update PO
This commit is contained in:
@ -1422,30 +1422,24 @@ class PoAdapter extends Adapter {
|
|||||||
var nik = req.body.nik;
|
var nik = req.body.nik;
|
||||||
var status = req.body.status;
|
var status = req.body.status;
|
||||||
var statusdescription = req.body.statusdescription;
|
var statusdescription = req.body.statusdescription;
|
||||||
|
const poNumber = String(posapnumber || "").trim();
|
||||||
|
let setvalues = "";
|
||||||
|
|
||||||
if (!posapnumber || posapnumber == "") {
|
if (poNumber && poNumber !== "000") {
|
||||||
posapnumber = "000";
|
setvalues =
|
||||||
}
|
"p.ponumber='" +
|
||||||
// var setvalues="p.ponumber='"+posapnumber+"',p.status='"+status+"',p.statusdescription='"+statusdescription+"',po.status='"+status+"',po.statusdescription='"+statusdescription+"',";
|
poNumber +
|
||||||
var setvalues =
|
"',p.status='" +
|
||||||
"p.ponumber='" +
|
status +
|
||||||
posapnumber +
|
"',p.statusdescription='" +
|
||||||
"',p.status='" +
|
statusdescription +
|
||||||
status +
|
"',po.ponumber='" +
|
||||||
"',p.statusdescription='" +
|
poNumber +
|
||||||
statusdescription +
|
"',po.status='" +
|
||||||
"',";
|
status +
|
||||||
setvalues +=
|
"',po.statusdescription='" +
|
||||||
"po.ponumber='" +
|
statusdescription +
|
||||||
posapnumber +
|
"',";
|
||||||
"',po.status='" +
|
|
||||||
status +
|
|
||||||
"',po.statusdescription='" +
|
|
||||||
statusdescription +
|
|
||||||
"',";
|
|
||||||
// var setvalues="ponumber='"+posapnumber+"',status='"+status+"',statusdescription='"+statusdescription+"',";
|
|
||||||
if (!posapnumber || posapnumber == "" || posapnumber == "000") {
|
|
||||||
setvalues = "";
|
|
||||||
}
|
}
|
||||||
var qry =
|
var qry =
|
||||||
"update tbl_po p, tbl_poboq po set " +
|
"update tbl_po p, tbl_poboq po set " +
|
||||||
@ -1482,6 +1476,20 @@ class PoAdapter extends Adapter {
|
|||||||
} else {
|
} else {
|
||||||
apires.success = true;
|
apires.success = true;
|
||||||
apires.data = JSON.parse(JSON.stringify(result1));
|
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);
|
callback(null, apires);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -1690,16 +1698,33 @@ class PoAdapter extends Adapter {
|
|||||||
let offset = req.query.offset;
|
let offset = req.query.offset;
|
||||||
let keyword = req.query.keyword;
|
let keyword = req.query.keyword;
|
||||||
let nik = req.body.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 ";
|
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 += "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_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;
|
let qry = qryBase;
|
||||||
qry =
|
qry =
|
||||||
qry +
|
qry +
|
||||||
"where trim(v.ponumber) like '%" +
|
"where " +
|
||||||
keyword +
|
keywordFilter +
|
||||||
"%' and v.ponumber<>'000' and v.status in (2,3,4,5,6)";
|
"and v.ponumber<>'000' and v.status in (2,3,4,5,6) " +
|
||||||
|
divisionFilter;
|
||||||
|
|
||||||
if (nik) {
|
if (nik) {
|
||||||
if (!proc_users.includes(nik)) {
|
if (!proc_users.includes(nik)) {
|
||||||
@ -1727,13 +1752,18 @@ class PoAdapter extends Adapter {
|
|||||||
"totalrows": result.length,
|
"totalrows": result.length,
|
||||||
});
|
});
|
||||||
qry = qryBase;
|
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 (nik) {
|
||||||
if (!proc_users.includes(nik)) {
|
if (!proc_users.includes(nik)) {
|
||||||
qry += ' and (iby="' + nik + ' or nikapproval="' + 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) {
|
db.query(qry, [], function (err, result, fields) {
|
||||||
if (err) {
|
if (err) {
|
||||||
apires.meta["message"] = err.toString();
|
apires.meta["message"] = err.toString();
|
||||||
@ -1770,17 +1800,35 @@ class PoAdapter extends Adapter {
|
|||||||
let offset = req.query.offset;
|
let offset = req.query.offset;
|
||||||
let keyword = req.query.keyword;
|
let keyword = req.query.keyword;
|
||||||
let nik = req.query.nik;
|
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 ";
|
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 += "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_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;
|
let qry = qryBase;
|
||||||
qry =
|
qry =
|
||||||
qry +
|
qry +
|
||||||
"where trim(v.ponumber) like '%" +
|
"where " +
|
||||||
keyword +
|
keywordFilter +
|
||||||
"%' and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' ";
|
"and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' " +
|
||||||
|
divisionFilter;
|
||||||
|
|
||||||
if (nik) {
|
if (nik) {
|
||||||
if (!proc_users.includes(nik)) {
|
if (!proc_users.includes(nik)) {
|
||||||
@ -1808,16 +1856,17 @@ class PoAdapter extends Adapter {
|
|||||||
qry = qryBase;
|
qry = qryBase;
|
||||||
qry =
|
qry =
|
||||||
qry +
|
qry +
|
||||||
"where trim(v.ponumber) like '%" +
|
"where " +
|
||||||
keyword +
|
keywordFilter +
|
||||||
"%' and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' ";
|
"and v.status in(1,2,3,4,5,6) and v.ponumber<>'000' and v.ponumber<>'' " +
|
||||||
|
divisionFilter;
|
||||||
if (nik) {
|
if (nik) {
|
||||||
if (!proc_users.includes(nik)) {
|
if (!proc_users.includes(nik)) {
|
||||||
qry += 'and (iby="' + nik + ' or nikapproval="' + 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) {
|
db.query(qry, [], function (err, result, fields) {
|
||||||
if (err) {
|
if (err) {
|
||||||
apires.meta["message"] = err.toString();
|
apires.meta["message"] = err.toString();
|
||||||
@ -2315,10 +2364,24 @@ class PoAdapter extends Adapter {
|
|||||||
let limit = req.query.limit;
|
let limit = req.query.limit;
|
||||||
let offset = req.query.offset;
|
let offset = req.query.offset;
|
||||||
let keyword = req.query.keyword;
|
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 ";
|
let qryBase = "select a.* from vw_poadjlist a left join tbl_justification j on j._idx = a.idxjustification ";
|
||||||
qry = qry + "where trim(ponumber) like '%" + keyword + "%' ";
|
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;
|
// qry = qry +"order by _idx asc limit " + offset + ", " + limit;
|
||||||
|
|
||||||
// console.log(qry);
|
// console.log(qry);
|
||||||
@ -2339,9 +2402,8 @@ class PoAdapter extends Adapter {
|
|||||||
"totalpage": pagination,
|
"totalpage": pagination,
|
||||||
"totalrows": result.length,
|
"totalrows": result.length,
|
||||||
});
|
});
|
||||||
qry = "select * from vw_poadjlist ";
|
qry = qryBase + "where " + keywordFilter + divisionFilter;
|
||||||
qry = qry + "where trim(ponumber) like '%" + keyword + "%' ";
|
qry = qry + "order by " + sorder + " limit " + offset + ", " + limit;
|
||||||
qry = qry + "order by _idx asc limit " + offset + ", " + limit;
|
|
||||||
db.query(qry, [], function (err, result, fields) {
|
db.query(qry, [], function (err, result, fields) {
|
||||||
if (err) {
|
if (err) {
|
||||||
apires.meta["message"] = err.toString();
|
apires.meta["message"] = err.toString();
|
||||||
|
|||||||
@ -986,24 +986,31 @@ class ProcJustificationAdapter extends Adapter {
|
|||||||
let keyword = req.body.keyword;
|
let keyword = req.body.keyword;
|
||||||
let nik = req.body.nik;
|
let nik = req.body.nik;
|
||||||
let status = req.body.status;
|
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 = "";
|
let swherenik = "";
|
||||||
if (nik) {
|
if (nik) {
|
||||||
swherenik = "iby='" + nik + "' and ";
|
swherenik = "iby='" + nik + "' and ";
|
||||||
}
|
}
|
||||||
|
|
||||||
// let qry = "select * from vw_procjustification ";
|
let keywordFilter =
|
||||||
// qry = qry +"where (trim(prnumber) like '%"+ keyword +"%' or trim(justificationnumber) like '%"+ keyword +"%') ";
|
"(trim(prnumber) like '%" +
|
||||||
// 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 '%" +
|
|
||||||
keyword +
|
keyword +
|
||||||
"%' or trim(justificationnumber) like '%" +
|
"%' or trim(justificationnumber) like '%" +
|
||||||
keyword +
|
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);
|
// console.log(qry);
|
||||||
db.query(qry, [], function (err, result, fields) {
|
db.query(qry, [], function (err, result, fields) {
|
||||||
@ -1024,20 +1031,18 @@ class ProcJustificationAdapter extends Adapter {
|
|||||||
"totalrows": result.length,
|
"totalrows": result.length,
|
||||||
});
|
});
|
||||||
qry = "select * from vw_procjustification ";
|
qry = "select * from vw_procjustification ";
|
||||||
qry =
|
qry = qry + "where " + keywordFilter;
|
||||||
qry +
|
|
||||||
"where (trim(prnumber) like '%" +
|
|
||||||
keyword +
|
|
||||||
"%' or trim(justificationnumber) like '%" +
|
|
||||||
keyword +
|
|
||||||
"%') ";
|
|
||||||
qry =
|
qry =
|
||||||
qry +
|
qry +
|
||||||
"and " +
|
"and " +
|
||||||
swherenik +
|
swherenik +
|
||||||
" status in(" +
|
" status in(" +
|
||||||
status +
|
status +
|
||||||
") order by id asc limit " +
|
") " +
|
||||||
|
divisionFilter +
|
||||||
|
"order by " +
|
||||||
|
sorder +
|
||||||
|
" limit " +
|
||||||
offset +
|
offset +
|
||||||
", " +
|
", " +
|
||||||
limit;
|
limit;
|
||||||
|
|||||||
@ -55,6 +55,60 @@ function formatSapDate(value) {
|
|||||||
return str;
|
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) => {
|
exports.getListVendor = (req, res) => {
|
||||||
try {
|
try {
|
||||||
poadapter.queryVendorList(req, function (err, data) {
|
poadapter.queryVendorList(req, function (err, data) {
|
||||||
@ -257,46 +311,37 @@ exports.createPOSAPold = (req, res) => {
|
|||||||
apireshandler.message = error.toString();
|
apireshandler.message = error.toString();
|
||||||
poadapter.sendResponse(400, apireshandler, res);
|
poadapter.sendResponse(400, apireshandler, res);
|
||||||
} else {
|
} else {
|
||||||
// console.log(response.body);
|
var resdata = parseSapResponse(response.body);
|
||||||
var resdata = JSON.parse(response.body);
|
const poNumber = extractSapPoNumber(resdata);
|
||||||
var errcode = "";
|
const { errcode, errmsg } = collectSapErrors(resdata);
|
||||||
var errmsg = "";
|
|
||||||
|
|
||||||
resdata["RETURN"].forEach((e) => {
|
const savePoResult = (statusCodeOverride) =>
|
||||||
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) {
|
|
||||||
poadapter.queryUpdatePoNumberold(
|
poadapter.queryUpdatePoNumberold(
|
||||||
req,
|
req,
|
||||||
resdata["NUMBER"] || resdata["EXPPURCHASEORDER"],
|
poNumber,
|
||||||
errmsg,
|
errmsg,
|
||||||
function (err, data) {
|
function (err, data) {
|
||||||
let statusCode = data != null ? data.meta.code : 200;
|
let statusCode =
|
||||||
if (err) statusCode = 500;
|
statusCodeOverride ?? (data != null ? data.meta.code : 200);
|
||||||
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;
|
if (err) statusCode = 500;
|
||||||
|
if (statusCodeOverride === 500) {
|
||||||
|
data.success = false;
|
||||||
|
data.meta.message = errmsg;
|
||||||
|
}
|
||||||
poadapter.sendResponse(statusCode, data, res);
|
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){
|
// if(errcode.length>0){
|
||||||
|
|||||||
Reference in New Issue
Block a user