From 326d3f40ed4c8db010204eb869d452a25d0afcfe Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Mon, 16 Sep 2024 16:44:39 +0800 Subject: [PATCH] update overconsumption with expense to totalConsumedBudget, and extra col: project expense --- .../modules/report/service/ReportService.kt | 17 +++++++++++++---- .../report/AR03_Resource Overconsumption.xlsx | Bin 13120 -> 13145 bytes 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt index 1e0f2a5..f34d0a0 100644 --- a/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt +++ b/src/main/java/com/ffii/tsms/modules/report/service/ReportService.kt @@ -2118,10 +2118,18 @@ open class ReportService( // } open fun getProjectResourceOverconsumptionReport(args: Map): List> { - val sql = StringBuilder( - " SELECT " + val sql = StringBuilder("with pe_cte as (" + + " select" + + " pe.projectId," + + " sum(coalesce(amount)) as expense" + + " from project_expense pe" + + " where deleted = false" + + " group by pe.projectId" + + " )" + + " SELECT " + " p.code, p.name, tm.code as team, concat(c.code, ' -',c.name) as client, COALESCE(concat(ss.code, ' -', ss.name), 'N/A') as subsidiary " - + " , (p.expectedTotalFee - ifnull(p.subContractFee, 0)) * 0.8 as plannedBudget, sum(t.consumedBudget) as actualConsumedBudget " + + " , (p.expectedTotalFee - ifnull(p.subContractFee, 0)) * 0.8 as plannedBudget, sum(t.consumedBudget) + coalesce(pc.expense, 0) as actualConsumedBudget " + + " , coalesce(pc.expense, 0) as projectExpense " + " , COALESCE(p.totalManhour, 0) as plannedManhour, sum(t.normalConsumed + COALESCE(t.otConsumed, 0)) as actualConsumedManhour " + " , sum(t.consumedBudget) / ((p.expectedTotalFee - ifnull(p.subContractFee, 0)) * 0.8) as budgetConsumptionRate " + " , sum(t.normalConsumed + COALESCE(t.otConsumed, 0)) / COALESCE(p.totalManhour, 0) as manhourConsumptionRate " @@ -2140,6 +2148,7 @@ open class ReportService( + " LEFT JOIN salary sal on se.salaryId = sal.salaryPoint " + " ) t " + " left join project p on p.id = t.projectId " + + " left join pe_cte pc on pc.projectId = t.projectId " + " left join team tm on p.teamLead = tm.teamLead " + " left join customer c on c.id = p.customerId " + " left join subsidiary ss on p.customerSubsidiaryId = ss.id " @@ -2168,7 +2177,7 @@ open class ReportService( else -> "" } } - sql.append(" group by p.code, p.name, tm.code, c.code, c.name, ss.code, ss.name, p.expectedTotalFee, p.subContractFee, p.totalManhour ") + sql.append(" group by p.code, p.name, tm.code, c.code, c.name, ss.code, ss.name, p.expectedTotalFee, p.subContractFee, p.totalManhour, pc.expense ") sql.append(statusFilter) return jdbcDao.queryForList(sql.toString(), args) } diff --git a/src/main/resources/templates/report/AR03_Resource Overconsumption.xlsx b/src/main/resources/templates/report/AR03_Resource Overconsumption.xlsx index 4700608072d0b307b3fa6e4c8fb2ceafb5cd05c3..631851349dcddde372cfefc1b56d68f133842284 100644 GIT binary patch delta 3328 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