From f57510c23f6f85d41108c963c680f38c8b948ce0 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Thu, 28 Mar 2024 18:15:40 +0700 Subject: [PATCH] backup --- src/controllers/TumReportController.ts | 1152 ++++++++++++++++++++++++ 1 file changed, 1152 insertions(+) create mode 100644 src/controllers/TumReportController.ts diff --git a/src/controllers/TumReportController.ts b/src/controllers/TumReportController.ts new file mode 100644 index 0000000..e3aa6f6 --- /dev/null +++ b/src/controllers/TumReportController.ts @@ -0,0 +1,1152 @@ +import { + Controller, + Get, + Post, + Put, + Delete, + Patch, + Route, + Security, + Tags, + Body, + Path, + Request, + Example, + SuccessResponse, + Response, + Query, + } from "tsoa"; + import { AppDataSource } from "../database/data-source"; + import HttpSuccess from "../interfaces/http-success"; + import HttpStatusCode from "../interfaces/http-status"; + import HttpError from "../interfaces/http-error"; + import { In, Not, IsNull, MoreThan } from "typeorm"; + import { Salarys } from "../entities/Salarys"; + import { SalaryRanks } from "../entities/SalaryRanks"; + import { PosType } from "../entities/PosType"; + import { PosLevel } from "../entities/PosLevel"; + import { SalaryPeriod } from "../entities/SalaryPeriod"; + import { SalaryOrg } from "../entities/SalaryOrg"; + import { SalaryProfile } from "../entities/SalaryProfile"; + import Extension from "../interfaces/extension"; + import { SalaryEmployee } from "../entities/SalaryEmployee"; + import { SalaryRankEmployee } from "../entities/SalaryRankEmployee"; + import { EmployeePosType } from "../entities/EmployeePosType"; + import { EmployeePosLevel } from "../entities/EmployeePosLevel"; + import { SalaryOrgEmployee } from "../entities/SalaryOrgEmployee"; + import { SalaryProfileEmployee } from "../entities/SalaryProfileEmployee"; + @Route("api/v1/salary/report/tum") + @Tags("Tum") + @Security("bearerAuth") + @Response( + HttpStatusCode.INTERNAL_SERVER_ERROR, + "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", + ) + @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") + export class TumReportController extends Controller { + private salaryPeriodRepository = AppDataSource.getRepository(SalaryPeriod); + private salaryRepository = AppDataSource.getRepository(Salarys); + private salaryEmployeeRepository = AppDataSource.getRepository(SalaryEmployee); + private salaryRankRepository = AppDataSource.getRepository(SalaryRanks); + private salaryEmployeeRankRepository = AppDataSource.getRepository(SalaryRankEmployee); + private poTypeRepository = AppDataSource.getRepository(PosType); + private poTypeEmployeeRepository = AppDataSource.getRepository(EmployeePosType); + private posLevelRepository = AppDataSource.getRepository(PosLevel); + private posLevelEmployeeRepository = AppDataSource.getRepository(EmployeePosLevel); + private salaryOrgRepository = AppDataSource.getRepository(SalaryOrg); + private salaryOrgEmployeeRepository = AppDataSource.getRepository(SalaryOrgEmployee); + private salaryProfileRepository = AppDataSource.getRepository(SalaryProfile); + private salaryProfileEmployeeRepository = AppDataSource.getRepository(SalaryProfileEmployee); + + + /** + * API 01-บัญชีการคำนวณวงเงินเลื่อนขั้นค่าจ้างลูกจ้างประจำกรุงเทพมหานคร + * + * @summary 01-บัญชีการคำนวณวงเงินเลื่อนขั้นค่าจ้างลูกจ้างประจำกรุงเทพมหานคร + * + */ + @Get("emp2-01/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_1(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const salaryPeriodAPR = await this.salaryPeriodRepository.findOne({ + where: { + year: salaryPeriod.year, + period: "APR", + }, + }); + if (!salaryPeriodAPR) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือนรอบเดือนเมษายน"); + } + + const aprSnap2 = await this.salaryOrgEmployeeRepository.findOne({ + relations: ["salaryPeriod", "salaryProfiles"], + where: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodAPR.id, + }, + }); + + if (!aprSnap2) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const octSnap1 = await this.salaryOrgEmployeeRepository.findOne({ + relations: ["salaryPeriod", "salaryProfiles"], + where: { + snapshot: "SNAP1", + group: "GROUP1", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }); + + if (!octSnap1) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const octSnap2 = await this.salaryOrgEmployeeRepository.findOne({ + relations: ["salaryPeriod", "salaryProfiles"], + where: { + snapshot: "SNAP2", + group: "GROUP1", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }); + + if (!octSnap2) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + let fullHaftTotalAmount: any = 0; + let fullHaftCount: any = 0; + let fullTotalAmount: any = 0; + let fullCount: any = 0; + let haftTotalAmount: any = 0; + let haftCount: any = 0; + let noneCount: any = 0; + + if (octSnap2 && octSnap2.salaryProfiles) { + octSnap2.salaryProfiles.forEach((profile: any) => { + switch (profile.type) { + case "FULLHAFT": + fullHaftTotalAmount += profile.amount ?? 0; + fullHaftCount++; + break; + case "FULL": + fullTotalAmount += profile.amount ?? 0; + fullCount++; + break; + case "HAFT": + haftTotalAmount += profile.amount ?? 0; + haftCount++; + break; + case "NONE": + noneCount++; + break; + default: + break; + } + }); + } + + const emp2step = new Set(); + if (octSnap2 && aprSnap2) { + octSnap2.salaryProfiles.forEach((octProfile) => { + aprSnap2.salaryProfiles.forEach((aprProfile) => { + if ( + octProfile.citizenId === aprProfile.citizenId && + ((octProfile.type === "FULL" && aprProfile.type === "FULL") || + (octProfile.type === "HAFT" && aprProfile.type === "FULLHAFT") || + (octProfile.type === "FULLHAFT" && aprProfile.type === "HAFT")) + ) { + emp2step.add(octProfile.citizenId); + } + }); + }); + } + const totalEmp2step = emp2step.size ?? 0; + + const agency = octSnap1.salaryProfiles[0] == null ? "" : octSnap1.salaryProfiles[0].root; + return new HttpSuccess({ + template: "emp2-01", + reportName: "emp2-01", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + yearShort: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))).slice( + -2, + ), + agency: agency, + totalUser: octSnap1 == null ? "" : Extension.ToThaiNumber(octSnap1.total.toString()), + totalSalary: + octSnap1 == null ? "" : Extension.ToThaiNumber(octSnap1.currentAmount.toString()), + sixPercent: + octSnap1 == null ? "" : Extension.ToThaiNumber(octSnap1.sixPercentAmount.toString()), + remainingAmountApr: + aprSnap2 == null ? "" : Extension.ToThaiNumber(aprSnap2.useAmount.toString()), //จำนวนเงินที่ใช้เลื่อนขั้นค่าจ้างไปแล้วในวันที่ 1 เม.ย. + remainingAmountOct: + octSnap2 == null ? "" : Extension.ToThaiNumber(octSnap2.spentAmount.toString()), //เหลือเงินใช้เลื่อนขั้นค่าจ้างในวันที่ 1 ต.ค. + totalOld: aprSnap2 == null ? "" : Extension.ToThaiNumber(aprSnap2.total.toString()), //จำนวน(คน)(โควตาเลื่อนขั้นค่าจ้าง) + fifteenPercentOld: + aprSnap2 == null ? "" : Extension.ToThaiNumber(aprSnap2.fifteenPercent.toString()), + totalUseOld: + aprSnap2 == null ? "" : Extension.ToThaiNumber(aprSnap2.quantityUsed.toString()), //พิจารณาให้(คน)(โควตาเลื่อนขั้นค่าจ้าง) + full2: totalEmp2step == null ? "" : Extension.ToThaiNumber(totalEmp2step.toString()), //เลื่อนขั้นค่าจ้างรวมทั้งปีสองขั้นจำนวน(คน) + fullHaft: fullHaftCount == null ? "" : Extension.ToThaiNumber(fullHaftCount.toString()), //จำนวน(คน)(หนึ่งขั้นครึ่ง) + fullHaftSalary: + fullHaftTotalAmount == null ? "" : Extension.ToThaiNumber(fullHaftTotalAmount.toString()), //ใช้เงิน(หนึ่งขั้นครึ่ง) + full: fullCount == null ? "" : Extension.ToThaiNumber(fullCount.toString()), //จำนวน(คน)(หนึ่งขั้น) + fullSalary: + fullTotalAmount == null ? "" : Extension.ToThaiNumber(fullTotalAmount.toString()), //ใช้เงิน(หนึ่งขั้น) + haft: haftCount == null ? "" : Extension.ToThaiNumber(haftCount.toString()), //จำนวน(คน)(ครึ่งขั้น) + haftSalary: + haftTotalAmount == null ? "" : Extension.ToThaiNumber(haftTotalAmount.toString()), //ใช้เงิน(ครึ่งขั้น) + notPromoted: noneCount == null ? "" : Extension.ToThaiNumber(noneCount.toString()), //ไม่ได้เลื่อนขั้นค่าจ้างจำนวน(คน) + total: octSnap2 == null ? "" : Extension.ToThaiNumber(octSnap2.useAmount.toString()), //รวมใช้เงิน + summary: + octSnap2 == null ? "" : Extension.ToThaiNumber(octSnap2.remainingAmount.toString()), //เหลือเงิน + }, + }); + } + /** + * API 02-รายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ครองตำแหน่ง + * + * @summary 02-รายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ครองตำแหน่ง + * + */ + @Get("emp2-02/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_2(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + period: "OCT", + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const salaryPeriodAPR = await this.salaryPeriodRepository.findOne({ + where: { + period: "APR", + year: salaryPeriod?.year, + }, + }); + if (!salaryPeriodAPR) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const salaryPeriodAPRProfile = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodAPR?.id, + }, + }, + }); + + const octPreviousYear = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 1, + }, + }); + + const octPreviousYear2 = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 2, + }, + }); + + let octPreviousYearProfile: SalaryProfileEmployee[] = []; + if (octPreviousYear) { + octPreviousYearProfile = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: octPreviousYear?.id, + }, + }, + }); + } + + let octPreviousYearProfile2: SalaryProfileEmployee[] = []; + if (octPreviousYear2) { + octPreviousYearProfile2 = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + salaryOrg: { + snapshot: "SNAP2", + salaryPeriodId: octPreviousYear2?.id, + rootId: rootId, + }, + }, + }); + } + + const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + salaryOrg: { + snapshot: "SNAP1", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const agency = _salaryPeriod[0] == null ? "" : _salaryPeriod[0].root; + + const formattedData = _salaryPeriod.map((profile: any, index: number) => { + if (!profile) { + return null; + } + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + yearOld2: octPreviousYear2 == null ? null : Extension.ToThaiNumber(octPreviousYear2.year.toString()), + typeOld2: + octPreviousYear2 && octPreviousYearProfile2.length > 0 ? (() => { + const _profile = octPreviousYearProfile2 + .filter((profileOCT2) => profileOCT2.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + yearOld: octPreviousYear == null ? null : Extension.ToThaiNumber(octPreviousYear.year.toString()), + typeOld1: + octPreviousYear && octPreviousYearProfile.length > 0 ? (() => { + const _profile = octPreviousYearProfile + .filter((profileOCT) => profileOCT.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + typeOld: + salaryPeriodAPRProfile.length > 0 + ? (() => { + const _profile = salaryPeriodAPRProfile + .filter((profileAPR) => profileAPR.citizenId === profile.citizenId) + .map((profile) => ({ + type: profile.type, + })); + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + })() + : null, //เมษา ปีเดียวกัน + type: + profile.type === "HAFT" + ? "๐.๕ ขั้น" + : profile.type === "FULL" + ? "๑ ขั้น" + : profile.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ", //หน่วยงานพิจารณาเลื่อนขั้นค่าจ้าง 1 ต.ค. (จำนวนขั้น) + }; + }); + + return new HttpSuccess({ + template: "emp2-02", + reportName: "emp2-02", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + agency: agency, + data: formattedData, + }, + }); + } + /** + * API 03-รายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ได้รับการเสนอขอเลื่อนขั้นค่าจ้างรวมทั้งปีสองขั้น + * + * @summary 03-รายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ได้รับการเสนอขอเลื่อนขั้นค่าจ้างรวมทั้งปีสองขั้น + * + */ + @Get("emp2-03/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_3(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + const fifteenPoint = await this.salaryOrgEmployeeRepository.findOne({ + where:{ + salaryPeriodId: salaryPeriodId, + rootId: rootId, + snapshot: "SNAP1", + } , + select:[ + "fifteenPoint", + "fifteenPercent" + ] + }) + const fifteenPercentData = + fifteenPoint?.fifteenPercent == undefined || fifteenPoint?.fifteenPercent == null + ? "๐" + : Extension.ToThaiNumber(String(fifteenPoint?.fifteenPercent)); + const fifteenPointData = + fifteenPoint?.fifteenPoint == undefined || fifteenPoint?.fifteenPoint == null + ? ".๐๐" + : "." + Extension.ToThaiNumber(String(fifteenPoint?.fifteenPoint)); + const _salaryPeriodTarget = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + type: "FULL", + salaryOrg: { + snapshot: "SNAP1", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriodTarget) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const octPreviousYear = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 1, + }, + }); + + const octPreviousYear2 = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 2, + }, + }); + + let octPreviousYearProfile: SalaryProfileEmployee[] = []; + if (octPreviousYear) { + octPreviousYearProfile = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + type: "FULL", + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: octPreviousYear?.id, + }, + }, + }); + } + + let octPreviousYearProfile2: SalaryProfileEmployee[] = []; + if (octPreviousYear2) { + octPreviousYearProfile2 = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + type: "FULL", + salaryOrg: { + snapshot: "SNAP2", + salaryPeriodId: octPreviousYear2?.id, + rootId: rootId, + }, + }, + }); + } + + // const aprPreviousYear = await this.salaryPeriodRepository.findOne({ + // where: { + // period: "APR", + // year: salaryPeriod?.year - 1, + // }, + // }); + + // const aprPreviousYear2 = await this.salaryPeriodRepository.findOne({ + // where: { + // period: "APR", + // year: salaryPeriod?.year - 2, + // }, + // }); + + // let aprPreviousYearProfile: SalaryProfileEmployee[] = []; + // if (aprPreviousYear) { + // aprPreviousYearProfile = await this.salaryProfileEmployeeRepository.find({ + // relations: ["salaryOrg"], + // where: { + // salaryOrg: { + // snapshot: "SNAP2", + // rootId: rootId, + // salaryPeriodId: aprPreviousYear?.id, + // }, + // }, + // }); + // } + + // let aprPreviousYearProfile2: SalaryProfileEmployee[] = []; + // if (aprPreviousYear2) { + // aprPreviousYearProfile2 = await this.salaryProfileEmployeeRepository.find({ + // relations: ["salaryOrg"], + // where: { + // salaryOrg: { + // snapshot: "SNAP2", + // salaryPeriodId: aprPreviousYear2?.id, + // rootId: rootId, + // }, + // }, + // }); + // } + + const agency = _salaryPeriodTarget[0] == null ? "" : _salaryPeriodTarget[0].root; + + const formattedData = _salaryPeriodTarget.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + typeOld2: + octPreviousYear2 && octPreviousYearProfile2.length > 0 ? (() => { + const _profile = octPreviousYearProfile2 + .filter((profileOCT2) => profileOCT2.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + yearOld: octPreviousYear == null ? null : Extension.ToThaiNumber(octPreviousYear.year.toString()), + typeOld1: + octPreviousYear && octPreviousYearProfile.length > 0 ? (() => { + const _profile = octPreviousYearProfile + .filter((profileOCT) => profileOCT.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + typeOld: + _salaryPeriodTarget.length > 0 + ? (() => { + const _profile = _salaryPeriodTarget + .filter((profileAPR) => profileAPR.citizenId === profile.citizenId) + .map((profile) => ({ + type: profile.type, + })); + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + })() + : null, //เมษา ปีเดียวกัน + type: + profile.type === "HAFT" + ? "๐.๕ ขั้น" + : profile.type === "FULL" + ? "๑ ขั้น" + : profile.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ", + score1: null, + score2: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-03", + reportName: "emp2-03", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + yearShort: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))).slice(-2,), + yearShortOld: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year-1))).slice(-2,), + fifteenPercent: fifteenPercentData + fifteenPointData, + agency: agency, + data: formattedData, + }, + }); + } + + /** + * API 04-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้สมควรได้เลื่อนขั้นค่าจ้าง (แบบ ลจ.กทม.1) + * + * @summary 04-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้สมควรได้เลื่อนขั้นค่าจ้าง (แบบ ลจ.กทม.1) + * + */ + + @Get("emp2-05/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_5(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + amountSpecial: Not(IsNull()), + type: Not("NONE"), + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const agency = _salaryPeriod[0] == null ? "" : _salaryPeriod[0].root; + + const formattedData = _salaryPeriod.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + positionSalaryAmount: profile.positionSalaryAmount ? Extension.ToThaiNumber(profile.positionSalaryAmount.toLocaleString()) : null, + amountSpecial: profile.amountSpecial ? Extension.ToThaiNumber(profile.amountSpecial.toLocaleString()) : null, + reason: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-05", + reportName: "emp2-05", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + agency: agency, + data: formattedData, + }, + }); + } + + /** + * API 07-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่สมควรได้รับค่าตอบแทนพิเศษ (แบบ ลจ.กทม.2/1) + * + * @summary 07-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่สมควรได้รับค่าตอบแทนพิเศษ (แบบ ลจ.กทม.2/1) + * + */ + @Get("emp2-07/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_7(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + type: "NONE", + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const agency = _salaryPeriod[0] == null ? "" : _salaryPeriod[0].root; + + const formattedData = _salaryPeriod.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + reason: null, + score: null, + signature: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-07", + reportName: "emp2-07", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + agency: agency, + data: formattedData, + }, + }); + } + + /** + * API 09-รายชื่อลูกจ้างประจำกรุงเทพมหานครที่ครบเกษียณอายุราชการ + * + * @summary 09-รายชื่อลูกจ้างประจำกรุงเทพมหานครที่ครบเกษียณอายุราชการ + * + */ + @Get("emp2-09/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_9(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const _salaryPeriodTarget = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + isRetired: true, + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriodTarget) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const octPreviousYear = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 1, + }, + }); + + const octPreviousYear2 = await this.salaryPeriodRepository.findOne({ + where: { + period: "OCT", + year: salaryPeriod?.year - 2, + }, + }); + + let octPreviousYearProfile: SalaryProfileEmployee[] = []; + if (octPreviousYear) { + octPreviousYearProfile = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + isRetired: true, + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: octPreviousYear?.id, + }, + }, + }); + } + + let octPreviousYearProfile2: SalaryProfileEmployee[] = []; + if (octPreviousYear2) { + octPreviousYearProfile2 = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg"], + where: { + isRetired: true, + salaryOrg: { + snapshot: "SNAP2", + salaryPeriodId: octPreviousYear2?.id, + rootId: rootId, + }, + }, + }); + } + + + const agency = _salaryPeriodTarget[0] == null ? "" : _salaryPeriodTarget[0].root; + + const formattedData = _salaryPeriodTarget.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + typeOld2: + octPreviousYear2 && octPreviousYearProfile2.length > 0 ? (() => { + const _profile = octPreviousYearProfile2 + .filter((profileOCT2) => profileOCT2.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + yearOld: octPreviousYear == null ? null : Extension.ToThaiNumber(octPreviousYear.year.toString()), + typeOld1: + octPreviousYear && octPreviousYearProfile.length > 0 ? (() => { + const _profile = octPreviousYearProfile + .filter((profileOCT) => profileOCT.citizenId === profile.citizenId); + if (_profile.length > 0) { + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + } + return null; + })() + : null, + typeOld: + _salaryPeriodTarget.length > 0 + ? (() => { + const _profile = _salaryPeriodTarget + .filter((profileAPR) => profileAPR.citizenId === profile.citizenId) + .map((profile) => ({ + type: profile.type, + })); + return _profile[0]?.type === "HAFT" + ? "๐.๕ ขั้น" + : _profile[0]?.type === "FULL" + ? "๑ ขั้น" + : profile?.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ"; + })() + : null, //เมษา ปีเดียวกัน + type: + profile.type === "HAFT" + ? "๐.๕ ขั้น" + : profile.type === "FULL" + ? "๑ ขั้น" + : profile.type === "FULLHAFT" + ? "๑.๕ ขั้น" + : "ไม่ได้เลื่อนขั้นฯ", + score1: null, + score2: null, + reason: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-09", + reportName: "emp2-09", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + yearShort: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))).slice(-2,), + yearShortOld: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year-1))).slice(-2,), + agency: agency, + data: formattedData, + }, + }); + } + + /** + * API 15-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่ได้รับค่าตอบแทนพิเศษที่เกษียณอายุราชการ + * + * @summary 15-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่ได้รับค่าตอบแทนพิเศษที่เกษียณอายุราชการ + * + */ + @Get("emp2-15/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_15(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + isRetired: true, + type: "NONE", + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const agency = _salaryPeriod[0] == null ? "" : _salaryPeriod[0].root; + + const formattedData = _salaryPeriod.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + reason: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-15", + reportName: "emp2-15", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + agency: agency, + data: formattedData, + }, + }); + } + + /** + * API 21-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่ได้รับค่าตอบแทนพิเศษ + * + * @summary 21-บัญชีรายชื่อลูกจ้างประจำกรุงเทพมหานครผู้ไม่ได้รับค่าตอบแทนพิเศษ + * + */ + @Get("emp2-21/{rootId}/{salaryPeriodId}") + async SalaryReportEmp2_21(@Path() rootId: string, @Path() salaryPeriodId: string) { + const salaryPeriod = await this.salaryPeriodRepository.findOne({ + where: { + id: salaryPeriodId, + }, + }); + if (!salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการขึ้นเงินเดือน"); + } + + const _salaryPeriod = await this.salaryProfileEmployeeRepository.find({ + relations: ["salaryOrg", "salaryOrg.salaryPeriod"], + where: { + type: "NONE", + salaryOrg: { + snapshot: "SNAP2", + rootId: rootId, + salaryPeriodId: salaryPeriodId, + }, + }, + order: { + orgShortName: "ASC", + posMasterNo: "ASC", + }, + }); + + if (!_salaryPeriod) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const agency = _salaryPeriod[0] == null ? "" : _salaryPeriod[0].root; + + const formattedData = _salaryPeriod.map((profile, index) => { + const fullNameParts = [ + profile.child4, + profile.child3, + profile.child2, + profile.child1, + profile.root, + `${profile.prefix}${profile.firstName} ${profile.lastName}`, + ]; + + const fullName = fullNameParts + .filter((part) => part !== undefined && part !== null) + .join("/"); + + return { + no: Extension.ToThaiNumber((index + 1).toLocaleString()), + fullName: fullName, + position: profile.position, + posLevel: profile.posLevel, + posNumber: + profile.orgShortName + Extension.ToThaiNumber(profile.posMasterNo.toLocaleString()), + amount: profile.amount ? Extension.ToThaiNumber(profile.amount.toLocaleString()) : null, + reason: null, + }; + }); + + return new HttpSuccess({ + template: "emp2-21", + reportName: "emp2-21", + data: { + year: Extension.ToThaiNumber(String(Extension.ToThaiYear(salaryPeriod.year))), + agency: agency, + data: formattedData, + }, + }); + } + +} \ No newline at end of file