update PO
This commit is contained in:
@ -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 =
|
||||
if (poNumber && poNumber !== "000") {
|
||||
setvalues =
|
||||
"p.ponumber='" +
|
||||
posapnumber +
|
||||
poNumber +
|
||||
"',p.status='" +
|
||||
status +
|
||||
"',p.statusdescription='" +
|
||||
statusdescription +
|
||||
"',";
|
||||
setvalues +=
|
||||
"po.ponumber='" +
|
||||
posapnumber +
|
||||
"',po.ponumber='" +
|
||||
poNumber +
|
||||
"',po.status='" +
|
||||
status +
|
||||
"',po.statusdescription='" +
|
||||
statusdescription +
|
||||
"',";
|
||||
// var setvalues="ponumber='"+posapnumber+"',status='"+status+"',statusdescription='"+statusdescription+"',";
|
||||
if (!posapnumber || posapnumber == "" || posapnumber == "000") {
|
||||
setvalues = "";
|
||||
}
|
||||
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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
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(500, data, res);
|
||||
},
|
||||
);
|
||||
} else {
|
||||
poadapter.queryUpdatePoNumberold(
|
||||
req,
|
||||
resdata["NUMBER"] || resdata["EXPPURCHASEORDER"],
|
||||
errmsg,
|
||||
function (err, data) {
|
||||
let statusCode = data != null ? data.meta.code : 200;
|
||||
if (err) statusCode = 500;
|
||||
}
|
||||
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){
|
||||
|
||||
Reference in New Issue
Block a user