| @@ -8,6 +8,8 @@ import com.ffii.tsms.modules.data.entity.SalaryEffectiveRepository | |||
| import com.ffii.tsms.modules.data.entity.SalaryRepository | |||
| import com.ffii.tsms.modules.data.entity.Staff | |||
| import com.ffii.tsms.modules.data.entity.StaffRepository | |||
| import com.ffii.tsms.modules.data.web.models.SalaryEffectiveInfo | |||
| import com.ffii.tsms.modules.data.web.models.SalaryEffectiveInfoResponse | |||
| import org.springframework.stereotype.Service | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDate | |||
| @@ -44,6 +46,23 @@ open class SalaryEffectiveService( | |||
| return if(result > 0) result.toLong() else -1 | |||
| } | |||
| open fun findSalaryEffectiveInfoByStaffId(staffId: Long): List<SalaryEffectiveInfoResponse> { | |||
| val sql = StringBuilder( " Select se.*, s.lowerLimit, s.upperLimit " + | |||
| " from salary_effective se " + | |||
| " join salary s on s.salaryPoint = se.salaryId " + | |||
| " where staffId = :staffId order by date ") | |||
| val result = jdbcDao.queryForList(sql.toString(), mapOf("staffId" to staffId)).map { | |||
| result -> SalaryEffectiveInfoResponse( | |||
| (result["id"] as Int).toLong(), | |||
| (result["salaryId"] as Int).toLong(), | |||
| (result["lowerLimit"] as Int), | |||
| (result["upperLimit"] as Int), | |||
| (result["date"] as java.sql.Date).toLocalDate(), | |||
| ) | |||
| } | |||
| return result | |||
| } | |||
| open fun saveSalaryEffective (staffId: Long, salaryId: Long): SalaryEffective? { | |||
| // val existSalaryEffective = findByStaffIdAndSalaryId(staffId, salaryId) | |||
| // | |||
| @@ -62,6 +81,8 @@ open class SalaryEffectiveService( | |||
| val salary = salaryRepository.findBySalaryPoint(salaryId).orElseThrow() | |||
| val salaryEffective = SalaryEffective().apply { | |||
| date = LocalDate.now() | |||
| startDate = LocalDate.now() | |||
| endDate = LocalDate.of(2124, 1, 1) | |||
| this.staff = staff | |||
| this.salary = salary | |||
| } | |||
| @@ -71,6 +92,42 @@ open class SalaryEffectiveService( | |||
| return salaryEffective | |||
| } | |||
| open fun updateSalaryEffective(staffId: Long, salaryEffectiveInfo: List<SalaryEffectiveInfo>?){ | |||
| salaryEffectiveInfo?.forEachIndexed { index, item -> | |||
| val staff = staffRepository.findById(staffId).orElseThrow() | |||
| val salary = salaryRepository.findBySalaryPoint(item.salaryPoint).orElseThrow() | |||
| val salaryEffective: SalaryEffective | |||
| val endDate: LocalDate | |||
| endDate = if(index == salaryEffectiveInfo.lastIndex){ | |||
| LocalDate.of(2124, 1, 1) | |||
| }else{ | |||
| salaryEffectiveInfo[index+1].date | |||
| } | |||
| if (salaryEffectiveRepository.findById(item.id).isEmpty) { | |||
| salaryEffective = SalaryEffective().apply { | |||
| date = item.date | |||
| startDate = item.date | |||
| this.endDate = endDate | |||
| this.staff = staff | |||
| this.salary = salary | |||
| } | |||
| } else { | |||
| salaryEffective = salaryEffectiveRepository.findById(item.id).get() | |||
| salaryEffective.apply { | |||
| date = item.date | |||
| startDate = item.date | |||
| this.endDate = endDate | |||
| this.staff = staff | |||
| this.salary = salary | |||
| } | |||
| } | |||
| salaryEffectiveRepository.save(salaryEffective) | |||
| } | |||
| } | |||
| data class SalaryData(val idInStaff: Long, val staffId: String, val financialYear: LocalDate, val hourlyRate: BigDecimal, val salaryPoint: Int) | |||
| data class StaffSalaryData(val staffId: String, val salaryData: List<SalaryData>) | |||
| @@ -7,6 +7,7 @@ import com.ffii.tsms.modules.common.SecurityUtils | |||
| 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 org.springframework.security.core.GrantedAuthority | |||
| @@ -199,7 +200,8 @@ open class StaffsService( | |||
| 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 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 | |||
| staff.apply { | |||
| @@ -224,7 +226,8 @@ open class StaffsService( | |||
| this.department = department | |||
| } | |||
| salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.salaryPoint.toLong()) | |||
| // salaryEffectiveService.saveSalaryEffective(staff.id!!, salary.salaryPoint.toLong()) | |||
| // salaryEffectiveService.updateSalaryEffective(staff.id!!, req.salaryEffectiveInfo?.sortedBy { it.date }) | |||
| return staffRepository.save(staff) | |||
| } | |||
| @@ -259,4 +262,9 @@ open class StaffsService( | |||
| open fun currentAuthorities(): Collection<GrantedAuthority>? { | |||
| return SecurityUtils.getUser().getOrNull()?.authorities | |||
| } | |||
| open fun checkLatestSalaryPoint(salaryEffectInfo: List<SalaryEffectiveInfo>?): Long?{ | |||
| val latestSalaryPoint = salaryEffectInfo?.maxByOrNull { it.date }?.salaryPoint | |||
| return latestSalaryPoint | |||
| } | |||
| } | |||
| @@ -3,6 +3,8 @@ package com.ffii.tsms.modules.data.web | |||
| import com.ffii.core.response.RecordsRes | |||
| import com.ffii.core.utils.CriteriaArgsBuilder | |||
| import com.ffii.tsms.modules.data.service.SalaryEffectiveService | |||
| import com.ffii.tsms.modules.data.web.models.SalaryEffectiveInfo | |||
| import com.ffii.tsms.modules.data.web.models.SalaryEffectiveInfoResponse | |||
| import jakarta.servlet.http.HttpServletRequest | |||
| import jakarta.validation.Valid | |||
| import org.springframework.web.bind.ServletRequestBindingException | |||
| @@ -18,6 +20,11 @@ class SalaryEffectiveController(private val salaryEffectiveService: SalaryEffect | |||
| fun test(@RequestParam startDate: LocalDate, @RequestParam endDate: LocalDate): List<SalaryEffectiveService.MonthlyStaffSalaryData> { | |||
| return salaryEffectiveService.getMonthlyStaffSalaryData(startDate, endDate) | |||
| } | |||
| @GetMapping | |||
| fun test2(@RequestParam staffId: Long): List<SalaryEffectiveInfoResponse> { | |||
| return salaryEffectiveService.findSalaryEffectiveInfoByStaffId(staffId) | |||
| } | |||
| // @GetMapping("/combo") | |||
| // @Throws(ServletRequestBindingException::class) | |||
| // fun combo(request: HttpServletRequest?): RecordsRes<Map<String, Any>> { | |||
| @@ -59,6 +59,7 @@ class StaffsController(private val staffsService: StaffsService) { | |||
| } | |||
| @PostMapping("/save") | |||
| fun saveStaff(@Valid @RequestBody newStaff: NewStaffRequest): Staff { | |||
| println("---------------------------------------------------------") | |||
| return staffsService.saveOrUpdate(newStaff) | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package com.ffii.tsms.modules.data.web.models | |||
| import com.ffii.tsms.modules.report.service.ReportService | |||
| import jakarta.validation.constraints.NotBlank | |||
| import jakarta.validation.constraints.NotNull | |||
| import java.time.LocalDate | |||
| @@ -36,4 +37,11 @@ data class NewStaffRequest( | |||
| val departDate: LocalDate?, | |||
| val departReason: String?, | |||
| val remark: String?, | |||
| val salaryEffectiveInfo: List<SalaryEffectiveInfo>? | |||
| ) | |||
| data class SalaryEffectiveInfo( | |||
| val id: Long, | |||
| val salaryPoint: Long, | |||
| val date: LocalDate | |||
| ) | |||
| @@ -0,0 +1,12 @@ | |||
| package com.ffii.tsms.modules.data.web.models | |||
| import org.hibernate.query.spi.Limit | |||
| import java.time.LocalDate | |||
| data class SalaryEffectiveInfoResponse ( | |||
| val id: Long, | |||
| val salaryPoint: Long, | |||
| val lowerLimit: Int, | |||
| val upperLimit: Int, | |||
| val date: LocalDate | |||
| ) | |||