|
|
@@ -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<LeaveType> { |
|
|
|
return leaveTypeRepository.findAll() |
|
|
@@ -51,6 +55,45 @@ open class LeaveService( |
|
|
|
return transformToLeaveEntryMap(savedLeaves) |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional |
|
|
|
open fun saveMemberLeaveEntry(staffId: Long, entry: LeaveEntry, recordDate: LocalDate?): Map<String, List<LeaveEntry>> { |
|
|
|
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<Long, TeamMemberLeaveEntries> { |
|
|
|
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<Leave>): Map<String, List<LeaveEntry>> { |
|
|
|
return leaves |
|
|
|
.groupBy { leave -> leave.recordDate!!.format(DateTimeFormatter.ISO_LOCAL_DATE) } |
|
|
|