| @@ -30,6 +30,11 @@ public class SalaryEffective extends IdEntity<Long> { | |||
| @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<Long> { | |||
| public void setSalary(Salary salary) { | |||
| this.salary = salary; | |||
| } | |||
| public Staff getStaff() { return staff; } | |||
| public void setStaff(Staff staff) { this.staff = staff; } | |||
| } | |||
| @@ -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<SalaryEffective, Long> { | |||
| Optional<SalaryEffective> findByStaffIdAndSalaryId(@Param("staffId") Long staffId, @Param("salaryId") Long salaryId); | |||
| } | |||
| @@ -51,10 +51,15 @@ public class Staff extends BaseEntity<Long> { | |||
| @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<Long> { | |||
| 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() { | |||
| @@ -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<Customer> { | |||
| @@ -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<SalaryEffective, Long, SalaryEffectiveRepository>(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 | |||
| } | |||
| } | |||
| @@ -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) | |||
| @@ -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<Subsidiary> { | |||
| @@ -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?, | |||
| ) | |||