From 36404b4cac422dce7a8c8ecddbfdcf6036abb905 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Fri, 17 May 2024 14:01:20 +0800 Subject: [PATCH] update ex02 report --- .../modules/report/service/ReportService.kt | 8 +++++--- .../modules/report/web/ReportController.kt | 2 +- .../modules/report/web/model/ReportRequest.kt | 3 ++- .../report/EX02_Project Cash Flow Report.xlsx | Bin 13299 -> 13289 bytes 4 files changed, 8 insertions(+), 5 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 9f01d30..fc8deef 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 @@ -103,10 +103,11 @@ open class ReportService( fun generateProjectCashFlowReport( project: Project, invoices: List, - timesheets: List + timesheets: List, + dateType: String ): ByteArray { // Generate the Excel report with query results - val workbook: Workbook = createProjectCashFlowReport(project, invoices, timesheets, PROJECT_CASH_FLOW_REPORT) + val workbook: Workbook = createProjectCashFlowReport(project, invoices, timesheets, dateType, PROJECT_CASH_FLOW_REPORT) // Write the workbook to a ByteArrayOutputStream val outputStream: ByteArrayOutputStream = ByteArrayOutputStream() @@ -449,6 +450,7 @@ open class ReportService( project: Project, invoices: List, timesheets: List, + dateType: String, templatePath: String, ): Workbook { // please create a new function for each report template @@ -534,7 +536,7 @@ open class ReportService( rowIndex = 15 - val dateFormatter = DateTimeFormatter.ofPattern("MMM YYYY") + val dateFormatter = if (dateType == "Date") DateTimeFormatter.ofPattern("yyyy/MM/dd") else DateTimeFormatter.ofPattern("MMM YYYY") val combinedResults = (invoices.map { it.receiptDate } + timesheets.map { it.recordDate }).filterNotNull().sortedBy { it } .map { it.format(dateFormatter) }.distinct() 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 2e244bc..1173a10 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 @@ -63,7 +63,7 @@ class ReportController( val invoices = invoiceService.findAllByProjectAndPaidAmountIsNotNull(project) val timesheets = timesheetRepository.findAllByProjectTaskIn(projectTasks) - val reportResult: ByteArray = excelReportService.generateProjectCashFlowReport(project, invoices, timesheets) + val reportResult: ByteArray = excelReportService.generateProjectCashFlowReport(project, invoices, timesheets, request.dateType) // 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 4d002cb..17f67e8 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 @@ -6,7 +6,8 @@ data class FinancialStatusReportRequest ( val teamLeadId: Long ) data class ProjectCashFlowReportRequest ( - val projectId: Long + val projectId: Long, + val dateType: String, // "Date", "Month" ) data class StaffMonthlyWorkHourAnalysisReportRequest ( diff --git a/src/main/resources/templates/report/EX02_Project Cash Flow Report.xlsx b/src/main/resources/templates/report/EX02_Project Cash Flow Report.xlsx index d2e48b6fbc04de132dbb67945061c3791b846157..0f63db775a5f861c774f676eed7c2971850b1afb 100644 GIT binary patch delta 3178 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