รายงาน ทปอ.สามัญ (แก้ไขเพิ่มเติม) #2360
This commit is contained in:
parent
9f9fd612d3
commit
5d0795335c
2 changed files with 164 additions and 22 deletions
|
|
@ -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: "",
|
||||||
|
|
|
||||||
|
|
@ -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: "",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue