diff --git a/adapter/poadapter.js b/adapter/poadapter.js index ed93411..ea50d82 100644 --- a/adapter/poadapter.js +++ b/adapter/poadapter.js @@ -1422,30 +1422,24 @@ class PoAdapter extends Adapter { var nik = req.body.nik; var status = req.body.status; var statusdescription = req.body.statusdescription; + const poNumber = String(posapnumber || "").trim(); + let setvalues = ""; - if (!posapnumber || posapnumber == "") { - posapnumber = "000"; - } - // var setvalues="p.ponumber='"+posapnumber+"',p.status='"+status+"',p.statusdescription='"+statusdescription+"',po.status='"+status+"',po.statusdescription='"+statusdescription+"',"; - var setvalues = - "p.ponumber='" + - posapnumber + - "',p.status='" + - status + - "',p.statusdescription='" + - statusdescription + - "',"; - setvalues += - "po.ponumber='" + - posapnumber + - "',po.status='" + - status + - "',po.statusdescription='" + - statusdescription + - "',"; - // var setvalues="ponumber='"+posapnumber+"',status='"+status+"',statusdescription='"+statusdescription+"',"; - if (!posapnumber || posapnumber == "" || posapnumber == "000") { - setvalues = ""; + if (poNumber && poNumber !== "000") { + setvalues = + "p.ponumber='" + + poNumber + + "',p.status='" + + status + + "',p.statusdescription='" + + statusdescription + + "',po.ponumber='" + + poNumber + + "',po.status='" + + status + + "',po.statusdescription='" + + statusdescription + + "',"; } var qry = "update tbl_po p, tbl_poboq po set " + @@ -1482,6 +1476,20 @@ class PoAdapter extends Adapter { } else { apires.success = true; apires.data = JSON.parse(JSON.stringify(result1)); + if (poNumber && poNumber !== "000") { + if (apires.data.length === 0) { + apires.data = String(idxpoboq) + .split(",") + .map((id) => ({ + idxpoboq: Number(id) || id, + ponumber: poNumber, + })); + } else { + apires.data.forEach((row) => { + if (!row.ponumber) row.ponumber = poNumber; + }); + } + } callback(null, apires); } }); @@ -1690,16 +1698,33 @@ class PoAdapter extends Adapter { let offset = req.query.offset; let keyword = req.query.keyword; let nik = req.body.nik; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v._idx asc" : "v._idx desc"; let qryBase = "select v.*, po.currency_id, po.rate_snapshot, c.currency AS currency_code, c.symbol AS currency_symbol "; qryBase += "from vw_po v left join tbl_po po on po._idx = v._idx "; qryBase += "left join tbl_currency c on c._idx = po.currency_id "; + qryBase += "left join tbl_justification j on j._idx = v.idxjustification "; + let keywordFilter = + "(trim(v.ponumber) like '%" + + keyword + + "%' or trim(v.prnumber) like '%" + + keyword + + "%' or trim(v.justificationnumber) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } let qry = qryBase; qry = qry + - "where trim(v.ponumber) like '%" + - keyword + - "%' and v.ponumber<>'000' and v.status in (2,3,4,5,6)"; + "where " + + keywordFilter + + "and v.ponumber<>'000' and v.status in (2,3,4,5,6) " + + divisionFilter; if (nik) { if (!proc_users.includes(nik)) { @@ -1727,13 +1752,18 @@ class PoAdapter extends Adapter { "totalrows": result.length, }); qry = qryBase; - qry = qry + "where trim(v.ponumber) like '%" + keyword + "%' and v.ponumber<>'000' and v.status in (2,3,4,5,6)"; + qry = + qry + + "where " + + keywordFilter + + "and v.ponumber<>'000' and v.status in (2,3,4,5,6) " + + divisionFilter; if (nik) { if (!proc_users.includes(nik)) { qry += ' and (iby="' + nik + ' or nikapproval="' + nik + '") '; } } - qry = qry + "order by v._idx asc limit " + offset + ", " + limit; + qry = qry + "order by " + sorder + " limit " + offset + ", " + limit; db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -1770,17 +1800,35 @@ class PoAdapter extends Adapter { let offset = req.query.offset; let keyword = req.query.keyword; let nik = req.query.nik; - // let nik = req.body.nik; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v._idx asc" : "v._idx desc"; let qryBase = "select v.*, po.currency_id, po.rate_snapshot, c.currency AS currency_code, c.symbol AS currency_symbol "; qryBase += "from vw_po v left join tbl_po po on po._idx = v._idx "; qryBase += "left join tbl_currency c on c._idx = po.currency_id "; + qryBase += "left join tbl_justification j on j._idx = v.idxjustification "; + let keywordFilter = + "(trim(v.ponumber) like '%" + + keyword + + "%' or trim(v.prnumber) like '%" + + keyword + + "%' or trim(v.identifyprojectnumber) like '%" + + keyword + + "%' or trim(v.podescription) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } let qry = qryBase; qry = qry + - "where trim(v.ponumber) like '%" + - keyword + - "%' and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' "; + "where " + + keywordFilter + + "and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' " + + divisionFilter; if (nik) { if (!proc_users.includes(nik)) { @@ -1808,16 +1856,17 @@ class PoAdapter extends Adapter { qry = qryBase; qry = qry + - "where trim(v.ponumber) like '%" + - keyword + - "%' and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' "; + "where " + + keywordFilter + + "and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' " + + divisionFilter; if (nik) { if (!proc_users.includes(nik)) { qry += 'and (iby="' + nik + ' or nikapproval="' + nik + '") '; } } - qry = qry + "order by v._idx asc limit " + offset + ", " + limit; + qry = qry + "order by " + sorder + " limit " + offset + ", " + limit; db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -2315,10 +2364,24 @@ class PoAdapter extends Adapter { let limit = req.query.limit; let offset = req.query.offset; let keyword = req.query.keyword; - // let nik = req.body.nik; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "a._idx asc" : "a._idx desc"; - let qry = "select * from vw_poadjlist "; - qry = qry + "where trim(ponumber) like '%" + keyword + "%' "; + let qryBase = "select a.* from vw_poadjlist a left join tbl_justification j on j._idx = a.idxjustification "; + let keywordFilter = + "(trim(a.ponumber) like '%" + + keyword + + "%' or trim(a.identifyprojectnumber) like '%" + + keyword + + "%' or trim(a.prnumber) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = qryBase + "where " + keywordFilter + divisionFilter; // qry = qry +"order by _idx asc limit " + offset + ", " + limit; // console.log(qry); @@ -2339,9 +2402,8 @@ class PoAdapter extends Adapter { "totalpage": pagination, "totalrows": result.length, }); - qry = "select * from vw_poadjlist "; - qry = qry + "where trim(ponumber) like '%" + keyword + "%' "; - qry = qry + "order by _idx asc limit " + offset + ", " + limit; + qry = qryBase + "where " + keywordFilter + divisionFilter; + qry = qry + "order by " + sorder + " limit " + offset + ", " + limit; db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); diff --git a/adapter/procjustificationadapter.js b/adapter/procjustificationadapter.js index 63214eb..42acd80 100644 --- a/adapter/procjustificationadapter.js +++ b/adapter/procjustificationadapter.js @@ -986,24 +986,31 @@ class ProcJustificationAdapter extends Adapter { let keyword = req.body.keyword; let nik = req.body.nik; let status = req.body.status; + let division = req.body.division ?? ""; + let sort = req.body.sort ?? "latest"; + let sorder = sort === "past" ? "id asc" : "id desc"; let swherenik = ""; if (nik) { swherenik = "iby='" + nik + "' and "; } - // let qry = "select * from vw_procjustification "; - // qry = qry +"where (trim(prnumber) like '%"+ keyword +"%' or trim(justificationnumber) like '%"+ keyword +"%') "; - // qry = qry +"and iby='"+nik+"' and status in("+status+") order by id asc"; - let qry = "select * from vw_procjustification "; - qry = - qry + - "where (trim(prnumber) like '%" + + let keywordFilter = + "(trim(prnumber) like '%" + keyword + "%' or trim(justificationnumber) like '%" + keyword + + "%' or trim(procjustificationnumber) like '%" + + keyword + "%') "; - qry = qry + "and " + swherenik + " status in(" + status + ") order by id asc"; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and divisi = '" + division + "' "; + } + + let qry = "select * from vw_procjustification "; + qry = qry + "where " + keywordFilter; + qry = qry + "and " + swherenik + " status in(" + status + ") " + divisionFilter + "order by " + sorder; // console.log(qry); db.query(qry, [], function (err, result, fields) { @@ -1024,20 +1031,18 @@ class ProcJustificationAdapter extends Adapter { "totalrows": result.length, }); qry = "select * from vw_procjustification "; - qry = - qry + - "where (trim(prnumber) like '%" + - keyword + - "%' or trim(justificationnumber) like '%" + - keyword + - "%') "; + qry = qry + "where " + keywordFilter; qry = qry + "and " + swherenik + " status in(" + status + - ") order by id asc limit " + + ") " + + divisionFilter + + "order by " + + sorder + + " limit " + offset + ", " + limit; diff --git a/controllers/po.js b/controllers/po.js index 9b3e393..c9dcd4a 100644 --- a/controllers/po.js +++ b/controllers/po.js @@ -55,6 +55,60 @@ function formatSapDate(value) { 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) { @@ -257,46 +311,37 @@ exports.createPOSAPold = (req, res) => { apireshandler.message = error.toString(); poadapter.sendResponse(400, apireshandler, res); } else { - // console.log(response.body); - var resdata = JSON.parse(response.body); - var errcode = ""; - var errmsg = ""; + var resdata = parseSapResponse(response.body); + const poNumber = extractSapPoNumber(resdata); + const { errcode, errmsg } = collectSapErrors(resdata); - resdata["RETURN"].forEach((e) => { - if (e.TYPE == "E") { - errcode += e.NUMBER + "\n\n"; - errmsg += e.MESSAGE + "\n\n"; - } - }); - - // Hapus newline terakhir biar rapi - errcode = errcode.trim(); - errmsg = errmsg.trim(); - - if (errmsg.length > 0) { + const savePoResult = (statusCodeOverride) => poadapter.queryUpdatePoNumberold( req, - resdata["NUMBER"] || resdata["EXPPURCHASEORDER"], + poNumber, 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.queryUpdatePoNumberold( - req, - resdata["NUMBER"] || resdata["EXPPURCHASEORDER"], - errmsg, - function (err, data) { - let statusCode = data != null ? data.meta.code : 200; + 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){