คำนวนเงินเดือนลูกจ้าง

This commit is contained in:
Kittapath 2024-04-02 09:03:08 +07:00
parent 139da05b0c
commit 3d5d7d8491

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";
@ -330,53 +330,88 @@ export class SalaryPeriodEmployeeController extends Controller {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบระดับตำแหน่ง");
}
let type = salaryProfile.type;
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;
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 (salaryProfile.amount == null || salaryProfile.amount == 0) {
if (salaryFormula != null) {
const salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth: salaryFormula.salaryMin == null ? 0 : salaryFormula.salaryMin,
salaryEmployee_: {
isActive: true,
group: group,
},
},
});
if (salaryRankMin == null) {
step = 1;
} else {
step = salaryRankMin.step - 0.5;
}
} else {
step = 1;
}
}
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 salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? salaryProfile.amount
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? salaryFormula.salaryMin
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
if (salaryRankMin == null) {
salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? MoreThanOrEqual(salaryProfile.amount)
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? MoreThanOrEqual(salaryFormula.salaryMin)
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
step = salaryRankMin == null ? 1 : salaryRankMin.step - 0.5;
} else {
step = salaryRankMin.step;
}
} else {
step = 1;
}
}
if (type == "HAFT") {
step = step + 0.5;
} else if (type == "FULL") {
@ -384,6 +419,7 @@ export class SalaryPeriodEmployeeController extends Controller {
} else if (type == "FULLHAFT") {
step = step + 1.5;
}
//หาขั้นสูงสุดในกลุ่มนั้น
let salaryRankMax = await this.salaryRankRepository.findOne({
where: {
salaryEmployee_: {
@ -393,18 +429,23 @@ export class SalaryPeriodEmployeeController extends Controller {
},
order: { step: "DESC" },
});
//เงินเดือนเกินตาราง
if (salaryRankMax != null && step > salaryRankMax.step) {
group = group + 1;
//เงินเดือนในกลุ่มต่อไป
let salaryRankAmount = await this.salaryRankRepository.findOne({
where: {
salaryMonth: MoreThan(salaryProfile.amount),
salaryMonth:
salaryRankMax.salaryMonth != null && salaryRankMax.salaryMonth > 0
? MoreThan(salaryRankMax.salaryMonth)
: 0,
salaryEmployee_: {
isActive: true,
group: group + 1,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
group = group + 1;
step =
(salaryRankAmount == null ? 1 : salaryRankAmount.step) +
(step - (salaryRankMax == null ? 0 : salaryRankMax.step) - 0.5);
@ -656,56 +697,91 @@ export class SalaryPeriodEmployeeController extends Controller {
if (!Level) {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบระดับตำแหน่ง");
}
salaryProfile.type = body.type;
salaryProfile.isReserve = body.isReserve;
salaryProfile.type = body.type;
let type = salaryProfile.type;
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;
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 (salaryProfile.amount == null || salaryProfile.amount == 0) {
if (salaryFormula != null) {
const salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth: salaryFormula.salaryMin == null ? 0 : salaryFormula.salaryMin,
salaryEmployee_: {
isActive: true,
group: group,
},
},
});
if (salaryRankMin == null) {
step = 1;
} else {
step = salaryRankMin.step - 0.5;
}
} else {
step = 1;
}
}
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 salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? salaryProfile.amount
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? salaryFormula.salaryMin
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
if (salaryRankMin == null) {
salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? MoreThanOrEqual(salaryProfile.amount)
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? MoreThanOrEqual(salaryFormula.salaryMin)
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
step = salaryRankMin == null ? 1 : salaryRankMin.step - 0.5;
} else {
step = salaryRankMin.step;
}
} else {
step = 1;
}
}
if (type == "HAFT") {
step = step + 0.5;
} else if (type == "FULL") {
@ -713,6 +789,7 @@ export class SalaryPeriodEmployeeController extends Controller {
} else if (type == "FULLHAFT") {
step = step + 1.5;
}
//หาขั้นสูงสุดในกลุ่มนั้น
let salaryRankMax = await this.salaryRankRepository.findOne({
where: {
salaryEmployee_: {
@ -722,18 +799,23 @@ export class SalaryPeriodEmployeeController extends Controller {
},
order: { step: "DESC" },
});
//เงินเดือนเกินตาราง
if (salaryRankMax != null && step > salaryRankMax.step) {
group = group + 1;
//เงินเดือนในกลุ่มต่อไป
let salaryRankAmount = await this.salaryRankRepository.findOne({
where: {
salaryMonth: MoreThan(salaryProfile.amount == null ? 0 : salaryProfile.amount),
salaryMonth:
salaryRankMax.salaryMonth != null && salaryRankMax.salaryMonth > 0
? MoreThan(salaryRankMax.salaryMonth)
: 0,
salaryEmployee_: {
isActive: true,
group: group + 1,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
group = group + 1;
step =
(salaryRankAmount == null ? 1 : salaryRankAmount.step) +
(step - (salaryRankMax == null ? 0 : salaryRankMax.step) - 0.5);
@ -1046,53 +1128,88 @@ export class SalaryPeriodEmployeeController extends Controller {
throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบระดับตำแหน่ง");
}
let type = salaryProfile.type;
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;
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 (salaryProfile.amount == null || salaryProfile.amount == 0) {
if (salaryFormula != null) {
const salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth: salaryFormula.salaryMin == null ? 0 : salaryFormula.salaryMin,
salaryEmployee_: {
isActive: true,
group: group,
},
},
});
if (salaryRankMin == null) {
step = 1;
} else {
step = salaryRankMin.step - 0.5;
}
} else {
step = 1;
}
}
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 salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? salaryProfile.amount
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? salaryFormula.salaryMin
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
if (salaryRankMin == null) {
salaryRankMin = await this.salaryRankRepository.findOne({
where: {
salaryMonth:
salaryProfile.amount != null && salaryProfile.amount > 0
? MoreThanOrEqual(salaryProfile.amount)
: salaryFormula.salaryMin != null && salaryFormula.salaryMin > 0
? MoreThanOrEqual(salaryFormula.salaryMin)
: 0,
salaryEmployee_: {
isActive: true,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
step = salaryRankMin == null ? 1 : salaryRankMin.step - 0.5;
} else {
step = salaryRankMin.step;
}
} else {
step = 1;
}
}
if (type == "HAFT") {
step = step + 0.5;
} else if (type == "FULL") {
@ -1100,6 +1217,7 @@ export class SalaryPeriodEmployeeController extends Controller {
} else if (type == "FULLHAFT") {
step = step + 1.5;
}
//หาขั้นสูงสุดในกลุ่มนั้น
let salaryRankMax = await this.salaryRankRepository.findOne({
where: {
salaryEmployee_: {
@ -1109,18 +1227,23 @@ export class SalaryPeriodEmployeeController extends Controller {
},
order: { step: "DESC" },
});
//เงินเดือนเกินตาราง
if (salaryRankMax != null && step > salaryRankMax.step) {
group = group + 1;
//เงินเดือนในกลุ่มต่อไป
let salaryRankAmount = await this.salaryRankRepository.findOne({
where: {
salaryMonth: MoreThan(salaryProfile.amount == null ? 0 : salaryProfile.amount),
salaryMonth:
salaryRankMax.salaryMonth != null && salaryRankMax.salaryMonth > 0
? MoreThan(salaryRankMax.salaryMonth)
: 0,
salaryEmployee_: {
isActive: true,
group: group + 1,
group: group,
},
},
order: { salaryMonth: "ASC" },
});
group = group + 1;
step =
(salaryRankAmount == null ? 1 : salaryRankAmount.step) +
(step - (salaryRankMax == null ? 0 : salaryRankMax.step) - 0.5);