Merge branch 'develop' into working

This commit is contained in:
Suphonchai Phoonsawat 2026-03-25 10:07:08 +07:00
commit 9760c4f667
2 changed files with 166 additions and 24 deletions

View file

@ -61,6 +61,7 @@ import { ProfileFamilyFather } from "../entities/ProfileFamilyFather";
import Extension from "../interfaces/extension";
import { ProfileInsignia } from "../entities/ProfileInsignia";
import { ProfileLeave } from "../entities/ProfileLeave";
import { ProfileAbsentLate } from "../entities/ProfileAbsentLate";
import { updateName, deleteUser } from "../keycloak";
import permission from "../interfaces/permission";
import { PosMasterAct } from "../entities/PosMasterAct";
@ -134,6 +135,7 @@ export class ProfileController extends Controller {
private subDistrictRepo = AppDataSource.getRepository(SubDistrict);
private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia);
private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave);
private profileAbsentLateRepo = AppDataSource.getRepository(ProfileAbsentLate);
private posMasterActRepository = AppDataSource.getRepository(PosMasterAct);
private profileChildrenRepository = AppDataSource.getRepository(ProfileChildren);
private changeNameRepository = AppDataSource.getRepository(ProfileChangeName);
@ -1389,16 +1391,70 @@ export class ProfileController extends Controller {
leaves.push({year:""});
}
// Query มาสาย/ขาดราชการ และ merge ตามปี
const absentLate_raw = await this.profileAbsentLateRepo
.createQueryBuilder("absentLate")
.select([
"YEAR(absentLate.stampDate) as year",
"absentLate.status as status",
"SUM(absentLate.stampAmount) as totalAmount",
])
.where("absentLate.profileId = :profileId", { profileId: id })
.andWhere("absentLate.isDeleted = :isDeleted", { isDeleted: false })
.groupBy("YEAR(absentLate.stampDate), absentLate.status")
.orderBy("year", "DESC")
.getRawMany();
// Merge มาสาย/ขาดราชการเข้า leaves array
absentLate_raw.forEach((item) => {
const year = item.year
? Extension.ToThaiNumber((item.year + 543).toString())
: "";
let yearData = leaves.find((data) => data.year === year);
// ถ้าไม่มีปีนั้นใน leaves ให้สร้างใหม่
if (!yearData) {
yearData = { year };
for (let i = 1; i <= 11; i++) {
yearData[`leaveTypeCodeLv${i}`] = "-";
yearData[`totalLeaveDaysLv${i}`] = "-";
yearData[`leaveTypeNameLv${i}`] = "-";
}
leaves.push(yearData);
}
// เพิ่มข้อมูลมาสาย/ขาดราชการ
if (item.status === "LATE") {
yearData.late = item.totalAmount
? Extension.ToThaiNumber(parseFloat(item.totalAmount).toFixed(1))
: "-";
} else if (item.status === "ABSENT") {
yearData.absent = item.totalAmount
? Extension.ToThaiNumber(parseFloat(item.totalAmount).toFixed(1))
: "-";
}
});
// เติมค่า "-" ถ้าไม่มีข้อมูลมาสาย/ขาดราชการ
leaves.forEach((yearData) => {
if (!yearData.late) yearData.late = "-";
if (!yearData.absent) yearData.absent = "-";
});
const leave2_raw = await this.profileLeaveRepository
.createQueryBuilder("profileLeave")
.leftJoinAndSelect("profileLeave.leaveType", "leaveType")
.select([
"profileLeave.leaveSubTypeName AS leaveSubTypeName",
"profileLeave.coupleDayLevelCountry AS coupleDayLevelCountry",
"profileLeave.isDeleted AS isDeleted",
"profileLeave.dateLeaveStart AS dateLeaveStart",
"profileLeave.dateLeaveEnd AS dateLeaveEnd",
"profileLeave.leaveDays AS leaveDays",
"profileLeave.reason AS reason",
"leaveType.name as name",
"leaveType.code as code",
])
.where("profileLeave.profileId = :profileId", { profileId: id })
.andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false })
@ -1408,17 +1464,32 @@ export class ProfileController extends Controller {
.getRawMany();
const leaves2 =
leave2_raw.length > 0
? leave2_raw.map((item) => ({
date:
item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-",
type: item.name || "-",
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: item.reason || "-",
}))
? leave2_raw.map((item) => {
const leaveTypeCode = item.code ? item.code.trim().toUpperCase() : "";
// ข้อที่ 1: LV-008 ให้ใช้ leaveSubTypeName (ประเภทย่อย) แทน name
const displayType =
leaveTypeCode === "LV-008" && item.leaveSubTypeName
? item.leaveSubTypeName
: (item.name || "-");
// ข้อที่ 2: แสดง reason ก่อนเสมอ ถ้ามี coupleDayLevelCountry ค่อยแสดงประเทศ
const displayReason = item.coupleDayLevelCountry
? `${item.reason || ""} ลาไปประเทศ ${item.coupleDayLevelCountry}`.trim()
: (item.reason || "-");
return {
date:
item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-",
type: displayType,
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: displayReason,
};
})
: [
{
date: "",
@ -1552,7 +1623,7 @@ export class ProfileController extends Controller {
const retire_raw = await this.salaryRepo.findOne({
where: {
profileId: id,
commandCode: In(["16"]),
commandCode: In(["12", "15", "16"]),
},
order: { order: "desc" },
});

View file

@ -66,6 +66,7 @@ import { ProfileEmployeeEmploymentHistory } from "../entities/ProfileEmployeeEmp
import CallAPI from "../interfaces/call-api";
import { ProfileInsignia } from "../entities/ProfileInsignia";
import { ProfileLeave } from "../entities/ProfileLeave";
import { ProfileEmployeeAbsentLate } from "../entities/ProfileEmployeeAbsentLate";
import permission from "../interfaces/permission";
import axios from "axios";
import { Position } from "../entities/Position";
@ -124,6 +125,7 @@ export class ProfileEmployeeController extends Controller {
private profileEducationRepo = AppDataSource.getRepository(ProfileEducation);
private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia);
private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave);
private profileEmployeeAbsentLateRepo = AppDataSource.getRepository(ProfileEmployeeAbsentLate);
private positionRepository = AppDataSource.getRepository(Position);
private employeePositionRepository = AppDataSource.getRepository(EmployeePosition);
private permissionProflileRepository = AppDataSource.getRepository(PermissionProfile);
@ -1383,16 +1385,70 @@ export class ProfileEmployeeController extends Controller {
leaves.push({year:""});
}
// Query มาสาย/ขาดราชการ และ merge ตามปี
const absentLate_raw = await this.profileEmployeeAbsentLateRepo
.createQueryBuilder("absentLate")
.select([
"YEAR(absentLate.stampDate) as year",
"absentLate.status as status",
"SUM(absentLate.stampAmount) as totalAmount",
])
.where("absentLate.profileEmployeeId = :profileId", { profileId: id })
.andWhere("absentLate.isDeleted = :isDeleted", { isDeleted: false })
.groupBy("YEAR(absentLate.stampDate), absentLate.status")
.orderBy("year", "DESC")
.getRawMany();
// Merge มาสาย/ขาดราชการเข้า leaves array
absentLate_raw.forEach((item) => {
const year = item.year
? Extension.ToThaiNumber((item.year + 543).toString())
: "";
let yearData = leaves.find((data) => data.year === year);
// ถ้าไม่มีปีนั้นใน leaves ให้สร้างใหม่
if (!yearData) {
yearData = { year };
for (let i = 1; i <= 11; i++) {
yearData[`leaveTypeCodeLv${i}`] = "-";
yearData[`totalLeaveDaysLv${i}`] = "-";
yearData[`leaveTypeNameLv${i}`] = "-";
}
leaves.push(yearData);
}
// เพิ่มข้อมูลมาสาย/ขาดราชการ
if (item.status === "LATE") {
yearData.lateAmount = item.totalAmount
? Extension.ToThaiNumber(parseFloat(item.totalAmount).toFixed(1))
: "-";
} else if (item.status === "ABSENT") {
yearData.absentAmount = item.totalAmount
? Extension.ToThaiNumber(parseFloat(item.totalAmount).toFixed(1))
: "-";
}
});
// เติมค่า "-" ถ้าไม่มีข้อมูลมาสาย/ขาดราชการ
leaves.forEach((yearData) => {
if (!yearData.lateAmount) yearData.lateAmount = "-";
if (!yearData.absentAmount) yearData.absentAmount = "-";
});
const leave2_raw = await this.profileLeaveRepository
.createQueryBuilder("profileLeave")
.leftJoinAndSelect("profileLeave.leaveType", "leaveType")
.select([
"profileLeave.leaveSubTypeName AS leaveSubTypeName",
"profileLeave.coupleDayLevelCountry AS coupleDayLevelCountry",
"profileLeave.isDeleted AS isDeleted",
"profileLeave.dateLeaveStart AS dateLeaveStart",
"profileLeave.dateLeaveEnd AS dateLeaveEnd",
"profileLeave.leaveDays AS leaveDays",
"profileLeave.reason AS reason",
"leaveType.name as name",
"leaveType.code as code",
])
.where("profileLeave.profileEmployeeId = :profileId", { profileId: id })
.andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false })
@ -1402,17 +1458,32 @@ export class ProfileEmployeeController extends Controller {
.getRawMany();
const leaves2 =
leave2_raw.length > 0
? leave2_raw.map((item) => ({
date:
item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-",
type: item.name || "-",
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: item.reason || "-",
}))
? leave2_raw.map((item) => {
const leaveTypeCode = item.code ? item.code.trim().toUpperCase() : "";
// ข้อที่ 1: LV-008 ให้ใช้ leaveSubTypeName (ประเภทย่อย) แทน name
const displayType =
leaveTypeCode === "LV-008" && item.leaveSubTypeName
? item.leaveSubTypeName
: (item.name || "-");
// ข้อที่ 2: แสดง reason ก่อนเสมอ ถ้ามี coupleDayLevelCountry ค่อยแสดงประเทศ
const displayReason = item.coupleDayLevelCountry
? `${item.reason || ""} ลาไปประเทศ ${item.coupleDayLevelCountry}`.trim()
: (item.reason || "-");
return {
date:
item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-",
type: displayType,
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: displayReason,
};
})
: [
{
date: "",
@ -1755,7 +1826,7 @@ export class ProfileEmployeeController extends Controller {
const retire_raw = await this.salaryRepo.findOne({
where: {
profileEmployeeId: id,
commandCode: In(["16"]),
commandCode: In(["12", "15", "16"]),
},
order: { order: "desc" },
});