From 968fb6cd90e198eb644e7cd134dd873803a995f0 Mon Sep 17 00:00:00 2001 From: Wayne Date: Tue, 28 May 2024 23:51:38 +0900 Subject: [PATCH] Save team member leave entry --- .../modules/timesheet/service/LeaveService.kt | 45 ++++++++++++++++++- .../timesheet/service/TimesheetsService.kt | 2 +- .../timesheet/web/TimesheetsController.kt | 19 +++++--- .../timesheet/web/models/TeamLeaveEntry.kt | 7 +++ .../web/models/TeamMemberLeaveEntries.kt | 7 +++ 5 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamLeaveEntry.kt create mode 100644 src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamMemberLeaveEntries.kt diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/service/LeaveService.kt b/src/main/java/com/ffii/tsms/modules/timesheet/service/LeaveService.kt index 8dbc750..97658ac 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/service/LeaveService.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/service/LeaveService.kt @@ -2,18 +2,22 @@ package com.ffii.tsms.modules.timesheet.service import com.ffii.core.exception.BadRequestException import com.ffii.tsms.modules.data.service.StaffsService +import com.ffii.tsms.modules.data.service.TeamService import com.ffii.tsms.modules.timesheet.entity.* import com.ffii.tsms.modules.timesheet.web.models.LeaveEntry +import com.ffii.tsms.modules.timesheet.web.models.TeamMemberLeaveEntries import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.time.LocalDate import java.time.format.DateTimeFormatter +import kotlin.jvm.optionals.getOrDefault @Service open class LeaveService( private val leaveRepository: LeaveRepository, private val leaveTypeRepository: LeaveTypeRepository, - private val staffsService: StaffsService + private val staffsService: StaffsService, + private val teamService: TeamService ) { open fun getLeaveTypes(): List { return leaveTypeRepository.findAll() @@ -51,6 +55,45 @@ open class LeaveService( return transformToLeaveEntryMap(savedLeaves) } + @Transactional + open fun saveMemberLeaveEntry(staffId: Long, entry: LeaveEntry, recordDate: LocalDate?): Map> { + val currentStaff = staffsService.currentStaff() ?: throw BadRequestException() + // Make sure current staff is a team lead + teamService.getMyTeamForStaff(currentStaff) ?: throw BadRequestException() + val leaveTypesMap = getLeaveTypes().associateBy { it.id } + val memberStaff = staffsService.getStaff(staffId) + + val leave = leaveRepository.findById(entry.id).getOrDefault(Leave()).apply { + this.leaveHours = entry.inputHours + this.leaveType = leaveTypesMap[entry.leaveTypeId] + this.remark = entry.remark + this.recordDate = this.recordDate ?: recordDate + this.staff = this.staff ?: memberStaff + } + + leaveRepository.save(leave) + return transformToLeaveEntryMap(leaveRepository.findAllByStaff(memberStaff)) + } + + open fun getTeamMemberLeave(): Map { + val currentStaff = staffsService.currentStaff() ?: return emptyMap() + // Get team where current staff is team lead + val myTeam = teamService.getMyTeamForStaff(currentStaff) ?: return emptyMap() + + val teamMembers = staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) + + return teamMembers.associate { member -> + Pair( + member.id!!, + TeamMemberLeaveEntries( + staffId = member.staffId, + name = member.name, + leaveEntries = transformToLeaveEntryMap(leaveRepository.findAllByStaff(member)) + ) + ) + } + } + private fun transformToLeaveEntryMap(leaves: List): Map> { return leaves .groupBy { leave -> leave.recordDate!!.format(DateTimeFormatter.ISO_LOCAL_DATE) } diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/service/TimesheetsService.kt b/src/main/java/com/ffii/tsms/modules/timesheet/service/TimesheetsService.kt index 31350b1..206daf0 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/service/TimesheetsService.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/service/TimesheetsService.kt @@ -89,7 +89,7 @@ open class TimesheetsService( return transformToTimeEntryMap(timesheetRepository.findAllByStaff(currentStaff)) } - open fun getTimeMemberTimesheet(): Map { + open fun getTeamMemberTimesheet(): Map { val currentStaff = staffsService.currentStaff() ?: return emptyMap() // Get team where current staff is team lead val myTeam = teamService.getMyTeamForStaff(currentStaff) ?: return emptyMap() diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt index be9bbcc..df9bbe3 100644 --- a/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/TimesheetsController.kt @@ -4,10 +4,7 @@ import com.ffii.core.exception.BadRequestException import com.ffii.tsms.modules.timesheet.entity.LeaveType import com.ffii.tsms.modules.timesheet.service.LeaveService import com.ffii.tsms.modules.timesheet.service.TimesheetsService -import com.ffii.tsms.modules.timesheet.web.models.LeaveEntry -import com.ffii.tsms.modules.timesheet.web.models.TeamMemberTimeEntries -import com.ffii.tsms.modules.timesheet.web.models.TeamTimeEntry -import com.ffii.tsms.modules.timesheet.web.models.TimeEntry +import com.ffii.tsms.modules.timesheet.web.models.* import jakarta.validation.Valid import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping @@ -47,7 +44,12 @@ class TimesheetsController(private val timesheetsService: TimesheetsService, pri @GetMapping("/teamTimesheets") fun getTeamMemberTimesheetEntries(): Map { - return timesheetsService.getTimeMemberTimesheet() + return timesheetsService.getTeamMemberTimesheet() + } + + @GetMapping("/teamLeaves") + fun getTeamMemberLeaveEntries(): Map { + return leaveService.getTeamMemberLeave() } @PostMapping("/saveMemberEntry") @@ -57,6 +59,13 @@ class TimesheetsController(private val timesheetsService: TimesheetsService, pri }.getOrNull()) } + @PostMapping("/saveMemberLeave") + fun saveMemberLeave(@Valid @RequestBody request: TeamLeaveEntry): Map> { + return leaveService.saveMemberLeaveEntry(request.staffId, request.entry, runCatching { + LocalDate.parse(request.recordDate, DateTimeFormatter.ISO_LOCAL_DATE) + }.getOrNull()) + } + @GetMapping("/leaves") fun getLeaveEntry(): Map> { return leaveService.getLeaves() diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamLeaveEntry.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamLeaveEntry.kt new file mode 100644 index 0000000..f435625 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamLeaveEntry.kt @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.timesheet.web.models + +data class TeamLeaveEntry( + val staffId: Long, + val entry: LeaveEntry, + val recordDate: String, +) diff --git a/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamMemberLeaveEntries.kt b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamMemberLeaveEntries.kt new file mode 100644 index 0000000..8a6b95b --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/timesheet/web/models/TeamMemberLeaveEntries.kt @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.timesheet.web.models + +data class TeamMemberLeaveEntries( + val leaveEntries: Map>, + val staffId: String?, + val name: String?, +)