543 lines
13 KiB
JavaScript
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;
|