55 Commits

Author SHA1 Message Date
1f898d3977 upd 2026-03-06 16:10:32 +07:00
ee0cfda601 log 2026-03-06 16:10:15 +07:00
8f8bf4bad5 upd 2026-03-06 15:53:46 +07:00
17abbe9b73 upload po endpoint 2026-03-06 15:24:37 +07:00
4d94263a93 update 2026-03-06 14:37:56 +07:00
541b423c03 display vendor on detail 2026-03-06 10:33:27 +07:00
f6670321fc add field vendor in procjustification 2026-03-06 10:20:13 +07:00
c6ed4a0400 upd 2026-03-02 14:16:47 +07:00
7575fc2e13 upd 2026-03-02 14:15:16 +07:00
79709dd680 test 2026-03-02 14:04:42 +07:00
9d48cb4089 upd 2026-03-02 12:13:02 +07:00
d6e1035a3b update 2026-03-02 12:07:34 +07:00
82ac594b72 logging release po, unrelease po, change po 2026-02-13 14:22:56 +07:00
0cac4ae30b upd 2026-02-13 14:14:05 +07:00
232830070a log idxpr 2026-02-13 14:11:59 +07:00
71d960f9ea update 2026-02-13 14:09:19 +07:00
20c1864ac5 log create PO and create header SAP 2026-02-13 11:18:13 +07:00
44f10398ba log release, unrelease and change PR 2026-02-13 11:02:38 +07:00
4808c533a6 ok 2026-02-13 10:47:20 +07:00
9d4e4a98b2 create logger 2026-02-13 10:37:13 +07:00
034d99ff19 logs 2026-02-11 18:06:03 +07:00
4c332b3ce9 logs 2026-02-11 17:57:21 +07:00
dda6e73cbb upd 2026-02-11 17:36:34 +07:00
2dd3a8aa08 upd 2026-02-11 17:34:10 +07:00
ec10b69585 log 2026-02-11 17:29:50 +07:00
3b48e720d9 upd 2026-02-11 17:28:48 +07:00
f4c589e214 upd 2026-02-11 17:26:34 +07:00
b5fcf71f4a upd 2026-02-11 17:23:29 +07:00
051dcf2052 upd 2026-02-11 16:37:20 +07:00
5c4b79bac7 update 2026-02-11 15:49:41 +07:00
c39d79feec update to prev version 2026-01-20 10:51:49 +07:00
638ff55bff upd 2026-01-09 15:40:05 +07:00
7e3f6dd426 upd 2026-01-09 14:45:01 +07:00
a01efd2812 update 2026-01-09 14:41:28 +07:00
c777373817 test create PR 2026-01-09 14:26:24 +07:00
367bb5d29c upd 2026-01-09 13:36:41 +07:00
9c199e2413 update 2026-01-09 13:34:57 +07:00
2dc85891e2 upd 2026-01-09 10:54:08 +07:00
23f1026b3e upd 2026-01-09 10:52:27 +07:00
e139924302 upd 2026-01-09 10:50:08 +07:00
128d47e786 upd 2026-01-09 10:46:31 +07:00
76ac4d4341 upd 2026-01-09 10:44:29 +07:00
2a5363c835 upd 2026-01-09 10:41:47 +07:00
758fc65db3 udp 2026-01-08 17:25:53 +07:00
c00dc40f43 update 2026-01-08 17:20:26 +07:00
0221a6fb04 update 2026-01-08 17:12:08 +07:00
cc1102c444 API SAP Account 2026-01-08 16:54:56 +07:00
73ac2987a0 update 2026-01-07 15:25:14 +07:00
0476c18c43 updd 2026-01-07 15:22:42 +07:00
63db38c0fc try 2026-01-07 15:20:24 +07:00
ee58229803 upd 2026-01-07 15:09:30 +07:00
71b30d0a33 upd 2026-01-07 14:50:48 +07:00
221e81aff3 upd 2026-01-07 14:45:33 +07:00
b0c95b12e1 upd 2026-01-07 14:33:49 +07:00
9b1d94348e upd 2026-01-07 14:08:01 +07:00
13 changed files with 6906 additions and 4917 deletions

View File

@ -1,7 +1,7 @@
const db=require('../config/dbproc.js');
const Adapter=require('./dbadapter.js');
const db = require("../config/dbproc.js");
const Adapter = require("./dbadapter.js");
const fs = require("fs");
const baseUrl = process.env.URLPDFFILE;
class BastAdapter extends Adapter {
constructor() {
@ -25,22 +25,20 @@ class BastAdapter extends Adapter{
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
if (result.length > 0) {
let pagination = result.length / limit;
if (!Number.isInteger(pagination)) {
pagination=(Math.floor(result.length / limit))+1;
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
"totalrows": result.length,
});
qry = "select * from vw_bastactivitylist ";
qry = qry + "where activityname like '%" + keyword + "%' ";
@ -50,31 +48,27 @@ class BastAdapter extends Adapter{
// qry = qry + "order by _idx asc limit " + offset + ", " + limit;
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.data.push({
"results": JSON.parse(JSON.stringify(result))
"results": JSON.parse(JSON.stringify(result)),
});
callback(null, apires);
}
});
}
else{
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
callback(null, apires);
}
}
});
}
catch(err) {
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -95,22 +89,20 @@ class BastAdapter extends Adapter{
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
if (result.length > 0) {
let pagination = result.length / limit;
if (!Number.isInteger(pagination)) {
pagination=(Math.floor(result.length / limit))+1;
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
"totalrows": result.length,
});
// qry = "select * from vw_bastactivitylist ";
@ -121,31 +113,27 @@ class BastAdapter extends Adapter{
qry = qry + "order by _idx asc limit " + offset + ", " + limit;
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.data.push({
"results": JSON.parse(JSON.stringify(result))
"results": JSON.parse(JSON.stringify(result)),
});
callback(null, apires);
}
});
}
else{
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
callback(null, apires);
}
}
});
}
catch(err) {
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -160,28 +148,24 @@ class BastAdapter extends Adapter{
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
if (result.length > 0) {
apires.success = true;
apires.data = JSON.parse(JSON.stringify(result));
}
else{
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
}
callback(null, apires);
}
});
}
catch(err) {
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -206,50 +190,84 @@ class BastAdapter extends Adapter{
// qry = qry + "description='"+description+"',idxvendor='"+idxvendor+"',vendorcode='"+vendorcode+"',vendorname='"+vendorname+"',";
// qry = qry + "totalpo='"+totalpo+"',povendornumber='"+povendornumber+"',filedoctemplate='"+filedoctemplate+"',status='"+status+"',";
// qry = qry + "statusdescription='"+statusdescription+"',laststatusupdate=now(),iby='"+nik+"',idt=now()";
let qry = "insert into tbl_bast set idxpo='"+idxpo+"',bastnumber='"+bastnumber+"',bastdates='"+bastdates+"',";
qry = qry + "description='"+description+"',idxvendor='"+idxvendor+"',vendorcode='"+vendorcode+"',vendorname='"+vendorname+"',";
qry = qry + "totalpo='"+totalpo+"',povendornumber='"+povendornumber+"',filepdf='"+filedoctemplate+"',ismergedoc=1,status='"+status+"',";
qry = qry + "statusdescription='"+statusdescription+"',laststatusupdate=now(),iby='"+nik+"',idt=now()";
let qry =
"insert into tbl_bast set idxpo='" +
idxpo +
"',bastnumber='" +
bastnumber +
"',bastdates='" +
bastdates +
"',";
qry =
qry +
"description='" +
description +
"',idxvendor='" +
idxvendor +
"',vendorcode='" +
vendorcode +
"',vendorname='" +
vendorname +
"',";
qry =
qry +
"totalpo='" +
totalpo +
"',povendornumber='" +
povendornumber +
"',filepdf='" +
filedoctemplate +
"',ismergedoc=1,status='" +
status +
"',";
qry =
qry +
"statusdescription='" +
statusdescription +
"',laststatusupdate=now(),iby='" +
nik +
"',idt=now()";
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
var idxheader = result.insertId;
// qry ="insert into tbl_bastdetail(idxheader,idxpoboq,description,qty,units,poamount,iby,idt) ";
// qry = qry + "select '"+idxheader+"', _idx , description, qty, units, poamount, '"+nik+"',now() ";
// qry = qry + "from tbl_poboq where _idx in("+idxpoboq+")";
qry ="insert into tbl_bastdetail(idxheader,idxpoboq,description,qty,units,poamount,iby,idt) ";
qry = qry + "select '"+idxheader+"', _idx , description, qty, units, poamount, '"+nik+"',now() ";
qry =
"insert into tbl_bastdetail(idxheader,idxpoboq,description,qty,units,poamount,iby,idt) ";
qry =
qry +
"select '" +
idxheader +
"', _idx , description, qty, units, poamount, '" +
nik +
"',now() ";
qry = qry + "from tbl_poboq where _idx in(" + idxpoboq + ")";
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.success = true;
apires.data = JSON.parse(JSON.stringify(result));
apires.meta.code = 200;
callback(null, apires);
}
});
}
});
}
catch(err) {
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -261,30 +279,59 @@ class BastAdapter extends Adapter{
let bastdates = req.body.bastdates;
let description = req.body.description;
let qry = "update tbl_bast set status=1,statusdescription='Upload Handover',bastdateshandover='"+bastdates+"',descriptionhandover='"+description+"',";
qry +="filehandoversign='"+filehandoversign+"',uby='"+nik+"',udt=now() where _idx='"+idxbast+"'";
let qry =
"update tbl_bast set status=1,statusdescription='Upload Handover',bastdateshandover='" +
bastdates +
"',descriptionhandover='" +
description +
"',";
qry +=
"filehandoversign='" +
filehandoversign +
"',uby='" +
nik +
"',udt=now() where _idx='" +
idxbast +
"'";
// let qry = "update tbl_bast set filehandoversign='"+filehandoversign+"',uby='"+nik+"',udt=now() where _idx='"+idxbast+"'";
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
let qryHistory =
"insert into tbl_bastfilehistory set statusdescription='Upload Handover', bastdateshandover='" +
bastdates +
"',descriptionhandover='" +
description +
"', filehandoversign='" +
filehandoversign +
"',iby='" +
nik +
"',idt=now(), idxbast='" +
idxbast +
"'";
db.query(qryHistory, [], function (err, result, fields) {
if (err) {
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.success = true;
apires.meta.code = 200;
callback(null, apires);
}
});
}
catch(err) {
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -302,53 +349,47 @@ class BastAdapter extends Adapter{
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
if (result.length > 0) {
let pagination = result.length / limit;
if (!Number.isInteger(pagination)) {
pagination=(Math.floor(result.length / limit))+1;
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
"totalrows": result.length,
});
qry = "select * from vw_bast ";
qry = qry + "where description like '%" + keyword + "%' ";
qry = qry + "order by _idx asc limit " + offset + ", " + limit;
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.data.push({
"results": JSON.parse(JSON.stringify(result))
"results": JSON.parse(JSON.stringify(result)),
});
callback(null, apires);
}
});
}
else{
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
callback(null, apires);
}
}
});
}
catch(err) {
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -363,23 +404,32 @@ class BastAdapter extends Adapter{
// console.log(qry);
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
let qryHistory = `select statusdescription, bastdateshandover, descriptionhandover, CONCAT('${baseUrl}?route=bast&name=', filehandoversign) AS filehandoversign, iby, idt from tbl_bastfilehistory where idxbast = ${result[0]._idx} order by _idx desc`;
db.query(qryHistory, [], function (err, resultHistory, fields) {
console.log(err);
console.log(resultHistory);
if (err) {
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
result[0].history_handover = resultHistory;
apires.data.push({
"results": JSON.parse(JSON.stringify(result))
"results": JSON.parse(JSON.stringify(result)),
});
callback(null, apires);
}
});
}
catch(err) {
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
@ -391,16 +441,23 @@ class BastAdapter extends Adapter{
var statusdescription = req.body.statusdescription;
var nik = req.body.nik;
var qry = "update tbl_bast set filehandover='"+filehandover+"',status='" + status +"',statusdescription='" + statusdescription +"',uby='"+nik+"',udt=now() ";
var qry =
"update tbl_bast set filehandover='" +
filehandover +
"',status='" +
status +
"',statusdescription='" +
statusdescription +
"',uby='" +
nik +
"',udt=now() ";
qry = qry + "where _idx='" + idxbast + "'";
db.query(qry, [], function (err, result, fields) {
if (err) {
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.meta["message"] = err.toString();
apires.meta["code"] = 500;
callback("err", apires);
} else {
apires.success = true;
apires.data = JSON.parse(JSON.stringify(result));
callback(null, apires);
@ -409,11 +466,9 @@ class BastAdapter extends Adapter{
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
callback("error", apires);
}
}
}
module.exports = BastAdapter;

File diff suppressed because it is too large Load Diff

View File

@ -88,7 +88,7 @@ class PrAdapter extends Adapter{
let idxjustification= req.body.idxjustification;
let justificationnumber= req.body.justificationnumber;
let trxidpr = req.body.trxidpr;
let prnumber = req.body.prnumber;
let prnumber = req.body.prnumber ?? "";
let costcenter = req.body.costcenter;
let profitcenter = req.body.profitcenter;
let description = req.body.description;
@ -143,7 +143,7 @@ class PrAdapter extends Adapter{
let idxjustification= req.body.idxjustification;
let justificationnumber= req.body.justificationnumber;
let trxidpr = req.body.trxidpr;
let prnumber = req.body.prnumber;
let prnumber = req.body.prnumber ?? "";
let costcenter = req.body.costcenter;
let profitcenter = req.body.profitcenter;
let description = req.body.description;
@ -313,6 +313,8 @@ class PrAdapter extends Adapter{
async queryPrList(req,callback){
var apires = this.getApiResultDefined();
try {
const proc_nik = process.env.PROC_USER_NIK ?? ""
const proc_users = proc_nik.split(",")
let limit = req.body.limit;
let offset = req.body.offset;
@ -326,7 +328,9 @@ class PrAdapter extends Adapter{
let swherenik="";
if(nik){
swherenik="iby='"+nik+"' and ";
if (!proc_users.includes(nik)) {
swherenik = '(iby="'+nik+' or nikapproval="'+nik+'") and ';
}
}
@ -478,6 +482,8 @@ class PrAdapter extends Adapter{
async queryPrManagementList(req,callback){
var apires = this.getApiResultDefined();
try {
const proc_nik = process.env.PROC_USER_NIK ?? ""
const proc_users = proc_nik.split(",")
let limit = req.query.limit;
let offset = req.query.offset;
@ -485,7 +491,7 @@ class PrAdapter extends Adapter{
let nik = req.query.nik;
let swherenik="and iby='"+nik+"'";
if(nik=='999999'){
if (!proc_users.includes(nik)) {
swherenik="";
}
@ -517,7 +523,7 @@ class PrAdapter extends Adapter{
"totalrows": result.length
});
qry = "select * from vw_prmanagement ";
qry = qry +"where (trim(trxidpr) like '%"+ keyword +"%' or trim(prnumber) like '%"+ keyword +"%') ";
qry = qry +"where status >= 2 and (trim(trxidpr) like '%"+ keyword +"%' or trim(prnumber) like '%"+ keyword +"%') ";
qry = qry + swherenik +" order by id asc limit " + offset + ", " + limit;
db.query(qry,[],function(err,result,fields){
if(err){
@ -586,6 +592,38 @@ class PrAdapter extends Adapter{
}
}
async queryUpdateSapMessage(req, sapmessage, callback) {
try {
var apires = this.getApiResultDefined();
var idxpr = req.body.idxpr;
var nik = req.body.nik;
// console.log(setdescription);
var qry = "update tbl_pr set sapmessage='"+sapmessage+"', uby='"+nik+"',udt=now() ";
qry = qry +"where _idx='" + idxpr +"'";
console.log('qry', qry)
db.query(qry,[],function(err,result,fields){
if(err){
apires.meta['message'] = err.toString();
apires.meta['code'] = 500;
callback('err',apires);
}
else
{
apires.success = true;
apires.data = JSON.parse(JSON.stringify(result));
callback(null, apires);
}
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback('error',apires);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,412 @@
const db = require("../config/dbproc.js");
const Adapter = require("./dbadapter.js");
const request = require("request");
class SAPAccountAdapter extends Adapter {
constructor() {
super();
}
/* ================= LIST + PAGINATION ================= */
async queryList(req, callback) {
var apires = this.getApiResultDefined();
try {
let limit = parseInt(req.query.limit) || 10;
let offset = parseInt(req.query.offset) || 0;
let keyword = req.query.keyword || "";
/* ===== QUERY TOTAL ROW ===== */
let qry = `
SELECT *
FROM tbl_sap_connections
WHERE deleted_at IS NULL
AND (
host LIKE '%${keyword}%'
OR sap_user LIKE '%${keyword}%'
OR ket_sap LIKE '%${keyword}%'
)
`;
db.query(qry, [], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
if (result.length > 0) {
let pagination = result.length / limit;
if (!Number.isInteger(pagination)) {
pagination = Math.floor(result.length / limit) + 1;
}
apires.success = true;
apires.data.push({
totalpage: pagination,
totalrows: result.length,
});
/* ===== QUERY DATA WITH LIMIT ===== */
let qryData = `
SELECT *
FROM tbl_sap_connections
WHERE deleted_at IS NULL
AND (
host LIKE '%${keyword}%'
OR sap_user LIKE '%${keyword}%'
OR ket_sap LIKE '%${keyword}%'
)
ORDER BY id ASC
LIMIT ${offset}, ${limit}
`;
db.query(qryData, [], function (err, resultData) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
apires.data.push({
results: JSON.parse(JSON.stringify(resultData)),
});
callback(null, apires);
}
});
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
callback(null, apires);
}
}
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
/* ================= CREATE ================= */
async queryCreate(req, callback) {
var apires = this.getApiResultDefined();
try {
const {sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi} =
req.body;
let qry = `
INSERT INTO tbl_sap_connections
(sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi, created_at, created_by, status)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?, 'Not_Active')
`;
const password = Buffer.from(sap_password, "utf8").toString("base64");
db.query(
qry,
[
sap_id,
host,
sysnr,
client,
codepage,
ket_sap,
sap_user,
password,
aktivasi,
req.body.nik || "system",
],
function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
apires.success = true;
apires.data = {insertId: result.insertId};
callback(null, apires);
}
},
);
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async callSapActivateById(id, nik, callback) {
var apires = this.getApiResultDefined();
let qry = `
SELECT *
FROM tbl_sap_connections
WHERE id = ?
AND deleted_at IS NULL
LIMIT 1
`;
db.query(qry, [id], (err, result) => {
if (err || result.length === 0) {
apires.meta.code = 404;
apires.meta.message = "SAP Connection not found";
return callback("err", apires);
}
const sap = result[0];
// decode password sebelum kirim ke SAP
const decodedPassword = Buffer.from(sap.sap_password, "base64").toString("utf8");
const sapUrl =
process.env.SAP_API_BASE_URL +
"/sapConnection" +
`?user=${sap.sap_user}` +
`&password=${decodedPassword}` +
`&sysnr=${sap.sysnr}` +
`&client=${sap.client}` +
`&codepage=${sap.codepage}` +
`&ket_sap=${sap.ket_sap}` +
`&host=${encodeURIComponent(sap.host)}`;
const options = {
method: "POST",
url: sapUrl,
timeout: 10000,
headers: {
"x-api-key": process.env.SAP_API_KEY,
},
};
request(options, (error, response, body) => {
if (error || response.statusCode !== 200) {
apires.meta.code = 500;
apires.meta.message = "SAP API activate failed";
apires.data = body;
return callback("err", apires);
}
// set semua Not_Active
db.query(`UPDATE tbl_sap_connections SET status='Not_Active'`, [], () => {
// set Active untuk ID ini
db.query(
`UPDATE tbl_sap_connections
SET status='Active',
updated_at=NOW(),
updated_by=?
WHERE id=?`,
[nik || "system", id],
(err2) => {
if (err2) {
apires.meta.code = 500;
apires.meta.message = err2.toString();
return callback("err", apires);
}
apires.success = true;
apires.data = {sap_id: sap.sap_id};
callback(null, apires);
},
);
});
});
});
}
/* ================= UPDATE ================= */
async queryUpdate(req, callback) {
var apires = this.getApiResultDefined();
try {
const id = req.params.id;
const {sap_id, host, sysnr, client, codepage, ket_sap, sap_user, sap_password, aktivasi} =
req.body;
/* 1⃣ Ambil data existing (untuk cek status) */
const detailQry = `
SELECT status, sap_password
FROM tbl_sap_connections
WHERE id = ?
AND deleted_at IS NULL
LIMIT 1
`;
db.query(detailQry, [id], (err, rows) => {
if (err || rows.length === 0) {
apires.meta.code = 404;
apires.meta.message = "SAP Connection not found";
return callback("err", apires);
}
const currentStatus = rows[0].status;
/* 2⃣ Handle password (jangan overwrite kalau kosong) */
const encodedPassword = sap_password
? Buffer.from(sap_password, "utf8").toString("base64")
: rows[0].sap_password;
/* 3⃣ Update data */
const updateQry = `
UPDATE tbl_sap_connections
SET sap_id = ?, host = ?, sysnr = ?, client = ?, codepage = ?, ket_sap = ?,
sap_user = ?, sap_password = ?, aktivasi = ?,
updated_at = NOW(), updated_by = ?
WHERE id = ? AND deleted_at IS NULL
`;
db.query(
updateQry,
[
sap_id,
host,
sysnr,
client,
codepage,
ket_sap,
sap_user,
encodedPassword,
aktivasi,
req.body.nik || "system",
id,
],
(err2, result) => {
if (err2) {
apires.meta.code = 500;
apires.meta.message = err2.toString();
return callback("err", apires);
}
/* 4⃣ Jika sebelumnya Active → activate ulang SAP */
if (currentStatus === "Active") {
return this.callSapActivateById(id, req.body.nik, callback);
}
/* 5⃣ Kalau Not_Active → selesai */
apires.success = true;
apires.data = {affectedRows: result.affectedRows};
callback(null, apires);
},
);
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
/* ================= DELETE (SOFT) ================= */
async queryDelete(req, callback) {
var apires = this.getApiResultDefined();
try {
const id = req.params.id;
let qry = `
UPDATE tbl_sap_connections
SET deleted_at = NOW(), deleted_by = ?
WHERE id = ? AND deleted_at IS NULL
`;
db.query(qry, [req.body.nik || "system", id], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
apires.success = true;
apires.data = {affectedRows: result.affectedRows};
callback(null, apires);
}
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
/* ================= DETAIL ================= */
async queryDetail(req, callback) {
var apires = this.getApiResultDefined();
try {
const id = req.params.id;
let qry = `
SELECT *
FROM tbl_sap_connections
WHERE id = ?
AND deleted_at IS NULL
LIMIT 1
`;
db.query(qry, [id], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
if (result.length > 0) {
const password = Buffer.from(result[0].sap_password, "base64").toString("utf8");
apires.success = true;
apires.data = {...result[0], sap_password: password};
} else {
apires.meta.code = 200;
apires.meta.message = "Record Not Found";
apires.data = null;
}
callback(null, apires);
}
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
/* ================= ACTIVATE ================= */
async queryActivate(req, callback) {
try {
const id = req.params.id;
const nik = req.body.nik || "system";
// reuse logic yang sama
return this.callSapActivateById(id, nik, callback);
} catch (err) {
const apires = this.getApiResultDefined();
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
/* ================= CURRENT ================= */
async queryCurrent(req, callback) {
var apires = this.getApiResultDefined();
try {
let qry = `
SELECT *
FROM tbl_sap_connections
WHERE status='Active'
AND deleted_at IS NULL
LIMIT 1
`;
db.query(qry, [], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("err", apires);
} else {
apires.success = true;
apires.data = result.length > 0 ? result[0] : null;
callback(null, apires);
}
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
}
module.exports = SAPAccountAdapter;

43
adapter/sapadapter.js Normal file
View File

@ -0,0 +1,43 @@
const db = require("../config/dbproc.js");
const Adapter = require("./dbadapter.js");
class SapAdapter extends Adapter {
constructor() {
super();
}
async queryInsertSapLog(idxpr, req, req_type) {
var apires = this.getApiResultDefined();
try {
const {ref_code, request, request_at, request_by, response, response_at, url} = req;
let qry = `
INSERT INTO tbl_sap_log
(idxpr, created_at, ref_code, request_type, request, request_at, request_by, response, response_at, url)
VALUES (?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?)
`;
db.query(
qry,
[idxpr, ref_code, req_type, request, request_at, request_by, response, response_at, url],
function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
console.log('error saving log =>', err.toString())
} else {
apires.success = true;
apires.data = {insertId: result.insertId};
}
},
);
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
}
module.exports = SapAdapter;

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,55 @@
const PrAdapter=require('../adapter/pradapter.js');
const PrAdapter = require("../adapter/pradapter.js");
const pradapter = new PrAdapter();
const Controllers = require('./controller.js');
const Controllers = require("./controller.js");
const controllers = new Controllers();
var apireshandler = controllers.getApiResultDefined();
const baseurlsap = "http://" + process.env.HOSTSAP + "/sapapi/index.php/api";
const apikeysap = "befea63a-7c47-4323-afea-968a3168fe0a";
const request = require('request');
const request = require("request");
const SAPAdapter = require("../adapter/sapadapter.js");
const sapadapter = new SAPAdapter();
function buildPipeString(length, mapping = {}) {
const arr = Array(length).fill("");
Object.keys(mapping).forEach((index) => {
arr[index] = mapping[index];
});
return arr.join("|");
}
function buildPrAccount({prNo, qtyAcc, prDate, budget, costCenter, profitCenter}) {
return buildPipeString(40, {
0: prNo,
1: qtyAcc,
3: prDate,
7: budget,
8: "TIL1",
9: costCenter,
17: profitCenter,
});
}
function buildPrItem({prNo, shortText, qty, unit, price, prDate}) {
return buildPipeString(80, {
0: prNo,
3: "120",
4: "Putra",
5: shortText,
13: "1603",
15: "TrackNo1",
16: "ZSRV",
18: qty,
19: unit,
21: prDate,
23: prDate,
25: price,
26: "1",
28: "J",
36: "1603",
79: "D",
});
}
exports.getListJustification = (req, res) => {
try {
@ -15,13 +58,12 @@ exports.getListJustification = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [18] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.getListPR = (req, res) => {
try {
@ -30,13 +72,12 @@ exports.getListPR = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [18] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.gettrxid = (req, res) => {
try {
@ -45,13 +86,12 @@ exports.gettrxid = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [18] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.getListPr = (req, res) => {
try {
@ -60,13 +100,12 @@ exports.getListPr = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [167] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.setNewPr = (req, res) => {
try {
@ -75,13 +114,12 @@ exports.setNewPr = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [167] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.getDetailPr = (req, res) => {
try {
@ -90,13 +128,12 @@ exports.getDetailPr = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [93] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.setUpdatePr = (req, res) => {
try {
@ -105,51 +142,45 @@ exports.setUpdatePr = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [167] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.setUpdateStatusPr = (req, res) => {
try {
let status = req.body.status;
let idxpr = req.body.idxpr;
if (status == 0) {
// if(0==1){
req.query.id = idxpr;
pradapter.queryUpdateStatusPr(req, req.body.prnumber, '', function(err,data){
pradapter.queryUpdateStatusPr(req, req.body.prnumber, "", function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
} else {
pradapter.queryUpdateStatusPr(req, "00000", "", function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
else{
pradapter.queryUpdateStatusPr(req,'00000','',function(err,data){
let statusCode = data!=null ? data.meta.code : 200 ;
if(err) statusCode = 500;
pradapter.sendResponse(statusCode,data, res);
});
}
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.setUpdateStatusProld = (req, res) => {
try {
let status = req.body.status;
let idxpr = req.body.idxpr;
if (status == 0) {
// if(0==1){
req.query.id = idxpr;
@ -165,88 +196,134 @@ exports.setUpdateStatusProld = ( req, res ) => {
let x_pr_type = "X";
let pr_no = "00010";
let pr_qtyacc = "01";
let pr_date = rsdata.data[0]['prdateYmd']; //Ymd
let pr_budget = "00"+rsdata.data[0]['glaccount'];
let pr_costcenter = rsdata.data[0]['costcenter'];
let pr_date = rsdata.data[0]["prdateYmd"]; //Ymd
let pr_budget = "00" + rsdata.data[0]["glaccount"];
let pr_costcenter = rsdata.data[0]["costcenter"];
let pr_profitcenter = "TIL1A01"; //rsdata.data[0]['profitcenter'];
let pr_shorttext =rsdata.data[0]['description'];
let pr_qtyitem =rsdata.data[0]['qty'];
let pr_unititem =rsdata.data[0]['unit'];
let pr_priceitem =rsdata.data[0]['netprice'];
let pr_shorttext = rsdata.data[0]["description"];
let pr_qtyitem = rsdata.data[0]["qty"];
let pr_unititem = rsdata.data[0]["unit"];
let pr_priceitem = rsdata.data[0]["netprice"];
// let pr_account="00010|01||20130727||||0051331006|TIL1|TIL1A01|||||||||||TIL1A01||||||||||||||||||||||";
let pr_account= pr_no+"|"+pr_qtyacc+"||"+pr_date+"||||"+pr_budget+"|TIL1|"+pr_costcenter+"|||||||||||"+pr_profitcenter+"||||||||||||||||||||||";
let pr_account =
pr_no +
"|" +
pr_qtyacc +
"||" +
pr_date +
"||||" +
pr_budget +
"|TIL1|" +
pr_costcenter +
"|||||||||||" +
pr_profitcenter +
"||||||||||||||||||||||";
// let pr_item="00010|||120|Putra|testcreatePR|||||||||1603||TrackNo1|ZSRV||1|BH||20130727||20130727|||1000|1||J||||||||1603|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||D|";
let pr_item=pr_no+"|||120|Putra|"+pr_shorttext+"|||||||||1603||TrackNo1|ZSRV||"+pr_qtyitem+"|"+pr_unititem+"||"+pr_date+"||"+pr_date+"|||"+pr_priceitem+"|1||J||||||||1603|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||D|";
let pr_item =
pr_no +
"|||120|Putra|" +
pr_shorttext +
"|||||||||1603||TrackNo1|ZSRV||" +
pr_qtyitem +
"|" +
pr_unititem +
"||" +
pr_date +
"||" +
pr_date +
"|||" +
pr_priceitem +
"|1||J||||||||1603|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||D|";
let resuri = {
'method': 'POST',
"method": "POST",
// 'url': baseurl+'signon',
'url': baseurlsap+'/createPr?pr_type='+pr_type+'&x_pr_type=X&praccount[]='+pr_account+'&pritem[]='+pr_item,
'headers': {
'Content-Type': 'application/json',
'x-api-key' : apikeysap
"url":
process.env.SAP_API_BASE_URL +
"/createPr?pr_type=" +
pr_type +
"&x_pr_type=X&praccount[]=" +
pr_account +
"&pritem[]=" +
pr_item,
"headers": {
"Content-Type": "application/json",
"x-api-key": process.env.SAP_API_KEY,
},
// form: formjson,
};
console.log(resuri);
const logData = {
ref_code: rsdata.data[0]["justificationnumber"] ?? idxpr,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url:
process.env.SAP_API_BASE_URL +
"/createPr?pr_type=" +
pr_type +
"&x_pr_type=X&praccount[]=" +
pr_account +
"&pritem[]=" +
pr_item,
};
request(resuri, function (error, response) {
// console.log('response.body', response.body)
logData.response_at = new Date();
logData.response = error ? JSON.stringify(error) : response.body;
sapadapter.queryInsertSapLog(idxpr, logData, "CREATE_PR");
if (error) {
console.log(error);
apireshandler.message = error.toString();
pradapter.sendResponse(400, apireshandler, res);
}
else
{
// console.log(response.body);
} else {
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata['RETURN'].forEach(e => {
if(e.TYPE=='E'){
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) {
pradapter.queryUpdateSapMessage(req, errmsg, function (err, data) {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
apireshandler.meta.message = "Failed to Create PR SAP";
pradapter.sendResponse(200, apireshandler, res);
}
else{
pradapter.queryUpdateStatusPr(req,resdata['NUMBER'], errmsg, function(err,data){
});
} else {
pradapter.queryUpdateStatusPr(req, resdata["NUMBER"], errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
// apireshandler.success = true;
}
}
});
//pradapter.sendResponse(statusCode,data, res);
}
});
}
else{
pradapter.queryUpdateStatusPr(req,'00000','',function(err,data){
} else {
pradapter.queryUpdateStatusPr(req, null, "", function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [123] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.deletePR = (req, res) => {
try {
@ -255,13 +332,12 @@ exports.deletePR = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [138] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.approvedPR = (req, res) => {
try {
@ -270,13 +346,12 @@ exports.approvedPR = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [153] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.getprmanagementlist = (req, res) => {
try {
@ -285,13 +360,12 @@ exports.getprmanagementlist = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [260] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.getprmanagementlistdetail = (req, res) => {
try {
@ -300,13 +374,12 @@ exports.getprmanagementlistdetail = ( req, res ) => {
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [275] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.releasePRSAP = (req, res) => {
try {
@ -319,33 +392,45 @@ exports.releasePRSAP = ( req, res ) => {
pradapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
let prnumber = rsdata.data[0]['prnumber']; //Ymd
let prnumber = rsdata.data[0]["prnumber"]; //Ymd
let resuri = {
'method': 'POST',
"method": "POST",
// 'url': baseurl+'signon',
'url': baseurlsap+'/releasePr?number='+prnumber+'&rel_code=A1',
'headers': {
'Content-Type': 'application/json',
'x-api-key' : apikeysap
"url": baseurlsap + "/releasePr?number=" + prnumber + "&rel_code=A1",
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: prnumber,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url: baseurlsap + "/releasePr?number=" + prnumber + "&rel_code=A1",
};
// 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_PR");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
pradapter.sendResponse(400, apireshandler, res);
}
else
{
} else {
console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata['RETURN'].forEach(e => {
if(e.TYPE=='E'){
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
@ -356,11 +441,10 @@ exports.releasePRSAP = ( req, res ) => {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// pradapter.sendResponse(200, apireshandler, res);
}
else{
} else {
apireshandler.success = true;
}
pradapter.queryUpdateStatusPr(req,'',errmsg, function(err,data){
pradapter.queryUpdateStatusPr(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
//data.data = resdata;
@ -372,14 +456,12 @@ exports.releasePRSAP = ( req, res ) => {
});
}
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [348] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.unreleasePRSAP = (req, res) => {
try {
@ -392,33 +474,45 @@ exports.unreleasePRSAP = ( req, res ) => {
pradapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
let prnumber = rsdata.data[0]['prnumber']; //Ymd
let prnumber = rsdata.data[0]["prnumber"]; //Ymd
let resuri = {
'method': 'POST',
"method": "POST",
// 'url': baseurl+'signon',
'url': baseurlsap+'/unreleasePr?number='+prnumber+'&rel_code=A1',
'headers': {
'Content-Type': 'application/json',
'x-api-key' : apikeysap
"url": baseurlsap + "/unreleasePr?number=" + prnumber + "&rel_code=A1",
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: prnumber,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url: baseurlsap + "/unreleasePr?number=" + prnumber + "&rel_code=A1",
};
// 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_PR");
if (error) {
// console.log(error);
apireshandler.message = error.toString();
pradapter.sendResponse(400, apireshandler, res);
}
else
{
} else {
console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata['RETURN'].forEach(e => {
if(e.TYPE=='E'){
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
@ -429,8 +523,7 @@ exports.unreleasePRSAP = ( req, res ) => {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// pradapter.sendResponse(200, apireshandler, res);
}
else{
} else {
apireshandler.success = true;
}
// else{
@ -440,7 +533,7 @@ exports.unreleasePRSAP = ( req, res ) => {
// pradapter.sendResponse(statusCode,data, res);
// });
// }
pradapter.queryUpdateStatusPr(req,'',errmsg, function(err,data){
pradapter.queryUpdateStatusPr(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
//data.data = resdata;
@ -452,30 +545,27 @@ exports.unreleasePRSAP = ( req, res ) => {
});
}
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [413] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.changePRSAP = (req, res) => {
try {
pradapter.queryUpdateStatusPr(req,'','', function(err,data){
pradapter.queryUpdateStatusPr(req, "", "", function (err, data) {
console.log(data);
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
pradapter.sendResponse(statusCode, data, res);
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [522] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.changePRSAPold = (req, res) => {
try {
@ -492,46 +582,98 @@ exports.changePRSAPold = ( req, res ) => {
// console.log(rsdata["data"]);
let pr_no = "00010";
let pr_qtyacc = "01";
let pr_number = rsdata.data[0]['prnumber']; //Ymd
let pr_date = rsdata.data[0]['prdateYmd']; //Ymd
let pr_budget = "00"+rsdata.data[0]['glaccount'];
let pr_costcenter = rsdata.data[0]['costcenter'];
let pr_number = rsdata.data[0]["prnumber"]; //Ymd
let pr_date = rsdata.data[0]["prdateYmd"]; //Ymd
let pr_budget = "00" + rsdata.data[0]["glaccount"];
let pr_costcenter = rsdata.data[0]["costcenter"];
let pr_profitcenter = "TIL1A01"; //rsdata.data[0]['profitcenter'];
let pr_shorttext =rsdata.data[0]['description'];
let pr_qtyitem =rsdata.data[0]['qty'];
let pr_unititem =rsdata.data[0]['unit'];
let pr_priceitem =rsdata.data[0]['netprice'];
let pr_shorttext = rsdata.data[0]["description"];
let pr_qtyitem = rsdata.data[0]["qty"];
let pr_unititem = rsdata.data[0]["unit"];
let pr_priceitem = rsdata.data[0]["netprice"];
// let pr_account="00010|01||20130727||||0051331006|TIL1|TIL1A01|||||||||||TIL1A01||||||||||||||||||||||";
let pr_account= pr_no+"|"+pr_qtyacc+"||"+pr_date+"||||"+pr_budget+"|TIL1|"+pr_costcenter+"|||||||||||"+pr_profitcenter+"||||||||||||||||||||||";
let pr_account =
pr_no +
"|" +
pr_qtyacc +
"||" +
pr_date +
"||||" +
pr_budget +
"|TIL1|" +
pr_costcenter +
"|||||||||||" +
pr_profitcenter +
"||||||||||||||||||||||";
// let pr_item="00010|||120|Putra|testcreatePR|||||||||1603||TrackNo1|ZSRV||1|BH||20130727||20130727|||1000|1||J||||||||1603|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||D|";
let pr_item=pr_no+"|||120|Putra|"+pr_shorttext+"|||||||||1603||TrackNo1|ZSRV||"+pr_qtyitem+"|"+pr_unititem+"||"+pr_date+"||"+pr_date+"|||"+pr_priceitem+"|1||J||||||||1603||||||||||||||||||||||||||||||||||||||||USD|||||||||||||||||||D|";
let pr_item =
pr_no +
"|||120|Putra|" +
pr_shorttext +
"|||||||||1603||TrackNo1|ZSRV||" +
pr_qtyitem +
"|" +
pr_unititem +
"||" +
pr_date +
"||" +
pr_date +
"|||" +
pr_priceitem +
"|1||J||||||||1603||||||||||||||||||||||||||||||||||||||||USD|||||||||||||||||||D|";
let resuri = {
'method': 'POST',
"method": "POST",
// 'url': baseurl+'signon',
'url': baseurlsap+'/changePR?number='+pr_number+'&praccount[]='+pr_account+'&pritem[]='+pr_item,
'headers': {
'Content-Type': 'application/json',
'x-api-key' : apikeysap
"url":
baseurlsap +
"/changePR?number=" +
pr_number +
"&praccount[]=" +
pr_account +
"&pritem[]=" +
pr_item,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
const logData = {
ref_code: pr_number,
request: JSON.stringify(resuri),
request_at: new Date(),
request_by: "999999",
response: "",
response_at: "",
url:
baseurlsap +
"/changePR?number=" +
pr_number +
"&praccount[]=" +
pr_account +
"&pritem[]=" +
pr_item,
};
// 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_PR");
if (error) {
console.log(error);
apireshandler.message = error.toString();
pradapter.sendResponse(400, apireshandler, res);
}
else
{
} else {
// console.log("Change pR : "+response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata['RETURN'].forEach(e => {
resdata["RETURN"].forEach((e) => {
// console.log(e);
if(e.TYPE=='E'){
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
@ -542,11 +684,10 @@ exports.changePRSAPold = ( req, res ) => {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// pradapter.sendResponse(200, apireshandler, res);
}
else{
} else {
apireshandler.success = true;
}
pradapter.queryUpdateStatusPr(req,'',errmsg, function(err,data){
pradapter.queryUpdateStatusPr(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
//data.data = resdata;
@ -554,23 +695,18 @@ exports.changePRSAPold = ( req, res ) => {
apireshandler.data = data.data;
pradapter.sendResponse(statusCode, apireshandler, res);
});
}
});
//pradapter.sendResponse(statusCode,data, res);
}
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [522] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};
exports.deletePRSAP = (req, res) => {
try {
@ -583,14 +719,14 @@ exports.deletePRSAP = ( req, res ) => {
pradapter.sendResponse(statusCode, data, res);
} else {
var rsdata = JSON.parse(JSON.stringify(data));
let prnumber = rsdata.data[0]['prnumber']; //Ymd
let prnumber = rsdata.data[0]["prnumber"]; //Ymd
let resuri = {
'method': 'POST',
"method": "POST",
// 'url': baseurl+'signon',
'url': baseurlsap+'/deletePr?number='+prnumber,
'headers': {
'Content-Type': 'application/json',
'x-api-key' : apikeysap
"url": baseurlsap + "/deletePr?number=" + prnumber,
"headers": {
"Content-Type": "application/json",
"x-api-key": apikeysap,
},
// form: formjson,
};
@ -601,15 +737,13 @@ exports.deletePRSAP = ( req, res ) => {
// console.log(error);
apireshandler.message = error.toString();
pradapter.sendResponse(400, apireshandler, res);
}
else
{
} else {
// console.log(response.body);
var resdata = JSON.parse(response.body);
var errcode = "";
var errmsg = "";
resdata['RETURN'].forEach(e => {
if(e.TYPE=='E'){
resdata["RETURN"].forEach((e) => {
if (e.TYPE == "E") {
errcode += e.NUMBER + ", ";
errmsg += e.MESSAGE + " & ";
}
@ -620,8 +754,7 @@ exports.deletePRSAP = ( req, res ) => {
apireshandler.meta.code = errcode;
apireshandler.meta.message = errmsg;
// pradapter.sendResponse(200, apireshandler, res);
}
else{
} else {
apireshandler.success = true;
}
// else{
@ -631,7 +764,7 @@ exports.deletePRSAP = ( req, res ) => {
// pradapter.sendResponse(statusCode,data, res);
// });
// }
pradapter.queryUpdateStatusPr(req,'',errmsg, function(err,data){
pradapter.queryUpdateStatusPr(req, "", errmsg, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
//data.data = resdata;
@ -643,11 +776,9 @@ exports.deletePRSAP = ( req, res ) => {
});
}
});
}
catch(err){
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [413] : PR controller, " + err.toString();
pradapter.sendResponse(502, apireshandler, res);
}
}
};

110
controllers/sap_account.js Normal file
View File

@ -0,0 +1,110 @@
const SAPAccountAdapter = require("../adapter/sapaccountadapter.js");
const sapaccountadapter = new SAPAccountAdapter();
const Controllers = require("./controller.js");
const controllers = new Controllers();
var apireshandler = controllers.getApiResultDefined();
/* ================= LIST ================= */
exports.list = (req, res) => {
try {
sapaccountadapter.queryList(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [20] : SAP Account controller, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= CREATE ================= */
exports.create = (req, res) => {
try {
sapaccountadapter.queryCreate(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [21] : SAP Account create, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= UPDATE ================= */
exports.update = (req, res) => {
try {
sapaccountadapter.queryUpdate(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [22] : SAP Account update, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= DELETE (SOFT DELETE) ================= */
exports.delete = (req, res) => {
try {
sapaccountadapter.queryDelete(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [23] : SAP Account delete, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= DETAIL ================= */
exports.detail = (req, res) => {
try {
sapaccountadapter.queryDetail(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [24] : SAP Account detail, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= ACTIVATE SAP ================= */
exports.activate = (req, res) => {
try {
sapaccountadapter.queryActivate(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [25] : SAP Account activate, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};
/* ================= CURRENT SAP ================= */
exports.current = (req, res) => {
try {
sapaccountadapter.queryCurrent(req, function (err, data) {
let statusCode = data != null ? data.meta.code : 200;
if (err) statusCode = 500;
sapaccountadapter.sendResponse(statusCode, data, res);
});
} catch (err) {
apireshandler.meta.code = 502;
apireshandler.meta.message = " [26] : SAP Account current, " + err.toString();
sapaccountadapter.sendResponse(502, apireshandler, res);
}
};

View File

@ -0,0 +1,74 @@
const multer = require('multer');
const path = require('path');
var imageStorage = multer.diskStorage({
// Destination to store image
// destination: 'assets/images/'+pathDir,
destination: (req, file, cb) => {
// console.log(req.get("path"));
// let pathdir = req.get("path");
cb(null, "assets/sap-po/")
// cb(null, "assets/words/" + pathdir + "/")
},
filename : (req, file, cb) => {
// let filename=file.originalname.split(".")[0];
let nik = req.nik;
let filedoc = 'sap_po_'+nik+'_' + Date.now() + path.extname(file.originalname);
// req.body.filedoc = filedoc;
// cb(null, filedoc);
req.body.filename = filedoc;
cb(null, filedoc);
// file.fieldname is name of the field (image)
// path.extname get the uploaded file extension
}
});
var imageUpload = multer({
storage: imageStorage,
limits: {
fileSize: '25mb' // 1000000 Bytes = 5 MB
},
fileFilter(req, file, cb) {
if (!file.originalname.match(/\.(docx|pdf|PDF)$/)) {
// if (!file.originalname.match(/\.(docx)$/)) {
// upload only png and jpg format
req.fileValidationError = "Please upload a word document in ( docx ) / pdf file max 25 mb";
cb(new Error('Please upload a word document in ( docx ) / pdf file max 25 mb'), false);
}
else{
cb(null, true);
}
}
}).single("file-doc");
module.exports = (req, res, next) => {
try {
imageUpload(req,res, function(err){
try {
// if (err || err instanceof multer.MulterError){
if (err){
res.status(500).send({
"meta":{
"auth": false,
"code" : 500,
"message" : req.fileValidationError || err.toString(),
},
"data" :[]
});
} else {
next();
// console.log('The filename is ' + res.req.file.filename);
}
} catch (error) {
console.log("error "+error);
}
});
} catch (error) {
console.log("error " + error);
error.message = error.message;
error.statusCode = 500;
throw error;
}
}

View File

@ -4,6 +4,9 @@ const pocontroller = require('../controllers/po');
const jwtauth = require('../middlewares/auth.js');
const uploadfile = require('../middlewares/multer/po-doc.js');
const uploadfileBoq = require('../middlewares/multer/poboq-csv.js');
const uploadfilePO = require('../middlewares/multer/singlepo.js');
const router=express.Router();
router.get('/getlistvendor',[jwtauth], pocontroller.getListVendor);
@ -24,13 +27,15 @@ router.get('/getpomigolist',[jwtauth], pocontroller.getPOMigoList);
router.get('/getpomigodetaillist',[jwtauth], pocontroller.getPOMigoDetailList);
// === SAP Enpoint
router.post('/createposap',[jwtauth], pocontroller.createPOSAP);
router.post('/createmigosap',[jwtauth], pocontroller.createMIGOPOSAP);
router.post('/createposap',[jwtauth], pocontroller.createPOSAPold);
router.post('/createmigosap',[jwtauth], pocontroller.createMIGOPOSAPold);
router.post('/changeposap',[jwtauth], pocontroller.changePOSAP);
router.post('/releaseposap',[jwtauth], pocontroller.releasePOSAP);
router.post('/unreleaseposap',[jwtauth], pocontroller.unreleasePOSAP);
router.post('/createheaderposap',[jwtauth], pocontroller.createHeaderPOSAP);
// === Upload PO SAP
router.post('/uploadpo',[jwtauth, uploadfilePO], pocontroller.uploadPOSAP);
// === PO Adjustment
router.post('/newpoadj',[jwtauth, uploadfile], pocontroller.newpoadjustment);

View File

@ -14,12 +14,12 @@ router.post('/prlist',[jwtauth], prcontroller.getListPr);
router.post('/setnewpr',[jwtauth], prcontroller.setNewPr);
router.post('/updatepr',[jwtauth], prcontroller.setUpdatePr);
router.post('/approvedpr',[jwtauth], prcontroller.approvedPR);
router.post('/updatestatuspr',[jwtauth], prcontroller.setUpdateStatusPr);
router.post('/updatestatuspr',[jwtauth], prcontroller.setUpdateStatusProld);
router.post('/deletepr',[jwtauth], prcontroller.deletePR);
// ==== SAP Part
router.post('/releaseprsap',[jwtauth], prcontroller.releasePRSAP);
router.post('/unreleaseprsap',[jwtauth], prcontroller.unreleasePRSAP);
router.post('/changeprsap',[jwtauth], prcontroller.changePRSAP);
router.post('/changeprsap',[jwtauth], prcontroller.changePRSAPold);
router.post('/deleteprsap',[jwtauth], prcontroller.deletePRSAP);
module.exports = router;

14
routes/sap.js Normal file
View File

@ -0,0 +1,14 @@
const express = require("express");
const sapcontroller = require("../controllers/sap_account.js");
const jwtauth = require("../middlewares/auth.js");
const router = express.Router();
router.get("/list", [jwtauth], sapcontroller.list);
router.post("/create", [jwtauth], sapcontroller.create);
router.post("/update/:id", [jwtauth], sapcontroller.update);
router.delete("/delete/:id", [jwtauth], sapcontroller.delete);
router.get("/detail/:id", [jwtauth], sapcontroller.detail);
router.post("/activate/:id", [jwtauth], sapcontroller.activate);
router.get("/current", [jwtauth], sapcontroller.current);
module.exports = router;