From fe5f50702bf488563b47d4cafc2c4f80e7df06c9 Mon Sep 17 00:00:00 2001 From: Iki Date: Thu, 18 Jun 2026 17:28:07 +0900 Subject: [PATCH] upd --- adapter/bastadapter.js | 86 ++++++----- adapter/financeadapter.js | 74 ++++----- adapter/poadapter.js | 95 ++++++++---- controllers/po.js | 309 +++++++++++++++++++------------------- 4 files changed, 311 insertions(+), 253 deletions(-) diff --git a/adapter/bastadapter.js b/adapter/bastadapter.js index 8052c2c..0853cdf 100644 --- a/adapter/bastadapter.js +++ b/adapter/bastadapter.js @@ -13,16 +13,29 @@ class BastAdapter extends Adapter { try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; + let keyword = req.query.keyword ?? ""; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v.idxbudget asc" : "v.idxbudget desc"; - let qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, pr.rate_snapshot AS pr_rate_snapshot " + - "from vw_bastactivitylist v " + - "left join tbl_pr pr on pr._idx = v.idxpr " + - "left join tbl_currency c on c._idx = pr.currency_id "; - qry = qry + "where v.activityname like '%" + keyword + "%' "; - qry = qry + "order by v.idxbudget asc limit " + offset + ", " + limit; + let qryBase = + "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, pr.rate_snapshot AS pr_rate_snapshot "; + qryBase += "from vw_bastactivitylist v "; + qryBase += "left join tbl_pr pr on pr._idx = v.idxpr "; + qryBase += "left join tbl_currency c on c._idx = pr.currency_id "; + qryBase += "left join tbl_justification j on j._idx = pr.idxjustification "; + let keywordFilter = + "(trim(v.activityname) like '%" + + keyword + + "%' or trim(v.prnumber) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = qryBase + "where " + keywordFilter + divisionFilter; - // console.log(qry); db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -34,21 +47,13 @@ class BastAdapter extends Adapter { if (!Number.isInteger(pagination)) { pagination = Math.floor(result.length / limit) + 1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length, }); - qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, pr.rate_snapshot AS pr_rate_snapshot " + - "from vw_bastactivitylist v " + - "left join tbl_pr pr on pr._idx = v.idxpr " + - "left join tbl_currency c on c._idx = pr.currency_id "; - qry = qry + "where v.activityname like '%" + keyword + "%' "; - qry = qry + "order by v.idxbudget asc limit " + offset + ", " + limit; - // qry = "select * from vw_basthandoverlist "; - // qry = qry + "where bastnumber 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(); @@ -80,19 +85,33 @@ class BastAdapter extends Adapter { try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; + let keyword = req.query.keyword ?? ""; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v._idx asc" : "v._idx desc"; - // let qry = "select * from vw_bastactivitylist "; - // qry = qry + "where activityname like '%" + keyword + "%' "; - // qry = qry + "order by idxbudget asc limit " + offset + ", " + limit; - let qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot " + - "from vw_basthandoverlist v " + - "left join tbl_po po on po._idx = v.idxpo " + - "left join tbl_currency c on c._idx = po.currency_id "; - qry = qry + "where v.bastnumber like '%" + keyword + "%' "; - qry = qry + "order by v._idx asc"; + let qryBase = + "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot "; + qryBase += "from vw_basthandoverlist v "; + qryBase += "left join tbl_po po on po._idx = v.idxpo "; + qryBase += "left join tbl_currency c on c._idx = po.currency_id "; + qryBase += "left join tbl_justification j on j._idx = po.idxjustification "; + let keywordFilter = + "(trim(v.bastnumber) like '%" + + keyword + + "%' or trim(v.ponumber) like '%" + + keyword + + "%' or trim(v.vendorname) like '%" + + keyword + + "%' or trim(v.description) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = qryBase + "where " + keywordFilter + divisionFilter; - // console.log(qry); db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -104,19 +123,14 @@ class BastAdapter extends Adapter { if (!Number.isInteger(pagination)) { pagination = Math.floor(result.length / limit) + 1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length, }); - qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot " + - "from vw_basthandoverlist v " + - "left join tbl_po po on po._idx = v.idxpo " + - "left join tbl_currency c on c._idx = po.currency_id "; - qry = qry + "where v.bastnumber like '%" + keyword + "%' "; - qry = qry + "order by v._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/financeadapter.js b/adapter/financeadapter.js index 9565478..5e1e40c 100644 --- a/adapter/financeadapter.js +++ b/adapter/financeadapter.js @@ -13,16 +13,24 @@ class FinanceAdapter extends Adapter{ try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; - - let qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; - qry += "from vw_popaylist v "; - qry += "left join tbl_po po on po._idx = v.idxpo "; - qry += "left join tbl_currency c on c._idx = po.currency_id "; - qry += "where v.podescription like '%" + keyword + "%' "; - // qry += "order by v.idxpo asc limit " + offset + ", " + limit; - - // console.log(qry); + let keyword = req.query.keyword ?? ""; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v.idxpo asc" : "v.idxpo desc"; + + let qryBase = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; + qryBase += "from vw_popaylist v "; + qryBase += "left join tbl_po po on po._idx = v.idxpo "; + qryBase += "left join tbl_currency c on c._idx = po.currency_id "; + qryBase += "left join tbl_justification j on j._idx = po.idxjustification "; + let keywordFilter = + "(trim(v.podescription) like '%" + keyword + "%' or trim(v.ponumber) like '%" + keyword + "%' or trim(v.prnumber) like '%" + keyword + "%' or trim(v.vendorname) like '%" + keyword + "%' or trim(v.sp3number) like '%" + keyword + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = qryBase + "where " + keywordFilter + divisionFilter; + db.query(qry,[],function(err,result,fields){ if(err){ apires.meta['message'] = err.toString(); @@ -36,18 +44,13 @@ class FinanceAdapter extends Adapter{ if(!Number.isInteger(pagination)){ pagination=(Math.floor(result.length / limit))+1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length }); - qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; - qry += "from vw_popaylist v "; - qry += "left join tbl_po po on po._idx = v.idxpo "; - qry += "left join tbl_currency c on c._idx = po.currency_id "; - qry += "where v.podescription like '%" + keyword + "%' "; - qry += "order by v.idxpo asc limit " + offset + ", " + limit; + qry = qryBase + "where " + keywordFilter + divisionFilter; + qry += "order by " + sorder + " limit " + offset + ", " + limit; db.query(qry,[],function(err,result,fields){ if(err){ apires.meta['message'] = err.toString(); @@ -329,20 +332,24 @@ class FinanceAdapter extends Adapter{ try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; + let keyword = req.query.keyword ?? ""; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v.idxpo asc" : "v.idxpo desc"; - // let qry = "select * from vw_financelist "; - // qry = qry + "where podescription like '%" + keyword + "%' "; - // qry = qry + "order by idxpo asc limit " + offset + ", " + limit; + let qryBase = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; + qryBase += "from vw_financelist v "; + qryBase += "left join tbl_po po on po._idx = v.idxpo "; + qryBase += "left join tbl_currency c on c._idx = po.currency_id "; + qryBase += "left join tbl_justification j on j._idx = po.idxjustification "; + let keywordFilter = + "(trim(v.podescription) like '%" + keyword + "%' or trim(v.ponumber) like '%" + keyword + "%' or trim(v.prnumber) like '%" + keyword + "%' or trim(v.vendorname) like '%" + keyword + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = qryBase + "where " + keywordFilter + divisionFilter; - let qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; - qry += "from vw_financelist v "; - qry += "left join tbl_po po on po._idx = v.idxpo "; - qry += "left join tbl_currency c on c._idx = po.currency_id "; - qry += "where v.podescription like '%" + keyword + "%' "; - qry += "order by v.idxpo asc"; - - // console.log(qry); db.query(qry,[],function(err,result,fields){ if(err){ apires.meta['message'] = err.toString(); @@ -356,18 +363,13 @@ class FinanceAdapter extends Adapter{ if(!Number.isInteger(pagination)){ pagination=(Math.floor(result.length / limit))+1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length }); - qry = "select v.*, COALESCE(c.currency, 'USD') AS currency_code, COALESCE(c.symbol, '$') AS currency_symbol, po.rate_snapshot AS po_rate_snapshot "; - qry += "from vw_financelist v "; - qry += "left join tbl_po po on po._idx = v.idxpo "; - qry += "left join tbl_currency c on c._idx = po.currency_id "; - qry += "where v.podescription like '%" + keyword + "%' "; - qry += "order by v.idxpo asc limit " + offset + ", " + limit; + qry = qryBase + "where " + keywordFilter + divisionFilter; + 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/poadapter.js b/adapter/poadapter.js index 53ba29c..f69f856 100644 --- a/adapter/poadapter.js +++ b/adapter/poadapter.js @@ -2106,21 +2106,39 @@ class PoAdapter extends Adapter { try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; - // let nik = req.body.nik; + let keyword = req.query.keyword ?? ""; + 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 "; + 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 "; - let qry = qryBase; - qry = - qry + - "where trim(v.ponumber) like '%" + + qryBase += "left join tbl_justification j on j._idx = v.idxjustification "; + let keywordFilter = + "(trim(v.ponumber) like '%" + keyword + - "%' and v.status in(2,4) and v.ponumber<>'000' and v.ponumber<>'' "; - // qry = qry +"order by _idx asc limit " + offset + ", " + limit; + "%' or trim(v.prnumber) like '%" + + keyword + + "%' or trim(v.identifyprojectnumber) like '%" + + keyword + + "%' or trim(v.vendorname) like '%" + + keyword + + "%' or trim(v.contractdescription) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = + qryBase + + "where " + + keywordFilter + + "and v.status in(2,4) and v.ponumber<>'000' and v.ponumber<>'' " + + divisionFilter; - // console.log(qry); db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -2132,19 +2150,18 @@ class PoAdapter extends Adapter { if (!Number.isInteger(pagination)) { pagination = Math.floor(result.length / limit) + 1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length, }); - qry = qryBase; qry = - qry + - "where trim(v.ponumber) like '%" + - keyword + - "%' and v.status in(2,4) and v.ponumber<>'000' and v.ponumber<>'' "; - qry = qry + "order by v._idx asc limit " + offset + ", " + limit; + qryBase + + "where " + + keywordFilter + + "and v.status in(2,4) and v.ponumber<>'000' and v.ponumber<>'' " + + divisionFilter; + qry = qry + "order by " + sorder + " limit " + offset + ", " + limit; db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -2305,15 +2322,34 @@ class PoAdapter extends Adapter { try { let limit = req.query.limit; let offset = req.query.offset; - let keyword = req.query.keyword; - // let nik = req.body.nik; + let keyword = req.query.keyword ?? ""; + let division = req.query.division ?? ""; + let sort = req.query.sort ?? "latest"; + let sorder = sort === "past" ? "v._idx asc" : "v._idx desc"; - let qry = "select v.* from vw_poinventoryheader v "; - qry = qry + "where EXISTS (SELECT 1 FROM tbl_bast b WHERE b.idxpo = v._idx AND b.isdeleted = 0) "; - qry = qry + "and trim(v.ponumber) like '%" + keyword + "%' "; - // qry = qry +"order by v._idx asc limit " + offset + ", " + limit; + let qryBase = "select v.* from vw_poinventoryheader v "; + qryBase += + "left join tbl_po po on po._idx = v._idx left join tbl_justification j on j._idx = po.idxjustification "; + let keywordFilter = + "(trim(v.ponumber) like '%" + + keyword + + "%' or trim(v.identifyprojectnumber) like '%" + + keyword + + "%' or trim(v.vendorname) like '%" + + keyword + + "%' or trim(v.podescription) like '%" + + keyword + + "%') "; + let divisionFilter = ""; + if (division && division.trim() !== "") { + divisionFilter = "and j.division = '" + division + "' "; + } + let qry = + qryBase + + "where EXISTS (SELECT 1 FROM tbl_bast b WHERE b.idxpo = v._idx AND b.isdeleted = 0) and " + + keywordFilter + + divisionFilter; - // console.log(qry); db.query(qry, [], function (err, result, fields) { if (err) { apires.meta["message"] = err.toString(); @@ -2325,16 +2361,17 @@ class PoAdapter extends Adapter { if (!Number.isInteger(pagination)) { pagination = Math.floor(result.length / limit) + 1; } - // let pagination = Adapter.getPagination(result.length, limit); apires.success = true; apires.data.push({ "totalpage": pagination, "totalrows": result.length, }); - qry = "select v.* from vw_poinventoryheader v "; - qry = qry + "where EXISTS (SELECT 1 FROM tbl_bast b WHERE b.idxpo = v._idx AND b.isdeleted = 0) "; - qry = qry + "and trim(v.ponumber) like '%" + keyword + "%' "; - qry = qry + "order by v._idx asc limit " + offset + ", " + limit; + qry = + qryBase + + "where EXISTS (SELECT 1 FROM tbl_bast b WHERE b.idxpo = v._idx AND b.isdeleted = 0) and " + + 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/controllers/po.js b/controllers/po.js index c9dcd4a..b4c8a20 100644 --- a/controllers/po.js +++ b/controllers/po.js @@ -90,6 +90,26 @@ function extractSapPoNumber(resdata) { 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: "" }; @@ -382,165 +402,150 @@ exports.createPOSAPold = (req, 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); }; exports.createMIGOPOSAPold = (req, res) => { try { - poadapter.queryPoManagementListDetail(req, function (err, resdata) { - let statusCode = resdata != null ? resdata.meta.code : 200; + poadapter.queryPoManagementListDetail(req, function (err, poDetail) { + let statusCode = poDetail != null ? poDetail.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); + 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;