This commit is contained in:
AdisakKanthawilang 2025-06-04 13:52:02 +07:00
parent 26a224eeda
commit 0af89e7ecf
2 changed files with 391 additions and 9 deletions

View file

@ -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({

View file

@ -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<SalaryProfileEmployee> {
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 &&