diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index b770b6a..44dfa0d 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -2953,8 +2953,8 @@ export class ReportController extends Controller { * @summary 04-แบบ ลจ.กทม.1-รายชื่อลูกจ้างผู้สมควรได้เลื่อนขั้นค่าจ้าง * */ - @Get("emp-04/{rootId}/{salaryPeriodId}") - async SalaryReportEmp1_4(@Path() rootId: string, @Path() salaryPeriodId: string) { + @Get("emp-04/{rootId}/{salaryPeriodId}/{type}") + async SalaryReportEmp1_4(@Path() rootId: string, @Path() salaryPeriodId: string, @Path() type: string = 'ALL') { const salaryPeriod = await this.salaryPeriodRepository.findOne({ where: { id: salaryPeriodId, @@ -2970,11 +2970,21 @@ export class ReportController extends Controller { salaryPeriodId: salaryPeriodId, }, }; - + condition.type = In(["HAFT", "FULL", "FULLHAFT"]); if(salaryPeriod.period == "APR"){ - condition.type = In(["HAFT", "FULL"]); + if(type == "HAFT"){ + condition.type = "HAFT"; + }else if(type == "FULL"){ + condition.type = "FULL"; + } }else{ - condition.type = In(["HAFT", "FULL", "FULLHAFT"]); + if(type == "HAFT"){ + condition.type = "HAFT"; + }else if(type == "FULL"){ + condition.type = "FULL"; + }else if(type == "FULLHAFT"){ + condition.type = "FULLHAFT"; + } } const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ diff --git a/src/controllers/SalaryPeriodEmployeeController.ts b/src/controllers/SalaryPeriodEmployeeController.ts index 6e442bf..43fe5d6 100644 --- a/src/controllers/SalaryPeriodEmployeeController.ts +++ b/src/controllers/SalaryPeriodEmployeeController.ts @@ -13,7 +13,7 @@ import { Query, } from "tsoa"; import { AppDataSource } from "../database/data-source"; -import { In, Not, MoreThan, Brackets, Like } from "typeorm"; +import { In, Not, MoreThan, Brackets, Like, MoreThanOrEqual } from "typeorm"; import HttpSuccess from "../interfaces/http-success"; import HttpError from "../interfaces/http-error"; import HttpStatusCode from "../interfaces/http-status"; @@ -438,7 +438,7 @@ export class SalaryPeriodEmployeeController extends Controller { } let type = salaryProfile.type; - salaryProfile = await this.calSalary(type, salaryProfile); + salaryProfile = await this.calSalaryNew(type, salaryProfile); salaryProfile.lastUpdateUserId = req.user.sub; salaryProfile.lastUpdateFullName = req.user.name; @@ -761,8 +761,8 @@ export class SalaryPeriodEmployeeController extends Controller { salaryProfile.remark = body.remark == null ? _null : body.remark; let type = salaryProfile.type; - salaryProfile = await this.calSalary(type, salaryProfile); - + salaryProfile = await this.calSalaryNew(type, salaryProfile); + salaryProfile.lastUpdateUserId = req.user.sub; salaryProfile.lastUpdateFullName = req.user.name; salaryProfile.lastUpdatedAt = new Date(); @@ -2231,6 +2231,378 @@ export class SalaryPeriodEmployeeController extends Controller { salaryProfile.positionSalaryAmountPer = 0; salaryProfile.amountSpecial = 0; } + } else { + if ( + salaryFormula != null && + salaryFormula.salaryMax != null && + salaryProfile.amount != null && + salaryFormula.salaryMax <= salaryProfile.amount + ) { + let salaryRankAmountMax = await this.salaryRankRepository.findOne({ + where: { + salaryMonth: salaryFormula.salaryMax, + salaryEmployee_: { + id: salaryFormula.salaryEmployee.id, + }, + }, + }); + salaryProfile.isNext = true; + salaryProfile.amountUse = salaryFormula.salaryMax - salaryProfile.amount; + salaryProfile.positionSalaryAmount = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : salaryRankAmountMax.salaryMonth; + salaryProfile.positionSalaryDayAmount = + salaryRankAmountMax == null ? 0 : salaryRankAmountMax.salaryDay; + salaryProfile.groupNew = salaryFormula.salaryEmployee.group; + salaryProfile.salaryLevelNew = salaryRankAmountMax == null ? 0 : salaryRankAmountMax.step; + salaryRankAmountMax == null ? 0 : salaryRankAmountMax.step; + if (salaryRankAmountMax != null) { + if (step - salaryRankAmountMax.step <= 0.5) { + salaryProfile.positionSalaryAmountPer = 0.02; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.02); + } else if (step - salaryRankAmountMax.step <= 1) { + salaryProfile.positionSalaryAmountPer = 0.04; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.04); + } else { + salaryProfile.positionSalaryAmountPer = 0.06; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.06); + } + } else { + salaryProfile.positionSalaryAmountPer = 0; + salaryProfile.amountSpecial = 0; + } + } else { + salaryProfile.isNext = false; + salaryProfile.amountUse = 0; + salaryProfile.positionSalaryAmount = + salaryProfile.amount == null ? 0 : salaryProfile.amount; + salaryProfile.positionSalaryDayAmount = 0; + salaryProfile.positionSalaryAmountPer = 0; + salaryProfile.amountSpecial = 0; + } + } + } else { + throw "ประเภทการเลื่อนขึ้นเงินเดือนไม่ถูกต้อง"; + } + + return salaryProfile; + } + + async calSalaryNew( + type: string, + salaryProfile: SalaryProfileEmployee, + ): Promise { + if (type == "NONE") { + salaryProfile.isNext = false; + salaryProfile.amountSpecial = 0; + salaryProfile.amountUse = 0; + salaryProfile.positionSalaryAmount = salaryProfile.amount == null ? 0 : salaryProfile.amount; + salaryProfile.positionSalaryDayAmount = 0; + salaryProfile.groupNew = 0; + salaryProfile.salaryLevelNew = 0; + salaryProfile.positionSalaryAmountPer = 0; + } else if (type == "PENDING") { + salaryProfile.isNext = false; + salaryProfile.amountSpecial = 0; + salaryProfile.amountUse = 0; + salaryProfile.positionSalaryAmount = 0; + salaryProfile.positionSalaryDayAmount = 0; + salaryProfile.groupNew = 0; + salaryProfile.salaryLevelNew = 0; + salaryProfile.positionSalaryAmountPer = 0; + } else if (type == "HAFT" || type == "FULL" || type == "FULLHAFT") { + + const salaryFormula = await this.salaryFormulaEmployeeRepository.findOne({ + where: { + position: salaryProfile.position, + posType: { posTypeName: salaryProfile.posType }, + posLevel: { posLevelName: salaryProfile.posLevel }, + }, + relations: ["salaryEmployeeMins", "salaryEmployee"], + }); + + //ขั้นเก่าที่เลื่อนมา + // let group = salaryProfile.group == null ? 0 : salaryProfile.group; + // let step = salaryProfile.salaryLevel == null ? 0 : salaryProfile.salaryLevel; + + // if (group == null || group == 0) { + // if (salaryFormula != null) { + // //หากลุ่มต่ำสุดตามเกณฑ์ + // group = salaryFormula.salaryEmployeeMins.sort((a, b) => a.group - b.group)[0].group; + // } else { + // group = 1; + // } + // } + // if (step == null || step == 0) { + // if (salaryFormula != null) { + // let salary = salaryProfile.amount == null ? 0 : salaryProfile.amount; + // //หาขั้นต่ำสุดตามเกณฑ์ + // let salaryRankMin = await this.salaryRankRepository.findOne({ + // where: { + // salaryMonth: salary, + // salaryEmployee_: { + // isActive: true, + // group: group, + // }, + // }, + // // order: { salaryMonth: "ASC" }, + // }); + + // if (salaryRankMin == null) { + // salaryRankMin = await this.salaryRankRepository.findOne({ + // where: { + // salaryMonth: MoreThan(salary), + // salaryEmployee_: { + // isActive: true, + // group: group, + // }, + // }, + // order: { salaryMonth: "ASC" }, + // }); + // if (salaryRankMin == null) { + // salaryRankMin = await this.salaryRankRepository.findOne({ + // where: { + // salaryMonth: salary, + // salaryEmployee_: { + // isActive: true, + // group: salaryFormula.salaryEmployee.group, + // }, + // }, + // order: { salaryMonth: "ASC" }, + // }); + // if (salaryRankMin == null) { + // salaryRankMin = await this.salaryRankRepository.findOne({ + // where: { + // salaryMonth: MoreThan(salary), + // salaryEmployee_: { + // isActive: true, + // group: salaryFormula.salaryEmployee.group, + // }, + // }, + // order: { salaryMonth: "ASC" }, + // }); + // let _salaryRankAmountMax = await this.salaryRankRepository.findOne({ + // where: { + // salaryMonth: salaryFormula.salaryMax == null ? 0 : salaryFormula.salaryMax, + // salaryEmployee_: { + // id: salaryFormula.salaryEmployee.id, + // }, + // }, + // }); + // step = + // salaryRankMin == null + // ? _salaryRankAmountMax == null + // ? 0.5 + // : _salaryRankAmountMax.step + // : salaryRankMin.step - 0.5; + // group = salaryFormula.salaryEmployee.group; + // } else { + // step = salaryRankMin.step; + // group = salaryFormula.salaryEmployee.group; + // } + // } else { + // step = salaryRankMin.step - 0.5; + // } + // } else { + // step = salaryRankMin.step; + // } + // } else { + // step = 0.5; + // } + // } + + let group = 0; + let step = 0; + let stepUp = 0; + + //****หา group และ step จาก amount MoreThanOrEqual + if (salaryProfile.amount != null) { + let salaryCurrentRanks = await this.salaryRankRepository.findOne({ + where: { + salaryMonth: salaryProfile.amount, + }, + relations: ["salaryEmployee_"], + }); + + if (!salaryCurrentRanks) { + salaryCurrentRanks = await this.salaryRankRepository.findOne({ + where: { + salaryMonth: MoreThanOrEqual(salaryProfile.amount), + }, + order: { + salaryMonth: "ASC", + }, + relations: ["salaryEmployee_"], + }); + } + + if (salaryCurrentRanks) { + group = salaryCurrentRanks.salaryEmployee_.group; + step = salaryCurrentRanks.step; + } + } + + //console.log("group", group); + //console.log("step", step); + + + if (type == "HAFT") { + step = step + 0.5; + stepUp = 0.5; + } else if (type == "FULL") { + step = step + 1; + stepUp = 1; + } else if (type == "FULLHAFT") { + step = step + 1.5; + stepUp = 1.5; + } + //console.log("step+type", step); + //หาขั้นสูงสุดในกลุ่มนั้น + let salaryRankMax = await this.salaryRankRepository.findOne({ + where: { + salaryEmployee_: { + isActive: true, + group: group, + }, + }, + order: { step: "DESC" }, + }); + + //console.log("salaryRankMax.step", salaryRankMax?.step); + //console.log("salaryProfile.amount", salaryProfile.amount); + //console.log("salaryFormula.salaryMax", salaryFormula?.salaryMax); + //เงินเดือนเกินตาราง + //****หา shot ที่ +ขั้น แล้วแก้เป็นหาเงินเดือนที่ใกล้เคียงกับขั้นผังเก่าก่อนแล้วค่อย +ขั้นที่เลื่อนเข้าไป ex.เงินตันที่ 20000 ไปหาผังใหม่ได้ใกล้เคียง 20100 ยึดตัวเลขนี้ไว้แล้วค่อย +ขั้นในผังใหม่ขึ้นไป + if ( + salaryRankMax != null && + step > salaryRankMax.step && + (salaryFormula == null || + (salaryFormula != null && + salaryProfile.amount != null && + salaryFormula.salaryMax != null && + salaryFormula.salaryMax > salaryProfile.amount)) + ) { + //console.log("in function เกินตาราง"); + + group = group + 1; + //เงินเดือนในกลุ่มต่อไป + let salaryRankAmount = await this.salaryRankRepository.findOne({ + where: { + salaryMonth: + salaryRankMax.salaryMonth != null && salaryRankMax.salaryMonth > 0 + ? MoreThan(salaryRankMax.salaryMonth) + : 0, + salaryEmployee_: { + isActive: true, + group: group, + }, + }, + order: { salaryMonth: "ASC" }, + }); + //console.log("salaryRankAmount", salaryRankAmount?.salaryMonth); + // step = + // (salaryRankAmount == null ? 1 : salaryRankAmount.step) + + // (step - (salaryRankMax == null ? 0 : salaryRankMax.step) - 0.5); + + step = (salaryRankAmount == null ? 1 : salaryRankAmount.step) + stepUp; //****หาขั้นของผังใหม่แล้ว + ด้วยขั้นที่ได้เลื่อน + //console.log("step in if", step); + } + + let whereCondition: any = { + step: step, + salaryEmployee_: { + isActive: true, + group: group, + }, + }; + + let salaryRanks = await this.salaryRankRepository.findOne({ + where: whereCondition, + }); + //console.log("salaryRanks.salaryMonth", salaryRanks?.salaryMonth); + if (salaryRanks != null && salaryRanks.salaryMonth != null) { + if ( + salaryFormula != null && + salaryFormula.salaryMax != null && + salaryRanks.salaryMonth > salaryFormula.salaryMax + ) { + let salaryRankAmountMax = await this.salaryRankRepository.findOne({ + where: { + salaryMonth: salaryFormula.salaryMax, + salaryEmployee_: { + id: salaryFormula.salaryEmployee.id, + }, + }, + }); + salaryProfile.isNext = true; + salaryProfile.amountUse = + salaryFormula.salaryMax - (salaryProfile.amount == null ? 0 : salaryProfile.amount); + salaryProfile.positionSalaryAmount = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : salaryRankAmountMax.salaryMonth; + salaryProfile.positionSalaryDayAmount = + salaryRankAmountMax == null ? 0 : salaryRankAmountMax.salaryDay; + salaryProfile.groupNew = salaryFormula.salaryEmployee.group; + salaryProfile.salaryLevelNew = salaryRankAmountMax == null ? 0 : salaryRankAmountMax.step;; + salaryRankAmountMax == null ? 0 : salaryRankAmountMax.step; + if (salaryRankAmountMax != null) { + if (step - salaryRankAmountMax.step <= 0.5) { + //console.log("in case 0.5 * 0.02"); + //console.log("salaryRankAmountMax.salaryMont>>>" ,salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null? 0 : salaryRankAmountMax.salaryMonth); + salaryProfile.positionSalaryAmountPer = 0.02; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.02); + } else if (step - salaryRankAmountMax.step <= 1) { + //console.log("in case 1 * 0.04"); + salaryProfile.positionSalaryAmountPer = 0.04; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.04); + } else { + //console.log("in case 1.5 * 0.06"); + salaryProfile.positionSalaryAmountPer = 0.06; + salaryProfile.amountSpecial = + salaryRankAmountMax == null || salaryRankAmountMax.salaryMonth == null + ? 0 + : Math.floor(salaryRankAmountMax.salaryMonth * 0.06); + } + } else { + salaryProfile.positionSalaryAmountPer = 0; + salaryProfile.amountSpecial = 0; + } + //console.log("in case เงินเดือน max ตำแหน่งแต่ไม่เกินผัง"); + //console.log(" salaryProfile.amountSpecial", salaryProfile.amountSpecial); + //console.log("salaryRanks.salaryMonth",salaryRanks.salaryMonth); + //console.log("salaryProfile.amount",(salaryProfile.amount == null ? 0 : salaryProfile.amount)); + } else { + //console.log("in case normal"); + //console.log("salaryRanks.salaryMonth",salaryRanks.salaryMonth); + //console.log("salaryProfile.amount",(salaryProfile.amount == null ? 0 : salaryProfile.amount)); + //console.log("salaryRanks.salaryMonth - salaryProfile.amount",salaryRanks.salaryMonth - (salaryProfile.amount == null ? 0 : salaryProfile.amount)); + salaryProfile.isNext = false; + salaryProfile.amountUse = + salaryRanks.salaryMonth - (salaryProfile.amount == null ? 0 : salaryProfile.amount); + salaryProfile.positionSalaryAmount = salaryRanks.salaryMonth; + salaryProfile.positionSalaryDayAmount = salaryRanks.salaryDay; + salaryProfile.groupNew = group; + salaryProfile.salaryLevelNew = step; + salaryProfile.positionSalaryAmountPer = 0; + salaryProfile.amountSpecial = 0; + } } else { if ( salaryFormula != null &&