รายงาน ทปอ.สามัญ (แก้ไขเพิ่มเติม) #2360

This commit is contained in:
harid 2026-03-24 16:44:38 +07:00
parent 9f9fd612d3
commit 5d0795335c
2 changed files with 164 additions and 22 deletions

View file

@ -61,6 +61,7 @@ import { ProfileFamilyFather } from "../entities/ProfileFamilyFather";
import Extension from "../interfaces/extension"; import Extension from "../interfaces/extension";
import { ProfileInsignia } from "../entities/ProfileInsignia"; import { ProfileInsignia } from "../entities/ProfileInsignia";
import { ProfileLeave } from "../entities/ProfileLeave"; import { ProfileLeave } from "../entities/ProfileLeave";
import { ProfileAbsentLate } from "../entities/ProfileAbsentLate";
import { updateName, deleteUser } from "../keycloak"; import { updateName, deleteUser } from "../keycloak";
import permission from "../interfaces/permission"; import permission from "../interfaces/permission";
import { PosMasterAct } from "../entities/PosMasterAct"; import { PosMasterAct } from "../entities/PosMasterAct";
@ -134,6 +135,7 @@ export class ProfileController extends Controller {
private subDistrictRepo = AppDataSource.getRepository(SubDistrict); private subDistrictRepo = AppDataSource.getRepository(SubDistrict);
private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia); private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia);
private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave); private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave);
private profileAbsentLateRepo = AppDataSource.getRepository(ProfileAbsentLate);
private posMasterActRepository = AppDataSource.getRepository(PosMasterAct); private posMasterActRepository = AppDataSource.getRepository(PosMasterAct);
private profileChildrenRepository = AppDataSource.getRepository(ProfileChildren); private profileChildrenRepository = AppDataSource.getRepository(ProfileChildren);
private changeNameRepository = AppDataSource.getRepository(ProfileChangeName); private changeNameRepository = AppDataSource.getRepository(ProfileChangeName);
@ -1389,16 +1391,70 @@ export class ProfileController extends Controller {
leaves.push({year:""}); 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 const leave2_raw = await this.profileLeaveRepository
.createQueryBuilder("profileLeave") .createQueryBuilder("profileLeave")
.leftJoinAndSelect("profileLeave.leaveType", "leaveType") .leftJoinAndSelect("profileLeave.leaveType", "leaveType")
.select([ .select([
"profileLeave.leaveSubTypeName AS leaveSubTypeName",
"profileLeave.coupleDayLevelCountry AS coupleDayLevelCountry",
"profileLeave.isDeleted AS isDeleted", "profileLeave.isDeleted AS isDeleted",
"profileLeave.dateLeaveStart AS dateLeaveStart", "profileLeave.dateLeaveStart AS dateLeaveStart",
"profileLeave.dateLeaveEnd AS dateLeaveEnd", "profileLeave.dateLeaveEnd AS dateLeaveEnd",
"profileLeave.leaveDays AS leaveDays", "profileLeave.leaveDays AS leaveDays",
"profileLeave.reason AS reason", "profileLeave.reason AS reason",
"leaveType.name as name", "leaveType.name as name",
"leaveType.code as code",
]) ])
.where("profileLeave.profileId = :profileId", { profileId: id }) .where("profileLeave.profileId = :profileId", { profileId: id })
.andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false })
@ -1408,17 +1464,32 @@ export class ProfileController extends Controller {
.getRawMany(); .getRawMany();
const leaves2 = const leaves2 =
leave2_raw.length > 0 leave2_raw.length > 0
? leave2_raw.map((item) => ({ ? 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: date:
item.dateLeaveStart && item.dateLeaveEnd item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " + " - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd)) Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-", : "-",
type: item.name || "-", type: displayType,
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-", leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: item.reason || "-", reason: displayReason,
})) };
})
: [ : [
{ {
date: "", date: "",

View file

@ -66,6 +66,7 @@ import { ProfileEmployeeEmploymentHistory } from "../entities/ProfileEmployeeEmp
import CallAPI from "../interfaces/call-api"; import CallAPI from "../interfaces/call-api";
import { ProfileInsignia } from "../entities/ProfileInsignia"; import { ProfileInsignia } from "../entities/ProfileInsignia";
import { ProfileLeave } from "../entities/ProfileLeave"; import { ProfileLeave } from "../entities/ProfileLeave";
import { ProfileEmployeeAbsentLate } from "../entities/ProfileEmployeeAbsentLate";
import permission from "../interfaces/permission"; import permission from "../interfaces/permission";
import axios from "axios"; import axios from "axios";
import { Position } from "../entities/Position"; import { Position } from "../entities/Position";
@ -124,6 +125,7 @@ export class ProfileEmployeeController extends Controller {
private profileEducationRepo = AppDataSource.getRepository(ProfileEducation); private profileEducationRepo = AppDataSource.getRepository(ProfileEducation);
private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia); private profileInsigniaRepo = AppDataSource.getRepository(ProfileInsignia);
private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave); private profileLeaveRepository = AppDataSource.getRepository(ProfileLeave);
private profileEmployeeAbsentLateRepo = AppDataSource.getRepository(ProfileEmployeeAbsentLate);
private positionRepository = AppDataSource.getRepository(Position); private positionRepository = AppDataSource.getRepository(Position);
private employeePositionRepository = AppDataSource.getRepository(EmployeePosition); private employeePositionRepository = AppDataSource.getRepository(EmployeePosition);
private permissionProflileRepository = AppDataSource.getRepository(PermissionProfile); private permissionProflileRepository = AppDataSource.getRepository(PermissionProfile);
@ -1383,16 +1385,70 @@ export class ProfileEmployeeController extends Controller {
leaves.push({year:""}); 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 const leave2_raw = await this.profileLeaveRepository
.createQueryBuilder("profileLeave") .createQueryBuilder("profileLeave")
.leftJoinAndSelect("profileLeave.leaveType", "leaveType") .leftJoinAndSelect("profileLeave.leaveType", "leaveType")
.select([ .select([
"profileLeave.leaveSubTypeName AS leaveSubTypeName",
"profileLeave.coupleDayLevelCountry AS coupleDayLevelCountry",
"profileLeave.isDeleted AS isDeleted", "profileLeave.isDeleted AS isDeleted",
"profileLeave.dateLeaveStart AS dateLeaveStart", "profileLeave.dateLeaveStart AS dateLeaveStart",
"profileLeave.dateLeaveEnd AS dateLeaveEnd", "profileLeave.dateLeaveEnd AS dateLeaveEnd",
"profileLeave.leaveDays AS leaveDays", "profileLeave.leaveDays AS leaveDays",
"profileLeave.reason AS reason", "profileLeave.reason AS reason",
"leaveType.name as name", "leaveType.name as name",
"leaveType.code as code",
]) ])
.where("profileLeave.profileEmployeeId = :profileId", { profileId: id }) .where("profileLeave.profileEmployeeId = :profileId", { profileId: id })
.andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false })
@ -1402,17 +1458,32 @@ export class ProfileEmployeeController extends Controller {
.getRawMany(); .getRawMany();
const leaves2 = const leaves2 =
leave2_raw.length > 0 leave2_raw.length > 0
? leave2_raw.map((item) => ({ ? 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: date:
item.dateLeaveStart && item.dateLeaveEnd item.dateLeaveStart && item.dateLeaveEnd
? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) +
" - " + " - " +
Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd)) Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd))
: "-", : "-",
type: item.name || "-", type: displayType,
leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-", leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-",
reason: item.reason || "-", reason: displayReason,
})) };
})
: [ : [
{ {
date: "", date: "",