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 extractSapMigoNumber(resdata) { if (!resdata || typeof resdata !== "object") return ""; const headret = resdata.GOODSMVT_HEADRET || resdata.goodsmvt_headret; if (headret?.MAT_DOC) return String(headret.MAT_DOC).trim(); if (headret?.mat_doc) return String(headret.mat_doc).trim(); return ""; } function extractSapMigoDocYear(resdata) { if (!resdata || typeof resdata !== "object") return ""; const headret = resdata.GOODSMVT_HEADRET || resdata.goodsmvt_headret; if (headret?.DOC_YEAR) return String(headret.DOC_YEAR).trim(); if (headret?.doc_year) return String(headret.doc_year).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) => { exports.createMIGOPOSAPold(req, res); }; exports.createMIGOPOSAPold = (req, res) => { try { poadapter.queryPoManagementListDetail(req, function (err, poDetail) { let statusCode = poDetail != null ? poDetail.meta.code : 200; if (err) statusCode = 500; if (!poDetail?.data?.length) { apireshandler.success = false; apireshandler.meta.code = statusCode === 200 ? 404 : statusCode; apireshandler.meta.message = poDetail?.meta?.message || "PO record not found"; poadapter.sendResponse(apireshandler.meta.code, apireshandler, res); return; } const row = poDetail.data[0]; const idxpr = row.idxpr ?? 0; const gm_code = "01"; const pstng_date = formatSapDate(row.podate) || String(row.podate || "").trim(); const doc_date = pstng_date; const header_txt = String(row.podescription || "").trim(); const quantity = String(row.totalqty || "").trim(); const po_unit = String(row.units || "PKT").trim(); const po_number = String(row.ponumber || "").trim(); const po_item = "00010"; const item_text = header_txt; const gr_rcpt = "GRreceipt"; const unload_pt = "unloadpoint"; const movement_ind = "B"; const reason = "0001"; const location = "160301"; let goodsmvt_item = "1603|101|" + quantity + "|" + po_unit + "|" + po_number + "|" + po_item + "|" + item_text + "|"; goodsmvt_item += gr_rcpt + "|" + unload_pt + "|" + movement_ind + "|" + reason + "|" + location + "|"; const url = baseurlsap + "/migo?gm_code=" + gm_code + "&pstng_date=" + pstng_date + "&doc_date=" + doc_date + "&header_txt=" + encodeURIComponent(header_txt) + "&goodsmvt_item[]=" + encodeURIComponent(goodsmvt_item); const resuri = { method: "POST", url, headers: { "Content-Type": "application/json", "x-api-key": apikeysap, }, }; const logData = { ref_code: po_number, request: JSON.stringify(resuri), request_at: new Date(), request_by: req.nik || req.body.nik || "999999", 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_MIGO"); if (error) { apireshandler.success = false; apireshandler.meta.code = 400; apireshandler.meta.message = error.toString(); poadapter.sendResponse(400, apireshandler, res); return; } let sapResult; try { sapResult = parseSapResponse(response.body); } catch (parseErr) { apireshandler.success = false; apireshandler.meta.code = 500; apireshandler.meta.message = "Invalid SAP response: " + parseErr.toString(); poadapter.sendResponse(500, apireshandler, res); return; } const { errmsg } = collectSapErrors(sapResult); const migoNumber = extractSapMigoNumber(sapResult); const docYear = extractSapMigoDocYear(sapResult); if (errmsg.length > 0) { apireshandler.success = false; apireshandler.meta.code = 500; apireshandler.meta.message = errmsg; poadapter.sendResponse(500, apireshandler, res); return; } if (!migoNumber) { apireshandler.success = false; apireshandler.meta.code = 500; apireshandler.meta.message = "MIGO created in SAP but document number was not returned"; poadapter.sendResponse(500, apireshandler, res); return; } req.body.migo = migoNumber; req.body.migosapmessage = docYear ? `MIGO ${migoNumber} / DOC_YEAR ${docYear}` : `MIGO ${migoNumber}`; req.body.nik = req.nik || req.body.nik || "999999"; poadapter.queryUpdateMigoNumber(req, function (updateErr, data) { let saveStatusCode = data != null ? data.meta.code : 200; if (updateErr) saveStatusCode = 500; if (data) { data.meta.message = `MIGO ${migoNumber} created successfully`; } poadapter.sendResponse(saveStatusCode, data, 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); } };