| @@ -128,7 +128,7 @@ open class MailReminderService( | |||||
| staffId = it["staffId"].toString().toLong(), | staffId = it["staffId"].toString().toLong(), | ||||
| recordDate = LocalDate.parse(it["recordDate"].toString()), | recordDate = LocalDate.parse(it["recordDate"].toString()), | ||||
| hours = it["hours"].toString().toDouble(), | hours = it["hours"].toString().toDouble(), | ||||
| joinDate = LocalDate.parse(it["joinDate"].toString()) | |||||
| joinDate = it["joinDate"]?.toString()?.let { date -> LocalDate.parse(date) } ?: LocalDate.of(1970, 1, 1) | |||||
| ) | ) | ||||
| } | } | ||||
| val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | ||||
| @@ -217,7 +217,7 @@ open class MailReminderService( | |||||
| staffId = it["staffId"].toString().toLong(), | staffId = it["staffId"].toString().toLong(), | ||||
| recordDate = LocalDate.parse(it["recordDate"].toString()), | recordDate = LocalDate.parse(it["recordDate"].toString()), | ||||
| hours = it["hours"].toString().toDouble(), | hours = it["hours"].toString().toDouble(), | ||||
| joinDate = LocalDate.parse(it["joinDate"].toString()) | |||||
| joinDate = it["joinDate"]?.toString()?.let { date -> LocalDate.parse(date) } ?: LocalDate.of(1970, 1, 1) | |||||
| ) | ) | ||||
| } | } | ||||
| val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | ||||
| @@ -256,6 +256,7 @@ open class MailReminderService( | |||||
| Pair(date, matchedStaffIds) | Pair(date, matchedStaffIds) | ||||
| }.sortedBy { it.first } | }.sortedBy { it.first } | ||||
| println(goodStaffsList) | |||||
| } | } | ||||
| } | } | ||||
| @@ -279,7 +280,7 @@ open class MailReminderService( | |||||
| staffId = it["staffId"].toString().toLong(), | staffId = it["staffId"].toString().toLong(), | ||||
| recordDate = LocalDate.parse(it["recordDate"].toString()), | recordDate = LocalDate.parse(it["recordDate"].toString()), | ||||
| hours = it["hours"].toString().toDouble(), | hours = it["hours"].toString().toDouble(), | ||||
| joinDate = LocalDate.parse(it["joinDate"].toString()) | |||||
| joinDate = it["joinDate"]?.toString()?.let { date -> LocalDate.parse(date) } ?: LocalDate.of(1970, 1, 1) | |||||
| ) | ) | ||||
| } | } | ||||
| val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | ||||
| @@ -352,6 +353,75 @@ open class MailReminderService( | |||||
| createEmailRequest(emailContent.toString(), receiver) | createEmailRequest(emailContent.toString(), receiver) | ||||
| } | } | ||||
| } | } | ||||
| open fun test15thStaffList() { | |||||
| if (!isSettingsConfigValid()) return | |||||
| val today = LocalDate.now().minusDays(1) // should always be 14, exclude 15th because the email is sent at 0600, suppose no one input timesheet in advance | |||||
| val firstDay = today.withDayOfMonth(1) | |||||
| val holidayList = holidayService.commonHolidayList().map { it.date } | |||||
| val companyHolidayList = companyHolidayService.allCompanyHolidays().map { it.date } | |||||
| val allHolidaysList: List<LocalDate> = (holidayList + companyHolidayList).toSet().toList() | |||||
| //get data | |||||
| val args = mutableMapOf( | |||||
| "from" to firstDay, | |||||
| "to" to today, | |||||
| ) | |||||
| val ts = timesheetsService.workHourRecordsWithinRange(args) | |||||
| val timesheet: List<WorkHourRecordsWithJoinDate> = ts.map { | |||||
| WorkHourRecordsWithJoinDate( | |||||
| staffId = it["staffId"].toString().toLong(), | |||||
| recordDate = LocalDate.parse(it["recordDate"].toString()), | |||||
| hours = it["hours"].toString().toDouble(), | |||||
| joinDate = it["joinDate"]?.toString()?.let { date -> LocalDate.parse(date) } ?: LocalDate.of(1970, 1, 1) | |||||
| ) | |||||
| } | |||||
| val staffs = staffRepository.findAllByEmployTypeAndDeletedFalseAndDepartDateIsNull(FULLTIME).filter { it.staffId != "A003" && it.staffId != "A004" && it.staffId != "B011" }.filter{ it.team?.code != "HO"} | |||||
| val teams = teamRepository.findAll().filter { team -> team.deleted == false | |||||
| // && ( team.code == "WY" || team.code == "TW" || team.code == "CH" || team.code == "MN" || team.code == "MC" ) | |||||
| } | |||||
| val dateList = generateSequence(firstDay) { it.plusDays(1) } | |||||
| .takeWhile { it <= today } | |||||
| .toList() | |||||
| val filteredDatesList = dateList.filter { | |||||
| it !in allHolidaysList && it.dayOfWeek != DayOfWeek.SATURDAY && it.dayOfWeek != DayOfWeek.SUNDAY | |||||
| } | |||||
| //loop each team | |||||
| for (team in teams) { | |||||
| // if (team.id?.toInt() != 5) continue // just for testing with fewer records, remove this when finishes | |||||
| val teamLead = team.staff | |||||
| val teamMembers: List<Staff> = staffs.filter { it.team != null &&it.team.id == team.id } | |||||
| if (teamMembers.isEmpty()) continue | |||||
| val teamMembersIds: List<Long?> = teamMembers.map { it.id }.sorted() | |||||
| // getting the naughty list | |||||
| val filteredTimesheet = timesheet.filter { teamMembersIds.contains(it.staffId) } // filter team members' timesheet | |||||
| val timesheetByIdAndRecord = filteredTimesheet.groupBy { Triple(it.staffId, it.recordDate, it.joinDate) } | |||||
| .mapNotNull { (key, records) -> | |||||
| StaffRecords( | |||||
| key.second, | |||||
| key.first, | |||||
| records.sumOf { it.hours }, | |||||
| key.third | |||||
| ) | |||||
| } | |||||
| // change the date list with desired time range | |||||
| val goodStaffsList = filteredDatesList.map { date -> | |||||
| val matchedStaffIds = timesheetByIdAndRecord | |||||
| .filter { | |||||
| if(it.joinDate!! <= date){ | |||||
| it.recordDate == date && it.sumOfHours >= 8 | |||||
| }else{ | |||||
| true | |||||
| } | |||||
| } | |||||
| .map { it.staffId } // Extracting the second element (staffId) | |||||
| .distinct() | |||||
| // Returning a Pair of the date and the list of matched staff IDs | |||||
| Pair(date, matchedStaffIds) | |||||
| }.sortedBy { it.first } | |||||
| println(goodStaffsList) | |||||
| } | |||||
| } | |||||
| @Scheduled(cron = "0 0 6 * * ?") // (SS/MM/HH/DD/MM/YY) - Runs at 06:00 AM every day | @Scheduled(cron = "0 0 6 * * ?") // (SS/MM/HH/DD/MM/YY) - Runs at 06:00 AM every day | ||||
| open fun sendTimesheetReminder() { | open fun sendTimesheetReminder() { | ||||
| if (!isSettingsConfigValid()) return | if (!isSettingsConfigValid()) return | ||||