Files
backend-Eprocurement/controllers/po.js
2026-06-16 14:34:58 +09:00

1385 lines
43 KiB
JavaScript

const PoAdapter = require("../adapter/poadapter.js");
const poadapter = new PoAdapter();
const Controllers = require("./controller.js");
const controllers = new Controllers();
var apireshandler = controllers.getApiResultDefined();
// const baseurlsap="http://172.20.25.27/sapapi/index.php/api";
const baseurlsap = "http://" + process.env.HOSTSAP + "/sapapi/index.php/api";
const apikeysap = "befea63a-7c47-4323-afea-968a3168fe0a";
const request = require("request");
var fs = require("fs");
const SAPAdapter = require("../adapter/sapadapter.js");
const sapadapter = new SAPAdapter();
function padSapDateParts(year, month, day) {
const y = String(year);
const m = String(month).padStart(2, "0");
const d = String(day).padStart(2, "0");
if (!/^\d{4}$/.test(y) || Number(m) < 1 || Number(m) > 12 || Number(d) < 1 || Number(d) > 31) {
return "";
}
return `${y}${m}${d}`;
}
function parseCompactSapDate(str) {
const year = str.slice(0, 4);
const rest = str.slice(4);
if (rest.length === 4) {
return padSapDateParts(year, rest.slice(0, 2), rest.slice(2));
}
if (rest.length === 3) {
const twoDigitMonth = padSapDateParts(year, rest.slice(0, 2), rest.slice(2));
if (twoDigitMonth) return twoDigitMonth;
return padSapDateParts(year, rest.slice(0, 1), rest.slice(1));
}
if (rest.length === 2) {
return padSapDateParts(year, rest.slice(0, 1), rest.slice(1));
}
return "";
}
function formatSapDate(value) {
if (!value) return "";
const str = String(value).trim();
if (/^\d{8}$/.test(str)) return str;
if (/^\d{4}-\d{2}-\d{2}/.test(str)) return str.slice(0, 10).replace(/-/g, "");
if (/^\d{6,7}$/.test(str)) {
const compact = parseCompactSapDate(str);
if (compact) return compact;
}
const d = new Date(str);
if (!isNaN(d.getTime())) {
return padSapDateParts(d.getFullYear(), d.getMonth() + 1, d.getDate());
}
return str;
}
function parseSapResponse(body) {
if (!body) return null;
if (typeof body === "object") return body;
let parsed = JSON.parse(body);
if (typeof parsed === "string") parsed = JSON.parse(parsed);
if (parsed?.data && typeof parsed.data === "object" && !Array.isArray(parsed.data)) {
return parsed.data;
}
return parsed;
}
function extractSapPoNumber(resdata) {
if (!resdata || typeof resdata !== "object") return "";
const directKeys = ["NUMBER", "EXPPURCHASEORDER", "exppurchaseorder", "Number"];
for (const key of directKeys) {
if (resdata[key] != null && String(resdata[key]).trim() !== "") {
return String(resdata[key]).trim();
}
}
const matchedKey = Object.keys(resdata).find(
(key) => key.trim().toUpperCase() === "EXPPURCHASEORDER" && resdata[key],
);
if (matchedKey) return String(resdata[matchedKey]).trim();
const returns = resdata.RETURN || resdata.return || [];
if (!Array.isArray(returns)) return "";
const successReturn = returns.find((entry) => entry.TYPE === "S" && entry.MESSAGE_V2);
if (successReturn?.MESSAGE_V2) return String(successReturn.MESSAGE_V2).trim();
return "";
}
function collectSapErrors(resdata) {
const returns = resdata?.RETURN || resdata?.return || [];
if (!Array.isArray(returns)) return { errcode: "", errmsg: "" };
let errcode = "";
let errmsg = "";
returns.forEach((entry) => {
if (entry.TYPE === "E") {
errcode += entry.NUMBER + "\n\n";
errmsg += entry.MESSAGE + "\n\n";
}
});
return {
errcode: errcode.trim(),
errmsg: errmsg.trim(),
};
}
exports.getListVendor = (req, res) => {
try {
poadapter.queryVendorList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPoBoqList = (req, res) => {
try {
poadapter.queryPoBoqlist(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getidxpoheader = (req, res) => {
try {
poadapter.queryGetidxpoheader(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.savePoboq = (req, res) => {
try {
poadapter.querySaveboqdetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getLastSignedPo = (req, res) => {
try {
poadapter.queryGetLastSignDate(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createPOSAP = (req, res) => {
try {
let status = req.body.status;
poadapter.queryUpdatePoHeader(req, function (err, resdata) {
console.log("err createpo =>", err);
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
} else {
poadapter.queryUpdatePoNumber(req, function (err, data) {
console.log("err queryUpdatePoNumber =>", err);
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createPOSAPold = (req, res) => {
try {
let status = req.body.status;
if (status == 1) {
// if(0==1){
poadapter.queryUpdatePoHeader(req, function (err, resdata) {
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) statusCode = 500;
// console.log(resdata.data.length);
// poadapter.sendResponse(statusCode,resdata, res);
if (resdata.data.length > 0) {
const data = resdata?.data?.[0] ?? {};
const {
idxpr = 0,
vendorid = "",
podate = "",
vper_start = "",
vper_end = "",
podescription = "",
totalqty = 0,
prnumber = "",
identifyprojectnumber = "",
} = data;
const createdBy = req.nik || req.body.createdby;
const creatDate = formatSapDate(req.body.createdate) || podate;
// ===== HEADER PARAM =====
const headerParams = {
comp_code: "1603",
doc_type: "POTL",
creat_date: creatDate,
created_by: createdBy,
vendor: vendorid,
purch_org: "1603",
pur_group: "TIL",
currency: "USD",
doc_date: podate,
vper_start,
vper_end,
zzctrnum: identifyprojectnumber?.toString().trim(),
};
// ===== ITEM PARAM =====
const preq_item = "00010";
const quantity = Number(totalqty).toString().replace(",", ".");
const po_unit = "PKT";
const net_price = req.body.totalpo;
const final_inv = "X";
const gr_basediv = "X";
const sloc = "TIL1";
const poitem = [
preq_item,
podescription,
quantity,
po_unit,
net_price,
final_inv,
gr_basediv,
prnumber,
preq_item,
sloc,
].join("|");
const poschedule = [preq_item, podate].join("|");
// ===== BUILD QUERY =====
const params = new URLSearchParams({
...headerParams,
"poitem[]": poitem,
"poschedule[]": poschedule,
}).toString();
const url = `${baseurlsap}/createPo?${params}`;
const resuri = {
method: "POST",
url,
headers: {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
};
const logData = {
ref_code: prnumber,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: createdBy,
response: "",
response_at: "",
url,
};
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "CREATE_PO");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
var resdata = parseSapResponse(response.body);
const poNumber = extractSapPoNumber(resdata);
const { errcode, errmsg } = collectSapErrors(resdata);
const savePoResult = (statusCodeOverride) =>
poadapter.queryUpdatePoNumberold(
req,
poNumber,
errmsg,
function (err, data) {
let statusCode =
statusCodeOverride ?? (data != null ? data.meta.code : 200);
if (err) statusCode = 500;
if (statusCodeOverride === 500) {
data.success = false;
data.meta.message = errmsg;
}
poadapter.sendResponse(statusCode, data, res);
},
);
if (errmsg.length > 0) {
savePoResult(500);
} else if (!poNumber) {
apireshandler.success = false;
apireshandler.meta.code = 500;
apireshandler.meta.message =
"PO created in SAP but PO number was not returned";
poadapter.sendResponse(500, apireshandler, res);
} else {
savePoResult();
}
// if(errcode.length>0){
// apireshandler.meta.code = errcode;
// apireshandler.meta.message = errmsg;
// poadapter.sendResponse(200, apireshandler, res);
// }
// else{
// // apireshandler.success = true;
// }
}
});
} else {
poadapter.sendResponse(statusCode, resdata, res);
}
});
} else {
poadapter.queryUpdatePoHeader(req, function (err, resdata) {
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
} else {
poadapter.queryUpdatePoNumber(req, "000", "", function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
});
}
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createMIGOPOSAP = (req, res) => {
try {
poadapter.queryUpdateMigoNumber(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
// data.success = false;
// data.meta.message = errmsg;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createMIGOPOSAPold = (req, res) => {
try {
poadapter.queryPoManagementListDetail(req, function (err, resdata) {
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) statusCode = 500;
// console.log(resdata.data.length);
// poadapter.sendResponse(statusCode,resdata, res);
if (resdata.data.length > 0) {
const idxpr = resdata.data[0]["idxpr"] ?? 0;
let gm_code = "01";
let pstng_date = resdata.data[0]["podate"].toString().trim();
let doc_date = pstng_date;
let header_txt = resdata.data[0]["podescription"].toString().trim();
// let quantity="1";
let quantity = resdata.data[0]["totalqty"].toString().trim();
// let po_unit="PKT";
let po_unit = resdata.data[0]["units"].toString().trim();
let po_number = resdata.data[0]["ponumber"].toString().trim();
let po_item = "00010";
let item_text = resdata.data[0]["podescription"].toString().trim();
let gr_rcpt = "GRreceipt";
let unload_pt = "unloadpoint";
let movement_ind = "B";
let reason = "0001";
let location = "160301";
let goodsmvt_item =
"1603|101|" +
quantity +
"|" +
po_unit +
"|" +
po_number +
"|" +
po_item +
"|" +
item_text +
"|";
// let goodsmvt_item="1603|101|"+quantity+"|"+po_number+"|"+po_item+"|"+item_text+"|";
goodsmvt_item +=
gr_rcpt + "|" + unload_pt + "|" + movement_ind + "|" + reason + "|" + location + "|";
// let zzctrnum = (resdata.data[0]['identifyprojectnumber']).toString().trim();//req.body.podescription;
const url =
baseurlsap +
"/migo?gm_code=" +
gm_code +
"&pstng_date=" +
pstng_date +
"&doc_date=" +
doc_date +
"&header_txt=" +
header_txt +
"&goodsmvt_item[]=" +
goodsmvt_item;
let resuri = {
"method": "POST",
// 'url': baseurlsap+'/createPo',
"url": url,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: resdata.data[0]["ponumber"].toString().trim(),
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url,
};
// http://172.20.25.27/sapapi/index.php/api/migo?gm_code=01&pstng_date=20140404&doc_date=20210404&hea
// der_txt=test header&goodsmvt_item[]=1603|101|1|BH|4110000019|00010|line itemtext|GRreceipt|unloadp
// oint|B|0001|160301|
console.log(resuri);
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "CREATE_PO_MIGO");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
// console.log(errmsg);
if (errmsg.length > 0) {
poadapter.queryUpdateMigoNumber(
req,
resdata["GOODSMVT_HEADRET"]["MAT_DOC"] || "",
errmsg,
function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
data.success = false;
data.meta.message = errmsg;
poadapter.sendResponse(500, data, res);
},
);
} else {
poadapter.queryUpdateMigoNumber(
req,
resdata["GOODSMVT_HEADRET"]["MAT_DOC"],
errmsg,
function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
},
);
}
// if(errcode.length>0){
// apireshandler.meta.code = errcode;
// apireshandler.meta.message = errmsg;
// poadapter.sendResponse(200, apireshandler, res);
// }
// else{
// // apireshandler.success = true;
// }
}
});
} else {
poadapter.sendResponse(statusCode, resdata, res);
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.deletePoBoq = (req, res) => {
try {
poadapter.queryDeletePoBoq(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [185] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOManagementList = (req, res) => {
try {
poadapter.queryPoManagementList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOManagementListDetail = (req, res) => {
try {
poadapter.queryPoManagementListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [215] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.changePOSAP = (req, res) => {
try {
req.query.idxpo = req.body.idxpo;
poadapter.queryPoManagementListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
const idxpr = rsdata.data[0]["idxpr"] ?? 0;
let ponumber = rsdata.data[0]["ponumber"]; //Ymd
let podescription = req.body.podescription; //rsdata.data[0]['podescription'];
let totalpo = req.body.totalpo; //rsdata.data[0]['podescription'];
let qty = 1; //req.query.qty; //rsdata.data[0]['podescription'];
let units = rsdata.data[0]["units"];
//http://172.20.25.27/sapapi/index.php/api/changePo?purchaseorder=4110000020&poitem[]=00010|test createPO|0||0||||00000
let poitem =
"00010|" +
podescription +
"|" +
qty +
"|" +
units +
"|" +
totalpo +
"|x|x|" +
ponumber +
"|00010";
let resuri = {
"method": "POST",
// 'url': baseurl+'signon',
"url": baseurlsap + "/changePo?purchaseorder=" + ponumber + "&poitem[]=" + poitem,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: rsdata.data[0]["ponumber"].toString().trim(),
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url: baseurlsap + "/changePo?purchaseorder=" + ponumber + "&poitem[]=" + poitem,
};
// console.log(resuri);
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "CHANGE_PO");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
// console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
if (errcode.length > 0) {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// poadapter.sendResponse(200, apireshandler, res);
} else {
apireshandler.success = true;
}
poadapter.queryUpdatePOSAP(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err || errcode.length > 0) statusCode = 500;
//data.data = resdata;
apireshandler.meta.code = statusCode;
apireshandler.data = data.data;
poadapter.sendResponse(statusCode, apireshandler, res);
});
}
});
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[291] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.releasePOSAP = (req, res) => {
try {
req.query.idxpo = req.body.idxpo;
poadapter.queryPoManagementListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
const idxpr = rsdata.data[0]["idxpr"] ?? 0;
let ponumber = rsdata.data[0]["ponumber"]; //Ymd
//http://172.20.25.27/sapapi/index.php/api/releasePo?im_purchaseorder=4110000020
let resuri = {
"method": "POST",
// 'url': baseurl+'signon',
"url": baseurlsap + "/releasePo?im_purchaseorder=" + ponumber,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: rsdata.data[0]["ponumber"].toString().trim(),
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url: baseurlsap + "/releasePo?im_purchaseorder=" + ponumber,
};
// console.log(resuri);
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "RELEASE_PO");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
// console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
if (errcode.length > 0) {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// poadapter.sendResponse(200, apireshandler, res);
} else {
apireshandler.success = true;
}
poadapter.queryUpdatePOSAP(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err || errcode.length > 0) statusCode = 500;
//data.data = resdata;
apireshandler.meta.code = statusCode;
apireshandler.data = data.data;
poadapter.sendResponse(statusCode, apireshandler, res);
});
}
});
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[291] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.unreleasePOSAP = (req, res) => {
try {
req.query.idxpo = req.body.idxpo;
poadapter.queryPoManagementListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
const idxpr = rsdata.data[0]["idxpr"] ?? 0;
let ponumber = rsdata.data[0]["ponumber"]; //Ymd
//http://172.20.25.27/sapapi/index.php/api/releasePo?im_purchaseorder=4110000020
let resuri = {
"method": "POST",
// 'url': baseurl+'signon',
"url": baseurlsap + "/unreleasePo?number=" + ponumber,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: rsdata.data[0]["ponumber"].toString().trim(),
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url: baseurlsap + "/unreleasePo?number=" + ponumber,
};
// console.log(resuri);
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "UNRELEASE_PO");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
// console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
if (errcode.length > 0) {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// poadapter.sendResponse(200, apireshandler, res);
} else {
apireshandler.success = true;
}
poadapter.queryUpdatePOSAP(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err || errcode.length > 0) statusCode = 500;
//data.data = resdata;
apireshandler.meta.code = statusCode;
apireshandler.data = data.data;
poadapter.sendResponse(statusCode, apireshandler, res);
});
}
});
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[291] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createHeaderPOSAP = (req, res) => {
try {
req.query.idxpo = req.body.idxpo;
poadapter.queryUpdateIdentifyProject(req, function (err, resdata) {
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) statusCode = 500;
// console.log(resdata.data.length);
// poadapter.sendResponse(statusCode,resdata, res);
if (resdata.data.length > 0) {
const data = resdata?.data?.[0] ?? {};
const {
idxpr = 0,
identifyprojectnumber = "",
contractdescription = "",
contractperiodfrom = "",
contractperiodto = "",
vendorname = "",
} = data;
// Static / default values
const params = {
im_ctrnum: identifyprojectnumber,
im_bukrs: "1603",
im_werks: "1603",
im_ctrdsc: contractdescription,
im_ctrtor: vendorname,
im_contract: identifyprojectnumber,
im_contract2: identifyprojectnumber,
im_contdesc: contractdescription,
im_spmon0: contractperiodfrom,
im_spmon1: contractperiodto,
im_ctrmax: 2,
im_waers2: "USD",
im_ctrval: "0",
im_ctrval2: "0",
im_action: "I",
};
// Build URL safely
const url = `${baseurlsap}/zcpxmm003?${new URLSearchParams(params).toString()}`;
const resuri = {
method: "POST",
url,
headers: {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
};
const logData = {
ref_code: identifyprojectnumber,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url,
};
// console.log(resuri);
request(resuri, function (error, response) {
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "CREATE_HEADER_SAP");
if (error) {
apireshandler.message = error.toString();
apireshandler.meta.message = "Header Created Successfuly";
poadapter.queryUpdatePoNumber(req, error.toString(), function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
// poadapter.sendResponse(400, apireshandler, res);
} else {
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
if (Array.isArray(resdata)) {
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
}
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
console.log("error : " + errmsg);
if (errmsg.length > 0) {
poadapter.queryUpdatePoNumber(req, errmsg, function (err, data) {
poadapter.sendResponse(500, data, res);
});
} else {
poadapter.queryUpdatePoNumber(req, errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
}
});
} else {
poadapter.sendResponse(statusCode, resdata, res);
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[550] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.createHeaderPOSAPold = (req, res) => {
try {
req.query.idxpo = req.body.idxpo;
poadapter.queryUpdateIdentifyProject(req, function (err, resdata) {
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) statusCode = 500;
// console.log(resdata.data.length);
// poadapter.sendResponse(statusCode,resdata, res);
if (resdata.data.length > 0) {
let identifyprojectnumber = resdata.data[0]["identifyprojectnumber"];
let contractdescription = resdata.data[0]["contractdescription"];
let contractperiodfrom = resdata.data[0]["contractperiodfrom"];
let contractperiodto = resdata.data[0]["contractperiodto"];
let im_ctrnum = identifyprojectnumber;
let im_bukrs = "1603";
let im_werks = "1603";
let im_ctrdsc = contractdescription;
let im_ctrtor = resdata.data[0]["vendorname"];
let im_contract = identifyprojectnumber;
let im_contract2 = identifyprojectnumber;
let im_contdesc = contractdescription;
let im_spmon0 = contractperiodfrom;
let im_spmon1 = contractperiodto;
let im_ctrmax = 2;
let im_waers2 = "USD";
let im_ctrval = "0";
let im_ctrval2 = "0";
let im_action = "I";
let resuri = {
"method": "POST",
"url":
baseurlsap +
"/zcpxmm003?im_ctrnum=" +
im_ctrnum +
"&im_bukrs=" +
im_bukrs +
"&im_werks=" +
im_werks +
"&im_ctrdsc=" +
im_ctrdsc +
"&im_ctrtor=" +
im_ctrtor +
"&im_contract=" +
im_contract +
"&im_contract2=" +
im_contract2 +
"&im_contdesc=" +
im_contdesc +
"&im_spmon0=" +
im_spmon0 +
"&im_spmon1=" +
im_spmon1 +
"&im_ctrmax=" +
im_ctrmax +
"&im_waers2=" +
im_waers2 +
"&im_ctrval=" +
im_ctrval +
"&im_ctrval2=" +
im_ctrval2 +
"&im_action=" +
im_action,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
};
// console.log(resuri);
request(resuri, function (error, response) {
if (error) {
// console.log(error);
apireshandler.message = error.toString();
poadapter.sendResponse(400, apireshandler, res);
} else {
// console.log("response : " +response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
if (Array.isArray(resdata)) {
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
});
}
errcode = errcode.substring(0, errcode.length - 2);
errmsg = errmsg.substring(0, errmsg.length - 3);
console.log("error : " + errmsg);
if (errmsg.length > 0) {
poadapter.queryUpdatePoNumber(req, "000", errmsg, function (err, data) {
poadapter.sendResponse(500, data, res);
});
} else {
poadapter.queryUpdatePoNumber(req, "000", "", function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
}
});
} else {
poadapter.sendResponse(statusCode, resdata, res);
}
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[550] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOInventorylist = (req, res) => {
try {
poadapter.queryPoInventoryList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOttdList = (req, res) => {
try {
poadapter.queryPottdList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOttdDetailList = (req, res) => {
try {
poadapter.queryPottdListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOMigoList = (req, res) => {
try {
poadapter.queryPoMigoList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOMigoDetailList = (req, res) => {
try {
poadapter.queryPoMigoListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getPOInventoryDetaillist = (req, res) => {
try {
poadapter.queryPoInventoryDetailList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [200] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.setSignedPO = (req, res) => {
try {
poadapter.querySignedPo(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.newpoadjustment = (req, res) => {
try {
// console.log(req.nik);
// console.log(req.body.filename);return false;
let ext = req.body.filename.split(".")[1];
let filename = "ADJPO_" + req.nik + "_" + Date.now() + "." + ext;
fs.rename(
process.env.BASEPATH + "/assets/po/" + req.body.filename,
process.env.BASEPATH + "/assets/po/" + filename,
function (err) {
if (err) {
poadapter.sendResponse(500, err, res);
} else {
poadapter.queryNewPoAdjustment(req, filename, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
},
);
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [958] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.updpoadjustment = (req, res) => {
try {
var ext = "";
var filename = "";
if (req.body.filename) {
ext = req.body.filename.split(".")[1];
filename = "ADJPO_" + req.nik + "_" + Date.now() + "." + ext;
fs.rename(
process.env.BASEPATH + "/assets/po/" + req.body.filename,
process.env.BASEPATH + "/assets/po/" + filename,
function (err) {
if (err) {
poadapter.sendResponse(500, err, res);
} else {
poadapter.queryUpdPoAdjustment(req, filename, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
},
);
} else {
poadapter.queryUpdPoAdjustment(req, filename, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [958] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.updpoboq = (req, res) => {
try {
var filename = req.body.filename;
if (req.body.filename) {
poadapter.queryUpdPoBoq(req, filename, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} else {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [1014] : PO controller, Upload File CSV Failed";
poadapter.sendResponse(502, apireshandler, res);
}
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [958] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getpoadjlist = (req, res) => {
try {
poadapter.queryPoAdjList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getpoadjlistdetail = (req, res) => {
try {
poadapter.queryPoAdjListDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.getpoapprovedlist = (req, res) => {
try {
poadapter.queryPoApproveList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.deletepoadj = (req, res) => {
try {
poadapter.queryDeleteAdjPO(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.submitpoadj = (req, res) => {
try {
poadapter.querySubmitAdjPO(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = "[636] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};
exports.uploadPOSAP = (req, res) => {
try {
let status = req.body.status;
console.log('req.body.filename =>', req.body.filename)
let ext = req.body.filename.split(".")[1];
let filename = req.body.filename + "_" + req.nik + "_" + Date.now() + "." + ext;
fs.rename(
process.env.BASEPATH + "/assets/sap-po/" + req.body.filename,
process.env.BASEPATH + "/assets/sap-po/" + filename,
function (err) {
if (err) {
poadapter.sendResponse(500, err, res);
} else {
poadapter.queryUpdatePoHeaderWithFile(req, filename, function (err, resdata) {
console.log("err upload PO =>", err);
let statusCode = resdata != null ? resdata.meta.code : 200;
if (err) {
statusCode = 500;
poadapter.sendResponse(statusCode, resdata, res);
} else {
poadapter.queryUpdateUploadPoNumber(req, "Success Bypass", function (err, data) {
console.log("err queryUpdateUploadPoNumber =>", err);
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
poadapter.sendResponse(statusCode, data, res);
});
}
});
}
},
);
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PO controller, " + err.toString();
poadapter.sendResponse(502, apireshandler, res);
}
};