From d905fb478d8897abafdc995f2af560c7d3343048 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Wed, 5 Jun 2024 15:17:28 +0800 Subject: [PATCH] add authority to timesheet --- .../modules/data/entity/StaffRepository.java | 2 + .../modules/data/service/StaffsService.kt | 3 ++ .../modules/timesheet/service/LeaveService.kt | 48 ++++++++++------- .../timesheet/service/TimesheetsService.kt | 54 ++++++++++++------- .../20240604_01_cyril/01_insert_authority.sql | 8 +++ 5 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 src/main/resources/db/changelog/changes/20240604_01_cyril/01_insert_authority.sql diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java index d650327..b9fc459 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/StaffRepository.java @@ -22,5 +22,7 @@ public interface StaffRepository extends AbstractRepository { Optional findByUserId(@Param("userId") Long userId); Optional> findAllByTeamIdAndDeletedFalse(Long id); + Optional> findAllByDeletedFalse(); + Optional findIdAndNameByUserIdAndDeletedFalse(Long id); } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt index 1d7cc01..07ad658 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/StaffsService.kt @@ -84,6 +84,9 @@ open class StaffsService( return staffRepository.findAllByTeamIdAndDeletedFalse(id); } + open fun findAll(): Optional> { + return staffRepository.findAllByDeletedFalse() + } open fun getStaff(args: Map): Optional>? { val sql = StringBuilder("select" + " s.id as id," 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 73a42ba..5a0f7f5 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 @@ -57,9 +57,15 @@ open class LeaveService( @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 authorities = staffsService.currentAuthorities() ?: throw BadRequestException() + + if (!authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { + throw BadRequestException() + } + +// 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) @@ -87,22 +93,28 @@ open class LeaveService( } 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)) + val authorities = staffsService.currentAuthorities() ?: return emptyMap() + if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { + val currentStaff = staffsService.currentStaff() + + // Get team where current staff is team lead + val myTeam = if (currentStaff != null) teamService.getMyTeamForStaff(currentStaff) else null + val teamMembers = if (myTeam != null) { + staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) + } else { + staffsService.findAll().getOrDefault(emptyList()) + } + return teamMembers.associate { member -> + Pair( + member.id!!, + TeamMemberLeaveEntries( + staffId = member.staffId, + name = member.name, + leaveEntries = transformToLeaveEntryMap(leaveRepository.findAllByStaff(member)) + ) ) - ) - } + } + } else return emptyMap() } private fun transformToLeaveEntryMap(leaves: List): Map> { 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 96f9c23..a387127 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 @@ -1,6 +1,8 @@ package com.ffii.tsms.modules.timesheet.service import com.ffii.core.exception.BadRequestException +import com.ffii.tsms.modules.data.entity.Staff +import com.ffii.tsms.modules.data.entity.StaffRepository import com.ffii.tsms.modules.data.service.StaffsService import com.ffii.tsms.modules.data.service.TeamService import com.ffii.tsms.modules.project.entity.ProjectRepository @@ -24,8 +26,8 @@ open class TimesheetsService( private val projectRepository: ProjectRepository, private val taskRepository: TaskRepository, private val staffsService: StaffsService, - private val teamService: TeamService - ) { + private val teamService: TeamService, private val staffRepository: StaffRepository +) { @Transactional open fun saveTimesheet(recordTimeEntry: Map>): Map> { // Need to be associated with a staff @@ -59,9 +61,14 @@ open class TimesheetsService( @Transactional open fun saveMemberTimeEntry(staffId: Long, entry: TimeEntry, recordDate: LocalDate?): Map> { - val currentStaff = staffsService.currentStaff() ?: throw BadRequestException() - // Make sure current staff is a team lead - teamService.getMyTeamForStaff(currentStaff) ?: throw BadRequestException() + val authorities = staffsService.currentAuthorities() ?: throw BadRequestException() + + if (!authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { + throw BadRequestException() + } +// val currentStaff = staffsService.currentStaff() ?: throw BadRequestException() +// // Make sure current staff is a team lead +// teamService.getMyTeamForStaff(currentStaff) ?: throw BadRequestException() val memberStaff = staffsService.getStaff(staffId) @@ -101,22 +108,29 @@ open class TimesheetsService( } 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() - - val teamMembers = staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) - - return teamMembers.associate { member -> - Pair( - member.id!!, - TeamMemberTimeEntries( - staffId = member.staffId, - name = member.name, - timeEntries = transformToTimeEntryMap(timesheetRepository.findAllByStaff(member)) + val authorities = staffsService.currentAuthorities() ?: return emptyMap() + if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET")}) { + val currentStaff = staffsService.currentStaff() + // Get team where current staff is team lead + + val myTeam = if (currentStaff != null) teamService.getMyTeamForStaff(currentStaff) else null + val teamMembers = if (myTeam != null) { + staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) + } else { + staffsService.findAll().getOrDefault(emptyList()) + } + + return teamMembers.associate { member -> + Pair( + member.id!!, + TeamMemberTimeEntries( + staffId = member.staffId, + name = member.name, + timeEntries = transformToTimeEntryMap(timesheetRepository.findAllByStaff(member)) + ) ) - ) - } + } + } else return emptyMap() } private fun transformToTimeEntryMap(timesheets: List): Map> { diff --git a/src/main/resources/db/changelog/changes/20240604_01_cyril/01_insert_authority.sql b/src/main/resources/db/changelog/changes/20240604_01_cyril/01_insert_authority.sql new file mode 100644 index 0000000..323764e --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240604_01_cyril/01_insert_authority.sql @@ -0,0 +1,8 @@ +-- liquibase formatted sql +-- changeset cyril:authority, user_authority + +INSERT INTO authority (authority,name) +VALUES ('MAINTAIN_TIMESHEET_FAST_TIME_ENTRY','enter fast time entry in timesheet'); + +INSERT INTO user_authority (userId,authId) +VALUES (1,20);