This commit is contained in:
parent
26a224eeda
commit
0af89e7ecf
2 changed files with 391 additions and 9 deletions
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue