From b94fe4d2d4bf295f72a8e552c181152c77046ff3 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Sat, 29 Nov 2025 22:04:58 +0800 Subject: [PATCH] [Report] Add sub-teamlead column & update formula & fix bugs. (financial status report & P&L report) --- .../modules/report/service/ReportService.kt | 170 ++++++++++-------- .../report/AR07_Project P&L Report v02.xlsx | Bin 12589 -> 12531 bytes .../report/EX01_Financial Status Report.xlsx | Bin 13531 -> 13545 bytes 3 files changed, 95 insertions(+), 75 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 99b30f9..a8e6ac8 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 @@ -547,13 +547,16 @@ open class ReportService( val teamLeadCell = row.createCell(4) teamLeadCell.setCellValue(if (item["teamLead"] != null) item.getValue("teamLead").toString() else "N/A") - val startDateCell = row.createCell(5) + val subTeamLeadCell = row.createCell(5) + subTeamLeadCell.setCellValue(if (item["subTeamLead"] != null) item.getValue("subTeamLead").toString() else "N/A") + + val startDateCell = row.createCell(6) startDateCell.setCellValue(if (item["planStart"] != null) item.getValue("planStart").toString() else "N/A") - val endDateCell = row.createCell(6) + val endDateCell = row.createCell(7) endDateCell.setCellValue(if (item["planEnd"] != null) item.getValue("planEnd").toString() else "N/A") - val totalFeeCell = row.createCell(7) + val totalFeeCell = row.createCell(8) val totalFee = (item["expectedTotalFee"]?.let { it as Double } ?: 0.0) totalFeeCell.apply { @@ -566,19 +569,19 @@ open class ReportService( val fee = (item["expectedTotalFee"]?.let { it as Double } ?: 0.0) - val budgetCell = row.createCell(8) + val budgetCell = row.createCell(9) budgetCell.apply { setCellValue(fee.times(0.8)) cellStyle.dataFormat = accountingStyle } - val cumExpenditureCell = row.createCell(9) + val cumExpenditureCell = row.createCell(10) cumExpenditureCell.apply { - cellFormula = "K${rowNum} + L${rowNum}" + cellFormula = "L${rowNum} + M${rowNum}" cellStyle.dataFormat = accountingStyle } - val cumManHourSpentCell = row.createCell(10) + val cumManHourSpentCell = row.createCell(11) // val normalConsumed = item["normalConsumed"]?.let { it as BigDecimal } ?: BigDecimal(0) // val otConsumed = item["otConsumed"]?.let { it as BigDecimal } ?: BigDecimal(0) // val cumExpenditure = normalConsumed.add(otConsumed) @@ -588,20 +591,20 @@ open class ReportService( cellStyle.dataFormat = accountingStyle } - val projectExpenseCell = row.createCell(11) + val projectExpenseCell = row.createCell(12) val projectExpense = item["projectExpense"]?.let { it as BigDecimal } ?: BigDecimal(0) projectExpenseCell.apply { setCellValue(projectExpense.toDouble()) cellStyle.dataFormat = accountingStyle } - val budgetVCell = row.createCell(12) + val budgetVCell = row.createCell(13) budgetVCell.apply { - cellFormula = "I${rowNum} - J${rowNum}" + cellFormula = "J${rowNum} - K${rowNum}" cellStyle.dataFormat = accountingStyle } - val issuedCell = row.createCell(13) + val issuedCell = row.createCell(14) val issuedAmount = item["sumIssuedAmount"]?.let { it as BigDecimal } ?: BigDecimal(0) issuedCell.apply { setCellValue(issuedAmount.toDouble()) @@ -609,37 +612,37 @@ open class ReportService( cellStyle.dataFormat = accountingStyle } - val uninvoiceCell = row.createCell(14) + val uninvoiceCell = row.createCell(15) uninvoiceCell.apply { cellFormula = - " H${rowNum}-N${rowNum} " + " I${rowNum}-O${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 } - val cpiCell = row.createCell(15) + val cpiCell = row.createCell(16) cpiCell.apply { - cellFormula = "IF(J${rowNum} = 0, 0, N${rowNum}/(J${rowNum}))" + cellFormula = "IF(K${rowNum} = 0, 0, O${rowNum}/(K${rowNum}))" cellStyle = boldFontCellStyle } - val projectedCpiCell = row.createCell(16) + val projectedCpiCell = row.createCell(17) projectedCpiCell.apply { - cellFormula = "IF(J${rowNum} = 0, 0, H${rowNum}/(J${rowNum}))" + cellFormula = "IF(K${rowNum} = 0, 0, I${rowNum}/(K${rowNum}))" cellStyle = boldFontCellStyle } - val receivedAmountCell = row.createCell(17) + val receivedAmountCell = row.createCell(18) val paidAmount = item["sumPaidAmount"]?.let { it as BigDecimal } ?: BigDecimal(0) receivedAmountCell.apply { setCellValue(paidAmount.toDouble()) cellStyle.dataFormat = accountingStyle } - val unsettledAmountCell = row.createCell(18) + val unsettledAmountCell = row.createCell(19) unsettledAmountCell.apply { - cellFormula = "N${rowNum}-R${rowNum}" + cellFormula = "O${rowNum}-S${rowNum}" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } @@ -648,13 +651,13 @@ open class ReportService( val lastRowNum = rowNum + 1 val row: Row = sheet.createRow(rowNum) - for (i in 0..5) { + for (i in 0..6) { val cell = row.createCell(i) CellUtil.setCellStyleProperty(cell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(cell, "borderBottom", BorderStyle.DOUBLE) } - val subTotalCell = row.createCell(6) + val subTotalCell = row.createCell(7) subTotalCell.apply { setCellValue("Sub-total:") } @@ -662,85 +665,85 @@ open class ReportService( CellUtil.setCellStyleProperty(subTotalCell, "borderBottom", BorderStyle.DOUBLE) - val sumTotalFeeCell = row.createCell(7) + val sumTotalFeeCell = row.createCell(8) sumTotalFeeCell.apply { - cellFormula = "SUM(H15:H${rowNum})" + cellFormula = "SUM(I15:I${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumTotalFeeCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumTotalFeeCell, "borderBottom", BorderStyle.DOUBLE) - val sumBudgetCell = row.createCell(8) + val sumBudgetCell = row.createCell(9) sumBudgetCell.apply { - cellFormula = "SUM(I15:I${rowNum})" + cellFormula = "SUM(J15:J${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumBudgetCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumBudgetCell, "borderBottom", BorderStyle.DOUBLE) - val sumCumExpenditureCell = row.createCell(9) + val sumCumExpenditureCell = row.createCell(10) sumCumExpenditureCell.apply { - cellFormula = "SUM(J15:J${rowNum})" + cellFormula = "SUM(K15:K${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumCumExpenditureCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumCumExpenditureCell, "borderBottom", BorderStyle.DOUBLE) - val sumTotalManHourSpent = row.createCell(10) + val sumTotalManHourSpent = row.createCell(11) sumTotalManHourSpent.apply { - cellFormula = "SUM(K15:K${rowNum})" + cellFormula = "SUM(L15:L${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumTotalManHourSpent, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumTotalManHourSpent, "borderBottom", BorderStyle.DOUBLE) - val sumProjectExpenseCell = row.createCell(11) + val sumProjectExpenseCell = row.createCell(12) sumProjectExpenseCell.apply { - cellFormula = "SUM(L15:L${rowNum})" + cellFormula = "SUM(M15:M${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumProjectExpenseCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumProjectExpenseCell, "borderBottom", BorderStyle.DOUBLE) - val sumBudgetVCell = row.createCell(12) + val sumBudgetVCell = row.createCell(13) sumBudgetVCell.apply { - cellFormula = "SUM(M15:M${rowNum})" + cellFormula = "SUM(N15:N${rowNum})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumBudgetVCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumBudgetVCell, "borderBottom", BorderStyle.DOUBLE) - val sumIInvoiceCell = row.createCell(13) + val sumIInvoiceCell = row.createCell(14) sumIInvoiceCell.apply { - cellFormula = "SUM(N15:N${rowNum})" + cellFormula = "SUM(O15:O${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumIInvoiceCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumIInvoiceCell, "borderBottom", BorderStyle.DOUBLE) - val sumUInvoiceCell = row.createCell(14) + val sumUInvoiceCell = row.createCell(15) sumUInvoiceCell.apply { // cellFormula = "IF(H${rowNum+1}-N${rowNum+1}<0,0,H${rowNum+1}-N${rowNum+1})" - cellFormula = " H${rowNum+1}-N${rowNum+1} " + cellFormula = " I${rowNum+1}-O${rowNum+1} " cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumUInvoiceCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumUInvoiceCell, "borderBottom", BorderStyle.DOUBLE) - val lastCpiCell = row.createCell(15) + val lastCpiCell = row.createCell(16) lastCpiCell.apply { - cellFormula = "IF(J${rowNum+1}=0,0,N${rowNum+1}/J${rowNum+1})" + cellFormula = "IF(K${rowNum+1}=0,0,O${rowNum+1}/K${rowNum+1})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(lastCpiCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(lastCpiCell, "borderBottom", BorderStyle.DOUBLE) - val lastPCpiCell = row.createCell(16) + val lastPCpiCell = row.createCell(17) lastPCpiCell.apply { - cellFormula = "IF(J${rowNum+1}=0,0,H${rowNum+1}/J${rowNum+1})" + cellFormula = "IF(K${rowNum+1}=0,0,I${rowNum+1}/K${rowNum+1})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } @@ -748,17 +751,17 @@ open class ReportService( CellUtil.setCellStyleProperty(lastPCpiCell, "borderBottom", BorderStyle.DOUBLE) - val sumRAmountCell = row.createCell(17) + val sumRAmountCell = row.createCell(18) sumRAmountCell.apply { - cellFormula = "SUM(R15:R${rowNum})" + cellFormula = "SUM(S15:S${rowNum})" cellStyle.dataFormat = accountingStyle } CellUtil.setCellStyleProperty(sumRAmountCell, "borderTop", BorderStyle.THIN) CellUtil.setCellStyleProperty(sumRAmountCell, "borderBottom", BorderStyle.DOUBLE) - val sumUnSettleCell = row.createCell(18) + val sumUnSettleCell = row.createCell(19) sumUnSettleCell.apply { - cellFormula = "SUM(S15:S${rowNum})" + cellFormula = "SUM(T15:T${rowNum})" cellStyle = boldFontCellStyle cellStyle.dataFormat = accountingStyle } @@ -778,7 +781,7 @@ open class ReportService( row2Cell.setCellValue("All") } else { row2Cell.apply { - cellFormula = "E16" + cellFormula = "E17" } } @@ -796,7 +799,7 @@ open class ReportService( val row5: Row = sheet.getRow(rowNum) val cell1 = row5.createCell(2) cell1.apply { - cellFormula = "I${lastRowNum}" + cellFormula = "J${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -804,7 +807,7 @@ open class ReportService( val row6: Row = sheet.getRow(rowNum) val cell2 = row6.createCell(2) cell2.apply { - cellFormula = "J${lastRowNum}" + cellFormula = "K${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -812,7 +815,7 @@ open class ReportService( val row7: Row = sheet.getRow(rowNum) val cell3 = row7.createCell(2) cell3.apply { - cellFormula = "M${lastRowNum}" + cellFormula = "N${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -820,7 +823,7 @@ open class ReportService( val row8: Row = sheet.getRow(rowNum) val cell4 = row8.createCell(2) cell4.apply { - cellFormula = "N${lastRowNum}" + cellFormula = "O${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -828,7 +831,7 @@ open class ReportService( val row9: Row = sheet.getRow(rowNum) val cell5 = row9.createCell(2) cell5.apply { - cellFormula = "O${lastRowNum}" + cellFormula = "P${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -836,7 +839,7 @@ open class ReportService( val row10: Row = sheet.getRow(rowNum) val cell6 = row10.createCell(2) cell6.apply { - cellFormula = "R${lastRowNum}" + cellFormula = "S${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -844,7 +847,7 @@ open class ReportService( val row11: Row = sheet.getRow(rowNum) val cell7 = row11.createCell(2) cell7.apply { - cellFormula = "S${lastRowNum}" + cellFormula = "T${lastRowNum}" cellStyle.dataFormat = accountingStyle } @@ -2262,6 +2265,7 @@ open class ReportService( + " group by p.id" + " ) " + " 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, " + + " concat(t.code, \' - \', s.staffId, \' - \', s.name) as subTeamLead," + " p.planStart , p.planEnd ," + " IFNULL(cte_f.expectedTotalFee, 0) as expectedTotalFee, ifnull(p.subContractFee, 0) as subContractFee, " + " IFNULL(cte_i.sumIssuedAmount, 0) as sumIssuedAmount, IFNULL(cte_ri.sumPaidAmount, 0) as sumPaidAmount" @@ -2272,6 +2276,8 @@ open class ReportService( + " left join customer_subsidiary cs on cs.id = p.customerSubsidiaryId" + " left join subsidiary s2 on s2.id = cs.subsidiaryId " + " left join tsmsdb.team t on t.teamLead = p.teamLead" + + " left join staff s on s.id = p.subTeamLead" + + " left join team st on st.id = s.teamId" + " left join cte_invoice cte_i on cte_i.code = p.code" + " left join cte_rinvoice cte_ri on cte_ri.code = p.code" + " left join cte_expense cte_e on cte_e.projectId = p.id " @@ -2580,7 +2586,7 @@ open class ReportService( // } private fun updateInfo(info: MutableMap, item: Map) { - val simpleFields = listOf("teamLead", "client", "code", "description") + val simpleFields = listOf("teamLead", "subTeamLead", "subsidiary", "client", "code", "description") val conditionalFields = mapOf( "paidAmount" to "sumPaidAmount", "subsidiary" to "subsidiary", @@ -2655,6 +2661,7 @@ open class ReportService( + " and (DATE_FORMAT(pe.issueDate, '%Y-%m') >= :startMonth and DATE_FORMAT(pe.issueDate, '%Y-%m') <= :endMonth) " + " ) " + " select p.code, p.description, c.name as client, IFNULL(s2.name, \"N/A\") as subsidiary, concat(t.code, \" - \", t.name) as teamLead," + + " concat(stlt.code, \" - \", stl.staffId, \" - \", stl.name) as subTeamLead," + " IFNULL(cte_ts.normalConsumed, 0) as normalConsumed, IFNULL(cte_ts.otConsumed, 0) as otConsumed, DATE_FORMAT(cte_ts.recordDate, '%Y-%m') as recordDate, " + " IFNULL(cte_ts.salaryPoint, 0) as salaryPoint, " + " (p.expectedTotalFee - IFNULL(cte_Ii.sumIssuedAmount, 0)) as expectedTotalFee, " @@ -2665,6 +2672,8 @@ open class ReportService( + " left join cte_timesheet_sum cte_tss on p.code = cte_tss.code" + " left join customer c on c.id = p.customerId" + " left join tsmsdb.team t on t.teamLead = p.teamLead" + + " left join staff stl on stl.id = p.subTeamLead" + + " left join team stlt on stlt.id = stl.teamId" + " left join cte_Iinvoice cte_Ii on cte_Ii.code = p.code" + " left join cte_Rinvoice cte_Ri on cte_Ri.code = p.code" + " left join staff s on s.id = cte_ts.staffId" @@ -2705,7 +2714,7 @@ open class ReportService( val manHoursSpent = jdbcDao.queryForList(sql.toString(), args) val projectCodeSql = StringBuilder( - "select p.code, p.description from project p where p.deleted = false and p.id = :projectId" + "select p.name, p.code, p.description from project p where p.deleted = false and p.id = :projectId" ) val projectExpenseSql = StringBuilder( @@ -2729,6 +2738,7 @@ open class ReportService( "startMonth" to startMonth, "endMonth" to endMonth, "code" to projectsCode["code"], + "name" to projectsCode["name"], "description" to projectsCode["description"], "projectExpense" to projectExpense["amount"] ) @@ -3140,6 +3150,11 @@ open class ReportService( val row6Cell = row6.getCell(1) row6Cell.setCellValue("-") + rowNum = 7 + val row7: Row = sheet.getRow(rowNum) + val row7Cell = row6.getCell(1) + row7Cell.setCellValue("-") + return workbook } @@ -3163,7 +3178,7 @@ open class ReportService( rowNum = 4 val row4: Row = sheet.getRow(rowNum) val row4Cell = row4.getCell(1) - row4Cell.setCellValue(info.getValue("description").toString()) + row4Cell.setCellValue(info.getValue("name").toString()) rowNum = 5 val row5: Row = sheet.getRow(rowNum) @@ -3173,52 +3188,57 @@ open class ReportService( rowNum = 6 val row6: Row = sheet.getRow(rowNum) val row6Cell = row6.getCell(1) + row6Cell.setCellValue(info.getOrDefault("subTeamLead", "N/A").toString()) + + rowNum = 7 + val row7: Row = sheet.getRow(rowNum) + val row7Cell = row7.getCell(1) val clientSubsidiary = if (info.getValue("subsidiary").toString() != "N/A") { info.getValue("subsidiary").toString() } else { info.getValue("client").toString() } - row6Cell.setCellValue(clientSubsidiary) + row7Cell.setCellValue(clientSubsidiary) // Average Hourly Rate by Pay Scale Point - rowNum = 8 - val row8: Row = sheet.getRow(rowNum) ?: sheet.createRow(rowNum) + rowNum = 9 + val row9: Row = sheet.getRow(rowNum) ?: sheet.createRow(rowNum) sheet.addMergedRegion(CellRangeAddress(rowNum, rowNum, 2, (financialYears.size + 1) * 2 - 1)) - val row8Cell = row8.getCell(2) ?: row8.createCell(2) - row8Cell.apply { + val row9Cell = row9.getCell(2) ?: row9.createCell(2) + row9Cell.apply { setCellValue("Average Hourly Rate by Pay Scale Point") } - CellUtil.setAlignment(row8Cell, HorizontalAlignment.CENTER); - CellUtil.setVerticalAlignment(row8Cell, VerticalAlignment.CENTER); - CellUtil.setCellStyleProperty(row8Cell, CellUtil.WRAP_TEXT, true) + CellUtil.setAlignment(row9Cell, HorizontalAlignment.CENTER); + CellUtil.setVerticalAlignment(row9Cell, VerticalAlignment.CENTER); + CellUtil.setCellStyleProperty(row9Cell, CellUtil.WRAP_TEXT, true) // Need to be updated to financial year // Base on the searching criteria - rowNum = 9 - val row9: Row = sheet.getRow(rowNum) ?: sheet.createRow(rowNum) + rowNum = 10 + val row10: Row = sheet.getRow(rowNum) ?: sheet.createRow(rowNum) var column = 2 financialYears.indices.forEach { i -> - val row9Cell = row9.getCell(column) ?: row9.createCell(column) - val row9Cell2 = row9.getCell(column + 1) ?: row9.createCell(column + 1) + val row10Cell = row10.getCell(column) ?: row10.createCell(column) + val row10Cell2 = row10.getCell(column + 1) ?: row10.createCell(column + 1) sheet.addMergedRegion(CellRangeAddress(rowNum, rowNum, column, column + 1)) - row9Cell.setCellValue( + row10Cell.setCellValue( "${financialYears[i].start.format(monthFormat)} - ${ financialYears[i].end.format( monthFormat ) }" ) - CellUtil.setAlignment(row9Cell, HorizontalAlignment.CENTER); - CellUtil.setVerticalAlignment(row9Cell, VerticalAlignment.CENTER); - CellUtil.setCellStyleProperty(row9Cell, "borderBottom", BorderStyle.THIN) - CellUtil.setCellStyleProperty(row9Cell2, "borderBottom", BorderStyle.THIN) + CellUtil.setAlignment(row10Cell, HorizontalAlignment.CENTER); + CellUtil.setVerticalAlignment(row10Cell, VerticalAlignment.CENTER); + CellUtil.setCellStyleProperty(row10Cell, "borderBottom", BorderStyle.THIN) + CellUtil.setCellStyleProperty(row10Cell2, "borderBottom", BorderStyle.THIN) column = column.plus(2) } - rowNum = 10 + rowNum = 11 for (staff in staffInfoList) { // val row: Row = sheet.getRow(rowNum++) ?: sheet.createRow(rowNum++) val row: Row = sheet.getRow(rowNum) ?: sheet.createRow(rowNum) diff --git a/src/main/resources/templates/report/AR07_Project P&L Report v02.xlsx b/src/main/resources/templates/report/AR07_Project P&L Report v02.xlsx index ba5e1b121514b9d51a0b43207583e890c0af2eb9..810426484b5fe440288caf69c1d0db76a2a941fb 100644 GIT binary patch delta 4407 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 kwV;1ih@b(1kiQ*-Lmywx~MB^LbMf~ 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 ZLjQlh#^@;dn?&R29(e&WtnA;=e*oyd