| @@ -2766,147 +2766,184 @@ open class ReportService( | |||||
| setCellValue(convertReportMonth) | 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<String, Double>().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<String, Double>().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<String, Double>().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 { | createCell(columnIndex++).apply { | ||||
| setCellValue("") | |||||
| setCellValue(grade.name) | |||||
| cellStyle = boldFontWithBorderStyle | 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 { | 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 { | 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 | return workbook | ||||
| } | } | ||||