diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffective.java b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffective.java index 2b01f9c..cc6092a 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffective.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffective.java @@ -30,6 +30,11 @@ public class SalaryEffective extends IdEntity { @NotNull private Salary salary; + @ManyToOne + @JoinColumn(name = "staffId") + @NotNull + private Staff staff; + public Salary getSalary() { return salary; } @@ -37,4 +42,8 @@ public class SalaryEffective extends IdEntity { public void setSalary(Salary salary) { this.salary = salary; } + + public Staff getStaff() { return staff; } + + public void setStaff(Staff staff) { this.staff = staff; } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java index fc3a291..8351d70 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SalaryEffectiveRepository.java @@ -1,7 +1,11 @@ package com.ffii.tsms.modules.data.entity; import com.ffii.core.support.AbstractRepository; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; public interface SalaryEffectiveRepository extends AbstractRepository { - + + Optional findByStaffIdAndSalaryId(@Param("staffId") Long staffId, @Param("salaryId") Long salaryId); } diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/Staff.java b/src/main/java/com/ffii/tsms/modules/data/entity/Staff.java index 001368f..5b04b2f 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/Staff.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/Staff.java @@ -51,10 +51,15 @@ public class Staff extends BaseEntity { @JoinColumn(name = "skillSetId") private Skill skill; +// @NotNull +// @ManyToOne +// @JoinColumn(name = "salaryEffId") +// private SalaryEffective salaryEffective; + @NotNull @ManyToOne - @JoinColumn(name = "salaryEffId") - private SalaryEffective salaryEffective; + @JoinColumn(name = "salaryId") + private Salary salary; @ManyToOne @JoinColumn(name = "departmentId") @@ -159,12 +164,12 @@ public class Staff extends BaseEntity { this.email = email; } - public SalaryEffective getSalaryEffective() { - return salaryEffective; + public Salary getSalary() { + return salary; } - public void setSalaryEffective(SalaryEffective salaryEffective) { - this.salaryEffective = salaryEffective; + public void setSalary(Salary salary) { + this.salary = salary; } public Skill getSkill() { diff --git a/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt b/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt index aeca073..4abb66e 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt @@ -30,7 +30,7 @@ open class CustomerService( } open fun findCustomer(id: Long): Customer { - return customerRepository.findById(id).orElseThrow() + return customerRepository.findById(id).orElse(Customer()) } open fun findCustomerByCode(code: String): Optional { diff --git a/src/main/java/com/ffii/tsms/modules/data/service/SalaryEffectiveService.kt b/src/main/java/com/ffii/tsms/modules/data/service/SalaryEffectiveService.kt index 0226a6c..f78fd42 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/SalaryEffectiveService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/SalaryEffectiveService.kt @@ -4,12 +4,16 @@ import com.ffii.core.support.AbstractIdEntityService import com.ffii.core.support.JdbcDao import com.ffii.tsms.modules.data.entity.SalaryEffective import com.ffii.tsms.modules.data.entity.SalaryEffectiveRepository +import com.ffii.tsms.modules.data.entity.SalaryRepository +import com.ffii.tsms.modules.data.entity.StaffRepository import org.springframework.stereotype.Service - +import java.time.LocalDate @Service open class SalaryEffectiveService( private val salaryEffectiveRepository: SalaryEffectiveRepository, + private val staffRepository: StaffRepository, + private val salaryRepository: SalaryRepository, private val jdbcDao: JdbcDao, ) : AbstractIdEntityService(jdbcDao, salaryEffectiveRepository) { @@ -22,4 +26,41 @@ open class SalaryEffectiveService( // ) // return jdbcDao.queryForList(sql.toString(), args) // } + + open fun findByStaffIdAndSalaryId(staffId: Long, salaryId: Long): SalaryEffective? { + return salaryEffectiveRepository.findByStaffIdAndSalaryId(staffId, salaryId).orElse(null) + } + + open fun findLatestSalaryIdByStaffId(staffId: Long): Long { + val sql = StringBuilder("select salaryId from salary_effective where staffId = :staffId order by id desc limit 1") + + val result = jdbcDao.queryForInt(sql.toString(), mapOf("staffId" to staffId)) + + return if(result > 0) result.toLong() else -1 + } + + open fun saveSalaryEffective (staffId: Long, salaryId: Long): SalaryEffective { + val existSalaryEffective = findByStaffIdAndSalaryId(staffId, salaryId) + + if (existSalaryEffective != null) { + val latestSalaryId = findLatestSalaryIdByStaffId(staffId) + + // If latest salary id is same as current salary id, then skip + if (latestSalaryId == existSalaryEffective.salary.id) { + return existSalaryEffective + } + } + + val staff = staffRepository.findById(staffId).orElseThrow() + val salary = salaryRepository.findById(salaryId).orElseThrow() + val salaryEffective = SalaryEffective().apply { + date = LocalDate.now() + this.staff = staff + this.salary = salary + } + + salaryEffectiveRepository.save(salaryEffective) + + return salaryEffective + } } \ 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 43c2e82..1333c2c 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 @@ -22,7 +22,9 @@ open class StaffsService( private val gradeRepository: GradeRepository, private val teamRepository: TeamRepository, private val skillRepository: SkillRepository, + private val salaryRepository: SalaryRepository, private val salaryEffectiveRepository: SalaryEffectiveRepository, + private val salaryEffectiveService: SalaryEffectiveService, private val departmentRepository: DepartmentRepository, private val jdbcDao: JdbcDao, private val passwordEncoder: PasswordEncoder @@ -73,10 +75,11 @@ open class StaffsService( val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() val joinPosition = positionRepository.findById(req.joinPositionId).orElseThrow() val company = companyRepository.findById(req.companyId).orElseThrow() - val grade = gradeRepository.findById(req.gradeId).orElseThrow() - val team = teamRepository.findById(req.teamId).orElseThrow() - val skill = skillRepository.findById(req.skillSetId).orElseThrow() - val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() + val grade = if (req.gradeId != null && req.gradeId > 0L) gradeRepository.findById(req.gradeId).orElseThrow() else null + val team = if (req.teamId != null && req.teamId > 0L) teamRepository.findById(req.teamId).orElseThrow() else null + val skill = if (req.skillSetId != null && req.skillSetId > 0L) skillRepository.findById(req.skillSetId).orElseThrow() else null + val salary = salaryRepository.findById(req.salaryId).orElseThrow() +// val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() val department = departmentRepository.findById(req.departmentId).orElseThrow() // // TODO: Add tasks, milestones, allocated @@ -100,10 +103,15 @@ open class StaffsService( this.grade = grade this.team = team this.skill = skill - this.salaryEffective = salaryEffective + this.salary = salary this.department = department } - return staffRepository.save(staff) + + staffRepository.save(staff) + + salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.id!!) + logger.info(staff.id) + return staff } @Transactional(rollbackFor = [Exception::class]) @@ -111,10 +119,11 @@ open class StaffsService( val currentPosition = positionRepository.findById(req.currentPositionId).orElseThrow() val joinPosition = positionRepository.findById(req.joinPositionId).orElseThrow() val company = companyRepository.findById(req.companyId).orElseThrow() - val grade = gradeRepository.findById(req.gradeId).orElseThrow() - val team = teamRepository.findById(req.teamId).orElseThrow() - val skill = skillRepository.findById(req.skillSetId).orElseThrow() - val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() + val grade = if (req.gradeId != null && req.gradeId > 0L) gradeRepository.findById(req.gradeId).orElseThrow() else null + val team = if (req.teamId != null && req.teamId > 0L) teamRepository.findById(req.teamId).orElseThrow() else null + val skill = if (req.skillSetId != null && req.skillSetId > 0L) skillRepository.findById(req.skillSetId).orElseThrow() else null + val salary = salaryRepository.findById(req.salaryId).orElseThrow() +// val salaryEffective = salaryEffectiveRepository.findById(req.salaryEffId).orElseThrow() val department = departmentRepository.findById(req.departmentId).orElseThrow() staff.apply { @@ -136,17 +145,19 @@ open class StaffsService( this.grade = grade this.team = team this.skill = skill - this.salaryEffective = salaryEffective + this.salary = salary this.department = department } + salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.id!!) + return staffRepository.save(staff) } @Transactional(rollbackFor = [Exception::class]) open fun saveOrUpdate(req: NewStaffRequest): Staff { - val staff = find(req.id).get() - if (req.id != 0L) { + val staff = if(req.id > 0L) find(req.id).get() else Staff() + if (req.id > 0L) { updateStaff(req, staff) } else { saveStaff(req) diff --git a/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt index 32ae5df..ea55431 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt @@ -31,7 +31,7 @@ open class SubsidiaryService( } open fun findSubsidiary(id: Long): Subsidiary { - return subsidiaryRepository.findById(id).orElseThrow() + return subsidiaryRepository.findById(id).orElse(Subsidiary()) } open fun findSubsidiaryByCode(code: String): Optional { diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt index 4e3c833..338d5d1 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/NewStaffRequest.kt @@ -15,24 +15,24 @@ data class NewStaffRequest( val staffId: String, @field:NotNull(message = "Staff companyId cannot be empty") val companyId: Long, - @field:NotNull(message = "Staff salaryEffId cannot be empty") - val salaryEffId: Long, - @field:NotNull(message = "Staff skillSetId cannot be empty") - val skillSetId: Long, + @field:NotNull(message = "Staff salaryId cannot be empty") + val salaryId: Long, +// @field:NotNull(message = "Staff skillSetId cannot be empty") + val skillSetId: Long?, val joinDate: LocalDate, val currentPositionId: Long, val joinPositionId: Long, - val gradeId: Long, - val teamId: Long, + val gradeId: Long?, + val teamId: Long?, val departmentId: Long, val phone1: String, - val phone2: String, + val phone2: String?, val email: String, val emergContactName: String, val emergContactPhone: String, val employType: String, - val departDate: LocalDate, - val departReason: String, - val remark: String, + val departDate: LocalDate?, + val departReason: String?, + val remark: String?, ) \ No newline at end of file