From 314b0c999136f02726255a99299c8144f110607f Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang Date: Mon, 10 Mar 2025 18:16:55 +0700 Subject: [PATCH] report2 --- src/controllers/ProfileController.ts | 113 ++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 20 deletions(-) diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 3231af09..8bf28811 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -1255,28 +1255,100 @@ export class ProfileController extends Controller { }, ]; - const leave_raw = await this.profileLeaveRepository.find({ - relations: { leaveType: true }, - where: { profileId: id }, - order: { dateLeaveStart: "ASC" }, + const leave_raw = await this.profileLeaveRepository + .createQueryBuilder('profileLeave') + .leftJoinAndSelect('profileLeave.leaveType', 'leaveType') + .select([ + 'profileLeave.leaveTypeId', + 'leaveType.name as name', + 'leaveType.code as code', + 'profileLeave.status', + 'profileLeave.profileId', + 'MAX(profileLeave.dateLeaveStart) as maxDateLeaveStart' + ]) + .addSelect('SUM(profileLeave.leaveDays)', 'totalLeaveDays') + .where('profileLeave.profileId = :profileId', { profileId: id }) + .andWhere('profileLeave.status = :status', { status: 'approve' }) + .groupBy('profileLeave.leaveTypeId') + .orderBy('code', 'ASC') + .addOrderBy('maxDateLeaveStart', 'ASC') + .getRawMany(); + + const leaves: any[] = []; + + leave_raw.forEach((item) => { + const leaveTypeCode = item.code ? item.code.trim().toUpperCase() : ''; + if (leaveTypeCode.startsWith('LV-')) { + const lvIndex = parseInt(leaveTypeCode.split('-')[1], 10); + + if (lvIndex >= 1 && lvIndex <= 11) { + const leaveTypeCodeKey = `leaveTypeCodeLv${lvIndex}`; + const totalLeaveDaysKey = `totalLeaveDaysLv${lvIndex}`; + const leaveTypeNameKey = `leaveTypeNameLv${lvIndex}`; + + const leaveDate = new Date(item.maxDateLeaveStart); + const year = leaveDate?Extension.ToThaiNumber((leaveDate.getFullYear()).toString()):""; + + let yearData = leaves.find((data) => data.year === year); + if (!yearData) { + yearData = { year }; + + for (let i = 1; i <= 11; i++) { + yearData[`leaveTypeCodeLv${i}`] = '-'; + yearData[`totalLeaveDaysLv${i}`] = '-'; + yearData[`leaveTypeNameLv${i}`] = '-'; + } + + leaves.push(yearData); + } + + yearData[leaveTypeCodeKey] = item.code?item.code:"-"; + yearData[totalLeaveDaysKey] = item.totalLeaveDays? Extension.ToThaiNumber((item.totalLeaveDays).toString()) + : "-"; + yearData[leaveTypeNameKey] = item.name?item.name:"-"; + } + } }); - const leaves = - leave_raw.length > 0 - ? leave_raw.map((item) => ({ - leaveTypeName: item.leaveType.name, - dateLeaveStart: item.dateLeaveStart - ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) - : "", - leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "", - })) - : [ - { - leaveTypeName: "-", - dateLeaveStart: "-", - leaveDays: "-", - }, - ]; + const leave2_raw = await this.profileLeaveRepository + .createQueryBuilder('profileLeave') + .leftJoinAndSelect('profileLeave.leaveType', 'leaveType') + .select([ + 'profileLeave.leaveTypeId', + 'profileLeave.dateLeaveStart', + 'profileLeave.dateLeaveEnd', + 'leaveType.name as name', + 'leaveType.code as code', + 'profileLeave.status', + 'profileLeave.profileId', + 'profileLeave.leaveDays', + 'profileLeave.reason', + ]) + .where('profileLeave.profileId = :profileId', { profileId: id }) + .andWhere('leaveType.code IN (:...codes)', { codes: ["LV-008", "LV-009", "LV-010"] }) + .andWhere('profileLeave.status = :status', { status: 'approve' }) + .orderBy('leaveType.code', 'ASC') + .getRawMany(); + const leaves2 = + leave2_raw.length > 0 + ? leave2_raw.map((item) => ({ + date: item.dateLeaveStart + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) + : (item.dateLeaveEnd + ? " - " + Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd)) + : ""), + type: item.name || "-", + leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays) : "-", + reason: item.reason || "-", + })) + : [ + { + date: "-", + type: "-", + leaveDays: "-", + reason: "-", + }, + ]; const children_raw = await this.profileChildrenRepository.find({ where: { profileId: id }, }); @@ -1666,6 +1738,7 @@ export class ProfileController extends Controller { children, insignias, leaves, + leaves2, certs, trainings, disciplines,