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 de32af4..6c492fd 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 @@ -2766,147 +2766,184 @@ open class ReportService( setCellValue(convertReportMonth) } - if (timesheets.isNotEmpty()) { - val combinedTeamCodeColNumber = grades.size - val sortedGrades = grades.sortedBy { it.id } - val sortedTeams = teams.sortedBy { it.id } - - val groupedTimesheets = timesheets - .filter { it.project?.teamLead?.team?.id != it.staff?.team?.id } - .groupBy { timesheetEntry -> - Triple( - timesheetEntry.project?.teamLead?.team?.id, - timesheetEntry.staff?.team?.id, - timesheetEntry.staff?.grade?.id - ) - } - .mapValues { (_, timesheetEntries) -> - timesheetEntries.map { timesheet -> - if (timesheet.normalConsumed != null) { - timesheet.normalConsumed!!.plus(timesheet.otConsumed ?: 0.0) - } else if (timesheet.otConsumed != null) { - timesheet.otConsumed!!.plus(timesheet.normalConsumed ?: 0.0) - } else { - 0.0 +// if (timesheets.isNotEmpty()) { + val combinedTeamCodeColNumber = grades.size + val sortedGrades = grades.sortedBy { it.id } + val sortedTeams = teams.sortedBy { it.id } + + val groupedTimesheets = timesheets + .filter { it.project?.teamLead?.team?.id != it.staff?.team?.id } + .groupBy { timesheetEntry -> + Triple( + timesheetEntry.project?.teamLead?.team?.id, + timesheetEntry.staff?.team?.id, + timesheetEntry.staff?.grade?.id + ) + } + .mapValues { (_, timesheetEntries) -> + timesheetEntries.map { timesheet -> + if (timesheet.normalConsumed != null) { + mutableMapOf().apply { + this["manHour"] = timesheet.normalConsumed!!.plus(timesheet.otConsumed ?: 0.0) + this["salary"] = timesheet.normalConsumed!!.plus(timesheet.otConsumed ?: 0.0) + .times(timesheet.staff!!.salary.hourlyRate.toDouble()) + } + } else if (timesheet.otConsumed != null) { + mutableMapOf().apply { + this["manHour"] = timesheet.otConsumed!!.plus(timesheet.normalConsumed ?: 0.0) + this["salary"] = timesheet.otConsumed!!.plus(timesheet.normalConsumed ?: 0.0) + .times(timesheet.staff!!.salary.hourlyRate.toDouble()) + } + } else { + mutableMapOf().apply { + this["manHour"] = 0.0 + this["salary"] = 0.0 } } } + } - if (sortedTeams.isNotEmpty() && sortedTeams.size > 1) { - rowIndex = 3 - sortedTeams.forEach { team: Team -> + if (sortedTeams.isNotEmpty() && sortedTeams.size > 1) { + rowIndex = 3 + sortedTeams.forEach { team: Team -> - // Team - sheet.createRow(rowIndex++).apply { - createCell(0).apply { - setCellValue("Team to be charged:") - cellStyle = boldFontWithBorderStyle.apply { - alignment = HorizontalAlignment.LEFT - } - } + // Team + sheet.createRow(rowIndex++).apply { + createCell(0).apply { + setCellValue("Team to be charged:") + cellStyle = boldFontWithBorderStyle + CellUtil.setAlignment(this, HorizontalAlignment.LEFT) + } - val rangeAddress = CellRangeAddress(this.rowNum, this.rowNum, 1, 1 + combinedTeamCodeColNumber) - sheet.addMergedRegion(rangeAddress) - RegionUtil.setBorderTop(BorderStyle.THIN, rangeAddress, sheet) - RegionUtil.setBorderLeft(BorderStyle.THIN, rangeAddress, sheet) - RegionUtil.setBorderRight(BorderStyle.THIN, rangeAddress, sheet) - RegionUtil.setBorderBottom(BorderStyle.THIN, rangeAddress, sheet) + val rangeAddress = CellRangeAddress(this.rowNum, this.rowNum, 1, 2 + combinedTeamCodeColNumber) + sheet.addMergedRegion(rangeAddress) + RegionUtil.setBorderTop(BorderStyle.THIN, rangeAddress, sheet) + RegionUtil.setBorderLeft(BorderStyle.THIN, rangeAddress, sheet) + RegionUtil.setBorderRight(BorderStyle.THIN, rangeAddress, sheet) + RegionUtil.setBorderBottom(BorderStyle.THIN, rangeAddress, sheet) - createCell(1).apply { - setCellValue(team.code) - cellStyle = normalFontWithBorderStyle.apply { - alignment = HorizontalAlignment.CENTER - } - } + createCell(1).apply { + setCellValue(team.code) + cellStyle = normalFontWithBorderStyle + CellUtil.setAlignment(this, HorizontalAlignment.CENTER) + } + + } + // Grades + sheet.createRow(rowIndex++).apply { + columnIndex = 0 + createCell(columnIndex++).apply { + setCellValue("") + cellStyle = boldFontWithBorderStyle } - // Grades - sheet.createRow(rowIndex++).apply { - columnIndex = 0 + + sortedGrades.forEach { grade: Grade -> createCell(columnIndex++).apply { - setCellValue("") + setCellValue(grade.name) cellStyle = boldFontWithBorderStyle + CellUtil.setAlignment(this, HorizontalAlignment.CENTER) } + } + createCell(columnIndex++).apply { + setCellValue("Total Manhour by Team") + cellStyle = boldFontWithBorderStyle + } - sortedGrades.forEach { grade: Grade -> + createCell(columnIndex).apply { + setCellValue("Total Cost Adjusted by Salary Point by Team") + cellStyle = boldFontWithBorderStyle + } + } + + // Team + Manhour + val startRow = rowIndex + var endRow = rowIndex + sortedTeams.forEach { chargedTeam: Team -> + if (team.id != chargedTeam.id) { + endRow++ + sheet.createRow(rowIndex++).apply { + columnIndex = 0 createCell(columnIndex++).apply { - setCellValue(grade.name) - cellStyle = boldFontWithBorderStyle.apply { - alignment = HorizontalAlignment.CENTER - } + setCellValue(chargedTeam.code) + cellStyle = normalFontWithBorderStyle + CellUtil.setAlignment(this, HorizontalAlignment.CENTER) } - } - createCell(columnIndex).apply { - setCellValue("Total Manhour by Team") - cellStyle = boldFontWithBorderStyle - } - } - - // Team + Manhour - val startRow = rowIndex - var endRow = rowIndex - sortedTeams.forEach { chargedTeam: Team -> - if (team.id != chargedTeam.id) { - endRow++ - sheet.createRow(rowIndex++).apply { - columnIndex = 0 + var totalSalary = 0.0 + sortedGrades.forEach { grade: Grade -> createCell(columnIndex++).apply { - setCellValue(chargedTeam.code) - cellStyle = normalFontWithBorderStyle + setCellValue( + groupedTimesheets[Triple( + team.id, + chargedTeam.id, + grade.id + )]?.sumOf { it.getValue("manHour") } ?: 0.0) + + totalSalary += groupedTimesheets[Triple( + team.id, + chargedTeam.id, + grade.id + )]?.sumOf { it.getValue("salary") } ?: 0.0 + + cellStyle = normalFontWithBorderStyle.apply { + dataFormat = accountingStyle + } } + } - sortedGrades.forEach { grade: Grade -> - createCell(columnIndex++).apply { - setCellValue( - groupedTimesheets[Triple(team.id, chargedTeam.id, grade.id)]?.sum() ?: 0.0 - ) - cellStyle = normalFontWithBorderStyle.apply { - dataFormat = accountingStyle - } - } + createCell(columnIndex++).apply { + val lastCellLetter = CellReference.convertNumToColString(this.columnIndex - 1) + cellFormula = "sum(B${this.rowIndex + 1}:${lastCellLetter}${this.rowIndex + 1})" + cellStyle = boldFontWithBorderStyle.apply { + dataFormat = accountingStyle } + } - createCell(columnIndex).apply { - val lastCellLetter = CellReference.convertNumToColString(this.columnIndex - 1) - cellFormula = "sum(B${this.rowIndex + 1}:${lastCellLetter}${this.rowIndex + 1})" - cellStyle = boldFontWithBorderStyle.apply { - dataFormat = accountingStyle - } + createCell(columnIndex).apply { + setCellValue(totalSalary) + cellStyle = boldFontWithBorderStyle.apply { + dataFormat = accountingStyle } } } } + } - // Total Manhour by grade - sheet.createRow(rowIndex).apply { - columnIndex = 0 - createCell(columnIndex++).apply { - setCellValue("Total Manhour by Grade") - cellStyle = boldFontWithBorderStyle - } + // Total Manhour by grade + sheet.createRow(rowIndex).apply { + columnIndex = 0 + createCell(columnIndex++).apply { + setCellValue("Total Manhour by Grade") + cellStyle = boldFontWithBorderStyle + } - sortedGrades.forEach { grade: Grade -> - createCell(columnIndex++).apply { - val currentCellLetter = CellReference.convertNumToColString(this.columnIndex) - cellFormula = "sum(${currentCellLetter}${startRow}:${currentCellLetter}${endRow})" - cellStyle = normalFontWithBorderStyle.apply { - dataFormat = accountingStyle - } + sortedGrades.forEach { grade: Grade -> + createCell(columnIndex++).apply { + val currentCellLetter = CellReference.convertNumToColString(this.columnIndex) + cellFormula = "sum(${currentCellLetter}${startRow}:${currentCellLetter}${endRow})" + cellStyle = normalFontWithBorderStyle.apply { + dataFormat = accountingStyle } } + } - createCell(columnIndex).apply { - setCellValue("") - cellStyle = boldFontWithBorderStyle - } + createCell(columnIndex++).apply { + setCellValue("") + cellStyle = boldFontWithBorderStyle + } + + createCell(columnIndex).apply { + setCellValue("") + cellStyle = boldFontWithBorderStyle } - rowIndex += 2 } + rowIndex += 2 } } +// } return workbook } diff --git a/src/main/resources/templates/report/Cross Team Charge Report.xlsx b/src/main/resources/templates/report/Cross Team Charge Report.xlsx index 26e201f..e3c005a 100644 Binary files a/src/main/resources/templates/report/Cross Team Charge Report.xlsx and b/src/main/resources/templates/report/Cross Team Charge Report.xlsx differ