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 { 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 { 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 { 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 { 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;