|
|
@@ -0,0 +1,72 @@ |
|
|
|
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.timesheet.entity.* |
|
|
|
import com.ffii.tsms.modules.timesheet.web.models.LeaveEntry |
|
|
|
import org.springframework.stereotype.Service |
|
|
|
import org.springframework.transaction.annotation.Transactional |
|
|
|
import java.time.LocalDate |
|
|
|
import java.time.format.DateTimeFormatter |
|
|
|
|
|
|
|
@Service |
|
|
|
open class LeaveService( |
|
|
|
private val leaveRepository: LeaveRepository, |
|
|
|
private val leaveTypeRepository: LeaveTypeRepository, |
|
|
|
private val staffsService: StaffsService |
|
|
|
) { |
|
|
|
open fun getLeaveTypes(): List<LeaveType> { |
|
|
|
return leaveTypeRepository.findAll() |
|
|
|
} |
|
|
|
|
|
|
|
open fun getLeaves(): Map<String, List<LeaveEntry>> { |
|
|
|
val currentStaff = staffsService.currentStaff() ?: return emptyMap() |
|
|
|
return transformToLeaveEntryMap(leaveRepository.findAllByStaff(currentStaff)) |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional |
|
|
|
open fun saveLeave(recordLeaveEntry: Map<LocalDate, List<LeaveEntry>>): Map<String, List<LeaveEntry>> { |
|
|
|
// Need to be associated with a staff |
|
|
|
val currentStaff = staffsService.currentStaff() ?: throw BadRequestException() |
|
|
|
|
|
|
|
val leaveTypesMap = getLeaveTypes().associateBy { it.id } |
|
|
|
|
|
|
|
val leaves = recordLeaveEntry.entries.flatMap { (entryDate, leaveEntries) -> |
|
|
|
// Replace db leave entries by deleting and then adding back |
|
|
|
leaveRepository.deleteAllByStaffAndRecordDate(currentStaff, entryDate) |
|
|
|
|
|
|
|
mergeLeaveEntriesByType(leaveEntries).map { leaveEntry -> |
|
|
|
Leave().apply { |
|
|
|
this.staff = currentStaff |
|
|
|
this.recordDate = entryDate |
|
|
|
this.leaveType = leaveTypesMap[leaveEntry.leaveTypeId] |
|
|
|
this.leaveHours = leaveEntry.inputHours |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
val savedLeaves = leaveRepository.saveAll(leaves) |
|
|
|
|
|
|
|
return transformToLeaveEntryMap(savedLeaves) |
|
|
|
} |
|
|
|
|
|
|
|
private fun transformToLeaveEntryMap(leaves: List<Leave>): Map<String, List<LeaveEntry>> { |
|
|
|
return leaves |
|
|
|
.groupBy { leave -> leave.recordDate!!.format(DateTimeFormatter.ISO_LOCAL_DATE) } |
|
|
|
.mapValues { (_, leaveEntries) -> leaveEntries.map { leave -> |
|
|
|
LeaveEntry( |
|
|
|
id = leave.id!!, |
|
|
|
inputHours = leave.leaveHours ?: 0.0, |
|
|
|
leaveTypeId = leave.leaveType!!.id |
|
|
|
) |
|
|
|
} } |
|
|
|
} |
|
|
|
|
|
|
|
private fun mergeLeaveEntriesByType(entries: List<LeaveEntry>): List<LeaveEntry> { |
|
|
|
return entries |
|
|
|
.groupBy { leaveEntry -> leaveEntry.leaveTypeId } |
|
|
|
.values.map { leaveEntires -> |
|
|
|
leaveEntires.reduce { acc, leaveEntry -> acc.copy(inputHours = acc.inputHours + leaveEntry.inputHours) } |
|
|
|
} |
|
|
|
} |
|
|
|
} |