diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 0eaf5a1f..ccec5b1a 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -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" }, }); diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index 39b6ea46..c476e3ae 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -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" }, });