From 2a71500f1d7aee8d38bde3b6b4276452f6299f5c Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Thu, 30 May 2024 13:11:12 +0800 Subject: [PATCH] update overconsum report --- .../modules/report/service/ReportService.kt | 10 ++++++---- .../modules/report/web/ReportController.kt | 12 +++++++++--- .../modules/report/web/model/ReportRequest.kt | 1 + .../report/AR03_Resource Overconsumption.xlsx | Bin 13340 -> 13354 bytes 4 files changed, 16 insertions(+), 7 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 2a54572..664d91b 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 @@ -1424,18 +1424,18 @@ open class ReportService( generalCreateReportIndexed(sheet, result, rowIndex, columnIndex) val sheetCF = sheet.sheetConditionalFormatting - val rule1 = sheetCF.createConditionalFormattingRule("AND(J7 >= $lowerLimit, J7 <= 1)") - val rule2 = sheetCF.createConditionalFormattingRule("J7 > 1") + val rule1 = sheetCF.createConditionalFormattingRule("AND(K7 >= $lowerLimit, K7 <= 1)") + val rule2 = sheetCF.createConditionalFormattingRule("K7 > 1") var fillOrange = rule1.createPatternFormatting() fillOrange.setFillBackgroundColor(IndexedColors.LIGHT_ORANGE.index); fillOrange.setFillPattern(PatternFormatting.SOLID_FOREGROUND) var fillRed = rule2.createPatternFormatting() - fillRed.setFillBackgroundColor(IndexedColors.PINK.index); + fillRed.setFillBackgroundColor(IndexedColors.RED1.index); fillRed.setFillPattern(PatternFormatting.SOLID_FOREGROUND) val cfRules = arrayOf(rule1, rule2) - val regions = arrayOf(CellRangeAddress.valueOf("\$J7:\$K${rowIndex + 1}")) + val regions = arrayOf(CellRangeAddress.valueOf("\$K7:\$L${rowIndex + 1}")) sheetCF.addConditionalFormatting(regions, cfRules); return workbook @@ -1838,6 +1838,8 @@ open class ReportService( sql.append("and t.id = :teamId") if (args.containsKey("custId")) sql.append("and c.id = :custId") + if (args.containsKey("subsidiaryId")) + sql.append("and ss.id = :subsidiaryId") if (args.containsKey("status")) statusFilter = when (args.get("status")) { "Potential Overconsumption" -> "and " + diff --git a/src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt b/src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt index aafd24e..02ea8fa 100644 --- a/src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt +++ b/src/main/java/com/ffii/tsms/modules/report/web/ReportController.kt @@ -35,6 +35,7 @@ import java.time.format.DateTimeFormatter import org.springframework.stereotype.Controller import org.springframework.data.jpa.repository.JpaRepository import com.ffii.tsms.modules.project.entity.Project +import com.ffii.tsms.modules.project.service.SubsidiaryService import com.ffii.tsms.modules.report.web.model.* import com.ffii.tsms.modules.timesheet.entity.Timesheet import org.springframework.data.domain.Example @@ -56,6 +57,7 @@ class ReportController( private val leaveRepository: LeaveRepository, private val teamService: TeamService, private val customerService: CustomerService, + private val subsidiaryService: SubsidiaryService, private val invoiceService: InvoiceService, private val gradeAllocationRepository: GradeAllocationRepository, private val subsidiaryRepository: SubsidiaryRepository ) { @@ -154,7 +156,7 @@ class ReportController( fun ProjectResourceOverconsumptionReport(@RequestBody @Valid request: ProjectResourceOverconsumptionReport): ResponseEntity { val lowerLimit = request.lowerLimit var team: String = "All" - var customer: String = "All" + var customerOrSubsidiary: String = "All" val args: MutableMap = mutableMapOf( "status" to request.status, "lowerLimit" to lowerLimit @@ -165,10 +167,14 @@ class ReportController( } if (request.custId != null) { args["custId"] = request.custId - customer = customerService.find(request.custId).orElseThrow().name + customerOrSubsidiary = customerService.find(request.custId).orElseThrow().name + } + if (request.subsidiaryId != null) { + args["subsidiaryId"] = request.subsidiaryId + customerOrSubsidiary = subsidiaryService.find(request.subsidiaryId).orElseThrow().name } val result: List> = excelReportService.getProjectResourceOverconsumptionReport(args); - val reportResult: ByteArray = excelReportService.generateProjectResourceOverconsumptionReport(team, customer, result, lowerLimit) + val reportResult: ByteArray = excelReportService.generateProjectResourceOverconsumptionReport(team, customerOrSubsidiary, result, lowerLimit) // val mediaType: MediaType = MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") return ResponseEntity.ok() // .contentType(mediaType) diff --git a/src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt b/src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt index e906a38..f302693 100644 --- a/src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/report/web/model/ReportRequest.kt @@ -46,6 +46,7 @@ data class LateStartReportRequest ( data class ProjectResourceOverconsumptionReport ( val teamId: Long?, val custId: Long?, + val subsidiaryId: Long?, val status: String, val lowerLimit: Double ) diff --git a/src/main/resources/templates/report/AR03_Resource Overconsumption.xlsx b/src/main/resources/templates/report/AR03_Resource Overconsumption.xlsx index 52e46ba30c385dcd4837082125c3196623179a20..fb9418177b8978fff9da6be57a7ac8d1e8afeef5 100644 GIT binary patch delta 3027 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 delta 3016 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