diff --git a/src/main/java/com/ffii/tsms/modules/common/mail/pojo/MailRequest.kt b/src/main/java/com/ffii/tsms/modules/common/mail/pojo/MailRequest.kt index e62fff2..726bcd1 100644 --- a/src/main/java/com/ffii/tsms/modules/common/mail/pojo/MailRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/common/mail/pojo/MailRequest.kt @@ -82,6 +82,17 @@ open class MailRequest() { return this } + @Suppress("INAPPLICABLE_JVM_NAME") + @JvmName("addToList") + open fun addTo(to: List): Builder { + to.forEach { + if (it.isNotEmpty()) { + mailRequest.addTo(InternetAddress(it)) + } + } + return this + } + @Suppress("INAPPLICABLE_JVM_NAME") @JvmName("addCcInternetAddress") open fun addCc(cc: InternetAddress): Builder { diff --git a/src/main/java/com/ffii/tsms/modules/common/mail/service/MailReminderService.kt b/src/main/java/com/ffii/tsms/modules/common/mail/service/MailReminderService.kt index 4dc5d36..1d25bc0 100644 --- a/src/main/java/com/ffii/tsms/modules/common/mail/service/MailReminderService.kt +++ b/src/main/java/com/ffii/tsms/modules/common/mail/service/MailReminderService.kt @@ -2,49 +2,89 @@ package com.ffii.tsms.modules.common.mail.service import com.ffii.tsms.modules.common.SecurityUtils import com.ffii.tsms.modules.common.SettingNames +import com.ffii.tsms.modules.common.holiday.service.HolidayService import com.ffii.tsms.modules.common.mail.pojo.MailRequest +import com.ffii.tsms.modules.data.entity.StaffRepository +import com.ffii.tsms.modules.data.service.StaffsService +import com.ffii.tsms.modules.project.web.models.MilestoneInfo import com.ffii.tsms.modules.settings.service.SettingsService +import com.ffii.tsms.modules.timesheet.entity.TimesheetRepository +import com.ffii.tsms.modules.timesheet.service.TimesheetsService import com.ffii.tsms.modules.user.service.UserService import jakarta.mail.internet.InternetAddress import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory import org.springframework.stereotype.Service +import java.time.DayOfWeek import java.time.LocalDate import java.time.format.DateTimeFormatter +import java.time.temporal.TemporalAdjuster +import java.time.temporal.TemporalAdjusters @Service -open class MailReminderService ( +open class MailReminderService( val mailService: MailService, val userService: UserService, val settingsService: SettingsService, + val holidayService: HolidayService, + val timesheetsService: TimesheetsService, + val timesheetRepository: TimesheetRepository, + val staffsService: StaffsService, + val staffRepository: StaffRepository, ) { protected val logger: Log = LogFactory.getLog(javaClass) private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd") -// @Scheduled(cron = "0 0 6 * * ?") // Runs at 06:00 AM every day + // @Scheduled(cron = "0 0 6 * * ?") // Runs at 06:00 AM every day open fun sendTimesheetReminder() { - val inputDate = LocalDate.now().minusDays(4).format(dateFormat) + val inputDate = LocalDate.now().minusDays(4) + val holidayList = holidayService.commonHolidayList().map { it.date } + val dayOfWeek = inputDate.dayOfWeek - val subject = settingsService.findByName(SettingNames.TIMESHEET_MAIL_SUBJECT).orElseThrow().value - val template = settingsService.findByName(SettingNames.TIMESHEET_MAIL_TEMPLATE).orElseThrow().value - val cc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_CC).orElseThrow().value.split(",") - val bcc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_BCC).orElseThrow().value.split(",") - val mailRequest = MailRequest.Builder() - .subject(subject) - .template("mail/TimesheetNotification") - .args(mapOf( - Pair("date", inputDate), - Pair("template", template) - )) - .addTo(InternetAddress("cyril.tsui@2fi-solutions.com.hk")) - .addCc(cc) - .addBcc(bcc) - .build() + if (!holidayList.contains(inputDate) && dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) { + // Timesheet Data + val timesheet = timesheetRepository.findAllByDeletedFalseAndRecordDate(inputDate) + .groupBy { it.staff?.id } + .mapValues {(_, t) -> + t.map { (it.normalConsumed ?: 0.0) } + } - val mailRequestList = mutableListOf() - mailRequestList += mailRequest - mailService.send(mailRequestList) + // Staff Data + val staffs = staffRepository.findAllByDeletedFalse().orElseThrow() + + val toList = mutableListOf() + staffs.forEach { staff -> + val sum = timesheet[staff.id]?.sum() ?: 0.0 + + if (sum < 8) { + toList += staff.email + } + } + + val subject = settingsService.findByName(SettingNames.TIMESHEET_MAIL_SUBJECT).orElseThrow().value + val template = settingsService.findByName(SettingNames.TIMESHEET_MAIL_TEMPLATE).orElseThrow().value + val cc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_CC).orElseThrow().value.split(",") + val bcc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_BCC).orElseThrow().value.split(",") + val mailRequest = MailRequest.Builder() + .subject(subject) + .template("mail/TimesheetNotification") + .args( + mapOf( + Pair("date", inputDate.format(dateFormat)), + Pair("template", template) + ) + ) +// .addTo(InternetAddress("cyril.tsui@2fi-solutions.com.hk")) + .addTo(toList) + .addCc(cc) + .addBcc(bcc) + .build() + + val mailRequestList = mutableListOf() + mailRequestList += mailRequest + mailService.send(mailRequestList) + } } open fun sendTimesheetReminderTest() { @@ -59,10 +99,12 @@ open class MailReminderService ( .subject(subject) // .template("mail/TimesheetNotification") .templateContent(template) - .args(mapOf( - Pair("date", inputDate), + .args( + mapOf( + Pair("date", inputDate), // Pair("template", template) - )) + ) + ) .addTo(InternetAddress(SecurityUtils.getUser().orElseThrow().email)) .addCc(cc) .addBcc(bcc) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt index 7a6cb09..84e1729 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/DashboardService.kt @@ -2886,7 +2886,8 @@ open class DashboardService( } createCell(8).apply { - cellFormula = "H${rowIndex}*80%" +// cellFormula = "H${rowIndex}*80%" + setCellValue(financialSummaryByClient.totalBudget) cellStyle.apply { setFont(normalFont) dataFormat = accountingStyle @@ -3063,7 +3064,8 @@ open class DashboardService( } createCell(9).apply { - cellFormula = "I${rowIndex}*80%" +// cellFormula = "I${rowIndex}*80%" + setCellValue(financialSummaryByProject.totalBudget) cellStyle.apply { setFont(normalFont) dataFormat = accountingStyle diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt index bc45465..c8197d3 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/ExportDashboardExcelRequest.kt @@ -5,6 +5,7 @@ data class FinancialSummaryByClient ( val customerName: String, val projectNo: Double, val totalFee: Double, + val totalBudget: Double, val cumulativeExpenditure: Double, val totalInvoiced: Double, val totalReceived: Double, @@ -20,6 +21,7 @@ data class FinancialSummaryByProject ( val customerName: String, val subsidiaryName: String?, val totalFee: Double, + val totalBudget: Double, val cumulativeExpenditure: Double, val totalInvoiced: Double, val totalReceived: Double, diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/entity/TimesheetRepository.kt b/src/main/java/com/ffii/tsms/modules/timesheet/entity/TimesheetRepository.kt index 1ddfe22..653e803 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/entity/TimesheetRepository.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/entity/TimesheetRepository.kt @@ -31,4 +31,5 @@ interface TimesheetRepository : AbstractRepository { @Query("SELECT MIN(t.recordDate) AS recordDate FROM Timesheet t WHERE t.project.id = ?1") fun findMinRecordDateByProjectId(projectId: Long): LocalDate? + fun findAllByDeletedFalseAndRecordDate(recordDate: LocalDate): List } \ No newline at end of file