# Conflicts: # src/main/java/com/ffii/tsms/modules/common/mail/service/MailReminderService.ktdevelop
| @@ -9,7 +9,7 @@ import org.springframework.data.repository.query.Param; | |||
| import com.ffii.core.support.AbstractRepository; | |||
| public interface CustomerRepository extends AbstractRepository<Customer, Long> { | |||
| List<Customer> findAllByDeletedFalse(); | |||
| List<Customer> findAllByDeletedFalseOrderByNameAsc(); | |||
| Optional<Customer> findByCode(@Param("code") String code); | |||
| Optional<Customer> findByName(@Param("name") String name); | |||
| @@ -10,6 +10,7 @@ public interface GradeLogRepository extends AbstractRepository<GradeLog, Long> { | |||
| List<GradeLogInfo> findGradeLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| GradeLog findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| void deleteAllByStaff(Staff staff); | |||
| List<GradeLog> findByDeletedFalseAndFromBeforeAndToIsNullOrToAfter(LocalDate before, LocalDate after); | |||
| // fun findByDeletedFalseAndRecordDateBetweenOrderByRecordDate(start: LocalDate, end: LocalDate): List<Timesheet> | |||
| } | |||
| @@ -8,7 +8,7 @@ import java.util.List; | |||
| public interface PositionLogRepository extends AbstractRepository<PositionLog, Long> { | |||
| List<PositionLogInfo> findPositionLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| void deleteAllByStaff(Staff staff); | |||
| PositionLog findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| } | |||
| @@ -28,6 +28,8 @@ public interface StaffRepository extends AbstractRepository<Staff, Long> { | |||
| Optional<List<Staff>> findAllByDeletedFalse(); | |||
| Optional<List<Staff>> findAllByIdInAndDeletedFalse(List<Long> id); | |||
| Optional<Staff> findIdAndNameByUserIdAndDeletedFalse(Long id); | |||
| } | |||
| @@ -8,7 +8,7 @@ import java.util.List; | |||
| import java.util.Optional; | |||
| public interface SubsidiaryRepository extends AbstractRepository<Subsidiary, Long> { | |||
| List<Subsidiary> findAllByDeletedFalse(); | |||
| List<Subsidiary> findAllByDeletedFalseOrderByNameAsc(); | |||
| List<Subsidiary> findAllByDeletedFalseAndIdIn(List<Long> id); | |||
| @@ -8,4 +8,7 @@ import java.util.List; | |||
| public interface TeamLogRepository extends AbstractRepository<TeamLog, Long> { | |||
| List<TeamLogInfo> findTeamLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| TeamLog findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(Long staffId); | |||
| void deleteAllByStaff(Staff staff); | |||
| } | |||
| @@ -23,7 +23,7 @@ open class CustomerService( | |||
| ) : AbstractBaseEntityService<Customer, Long, CustomerRepository>(jdbcDao, customerRepository){ | |||
| open fun allCustomers(): List<Customer> { | |||
| return customerRepository.findAllByDeletedFalse() | |||
| return customerRepository.findAllByDeletedFalseOrderByNameAsc() | |||
| } | |||
| open fun allCustomerTypes(): List<CustomerType> { | |||
| @@ -3989,7 +3989,7 @@ open class DashboardService( | |||
| + " c.code as customerCode, " | |||
| + " su.name as subsidiary, " | |||
| + " coalesce(pf.projectFee, 0) as totalFee, " | |||
| + " (coalesce(pf.projectFee, 0) - ifnull(p.subContractFee, 0)) * 0.8 as totalBudget, " | |||
| + " coalesce(pf.projectFee, 0) * 0.8 as totalBudget, " | |||
| + " coalesce(me.manhourExpense, 0) as manhourExpense, " | |||
| + " coalesce(id.invoicedAmount, 0) as invoicedAmount, " | |||
| // + " coalesce(id.uninvoicedAmount, 0) as uninvoicedAmount, " | |||
| @@ -2,14 +2,11 @@ package com.ffii.tsms.modules.data.service | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.tsms.modules.data.entity.Department | |||
| import com.ffii.tsms.modules.data.entity.DepartmentRepository | |||
| import com.ffii.tsms.modules.data.entity.GradeLog | |||
| import com.ffii.tsms.modules.data.entity.GradeLogRepository | |||
| import com.ffii.tsms.modules.data.entity.GradeRepository | |||
| import com.ffii.tsms.modules.data.entity.* | |||
| import com.ffii.tsms.modules.data.entity.projections.GradeLogInfo | |||
| import com.ffii.tsms.modules.data.web.models.GradeHistory | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Transactional | |||
| @Service | |||
| open class GradeLogService( | |||
| @@ -18,8 +15,35 @@ open class GradeLogService( | |||
| private val jdbcDao: JdbcDao, | |||
| ) : AbstractBaseEntityService<GradeLog, Long, GradeLogRepository>(jdbcDao, gradeLogRepository) { | |||
| open fun allGradeLog(staffId: Long): List<GradeLogInfo> { | |||
| return gradeLogRepository.findGradeLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId).drop(1) | |||
| return gradeLogRepository.findGradeLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId) | |||
| } | |||
| @Transactional | |||
| open fun saveGradeLogs(staff: Staff, entries: List<GradeHistory>) { | |||
| try { | |||
| // replace grade log data by delete all and add | |||
| gradeLogRepository.deleteAllByStaff(staff) | |||
| val sortedEntries = entries.sortedBy { it.from } | |||
| val gradeEntries = mutableListOf<GradeLog>() | |||
| sortedEntries.forEachIndexed { index, it -> | |||
| val grade = gradeRepository.findById(it.grade).orElseThrow() | |||
| val gradeLog = GradeLog().apply { | |||
| this.staff = staff | |||
| this.grade = grade | |||
| this.from = it.from | |||
| } | |||
| if (index > 0) { | |||
| gradeEntries[index - 1].to = it.from | |||
| } | |||
| gradeEntries.add(gradeLog) | |||
| } | |||
| gradeLogRepository.saveAll(gradeEntries) | |||
| } catch (e: Exception) { | |||
| throw Exception("Error saving grade logs", e) | |||
| } | |||
| } | |||
| open fun editGradeLog(gradeHistory: List<GradeHistory>, delGradeHistory: List<Long>) { | |||
| if (delGradeHistory.isNotEmpty()) { | |||
| delGradeHistory.forEach { | |||
| @@ -2,12 +2,11 @@ package com.ffii.tsms.modules.data.service | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.tsms.modules.data.entity.PositionLog | |||
| import com.ffii.tsms.modules.data.entity.PositionLogRepository | |||
| import com.ffii.tsms.modules.data.entity.PositionRepository | |||
| import com.ffii.tsms.modules.data.entity.* | |||
| import com.ffii.tsms.modules.data.entity.projections.PositionLogInfo | |||
| import com.ffii.tsms.modules.data.web.models.PositionHistory | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Transactional | |||
| @Service | |||
| @@ -17,7 +16,33 @@ open class PositionLogService ( | |||
| private val jdbcDao: JdbcDao, | |||
| ) : AbstractBaseEntityService<PositionLog, Long, PositionLogRepository>(jdbcDao, positionLogRepository) { | |||
| open fun allPositionLog(staffId: Long): List<PositionLogInfo> { | |||
| return positionLogRepository.findPositionLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId).drop(1) | |||
| return positionLogRepository.findPositionLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId) | |||
| } | |||
| @Transactional | |||
| open fun savePositionLogs(staff: Staff, entries: List<PositionHistory>) { | |||
| try { | |||
| // replace team log data by delete all and add | |||
| positionLogRepository.deleteAllByStaff(staff) | |||
| val sortedEntries = entries.sortedBy { it.from } | |||
| val positionEntries = mutableListOf<PositionLog>() | |||
| sortedEntries.forEachIndexed { index, it -> | |||
| val position = positionRepository.findById(it.position).orElseThrow() | |||
| val positionLog = PositionLog().apply { | |||
| this.staff = staff | |||
| this.position = position | |||
| this.from = it.from | |||
| } | |||
| if (index > 0) { | |||
| positionEntries[index - 1].to = it.from | |||
| } | |||
| positionEntries.add(positionLog) | |||
| } | |||
| positionLogRepository.saveAll(positionEntries) | |||
| } catch (e: Exception) { | |||
| throw Exception("Error saving position logs", e) | |||
| } | |||
| } | |||
| open fun editPositionLog(positionHistory: List<PositionHistory>, delPositionHistory: List<Long>) { | |||
| @@ -4,15 +4,12 @@ import com.ffii.core.exception.UnprocessableEntityException | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.tsms.modules.common.SecurityUtils | |||
| import com.ffii.tsms.modules.common.SettingNames | |||
| import com.ffii.tsms.modules.common.mail.pojo.MailRequest | |||
| import com.ffii.tsms.modules.data.entity.* | |||
| import com.ffii.tsms.modules.data.entity.projections.StaffSearchInfo | |||
| import com.ffii.tsms.modules.data.web.models.NewStaffRequest | |||
| import com.ffii.tsms.modules.data.web.models.SalaryEffectiveInfo | |||
| import com.ffii.tsms.modules.user.entity.User | |||
| import com.ffii.tsms.modules.user.entity.UserRepository | |||
| import jakarta.mail.internet.InternetAddress | |||
| import org.springframework.scheduling.annotation.Scheduled | |||
| import org.springframework.security.core.GrantedAuthority | |||
| import org.springframework.security.crypto.password.PasswordEncoder | |||
| @@ -97,8 +94,13 @@ open class StaffsService( | |||
| } | |||
| open fun findAll(): Optional<List<Staff>> { | |||
| return staffRepository.findAllByDeletedFalse() | |||
| return staffRepository.findAllByDeletedFalse(); | |||
| } | |||
| open fun findAllByIdIn(ids: List<Long>): Optional<List<Staff>> { | |||
| return staffRepository.findAllByIdInAndDeletedFalse(ids); | |||
| } | |||
| open fun getStaff(args: Map<String, Any>): Optional<MutableMap<String, Any>>? { | |||
| val sql = StringBuilder("select" | |||
| + " s.id as id," | |||
| @@ -135,14 +137,18 @@ open class StaffsService( | |||
| throw UnprocessableEntityException("Duplicated StaffId Found") | |||
| } | |||
| } | |||
| val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | |||
| // val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | |||
| val joinPosition = if (req.joinPositionId != null && req.joinPositionId > 0L) positionRepository.findById(req.joinPositionId).orElseThrow() else null | |||
| val company = companyRepository.findById(req.companyId).orElseThrow() | |||
| val grade = gradeRepository.findById(req.gradeId).orElseThrow() | |||
| val team = if (req.teamId != null && req.teamId > 0L) teamRepository.findById(req.teamId).orElseThrow() else null | |||
| val salary = salaryRepository.findBySalaryPoint(req.salaryId).orElseThrow() | |||
| // val grade = gradeRepository.findById(req.gradeId).orElseThrow() | |||
| // val team = if (req.teamId != null && req.teamId > 0L) teamRepository.findById(req.teamId).orElseThrow() else null | |||
| // val salary = salaryRepository.findBySalaryPoint(req.salaryId).orElseThrow() | |||
| val department = if (req.departmentId != null && req.departmentId > 0L) departmentRepository.findById(req.departmentId).orElseThrow() else null | |||
| val salary = if (!req.salaryEffectiveInfo.isNullOrEmpty()) salaryRepository.findBySalaryPoint(req.salaryEffectiveInfo.last().salaryPoint).orElseThrow() else null | |||
| val team = if (!req.teamHistory.isNullOrEmpty()) teamRepository.findById(req.teamHistory.last().team).orElseThrow() else null | |||
| val grade = if (!req.gradeHistory.isNullOrEmpty()) gradeRepository.findById(req.gradeHistory.last().grade).orElseThrow() else null | |||
| val currentPosition = if (!req.positionHistory.isNullOrEmpty()) positionRepository.findById(req.positionHistory.last().position).orElseThrow() else null | |||
| val user = userRepository.saveAndFlush( | |||
| User().apply { | |||
| username = req.staffId | |||
| @@ -193,29 +199,19 @@ open class StaffsService( | |||
| staffSkillsetRepository.save(ss) | |||
| } | |||
| } | |||
| salaryEffectiveService.saveSalaryEffective(staff.id!!, req.joinDate ?: LocalDate.now(), salary.salaryPoint.toLong()) | |||
| if (team != null) { | |||
| val teamLog = TeamLog().apply { | |||
| this.staff = staff | |||
| this.team = team | |||
| from = req.joinDate ?: LocalDate.now() | |||
| } | |||
| teamLogRepository.save(teamLog) | |||
| // if (salary != null) salaryEffectiveService.saveSalaryEffective(staff.id!!, req.joinDate ?: LocalDate.now(), salary.salaryPoint.toLong()) | |||
| if (!req.salaryEffectiveInfo.isNullOrEmpty()) { | |||
| salaryEffectiveService.updateSalaryEffective(staff.id!!, req.salaryEffectiveInfo.sortedBy { it.date }, listOf()) | |||
| } | |||
| val gradeLog = GradeLog().apply { | |||
| this.staff = staff | |||
| this.grade = grade | |||
| from = req.joinDate ?: LocalDate.now() | |||
| if (!req.teamHistory.isNullOrEmpty()) { | |||
| teamLogService.saveTeamLogs(staff, req.teamHistory) | |||
| } | |||
| gradeLogRepository.save(gradeLog) | |||
| val positionLog = PositionLog().apply { | |||
| this.staff = staff | |||
| this.position = currentPosition | |||
| from = req.joinDate ?: LocalDate.now() | |||
| if (!req.gradeHistory.isNullOrEmpty()) { | |||
| gradeLogService.saveGradeLogs(staff, req.gradeHistory) | |||
| } | |||
| if (!req.positionHistory.isNullOrEmpty()) { | |||
| positionLogService.savePositionLogs(staff, req.positionHistory) | |||
| } | |||
| positionLogRepository.save(positionLog) | |||
| return staff | |||
| } | |||
| @@ -235,54 +231,35 @@ open class StaffsService( | |||
| staffSkillsetRepository.save(ss) | |||
| } | |||
| } | |||
| val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() | |||
| val gradeHistory = req.gradeHistory | |||
| val positionHistory = req.positionHistory | |||
| val teamHistory = req.teamHistory | |||
| var currentPosition: Position? = null | |||
| var grade: Grade? = null | |||
| var team: Team? = null | |||
| if (!positionHistory.isNullOrEmpty()) { | |||
| currentPosition = positionRepository.findById(req.positionHistory.last().position).orElseThrow() | |||
| positionLogService.savePositionLogs(staff, positionHistory) | |||
| } | |||
| if (!gradeHistory.isNullOrEmpty()) { | |||
| grade = gradeRepository.findById(req.gradeHistory.last().grade).orElseThrow() | |||
| gradeLogService.saveGradeLogs(staff, gradeHistory) | |||
| } | |||
| if (!teamHistory.isNullOrEmpty()) { | |||
| team = teamRepository.findById(req.teamHistory.last().team).orElseThrow() | |||
| teamLogService.saveTeamLogs(staff, teamHistory) | |||
| } | |||
| // val currentPosition = if (!positionHistory.isNullOrEmpty()) positionRepository.findById(req.positionHistory.last().position).orElseThrow() else null | |||
| // val grade = if (!gradeHistory.isNullOrEmpty()) gradeRepository.findById(req.gradeHistory.last().grade).orElseThrow() else null | |||
| // val team = if (!teamHistory.isNullOrEmpty()) teamRepository.findById(req.teamHistory.last().team).orElseThrow() else null | |||
| val joinPosition = if (req.joinPositionId != null && req.joinPositionId > 0L) positionRepository.findById(req.joinPositionId).orElseThrow() else null | |||
| val company = companyRepository.findById(req.companyId).orElseThrow() | |||
| val grade = gradeRepository.findById(req.gradeId).orElseThrow() | |||
| val team = if (req.teamId != null && req.teamId > 0L) teamRepository.findById(req.teamId).orElseThrow() else null | |||
| val salaryPoint = checkLatestSalaryPoint(req?.salaryEffectiveInfo) ?: 0 | |||
| val salary = salaryRepository.findBySalaryPoint(salaryPoint).orElseThrow() | |||
| val department = if (req.departmentId != null && req.departmentId > 0L) departmentRepository.findById(req.departmentId).orElseThrow() else null | |||
| val latestTeam = teamLogRepository.findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(staff.id) | |||
| val latestGrade = gradeLogRepository.findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(staff.id) | |||
| val latestPosition = positionLogRepository.findFirstByStaffIdAndDeletedFalseOrderByCreatedDesc(staff.id) | |||
| if (latestTeam != null && latestTeam.team.id != req.teamId) { | |||
| val teamLog = TeamLog().apply { | |||
| this.staff = staff | |||
| this.team = team | |||
| from = LocalDate.now() | |||
| } | |||
| val lastRecordTeam = latestTeam.apply { | |||
| to = LocalDate.now() | |||
| } | |||
| teamLogRepository.save(teamLog) | |||
| teamLogRepository.save(lastRecordTeam) | |||
| } | |||
| if (latestGrade != null && latestGrade.grade.id != req.gradeId) { | |||
| val gradeLog = GradeLog().apply { | |||
| this.staff = staff | |||
| this.grade = grade | |||
| from = LocalDate.now() | |||
| } | |||
| val lastRecordGrade = latestGrade.apply { | |||
| to = LocalDate.now() | |||
| } | |||
| gradeLogRepository.save(gradeLog) | |||
| gradeLogRepository.save(lastRecordGrade) | |||
| } | |||
| if (latestPosition != null && latestPosition.position.id != req.currentPositionId) { | |||
| val positionLog = PositionLog().apply { | |||
| this.staff = staff | |||
| this.position = currentPosition | |||
| from = LocalDate.now() | |||
| } | |||
| val lastRecordPosition = latestPosition.apply { | |||
| to = LocalDate.now() | |||
| } | |||
| positionLogRepository.save(positionLog) | |||
| positionLogRepository.save(lastRecordPosition) | |||
| } | |||
| staff.apply { | |||
| joinDate = req.joinDate | |||
| name = req.name | |||
| @@ -320,13 +297,14 @@ open class StaffsService( | |||
| // salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.salaryPoint.toLong()) | |||
| if (req.salaryEffectiveInfo != null && req.delSalaryEffectiveInfo != null) { | |||
| salaryEffectiveService.updateSalaryEffective(staff.id!!, req.salaryEffectiveInfo.sortedBy { it.date }, req.delSalaryEffectiveInfo) | |||
| } else if (req.teamHistory != null && req.delTeamHistory != null) { | |||
| teamLogService.editTeamLog(req.teamHistory, req.delTeamHistory) | |||
| } else if (req.gradeHistory != null && req.delGradeHistory != null) { | |||
| gradeLogService.editGradeLog(req.gradeHistory, req.delGradeHistory) | |||
| } else if (req.positionHistory != null && req.delPositionHistory != null) { | |||
| positionLogService.editPositionLog(req.positionHistory, req.delPositionHistory) | |||
| } | |||
| // else if (req.teamHistory != null && req.delTeamHistory != null) { | |||
| // teamLogService.editTeamLog(req.teamHistory, req.delTeamHistory) | |||
| // } else if (req.gradeHistory != null && req.delGradeHistory != null) { | |||
| // gradeLogService.editGradeLog(req.gradeHistory, req.delGradeHistory) | |||
| // } else if (req.positionHistory != null && req.delPositionHistory != null) { | |||
| // positionLogService.editPositionLog(req.positionHistory, req.delPositionHistory) | |||
| // } | |||
| return staffRepository.save(staff) | |||
| } | |||
| @@ -23,7 +23,7 @@ open class SubsidiaryService( | |||
| private val subsidiaryContactService: SubsidiaryContactService, | |||
| ) : AbstractBaseEntityService<Subsidiary, Long, SubsidiaryRepository>(jdbcDao, subsidiaryRepository) { | |||
| open fun allSubsidiaries(): List<Subsidiary> { | |||
| return subsidiaryRepository.findAllByDeletedFalse() | |||
| return subsidiaryRepository.findAllByDeletedFalseOrderByNameAsc() | |||
| } | |||
| open fun allSubsidiaryTypes(): List<SubsidiaryType> { | |||
| @@ -2,12 +2,11 @@ package com.ffii.tsms.modules.data.service | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.tsms.modules.data.entity.TeamLog | |||
| import com.ffii.tsms.modules.data.entity.TeamLogRepository | |||
| import com.ffii.tsms.modules.data.entity.TeamRepository | |||
| import com.ffii.tsms.modules.data.entity.* | |||
| import com.ffii.tsms.modules.data.entity.projections.TeamLogInfo | |||
| import com.ffii.tsms.modules.data.web.models.TeamHistory | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Transactional | |||
| import java.time.LocalDate | |||
| @Service | |||
| @@ -17,7 +16,7 @@ open class TeamLogService ( | |||
| private val jdbcDao: JdbcDao, | |||
| ) : AbstractBaseEntityService<TeamLog, Long, TeamLogRepository>(jdbcDao, teamLogRepository) { | |||
| open fun allTeamLog(staffId: Long): List<TeamLogInfo> { | |||
| return teamLogRepository.findTeamLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId).drop(1) | |||
| return teamLogRepository.findTeamLogInfoByStaffIdAndDeletedFalseOrderByCreatedDesc(staffId) | |||
| } | |||
| open fun getStaffTeamLog(staffId:Long, recordDate: LocalDate): TeamLog? { | |||
| @@ -30,6 +29,34 @@ open class TeamLogService ( | |||
| return team | |||
| } | |||
| @Transactional | |||
| open fun saveTeamLogs(staff: Staff, entries: List<TeamHistory>) { | |||
| try { | |||
| val testList = mutableListOf<Int>() | |||
| // replace team log data by delete all and add | |||
| teamLogRepository.deleteAllByStaff(staff) | |||
| val sortedEntries = entries.sortedBy { it.from } | |||
| val teamEntries = mutableListOf<TeamLog>() | |||
| sortedEntries.forEachIndexed { index, it -> | |||
| val team = teamRepository.findById(it.team).orElseThrow() | |||
| val teamLog = TeamLog().apply { | |||
| this.staff = staff | |||
| this.team = team | |||
| this.from = it.from | |||
| } | |||
| if (index > 0) { | |||
| teamEntries[index - 1].to = it.from | |||
| } | |||
| testList.add(index) | |||
| teamEntries.add(teamLog) | |||
| } | |||
| teamLogRepository.saveAll(teamEntries) | |||
| } catch (e: Exception) { | |||
| throw Exception("Error saving team logs", e) | |||
| } | |||
| } | |||
| open fun editTeamLog(teamHistory: List<TeamHistory>, delTeamHistory: List<Long>) { | |||
| if (delTeamHistory.isNotEmpty()) { | |||
| delTeamHistory.forEach { | |||
| @@ -12,18 +12,15 @@ data class NewStaffRequest( | |||
| val staffId: String, | |||
| @field:NotNull(message = "Staff companyId cannot be empty") | |||
| val companyId: Long, | |||
| @field:NotNull(message = "Staff salaryId cannot be empty") | |||
| val salaryId: Long, | |||
| @field:NotNull(message = "Staff currentPositionId cannot be empty") | |||
| val currentPositionId: Long, | |||
| @field:NotBlank(message = "Staff phone1 cannot be empty") | |||
| val phone1: String, | |||
| @field:NotBlank(message = "Staff email cannot be empty") | |||
| val email: String, | |||
| @field:NotBlank(message = "Staff employType cannot be empty") | |||
| val employType: String, | |||
| @field:NotNull(message = "Staff grade cannot be empty") | |||
| val gradeId: Long, | |||
| val currentPositionId: Long?, | |||
| val gradeId: Long?, | |||
| val joinDate: LocalDate?, | |||
| val joinPositionId: Long?, | |||
| @@ -101,18 +101,24 @@ open class LeaveService( | |||
| open fun getTeamMemberLeave(): Map<Long, TeamMemberLeaveEntries> { | |||
| val authorities = staffsService.currentAuthorities() ?: return emptyMap() | |||
| if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { | |||
| val authMaintainTimesheet = authorities.any { it.authority.equals("MAINTAIN_TIMESHEET") } | |||
| val authMaintainTimesheetSelf = authorities.any { it.authority.equals("MAINTAIN_TIMESHEET_SELF") } | |||
| // if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { | |||
| if (authMaintainTimesheet || authMaintainTimesheetSelf) { | |||
| 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) { | |||
| val teamMembers = if (myTeam != null && authMaintainTimesheet) { | |||
| staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) | |||
| } else if (authMaintainTimesheetSelf) { | |||
| staffsService.findAllByIdIn(listOf(currentStaff?.id!!)).getOrDefault(emptyList()) | |||
| } else { | |||
| staffsService.findAll().getOrDefault(emptyList()) | |||
| } | |||
| return teamMembers.filter { it.departDate == null }.associate { member -> | |||
| return teamMembers.filter { it.departDate == null || it.departDate > LocalDate.now() }.sortedBy { it.staffId }.associate { member -> | |||
| Pair( | |||
| member.id!!, | |||
| TeamMemberLeaveEntries( | |||
| @@ -129,18 +129,23 @@ open class TimesheetsService( | |||
| open fun getTeamMemberTimesheet(): Map<Long, TeamMemberTimeEntries> { | |||
| val authorities = staffsService.currentAuthorities() ?: return emptyMap() | |||
| if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { | |||
| val authMaintainTimesheet = authorities.any { it.authority.equals("MAINTAIN_TIMESHEET") } | |||
| val authMaintainTimesheetSelf = authorities.any { it.authority.equals("MAINTAIN_TIMESHEET_SELF") } | |||
| // if (authorities.stream().anyMatch { it.authority.equals("MAINTAIN_TIMESHEET") }) { | |||
| if (authMaintainTimesheet || authMaintainTimesheetSelf) { | |||
| val currentStaff = staffsService.currentStaff() | |||
| // Get team where current staff is team lead | |||
| // Get team where current staff is team lead | |||
| val myTeam = if (currentStaff != null) teamService.getMyTeamForStaff(currentStaff) else null | |||
| val teamMembers = if (myTeam != null) { | |||
| val teamMembers = if (myTeam != null && authMaintainTimesheet) { | |||
| staffsService.findAllByTeamId(myTeam.id!!).getOrDefault(emptyList()) | |||
| } else if (authMaintainTimesheetSelf) { | |||
| staffsService.findAllByIdIn(listOf(currentStaff?.id!!)).getOrDefault(emptyList()) | |||
| } else { | |||
| staffsService.findAll().getOrDefault(emptyList()) | |||
| } | |||
| return teamMembers.filter { it.departDate == null }.associate { member -> | |||
| return teamMembers.filter { it.departDate == null || it.departDate > LocalDate.now() }.sortedBy { it.staffId }.associate { member -> | |||
| Pair( | |||
| member.id!!, | |||
| TeamMemberTimeEntries( | |||
| @@ -151,7 +156,9 @@ open class TimesheetsService( | |||
| ) | |||
| ) | |||
| } | |||
| } else return emptyMap() | |||
| } | |||
| return emptyMap() | |||
| } | |||
| private fun transformToTimeEntryMap(timesheets: List<Timesheet>): Map<String, List<TimeEntry>> { | |||
| @@ -0,0 +1,5 @@ | |||
| -- liquibase formatted sql | |||
| -- changeset cyril:add_authority | |||
| INSERT INTO `authority` (`authority`, `name`) VALUES | |||
| ('MAINTAIN_TIMESHEET_SELF', 'Maintain Self Timesheet'); | |||