From 87a20025703a6d07df4579dbd7d1692b8f0628c4 Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Mon, 13 May 2024 16:35:12 +0800 Subject: [PATCH] update --- .../modules/data/service/StaffsService.kt | 4 +-- .../data/web/models/NewStaffRequest.kt | 2 +- .../modules/report/service/ReportService.kt | 34 +++++++++++++----- ...08_Monthly Work Hours Analysis Report.xlsx | Bin 15765 -> 15817 bytes 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt index 982388e..00b0dd0 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt @@ -209,8 +209,8 @@ open class StaffsService( @Transactional(rollbackFor = [Exception::class]) open fun saveOrUpdate(req: NewStaffRequest): Staff { - val staff = if(req.id > 0L) find(req.id).get() else Staff() - if (req.id > 0L) { + val staff = if(req.id != null) find(req.id).get() else Staff() + if (req.id != null) { updateStaff(req, staff) } else { saveStaff(req) diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt index d6cf49c..1e41acd 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotNull import java.time.LocalDate data class NewStaffRequest( - val id: Long, + val id: Long?, // @field:NotNull(message = "Staff userId cannot be empty") // val userId: Long, 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 3cdbc81..e0ad756 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 @@ -16,7 +16,7 @@ import java.time.LocalDate import java.time.format.DateTimeFormatter import java.util.* -data class DayInfo(val date: String, val weekday: String) +data class DayInfo(val date: String?, val weekday: String?) @Service open class ReportService { private val DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd") @@ -310,9 +310,11 @@ open class ReportService { ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// rowIndex = 7 + println(daysOfMonth) daysOfMonth.forEach { dayInfo -> rowIndex++ rowSize++ + println(dayInfo) sheet.getRow(rowIndex).getCell(0).apply { setCellValue(dayInfo.date) cellStyle.setFont(boldFont) @@ -326,12 +328,16 @@ open class ReportService { rowIndex += 1 sheet.getRow(rowIndex).getCell(0).apply { setCellValue("Sub-total") + cellStyle.setFont(boldFont) + cellStyle.alignment = HorizontalAlignment.CENTER } sheet.addMergedRegion(CellRangeAddress(rowIndex,rowIndex , 0, 1)) // rowIndex += 1 sheet.getRow(rowIndex).getCell(0).apply { setCellValue("Total Normal Hours [A]") +// cellStyle.setFont(boldFont) + cellStyle.alignment = HorizontalAlignment.CENTER } sheet.addMergedRegion(CellRangeAddress(rowIndex,rowIndex , 0, 1)) // @@ -339,12 +345,16 @@ open class ReportService { sheet.getRow(rowIndex).getCell(0).apply { setCellValue("Total Other Hours [B]") sheet.addMergedRegion(CellRangeAddress(rowIndex,rowIndex , 0, 1)) + cellStyle.setFont(boldFont) + cellStyle.alignment = HorizontalAlignment.CENTER } rowIndex += 1 sheet.getRow(rowIndex).getCell(0).apply { setCellValue("Total Spent Manhours [A+B]") -// cellStyle.borderBottom = BorderStyle.DOUBLE +// cellStyle.setFont(boldFont) + cellStyle.alignment = HorizontalAlignment.CENTER + cellStyle.borderBottom = BorderStyle.DOUBLE } sheet.addMergedRegion(CellRangeAddress(rowIndex,rowIndex , 0, 1)) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -363,7 +373,7 @@ open class ReportService { columnIndex += 1 getCell(columnIndex).setCellValue("Daily Manhour Spent\n" + "(Excluding Leave Hours)") getCell(columnIndex).cellStyle.alignment = HorizontalAlignment.CENTER -// columnSize = columnIndex + columnSize = columnIndex } sheet.addMergedRegion(CellRangeAddress(6,6 , 2, columnIndex)) ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -389,17 +399,23 @@ open class ReportService { } rowIndex = 8 - println("rowSize is: $rowSize") +// println("rowSize is: $rowSize") if (sheet.getRow(rowIndex - 1).getCell(2).stringCellValue == "Leave Hours") { for (i in 0 until rowSize) { - val cell = sheet.getRow(rowIndex + i)?.getCell(columnIndex) ?: sheet.getRow(rowIndex + i)?.createCell(columnIndex) - cell?.cellFormula = "SUM(${getColumnAlphabet(2)}${rowIndex+1+i}:${getColumnAlphabet(columnIndex)}${rowIndex+1+i})" // should columnIndex - 2 + val cell = sheet.getRow(rowIndex)?.getCell(columnIndex) ?: sheet.getRow(rowIndex + i)?.createCell(columnIndex) + cell?.cellFormula = "SUM(${getColumnAlphabet(2)}${rowIndex+1}:${getColumnAlphabet(columnIndex)}${rowIndex+1})" // should columnIndex - 2 + rowIndex++ // cell?.setCellValue("testing") // rowIndex++ } -// for (i in 0 until columnSize) { -// val cell = sheet.getRow(rowIndex) -// } +// println(columnSize) + for (i in 0 until columnSize) { // minus last col + val cell = sheet.getRow(rowIndex)?.getCell(2) ?: sheet.getRow(rowIndex)?.createCell(2) + cell?.cellFormula = "SUM(${getColumnAlphabet(2)}${rowIndex}:${getColumnAlphabet(columnIndex + i)}${rowIndex})" + cell?.cellStyle?.dataFormat = accountingStyle + cell?.cellStyle?.setFont(boldFont) +// cell?.cellStyle.borderBottom = border + } } return workbook diff --git a/src/main/resources/templates/report/AR08_Monthly Work Hours Analysis Report.xlsx b/src/main/resources/templates/report/AR08_Monthly Work Hours Analysis Report.xlsx index a4e91ef0b86fc4a8bdbe4d88aaae90885152fbee..4922b4afe3b535bc8358b130064fc6778118843c 100644 GIT binary patch delta 6204 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