Files
backend-Eprocurement/adapter/dashboardadapter.js
Rizki b2c866d793 upd
2026-03-16 16:16:25 +07:00

543 lines
13 KiB
JavaScript

const db = require("../config/dbproc.js");
const Adapter = require("./dbadapter.js");
const libre = require("libreoffice-convert");
libre.convertAsync = require("util").promisify(libre.convert);
class DashboardAdapter extends Adapter {
constructor() {
super();
}
async queryDashboardSummary(req, callback) {
var apires = this.getApiResultDefined();
try {
let nik = req.query.nik || "";
let year = req.query.year || new Date().getFullYear();
let startDate = year + "-01-01";
let endDate = parseInt(year) + 1 + "-01-01";
let qry = `
SELECT
(
SELECT COALESCE(SUM(amount),0)
FROM tbl_requestbudget
WHERE isdeleted = 0 AND years = ? AND tbl_requestbudget.isused = 0
${nik != "" ? " AND iby=?" : ""}
) AS total_requested_budget,
(
SELECT COALESCE(SUM(amount),0)
FROM tbl_budgetcapexinfo
WHERE isdeleted = 0 AND years = ?
${nik != "" ? " AND iby=?" : ""}
) AS total_remaining_budget,
(
SELECT COALESCE(SUM(amount),0)
FROM tbl_justification
WHERE isdeleted = 0
AND idt >= ?
AND idt < ?
${nik != "" ? " AND iby=?" : ""}
) AS total_used_budget
`;
const params = [year];
if (nik != "") {
params.push(nik);
}
params.push(year);
if (nik != "") {
params.push(nik);
}
params.push(startDate);
params.push(endDate);
if (nik != "") {
params.push(nik);
}
db.query(qry, params, (err, budgetResult) => {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
let budget = budgetResult[0];
budget.total_budget =
parseFloat(budget.total_remaining_budget) +
parseFloat(budget.total_requested_budget) +
+parseFloat(budget.total_used_budget);
/* JUSTIFICATION */
let qryJustification = `
SELECT
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS total_approved,
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS total_submitted,
SUM(CASE WHEN status = -1 THEN 1 ELSE 0 END) AS total_draft,
SUM(CASE WHEN status = 2 AND iscreatepr = 1 THEN 1 ELSE 0 END) AS total_created_pr
FROM tbl_justification
WHERE isdeleted = 0
AND idt >= ?
AND idt < ?
${nik != "" ? " AND iby=?" : ""}
`;
const params = [startDate, endDate];
if (nik != "") params.push(nik);
db.query(qryJustification, params, (err, justificationResult) => {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
/* PURCHASE REQUEST */
let qryPR = `
SELECT
SUM(CASE WHEN status in (2,4,5,6,7) THEN 1 ELSE 0 END) AS total_approved,
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS total_submitted
FROM tbl_pr
WHERE isdeleted = 0
AND idt >= ?
AND idt < ?
${nik != "" ? " AND iby=?" : ""}
`;
const params = [startDate, endDate];
if (nik != "") params.push(nik);
db.query(qryPR, params, (err, prResult) => {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
/* PURCHASE ORDER */
let qryPO = `
SELECT
SUM(CASE WHEN status in (3,4,5,6,7) THEN 1 ELSE 0 END) AS total_approved,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS total_created,
SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS total_bast
FROM tbl_po
WHERE isdeleted = 0
AND idt >= ?
AND idt < ?
${nik != "" ? " AND iby=?" : ""}
`;
const params = [startDate, endDate];
if (nik != "") params.push(nik);
db.query(qryPO, params, (err, poResult) => {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
/* BAST */
let qryBast = `
SELECT
SUM(CASE WHEN (status = 1 and filehandoversign is NOT NULL) THEN 1 ELSE 0 END) AS total_approved_handover,
SUM(CASE WHEN (status = 1 and filehandoversign is NULL) THEN 1 ELSE 0 END) AS total_handovered,
SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS total_submitted
FROM tbl_bast
WHERE isdeleted = 0
AND idt >= ?
AND idt < ?
${nik != "" ? " AND iby=?" : ""}
`;
const params = [startDate, endDate];
if (nik != "") params.push(nik);
db.query(qryBast, params, (err, bastResult) => {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
apires.success = true;
apires.data = {
year: year,
justification: justificationResult[0],
purchase_request: prResult[0],
purchase_order: poResult[0],
bast: bastResult[0],
};
if (nik == "") {
apires.data.budget = budget
}
callback(null, apires);
});
});
});
});
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async queryBudgetLineChart(req, callback) {
var apires = this.getApiResultDefined();
try {
let year = req.query.year || new Date().getFullYear();
let qry = `
SELECT
SUM(amount) as used_budget,
MONTH(idt) as month
FROM tbl_justification
WHERE isdeleted=0
AND YEAR(idt)=?
GROUP BY MONTH(idt)
`;
db.query(qry, [year], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
let months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
let used = new Array(12).fill(0);
result.forEach((r) => {
used[r.month - 1] = r.used_budget;
});
apires.success = true;
apires.data = {
year: year,
months: months,
series: [
{
name: "Used Budget",
data: used,
},
],
};
callback(null, apires);
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async queryProcurementStackedChart(req, callback) {
var apires = this.getApiResultDefined();
try {
let nik = req.query.nik || "";
let year = req.query.year || new Date().getFullYear();
let start = year + "-01-01";
let end = parseInt(year) + 1 + "-01-01";
let months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
let justification = new Array(12).fill(0);
let pr = new Array(12).fill(0);
let po = new Array(12).fill(0);
let bast = new Array(12).fill(0);
// JUSTIFICATION
let qryJustification = `
SELECT MONTH(idt) as month, COUNT(*) total
FROM tbl_justification
WHERE isdeleted=0
AND idt>=? AND idt<? ${nik != "" ? " AND iby=?" : ""}
GROUP BY MONTH(idt)
`;
const params = [start, end];
if (nik != "") params.push(nik);
db.query(qryJustification, params, function (err, result) {
if (result) {
result.forEach((r) => {
justification[r.month - 1] = r.total;
});
}
// PR
let qryPR = `
SELECT MONTH(idt) as month, COUNT(*) total
FROM tbl_pr
WHERE isdeleted=0
AND idt>=? AND idt<? ${nik != "" ? " AND iby=?" : ""}
GROUP BY MONTH(idt)
`;
db.query(qryPR, params, function (err, result) {
if (result) {
result.forEach((r) => {
pr[r.month - 1] = r.total;
});
}
// PO
let qryPO = `
SELECT MONTH(idt) as month, COUNT(*) total
FROM tbl_po
WHERE isdeleted=0
AND idt>=? AND idt<? ${nik != "" ? " AND iby=?" : ""}
GROUP BY MONTH(idt)
`;
db.query(qryPO, params, function (err, result) {
if (result) {
result.forEach((r) => {
po[r.month - 1] = r.total;
});
}
// BAST
let qryBAST = `
SELECT MONTH(idt) as month, COUNT(*) total
FROM tbl_bast
WHERE isdeleted=0
AND idt>=? AND idt<? ${nik != "" ? " AND iby=?" : ""}
GROUP BY MONTH(idt)
`;
db.query(qryBAST, params, function (err, result) {
if (result) {
result.forEach((r) => {
bast[r.month - 1] = r.total;
});
}
apires.success = true;
apires.data = {
year: year,
months: months,
series: [
{name: "Justification", data: justification},
{name: "PR", data: pr},
{name: "PO", data: po},
{name: "BAST", data: bast},
],
};
callback(null, apires);
});
});
});
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async queryMonthlyBudgetUtilization(req, callback) {
var apires = this.getApiResultDefined();
try {
let year = req.query.year || new Date().getFullYear();
let qry = `
SELECT
MONTH(idt) as month,
SUM(amount) as used_budget
FROM tbl_justification
WHERE isdeleted=0
AND YEAR(idt)=?
GROUP BY MONTH(idt)
`;
db.query(qry, [year], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
let months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
let used = new Array(12).fill(0);
result.forEach((r) => {
used[r.month - 1] = r.used_budget;
});
apires.success = true;
apires.data = {
year: year,
months: months,
series: [
{
name: "Budget Utilization",
data: used,
},
],
};
callback(null, apires);
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async querySpendByUnitChart(req, callback) {
var apires = this.getApiResultDefined();
try {
let year = req.query.year || new Date().getFullYear();
let qry = `
SELECT
division,
SUM(amount) as total_used_budget
FROM tbl_justification
WHERE isdeleted = 0
AND idt >= CONCAT(?, '-01-01 00:00:00')
AND idt < CONCAT(? + 1, '-01-01 00:00:00')
AND division IN ('FBP','MarSal','MNO')
GROUP BY division
`;
db.query(qry, [year, year], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
let divisions = ["MNO", "MarSal", "FBP"];
let values = {
MNO: 0,
MarSal: 0,
FBP: 0,
};
result.forEach((r) => {
values[r.division] = r.total_used_budget;
});
let data = divisions.map((d) => values[d]);
let total = data.reduce((a, b) => a + b, 0);
apires.success = true;
apires.data = {
categories: divisions,
series: [
{
name: "Spend",
data: data,
},
],
total: total,
};
callback(null, apires);
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
async queryMyTask(req, callback) {
var apires = this.getApiResultDefined();
try {
let nik = req.query.nik;
let qry = `
SELECT *
FROM vw_my_task
WHERE nik = ?
ORDER BY date DESC
LIMIT 50
`;
db.query(qry, [nik], function (err, result) {
if (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
return callback("err", apires);
}
apires.success = true;
apires.data = result;
callback(null, apires);
});
} catch (err) {
apires.meta.code = 500;
apires.meta.message = err.toString();
callback("error", apires);
}
}
}
module.exports = DashboardAdapter;