From 75bb5939f4bbecf676de1e8ef0a147892c3da844 Mon Sep 17 00:00:00 2001 From: "MSI\\2Fi" Date: Thu, 9 Jan 2025 16:26:23 +0800 Subject: [PATCH] Update Dashboard Update Financial Status Report --- .../modules/data/service/DashboardService.kt | 24 +++++++++++++++--- .../web/models/ExportDashboardExcelRequest.kt | 4 ++- .../modules/report/service/ReportService.kt | 10 +++++--- ...hboard] Financial Summary for project.xlsx | Bin 13436 -> 13601 bytes 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt index ba2c720..394d060 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt @@ -3867,7 +3867,7 @@ open class DashboardService( } createCell(10).apply { - setCellValue(financialSummaryByProject.cumulativeExpenditure) + setCellValue(financialSummaryByProject.totalExpenditure) cellStyle.apply { setFont(normalFont) dataFormat = accountingStyle @@ -3876,7 +3876,7 @@ open class DashboardService( } createCell(11).apply { - setCellValue(financialSummaryByProject.totalInvoiced) + setCellValue(financialSummaryByProject.manhoursExpenditure) cellStyle.apply { setFont(normalFont) dataFormat = accountingStyle @@ -3885,7 +3885,7 @@ open class DashboardService( } createCell(12).apply { - cellFormula = "IF(I${rowIndex}-L${rowIndex}<0,0,I${rowIndex}-L${rowIndex})" + setCellValue(financialSummaryByProject.projectExpense) cellStyle.apply { setFont(normalFont) dataFormat = accountingStyle @@ -3894,6 +3894,24 @@ open class DashboardService( } createCell(13).apply { + setCellValue(financialSummaryByProject.totalInvoiced) + cellStyle.apply { + setFont(normalFont) + dataFormat = accountingStyle + } + CellUtil.setAlignment(this, HorizontalAlignment.RIGHT) + } + + createCell(14).apply { + cellFormula = "IF(I${rowIndex}-L${rowIndex}<0,0,I${rowIndex}-N${rowIndex})" + cellStyle.apply { + setFont(normalFont) + dataFormat = accountingStyle + } + CellUtil.setAlignment(this, HorizontalAlignment.RIGHT) + } + + createCell(15).apply { setCellValue(financialSummaryByProject.totalReceived) cellStyle.apply { setFont(normalFont) diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt index 6236ac3..9b87a43 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt @@ -30,7 +30,9 @@ data class FinancialSummaryByProject ( val subsidiaryName: String?, val totalFee: Double, val totalBudget: Double, - val cumulativeExpenditure: Double, + val totalExpenditure: Double, + val manhoursExpenditure: Double, + val projectExpense: Double, val totalInvoiced: Double, val totalReceived: Double, ) 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 0059f45..5649623 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 @@ -506,7 +506,7 @@ open class ReportService( val descriptionCell = row.createCell(1) descriptionCell.setCellValue( - if (item["description"] != null) item.getValue("description").toString() else "N/A" + if (item["name"] != null) item.getValue("name").toString() else "N/A" ) val clientCell = row.createCell(2) @@ -587,7 +587,8 @@ open class ReportService( val uninvoiceCell = row.createCell(14) uninvoiceCell.apply { cellFormula = - " IF(H${rowNum}-N${rowNum}<0, 0, H${rowNum}-N${rowNum})" + " H${rowNum}-N${rowNum} " +// " IF(H${rowNum}-N${rowNum}<0, 0, H${rowNum}-N${rowNum})" // " IF(I${rowNum}<=J${rowNum}, I${rowNum}-L${rowNum}, IF(AND(I${rowNum}>J${rowNum}, J${rowNum}J${rowNum}, J${rowNum}>=L${rowNum}), J${rowNum}-L${rowNum}, 0))) " cellStyle.dataFormat = accountingStyle } @@ -695,7 +696,8 @@ open class ReportService( val sumUInvoiceCell = row.createCell(14) sumUInvoiceCell.apply { - cellFormula = "IF(H${rowNum+1}-N${rowNum+1}<0,0,H${rowNum+1}-N${rowNum+1})" +// cellFormula = "IF(H${rowNum+1}-N${rowNum+1}<0,0,H${rowNum+1}-N${rowNum+1})" + cellFormula = " H${rowNum+1}-N${rowNum+1} " cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } @@ -2195,7 +2197,7 @@ open class ReportService( + " where pe.deleted = false " + " group by projectId " + " ) " - + " select p.code, p.description, c.name as client, IFNULL(s2.name, \"N/A\") as subsidiary, concat(t.code, \' - \', t.name) as teamLead, p.planStart , p.planEnd , p.expectedTotalFee, ifnull(p.subContractFee, 0) as subContractFee, " + + " select p.code, p.name, p.description, c.name as client, IFNULL(s2.name, \"N/A\") as subsidiary, concat(t.code, \' - \', t.name) as teamLead, p.planStart , p.planEnd , p.expectedTotalFee, ifnull(p.subContractFee, 0) as subContractFee, " + " IFNULL(cte_i.sumIssuedAmount, 0) as sumIssuedAmount, IFNULL(cte_i.sumPaidAmount, 0) as sumPaidAmount" + " ,0 as totalCumulativeExpenditure, IFNULL(cte_e.amount,0) as projectExpense " + " from project p" diff --git a/src/main/resources/templates/report/[Dashboard] Financial Summary for project.xlsx b/src/main/resources/templates/report/[Dashboard] Financial Summary for project.xlsx index bb7e7f97629c7dfa66db29d9b23d459f2a5a3c52..4c31e489751fdffe7b650069971a096a916f1985 100644 GIT binary patch delta 5123 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