From 11586a8fb26d20473f86511c5c8cd421a654c36e Mon Sep 17 00:00:00 2001 From: "DESKTOP-1R2VSQH\\Lenovo ThinkPad E490" Date: Tue, 28 Oct 2025 13:32:53 +0700 Subject: [PATCH 01/26] fix(ex/retirement): document --- src/controllers/ExRetirementController.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/controllers/ExRetirementController.ts b/src/controllers/ExRetirementController.ts index 7a3292f9..880a8477 100644 --- a/src/controllers/ExRetirementController.ts +++ b/src/controllers/ExRetirementController.ts @@ -100,7 +100,7 @@ export class ExRetirementController extends Controller { } @Get("/document/{documentId}") - async getDocument(@Path("documentId") officerDocumentID: string) { + async getDocument(@Path("documentId") officerDocumentID: string, @Request() req: any) { let retryCount = 0; const maxRetries = 2; while (retryCount < maxRetries) { @@ -118,8 +118,18 @@ export class ExRetirementController extends Controller { headers: { Authorization: `Bearer ${token}`, }, + responseType: "arraybuffer", }); - return res.data; + + if (!req.res.headersSent && !req.res.destroyed) { + // Set response headers + req.res.setHeader("Content-Type", "application/pdf"); + req.res.setHeader("Content-Disposition", `inline; filename="${officerDocumentID}.pdf"`); + req.res.setHeader("Content-Length", res.data.byteLength.toString()); + + req.res.end(Buffer.from(res.data)); + return; + } } catch (error: any) { if (error.response?.status === 500 && retryCount < maxRetries - 1) { TokenCache.delete(`${clientId}:${clientSecret}`); From e2da7d479d334fa121ad9dbfc0f4a15896f6c9f0 Mon Sep 17 00:00:00 2001 From: harid Date: Wed, 29 Oct 2025 17:39:30 +0700 Subject: [PATCH 02/26] recheck script retire 30/10 --- src/app.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 7f0e0220..e919c0f7 100644 --- a/src/app.ts +++ b/src/app.ts @@ -66,7 +66,9 @@ async function main() { } }); - const cronTime_Oct = "0 0 1 10 *"; + // const cronTime_Oct = "0 0 1 10 *"; + // Test #1892 + const cronTime_Oct = "0 0 30 10 *"; cron.schedule(cronTime_Oct, async () => { try { const commandController = new CommandController(); From 1c36e8dac8974631902fb0518c7dc0ecb3c3f0b3 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 10:37:13 +0700 Subject: [PATCH 03/26] test try catch avatar profile --- src/controllers/ProfileAvatarController.ts | 26 +++++++++++++++------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/controllers/ProfileAvatarController.ts b/src/controllers/ProfileAvatarController.ts index 98db7ca6..c3980c38 100644 --- a/src/controllers/ProfileAvatarController.ts +++ b/src/controllers/ProfileAvatarController.ts @@ -29,16 +29,26 @@ export class ProfileAvatarController extends Controller { @Get("profileId/{id}") async getProfile(@Path() id: string, @Request() req: RequestWithUser) { - let _workflow = await new permission().Workflow(req, id, "SYS_REGISTRY_OFFICER"); - if (_workflow == false) - await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); - const profile = await this.profileRepository.findOne({ - where: { id }, - }); + try { + let _workflow = await new permission().Workflow(req, id, "SYS_REGISTRY_OFFICER"); + if (_workflow == false) + await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); + const profile = await this.profileRepository.findOne({ + where: { id }, + }); - if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); - return new HttpSuccess(profile); + return new HttpSuccess(profile); + } catch (error) { + console.error("Error in getProfile:", error); + + if (error instanceof HttpError) { + throw error; + } + + throw new HttpError(HttpStatus.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาดภายในระบบ"); + } } @Get("profileId-admin/{id}") From 44038e549730322726aeea4a9e930591700cc41f Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 10:55:46 +0700 Subject: [PATCH 04/26] test comment _workflow privilage validate --- src/controllers/ProfileAvatarController.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controllers/ProfileAvatarController.ts b/src/controllers/ProfileAvatarController.ts index c3980c38..5842fd3c 100644 --- a/src/controllers/ProfileAvatarController.ts +++ b/src/controllers/ProfileAvatarController.ts @@ -30,9 +30,9 @@ export class ProfileAvatarController extends Controller { @Get("profileId/{id}") async getProfile(@Path() id: string, @Request() req: RequestWithUser) { try { - let _workflow = await new permission().Workflow(req, id, "SYS_REGISTRY_OFFICER"); - if (_workflow == false) - await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); + // let _workflow = await new permission().Workflow(req, id, "SYS_REGISTRY_OFFICER"); + // if (_workflow == false) + await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); const profile = await this.profileRepository.findOne({ where: { id }, }); From 2324b50229f7ed3e4ada4588e7ad0b0585b7f7e7 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 10:59:45 +0700 Subject: [PATCH 05/26] test comment all privilage validate --- src/controllers/ProfileAvatarController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/ProfileAvatarController.ts b/src/controllers/ProfileAvatarController.ts index 5842fd3c..dc8a7e0f 100644 --- a/src/controllers/ProfileAvatarController.ts +++ b/src/controllers/ProfileAvatarController.ts @@ -32,7 +32,7 @@ export class ProfileAvatarController extends Controller { try { // let _workflow = await new permission().Workflow(req, id, "SYS_REGISTRY_OFFICER"); // if (_workflow == false) - await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); + // await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", id); const profile = await this.profileRepository.findOne({ where: { id }, }); From 440b1616642e35a041a5467aef1e8a3eaaac60b4 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 17:36:23 +0700 Subject: [PATCH 06/26] add employee-temp xlsx template (report5) --- src/controllers/ReportController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 9ca0242f..90b7f013 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -11260,8 +11260,8 @@ export class ReportController extends Controller { }); return new HttpSuccess({ - template: "report4", - reportName: "report4", + template: "report5", + reportName: "report5", data: { dateCurrent: Extension.ToThaiShortDate(new Date()), rootName: orgRootData ? orgRootData.orgRootName : "-", From 01a17ef32314940ac110ffbb9647274a0b46ffc5 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 17:55:36 +0700 Subject: [PATCH 07/26] fix --- src/controllers/ReportController.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 90b7f013..5852fca9 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -11246,7 +11246,7 @@ export class ReportController extends Controller { typeShortNameAndRank: "", level: "รวม", levelRank: "", - total: total, + total: "รวม" + " " + total, remark: "", }); _reslut.push({ @@ -11255,7 +11255,7 @@ export class ReportController extends Controller { typeShortNameAndRank: "", level: "รวมทั้งสิ้น", levelRank: "", - total: allTotal, + total: "รวมทั้งสิ้น" + " " + allTotal, remark: "", }); From 31d7902b8864a9ba23e946a1c3ba8ecc2917f1d9 Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 18:07:51 +0700 Subject: [PATCH 08/26] fix --- src/controllers/ReportController.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 5852fca9..fdfb04d6 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -11222,10 +11222,10 @@ export class ReportController extends Controller { if (x.type !== tmpType && tmpType != "") { _total = total - x.total; _reslut.push({ - type: "", + type: "รวม", typeRank: "", typeShortNameAndRank: "", - level: "รวม", + level: "", levelRank: "", total: _total, remark: "", @@ -11241,21 +11241,21 @@ export class ReportController extends Controller { }); _reslut.push({ - type: "", + type: "รวม", typeRank: "", typeShortNameAndRank: "", - level: "รวม", + level: "", levelRank: "", - total: "รวม" + " " + total, + total: total, remark: "", }); _reslut.push({ - type: "", + type: "รวมทั้งสิ้น", typeRank: "", typeShortNameAndRank: "", - level: "รวมทั้งสิ้น", + level: "", levelRank: "", - total: "รวมทั้งสิ้น" + " " + allTotal, + total: allTotal, remark: "", }); From 8a96794e53219f3f8bfa13ae3fd20cf9cd6b7d2f Mon Sep 17 00:00:00 2001 From: Adisak Date: Thu, 30 Oct 2025 18:12:31 +0700 Subject: [PATCH 09/26] fix employee --- src/controllers/ReportController.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index fdfb04d6..2e72fc6b 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -11052,6 +11052,12 @@ export class ReportController extends Controller { acc[key] = { ...curr, total: 1 }; } else { acc[key].total += 1; + acc[key].total += 1; + const combinedPositions = new Set([ + ...acc[key].positions.split(", "), + ...curr.positions.split(", "), + ]); + acc[key].positions = Array.from(combinedPositions).join(", "); } return acc; }, {}); From 0c523a55a447e671904c88ed731ef858eec78318 Mon Sep 17 00:00:00 2001 From: harid Date: Thu, 30 Oct 2025 18:56:03 +0700 Subject: [PATCH 10/26] fix + test retirement #1903, #1904, #1892 --- src/app.ts | 2 +- src/controllers/CommandController.ts | 36 ++++--- src/controllers/ProfileController.ts | 106 ++++++++----------- src/controllers/ProfileEmployeeController.ts | 105 +++++++++--------- 4 files changed, 115 insertions(+), 134 deletions(-) diff --git a/src/app.ts b/src/app.ts index e919c0f7..6913a2c1 100644 --- a/src/app.ts +++ b/src/app.ts @@ -68,7 +68,7 @@ async function main() { // const cronTime_Oct = "0 0 1 10 *"; // Test #1892 - const cronTime_Oct = "0 0 30 10 *"; + const cronTime_Oct = "0 0 31 10 *"; cron.schedule(cronTime_Oct, async () => { try { const commandController = new CommandController(); diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index c9302286..a6885004 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -62,6 +62,7 @@ import { getUserByUsername, getRoleMappings, removeUserRoles, + getToken, } from "../keycloak"; import { ProfileEducation, CreateProfileEducation } from "../entities/ProfileEducation"; import { ProfileEducationHistory } from "../entities/ProfileEducationHistory"; @@ -1476,24 +1477,25 @@ export class CommandController extends Controller { } // @Get("XXX") async cronjobUpdateRetirementStatus(/*@Request() request: RequestWithUser*/) { - let body = { - client_id: "gettoken", - client_secret: process.env.AUTH_ACCOUNT_SECRET, - grant_type: "client_credentials", - }; - const postData = querystring.stringify(body); - const response = await axios.post( - `${process.env.KC_URL}/realms/${process.env.KC_REALMS}/protocol/openid-connect/token`, - postData, - { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - api_key: process.env.API_KEY, - }, - }, - ); - const adminToken = response.data.access_token; + // let body = { + // client_id: "gettoken", + // client_secret: process.env.AUTH_ACCOUNT_SECRET, + // grant_type: "client_credentials", + // }; + // const postData = querystring.stringify(body); + // const response = await axios.post( + // `${process.env.KC_URL}/realms/${process.env.KC_REALMS}/protocol/openid-connect/token`, + // postData, + // { + // headers: { + // "Content-Type": "application/x-www-form-urlencoded", + // api_key: process.env.API_KEY, + // }, + // }, + // ); + // const adminToken = response.data.access_token; // const adminToken = request.headers["authorization"]?.replace("Bearer ", ""); + const adminToken = await getToken() ?? ""; const today = new Date(); today.setUTCHours(0, 0, 0, 0); let type: string = "OFFICER"; diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index e32494c0..7a114b6e 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -9773,9 +9773,13 @@ export class ProfileController extends Controller { keyword?: string; }, ) { - let conditionFullName = - "CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; - const [findProfile, total] = await AppDataSource.getRepository(Profile) + const orgRevisionActive = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, + }); + if (!orgRevisionActive) { + throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); + } + let query = AppDataSource.getRepository(Profile) .createQueryBuilder("profile") .leftJoinAndSelect("profile.posLevel", "posLevel") .leftJoinAndSelect("profile.posType", "posType") @@ -9788,103 +9792,83 @@ export class ProfileController extends Controller { .leftJoinAndSelect("current_holders.orgChild4", "orgChild4") .leftJoinAndSelect("current_holders.positions", "positions") .leftJoinAndSelect("positions.posExecutive", "posExecutive") - .where(`profile.position LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profile.prefix LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profile.firstName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profile.lastName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`posLevel.posLevelName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`posType.posTypeName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(conditionFullName, { - keyword: `%${body.keyword}%`, - }) + .andWhere( + new Brackets(qb => { + qb.where("profile.position LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("posLevel.posLevelName LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("posType.posTypeName LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword", { keyword: `%${body.keyword}%` }); + }) + ) .andWhere("profile.isLeave = false") - .orderBy("profile.citizenId", "ASC") - .skip((body.page - 1) * body.pageSize) - .take(body.pageSize) - .getManyAndCount(); + .andWhere("current_holders.orgRevisionId = :orgRevisionId", { orgRevisionId: orgRevisionActive.id }); - const orgRevisionActive = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, - }); - const findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true }, - }); - if (!findRevision) { - throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); - } + const [findProfile, total] = await query + .orderBy("profile.citizenId", "ASC") + .skip((body.page - 1) * body.pageSize) + .take(body.pageSize) + .getManyAndCount(); const mapDataProfile = await Promise.all( findProfile.map(async (item: Profile) => { const posMaster = item.current_holders == null || item.current_holders.length == 0 || - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) == null ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id); + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id); const position = posMaster == null || - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.positions == null || - item.current_holders?.find((x) => x.orgRevisionId == findRevision.id)?.positions.length == + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions == null || + item.current_holders?.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions.length == 0 || item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true) == null ? null : item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true); const posExecutive = position == null || item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive == null || item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive ?.posExecutiveName == null ? null : item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true)?.posExecutive .posExecutiveName; const shortName = item.current_holders.length == 0 ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3 != + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgChild2 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgChild1 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgRoot != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` : null; return { diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index dad205a4..cdbac600 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -4419,11 +4419,16 @@ export class ProfileEmployeeController extends Controller { page: number; pageSize: number; keyword?: string; + type?: string; }, ) { - let conditionFullName = - "CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword"; - const [findProfile, total] = await AppDataSource.getRepository(ProfileEmployee) + const orgRevisionActive = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, + }); + if (!orgRevisionActive) { + throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); + } + let query = AppDataSource.getRepository(ProfileEmployee) .createQueryBuilder("profileEmployee") .leftJoinAndSelect("profileEmployee.posLevel", "posLevel") .leftJoinAndSelect("profileEmployee.posType", "posType") @@ -4435,88 +4440,78 @@ export class ProfileEmployeeController extends Controller { .leftJoinAndSelect("current_holders.orgChild3", "orgChild3") .leftJoinAndSelect("current_holders.orgChild4", "orgChild4") .leftJoinAndSelect("current_holders.positions", "positions") - .where(`profileEmployee.position LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profileEmployee.prefix LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profileEmployee.firstName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`profileEmployee.lastName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`posLevel.posLevelName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(`posType.posTypeName LIKE :keyword`, { - keyword: `%${body.keyword}%`, - }) - .orWhere(conditionFullName, { - keyword: `%${body.keyword}%`, - }) + .andWhere( + new Brackets(qb => { + qb.where("profileEmployee.position LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("posLevel.posLevelName LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("posType.posTypeName LIKE :keyword", { keyword: `%${body.keyword}%` }) + .orWhere("CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword", { keyword: `%${body.keyword}%` }); + }) + ) .andWhere("profileEmployee.isLeave = false") + .andWhere("current_holders.orgRevisionId = :orgRevisionId", { orgRevisionId: orgRevisionActive.id }); + + if (body.type) { + const typeUpper = body.type.trim().toUpperCase(); + if (typeUpper === "EMPLOYEE") { + query = query.andWhere("profileEmployee.employeeClass = 'PERM'"); + } + else if (typeUpper === "TEMP"){ + query = query.andWhere("profileEmployee.employeeClass = 'TEMP'"); + } + } + + const [findProfile, total] = await query .orderBy("profileEmployee.citizenId", "ASC") .skip((body.page - 1) * body.pageSize) .take(body.pageSize) .getManyAndCount(); - const orgRevisionActive = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, - }); - const findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true }, - }); - if (!findRevision) { - throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); - } - const mapDataProfile = await Promise.all( findProfile.map(async (item: ProfileEmployee) => { const posMaster = item.current_holders == null || item.current_holders.length == 0 || - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) == null + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) == null ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id); + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id); const position = posMaster == null || - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.positions == null || - item.current_holders?.find((x) => x.orgRevisionId == findRevision.id)?.positions.length == + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions == null || + item.current_holders?.find((x) => x.orgRevisionId == orgRevisionActive.id)?.positions.length == 0 || item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true) == null ? null : item.current_holders - .find((x) => x.orgRevisionId == findRevision.id) + .find((x) => x.orgRevisionId == orgRevisionActive.id) ?.positions?.find((position) => position.positionIsSelected == true); const shortName = item.current_holders.length == 0 ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3 != + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgChild2 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgChild1 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision.id) != + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` + : item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision.id) + item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id) ?.orgRoot != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` + ? `${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == orgRevisionActive.id)?.posMasterNo}` : null; return { From f32debfbb6a22e4a8af96044d3a1383427e43f60 Mon Sep 17 00:00:00 2001 From: Adisak Date: Mon, 3 Nov 2025 10:48:04 +0700 Subject: [PATCH 11/26] test commit --- src/controllers/OrganizationController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index 142d8033..909614d5 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -1338,7 +1338,7 @@ export class OrganizationController extends Controller { .getMany() : []; - // const formattedData = orgRootData.map((orgRoot) => { + // const formattedData = orgRootData.map((orgRoot) => { //return fix const formattedData = await Promise.all( orgRootData.map(async (orgRoot) => { return { From 39a1a3bbb09631a6cc97f78f0e178ac31de2eb08 Mon Sep 17 00:00:00 2001 From: AdisakKanthawilang <153157069+AdisakKanthawilang@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:56:26 +0700 Subject: [PATCH 12/26] #1767 (#205) --- src/controllers/OrganizationController.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index 909614d5..89ec4400 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -1218,6 +1218,7 @@ export class OrganizationController extends Controller { "orgRoot.SECTION_CODE", "orgRoot.JOB_CODE", "orgRoot.responsibility", + "orgRoot.ancestorDNA", ]) .orderBy("orgRoot.orgRootOrder", "ASC") .getMany(); @@ -1246,6 +1247,7 @@ export class OrganizationController extends Controller { "orgChild1.SECTION_CODE", "orgChild1.JOB_CODE", "orgChild1.responsibility", + "orgChild1.ancestorDNA", ]) .orderBy("orgChild1.orgChild1Order", "ASC") .getMany() @@ -1275,6 +1277,7 @@ export class OrganizationController extends Controller { "orgChild2.JOB_CODE", "orgChild2.orgChild1Id", "orgChild2.responsibility", + "orgChild2.ancestorDNA", ]) .orderBy("orgChild2.orgChild2Order", "ASC") .getMany() @@ -1304,6 +1307,7 @@ export class OrganizationController extends Controller { "orgChild3.JOB_CODE", "orgChild3.orgChild2Id", "orgChild3.responsibility", + "orgChild3.ancestorDNA", ]) .orderBy("orgChild3.orgChild3Order", "ASC") .getMany() @@ -1333,12 +1337,13 @@ export class OrganizationController extends Controller { "orgChild4.JOB_CODE", "orgChild4.orgChild3Id", "orgChild4.responsibility", + "orgChild4.ancestorDNA", ]) .orderBy("orgChild4.orgChild4Order", "ASC") .getMany() : []; - // const formattedData = orgRootData.map((orgRoot) => { //return fix + // const formattedData = orgRootData.map((orgRoot) => { const formattedData = await Promise.all( orgRootData.map(async (orgRoot) => { return { @@ -1351,6 +1356,7 @@ export class OrganizationController extends Controller { orgCode: orgRoot.orgRootCode + "00", orgTreeRank: orgRoot.orgRootRank, orgTreeRankSub: orgRoot.orgRootRankSub, + orgRootDnaId: orgRoot.ancestorDNA, DEPARTMENT_CODE: orgRoot.DEPARTMENT_CODE, DIVISION_CODE: orgRoot.DIVISION_CODE, SECTION_CODE: orgRoot.SECTION_CODE, @@ -1466,6 +1472,8 @@ export class OrganizationController extends Controller { orgCode: orgRoot.orgRootCode + orgChild1.orgChild1Code, orgTreeRank: orgChild1.orgChild1Rank, orgTreeRankSub: orgChild1.orgChild1RankSub, + orgRootDnaId: orgRoot.ancestorDNA, + orgChild1DnaId: orgChild1.ancestorDNA, DEPARTMENT_CODE: orgChild1.DEPARTMENT_CODE, DIVISION_CODE: orgChild1.DIVISION_CODE, SECTION_CODE: orgChild1.SECTION_CODE, @@ -1587,6 +1595,9 @@ export class OrganizationController extends Controller { orgCode: orgRoot.orgRootCode + orgChild2.orgChild2Code, orgTreeRank: orgChild2.orgChild2Rank, orgTreeRankSub: orgChild2.orgChild2RankSub, + orgRootDnaId: orgRoot.ancestorDNA, + orgChild1DnaId: orgChild1.ancestorDNA, + orgChild2DnaId: orgChild2.ancestorDNA, DEPARTMENT_CODE: orgChild2.DEPARTMENT_CODE, DIVISION_CODE: orgChild2.DIVISION_CODE, SECTION_CODE: orgChild2.SECTION_CODE, @@ -1709,6 +1720,10 @@ export class OrganizationController extends Controller { orgCode: orgRoot.orgRootCode + orgChild3.orgChild3Code, orgTreeRank: orgChild3.orgChild3Rank, orgTreeRankSub: orgChild3.orgChild3RankSub, + orgRootDnaId: orgRoot.ancestorDNA, + orgChild1DnaId: orgChild1.ancestorDNA, + orgChild2DnaId: orgChild2.ancestorDNA, + orgChild3DnaId: orgChild3.ancestorDNA, DEPARTMENT_CODE: orgChild3.DEPARTMENT_CODE, DIVISION_CODE: orgChild3.DIVISION_CODE, SECTION_CODE: orgChild3.SECTION_CODE, @@ -1831,6 +1846,11 @@ export class OrganizationController extends Controller { orgCode: orgRoot.orgRootCode + orgChild4.orgChild4Code, orgTreeRank: orgChild4.orgChild4Rank, orgTreeRankSub: orgChild4.orgChild4RankSub, + orgRootDnaId: orgRoot.ancestorDNA, + orgChild1DnaId: orgChild1.ancestorDNA, + orgChild2DnaId: orgChild2.ancestorDNA, + orgChild3DnaId: orgChild3.ancestorDNA, + orgChild4DnaId: orgChild4.ancestorDNA, DEPARTMENT_CODE: orgChild4.DEPARTMENT_CODE, DIVISION_CODE: orgChild4.DIVISION_CODE, SECTION_CODE: orgChild4.SECTION_CODE, From dcff08db6f83a916accb07cc7d72cf0809259ee9 Mon Sep 17 00:00:00 2001 From: mamoss <> Date: Mon, 3 Nov 2025 14:51:42 +0700 Subject: [PATCH 13/26] update Retire Clear Org --- src/controllers/ImportDataController.ts | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/controllers/ImportDataController.ts b/src/controllers/ImportDataController.ts index 08eacd6c..d6345ac0 100644 --- a/src/controllers/ImportDataController.ts +++ b/src/controllers/ImportDataController.ts @@ -6312,4 +6312,50 @@ export class ImportDataController extends Controller { } return new HttpSuccess(); } + + @Post("updateRetireClearOrg") + async updateRetireClearOrg(@Request() request: { user: Record }) { + const profiles = await this.profileRepo.find({ + where: { + isLeave: true, + }, + }); + + for (const item of profiles) { + const posmaster = await this.posMasterRepo.findOne({ + where: { + orgRevision: { + orgRevisionIsCurrent: false, + orgRevisionIsDraft: true, + }, + next_holderId: item.id, + }, + }); + if (!posmaster) continue; + posmaster.next_holderId = null; + await this.posMasterRepo.save(posmaster); + } + + const profileEmps = await this.profileEmpRepo.find({ + where: { + isLeave: true, + }, + }); + + for (const item of profileEmps) { + const posmaster = await this.posMasterEmpRepo.findOne({ + where: { + orgRevision: { + orgRevisionIsCurrent: false, + orgRevisionIsDraft: true, + }, + next_holderId: item.id, + }, + }); + if (!posmaster) continue; + posmaster.next_holderId = null; + await this.posMasterEmpRepo.save(posmaster); + } + return new HttpSuccess(); + } } From 19d665fd69882c95b6cfcaa3de16c75665cbf9bb Mon Sep 17 00:00:00 2001 From: Adisak Date: Mon, 3 Nov 2025 15:57:41 +0700 Subject: [PATCH 14/26] migration --- src/entities/ApiKey.ts | 2 +- src/entities/ProfileTraining.ts | 4 ++-- .../1762159481993-update_size_keyapi_field.ts | 17 +++++++++++++++++ .../1762159824907-update_size_place_field.ts | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/migration/1762159481993-update_size_keyapi_field.ts create mode 100644 src/migration/1762159824907-update_size_place_field.ts diff --git a/src/entities/ApiKey.ts b/src/entities/ApiKey.ts index 8f220fea..c8e099e8 100644 --- a/src/entities/ApiKey.ts +++ b/src/entities/ApiKey.ts @@ -14,9 +14,9 @@ export class ApiKey extends EntityBase { name: string; @Column({ + type: 'longtext', nullable: true, comment: "keyApi", - length: 255, default: null, }) keyApi: string; diff --git a/src/entities/ProfileTraining.ts b/src/entities/ProfileTraining.ts index e4b29b70..2afaa17a 100644 --- a/src/entities/ProfileTraining.ts +++ b/src/entities/ProfileTraining.ts @@ -55,9 +55,9 @@ export class ProfileTraining extends EntityBase { topic: string; @Column({ + type: 'longtext', nullable: true, - length: 200, - comment: "สถานที่ฝึกอบรม/ดูงาน ", + comment: "สถานที่ฝึกอบรม/ดูงาน", default: null, }) place: string; diff --git a/src/migration/1762159481993-update_size_keyapi_field.ts b/src/migration/1762159481993-update_size_keyapi_field.ts new file mode 100644 index 00000000..17b1b0d2 --- /dev/null +++ b/src/migration/1762159481993-update_size_keyapi_field.ts @@ -0,0 +1,17 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateSizeKeyapiField1762159481993 implements MigrationInterface { + name = 'UpdateSizeKeyapiField1762159481993' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`apiKey\` DROP COLUMN \`keyApi\``); + await queryRunner.query(`ALTER TABLE \`apiKey\` ADD \`keyApi\` longtext NULL COMMENT 'keyApi'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`apiKey\` DROP COLUMN \`keyApi\``); + await queryRunner.query(`ALTER TABLE \`apiKey\` ADD \`keyApi\` varchar(255) NULL COMMENT 'keyApi'`); + + } + +} diff --git a/src/migration/1762159824907-update_size_place_field.ts b/src/migration/1762159824907-update_size_place_field.ts new file mode 100644 index 00000000..56976d9f --- /dev/null +++ b/src/migration/1762159824907-update_size_place_field.ts @@ -0,0 +1,16 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateSizePlaceField1762159824907 implements MigrationInterface { + name = 'UpdateSizePlaceField1762159824907' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileTraining\` DROP COLUMN \`place\``); + await queryRunner.query(`ALTER TABLE \`profileTraining\` ADD \`place\` longtext NULL COMMENT 'สถานที่ฝึกอบรม/ดูงาน'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileTraining\` DROP COLUMN \`place\``); + await queryRunner.query(`ALTER TABLE \`profileTraining\` ADD \`place\` varchar(200) NULL COMMENT 'สถานที่ฝึกอบรม/ดูงาน '`); + } + +} From 3e6ee5d8689e09ae6855a133af6f1c39b3035e4c Mon Sep 17 00:00:00 2001 From: Adisak Date: Mon, 3 Nov 2025 17:35:15 +0700 Subject: [PATCH 15/26] migration --- src/entities/AuthRole.ts | 7 +++++++ ...863-add_field_isAdminVisibled_table_AuthRole.ts | 14 ++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 src/migration/1762165716863-add_field_isAdminVisibled_table_AuthRole.ts diff --git a/src/entities/AuthRole.ts b/src/entities/AuthRole.ts index 3dbd29ea..5fcfd9ae 100644 --- a/src/entities/AuthRole.ts +++ b/src/entities/AuthRole.ts @@ -23,6 +23,13 @@ export class AuthRole extends EntityBase { }) roleDescription: string; + @Column({ + nullable: true, + comment: "ข้อมูลที่ role admin สามารถเห็นได้", + default: null, + }) + isAdminVisibled: boolean; + @OneToMany(() => AuthRoleAttr, (authRoleAttr) => authRoleAttr.authRoleAttrForRole) authRoles: AuthRoleAttr[]; diff --git a/src/migration/1762165716863-add_field_isAdminVisibled_table_AuthRole.ts b/src/migration/1762165716863-add_field_isAdminVisibled_table_AuthRole.ts new file mode 100644 index 00000000..42348da7 --- /dev/null +++ b/src/migration/1762165716863-add_field_isAdminVisibled_table_AuthRole.ts @@ -0,0 +1,14 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddFieldIsAdminVisibledTableAuthRole1762165716863 implements MigrationInterface { + name = 'AddFieldIsAdminVisibledTableAuthRole1762165716863' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`authRole\` ADD \`isAdminVisibled\` tinyint NULL COMMENT 'ข้อมูลที่ role admin สามารถเห็นได้'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`authRole\` DROP COLUMN \`isAdminVisibled\``); + } + +} From ee4bff7f50b48e004623eea163376919f72d730d Mon Sep 17 00:00:00 2001 From: harid Date: Mon, 3 Nov 2025 18:05:29 +0700 Subject: [PATCH 16/26] =?UTF-8?q?fix=20=E0=B8=9C=E0=B8=B9=E0=B9=89?= =?UTF-8?q?=E0=B9=80=E0=B8=81=E0=B8=A9=E0=B8=B5=E0=B8=A2=E0=B8=93=20?= =?UTF-8?q?=E0=B9=83=E0=B8=99=E0=B9=81=E0=B8=9A=E0=B8=9A=E0=B8=A3=E0=B9=88?= =?UTF-8?q?=E0=B8=B2=E0=B8=87=20=E0=B8=82=E0=B8=AD=E0=B8=87=E0=B8=A3?= =?UTF-8?q?=E0=B8=B0=E0=B8=9A=E0=B8=9A=E0=B9=82=E0=B8=84=E0=B8=A3=E0=B8=87?= =?UTF-8?q?=E0=B8=AA=E0=B8=A3=E0=B9=89=E0=B8=B2=E0=B8=87=E0=B9=84=E0=B8=A1?= =?UTF-8?q?=E0=B9=88=E0=B8=96=E0=B8=B9=E0=B8=81=E0=B8=9B=E0=B8=A5=E0=B8=94?= =?UTF-8?q?=20#1912?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.ts | 4 +- src/controllers/CommandController.ts | 94 ++++++++++++++++------------ 2 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/app.ts b/src/app.ts index 6913a2c1..368be40f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -67,8 +67,8 @@ async function main() { }); // const cronTime_Oct = "0 0 1 10 *"; - // Test #1892 - const cronTime_Oct = "0 0 31 10 *"; + // Test #1912 + const cronTime_Oct = "0 0 4 11 *"; cron.schedule(cronTime_Oct, async () => { try { const commandController = new CommandController(); diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index a6885004..e4538538 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -1477,24 +1477,6 @@ export class CommandController extends Controller { } // @Get("XXX") async cronjobUpdateRetirementStatus(/*@Request() request: RequestWithUser*/) { - // let body = { - // client_id: "gettoken", - // client_secret: process.env.AUTH_ACCOUNT_SECRET, - // grant_type: "client_credentials", - // }; - // const postData = querystring.stringify(body); - // const response = await axios.post( - // `${process.env.KC_URL}/realms/${process.env.KC_REALMS}/protocol/openid-connect/token`, - // postData, - // { - // headers: { - // "Content-Type": "application/x-www-form-urlencoded", - // api_key: process.env.API_KEY, - // }, - // }, - // ); - // const adminToken = response.data.access_token; - // const adminToken = request.headers["authorization"]?.replace("Bearer ", ""); const adminToken = await getToken() ?? ""; const today = new Date(); today.setUTCHours(0, 0, 0, 0); @@ -1668,32 +1650,30 @@ export class CommandController extends Controller { } async posMasterRetire(profileId: string, type: string, _Date: Date) { - const orgRevision = await this.orgRevisionRepo.findOne({ + const revisionIsCurrent = await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); - if (orgRevision) { + if (revisionIsCurrent) { let _posMaster: any = null; - let _position: any = null; if (type == "OFFICER") { _posMaster = await this.posMasterRepository.findOne({ where: { - orgRevisionId: orgRevision.id, + orgRevisionId: revisionIsCurrent.id, current_holderId: profileId, }, }); if (_posMaster) { - _position = await this.positionRepository.findOne({ - where: { + await this.positionRepository.update( + { posMasterId: _posMaster.id, positionIsSelected: true, }, - }); - if (_position) { - _position.positionIsSelected = false; - _position.lastUpdateFullName = "System Administrator"; - _position.lastUpdatedAt = _Date; - await this.positionRepository.save(_position); - } + { + positionIsSelected: false, + lastUpdateFullName: "System Administrator", + lastUpdatedAt: _Date, + } + ); _posMaster.isSit = false; _posMaster.current_holderId = null; _posMaster.lastUpdateFullName = "System Administrator"; @@ -1701,26 +1681,57 @@ export class CommandController extends Controller { await this.posMasterRepository.save(_posMaster); await CreatePosMasterHistoryOfficer(_posMaster.id, null); } + const revisionIsDraft = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, + }); + if (revisionIsDraft) { + _posMaster = null; + _posMaster = await this.posMasterRepository.findOne({ + where: { + orgRevisionId: revisionIsDraft.id, + next_holderId: profileId, + }, + }); + if (_posMaster) { + await this.positionRepository.update( + { + posMasterId: _posMaster.id, + positionIsSelected: true, + }, + { + positionIsSelected: false, + lastUpdateFullName: "System Administrator", + lastUpdatedAt: _Date, + } + ); + _posMaster.isSit = false; + _posMaster.next_holderId = null; + _posMaster.lastUpdateFullName = "System Administrator"; + _posMaster.lastUpdatedAt = _Date; + await this.posMasterRepository.save(_posMaster); + await CreatePosMasterHistoryOfficer(_posMaster.id, null); + } + // console.log("clear posMaster & position 'Draf' success") + } } else if (type == "EMPLOYEE") { _posMaster = await this.employeePosMasterRepository.findOne({ where: { - orgRevisionId: orgRevision.id, + orgRevisionId: revisionIsCurrent.id, current_holderId: profileId, }, }); if (_posMaster) { - _position = await this.employeePositionRepository.findOne({ - where: { + await this.employeePositionRepository.update( + { posMasterId: _posMaster.id, positionIsSelected: true, }, - }); - if (_position) { - _position.positionIsSelected = false; - _position.lastUpdateFullName = "System Administrator"; - _position.lastUpdatedAt = _Date; - await this.employeePositionRepository.save(_position); - } + { + positionIsSelected: false, + lastUpdateFullName: "System Administrator", + lastUpdatedAt: _Date, + } + ); _posMaster.isSit = false; _posMaster.current_holderId = null; _posMaster.lastUpdateFullName = "System Administrator"; @@ -1729,6 +1740,7 @@ export class CommandController extends Controller { await CreatePosMasterHistoryEmployee(_posMaster.id, null); } } + // console.log("clear posMaster & position 'Current' success") } } From 40bc95bb87e613d2f8a1b71971d591f22d754cb6 Mon Sep 17 00:00:00 2001 From: mamoss <> Date: Mon, 3 Nov 2025 21:37:50 +0700 Subject: [PATCH 17/26] update org --- src/controllers/ImportDataController.ts | 44 ++++++++++++++----------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/controllers/ImportDataController.ts b/src/controllers/ImportDataController.ts index d6345ac0..e2339b8f 100644 --- a/src/controllers/ImportDataController.ts +++ b/src/controllers/ImportDataController.ts @@ -6316,45 +6316,49 @@ export class ImportDataController extends Controller { @Post("updateRetireClearOrg") async updateRetireClearOrg(@Request() request: { user: Record }) { const profiles = await this.profileRepo.find({ - where: { - isLeave: true, - }, + where: { isLeave: true }, + select: ["id"], }); - - for (const item of profiles) { - const posmaster = await this.posMasterRepo.findOne({ + const profileIds = profiles.map((p) => p.id); + if (profileIds.length > 0) { + const posmasters = await this.posMasterRepo.find({ where: { orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true, }, - next_holderId: item.id, + next_holderId: In(profileIds), }, }); - if (!posmaster) continue; - posmaster.next_holderId = null; - await this.posMasterRepo.save(posmaster); + for (const posmaster of posmasters) { + posmaster.next_holderId = null; + } + if (posmasters.length > 0) { + await this.posMasterRepo.save(posmasters); + } } const profileEmps = await this.profileEmpRepo.find({ - where: { - isLeave: true, - }, + where: { isLeave: true }, + select: ["id"], }); - - for (const item of profileEmps) { - const posmaster = await this.posMasterEmpRepo.findOne({ + const profileEmpIds = profileEmps.map((p) => p.id); + if (profileEmpIds.length > 0) { + const posmasterEmps = await this.posMasterEmpRepo.find({ where: { orgRevision: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true, }, - next_holderId: item.id, + next_holderId: In(profileEmpIds), }, }); - if (!posmaster) continue; - posmaster.next_holderId = null; - await this.posMasterEmpRepo.save(posmaster); + for (const posmasterEmp of posmasterEmps) { + posmasterEmp.next_holderId = null; + } + if (posmasterEmps.length > 0) { + await this.posMasterEmpRepo.save(posmasterEmps); + } } return new HttpSuccess(); } From ca7d2f2a75fcae46a8915d3370123442bd3a496a Mon Sep 17 00:00:00 2001 From: Adisak Date: Tue, 4 Nov 2025 09:51:33 +0700 Subject: [PATCH 18/26] #54 --- src/controllers/AuthRoleController.ts | 20 ++++++++++++++++++-- src/controllers/UserController.ts | 12 +++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/controllers/AuthRoleController.ts b/src/controllers/AuthRoleController.ts index 5d007fb3..78220ab7 100644 --- a/src/controllers/AuthRoleController.ts +++ b/src/controllers/AuthRoleController.ts @@ -6,6 +6,7 @@ import { Patch, Path, Post, + Query, Request, Route, Security, @@ -36,8 +37,21 @@ export class AuthRoleController extends Controller { private redis = require("redis"); @Get("list") - public async listAuthRole() { - const getList = await this.authRoleRepo.find(); + public async listAuthRole( + @Request() req: RequestWithUser, + @Query("isAdminVisibled ") isAdminVisibled : string = "false", + ) { + let condition: any = {}; + if(isAdminVisibled.toLowerCase() === "true"){ + condition = { isAdminVisibled: true }; + }else{ + condition = {}; + } + const getList = await this.authRoleRepo.find( + { + where: condition, + } + ); // if (!getList || getList.length === 0) { // throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); // } @@ -161,6 +175,7 @@ export class AuthRoleController extends Controller { body: { roleName: string; roleDescription: string; + isAdminVisibled?: boolean; authRoleAttrs: Array<{ // id: string; authSysId: string; @@ -187,6 +202,7 @@ export class AuthRoleController extends Controller { })); Object.assign(record, { + isAdminVisibled: body.isAdminVisibled?body.isAdminVisibled:false, roleName: body.roleName, roleDescription: body.roleDescription, lastUpdateFullName: req.user.name, diff --git a/src/controllers/UserController.ts b/src/controllers/UserController.ts index 6f2fd217..5d7d4910 100644 --- a/src/controllers/UserController.ts +++ b/src/controllers/UserController.ts @@ -758,11 +758,21 @@ export class KeycloakController extends Controller { } @Get("user/role/{id}") - async getRoleUser(@Path("id") id: string) { + async getRoleUser(@Request() req: RequestWithUser,@Path("id") id: string) { + const profile = await this.profileRepo.findOne({ where: { keycloak: id }, relations: ["roleKeycloaks"], }); + + if ( + req.user.sub === id && + req.user.role.some(x => x === 'ADMIN') && + !req.user.role.some(x => x === 'SUPER_ADMIN') + ) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่มีสิทธิ์เข้าถึงข้อมูลนี้"); + } + if (!profile) { const profileEmp = await this.profileEmpRepo.findOne({ where: { keycloak: id, employeeClass: "PERM" }, From b1a9c77c8c3210e38f844a6b0096da6a8e9a98f4 Mon Sep 17 00:00:00 2001 From: Adisak Date: Tue, 4 Nov 2025 10:03:35 +0700 Subject: [PATCH 19/26] fix --- src/controllers/AuthRoleController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/AuthRoleController.ts b/src/controllers/AuthRoleController.ts index 78220ab7..4159c5ec 100644 --- a/src/controllers/AuthRoleController.ts +++ b/src/controllers/AuthRoleController.ts @@ -39,7 +39,7 @@ export class AuthRoleController extends Controller { @Get("list") public async listAuthRole( @Request() req: RequestWithUser, - @Query("isAdminVisibled ") isAdminVisibled : string = "false", + @Query("isAdminVisibled") isAdminVisibled : string = "false", ) { let condition: any = {}; if(isAdminVisibled.toLowerCase() === "true"){ From 6cc6bed80622a7289ff2baf0346d459f12afddd3 Mon Sep 17 00:00:00 2001 From: Adisak Date: Tue, 4 Nov 2025 15:16:53 +0700 Subject: [PATCH 20/26] migration --- src/entities/ApiHistory.ts | 6 +++--- ...rApi_and_tokenApi_field_ApiHistoryTable.ts | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 src/migration/1762243747843-update_size_headerApi_and_tokenApi_field_ApiHistoryTable.ts diff --git a/src/entities/ApiHistory.ts b/src/entities/ApiHistory.ts index c5f640d0..e84263b6 100644 --- a/src/entities/ApiHistory.ts +++ b/src/entities/ApiHistory.ts @@ -6,17 +6,17 @@ import { ApiName } from "./ApiName"; @Entity("apiHistory") export class ApiHistory extends EntityBase { @Column({ + type: 'longtext', nullable: true, comment: "header", - length: 255, - default: null, + default: null, }) headerApi: string; @Column({ + type: 'longtext', nullable: true, comment: "token", - length: 255, default: null, }) tokenApi: string; diff --git a/src/migration/1762243747843-update_size_headerApi_and_tokenApi_field_ApiHistoryTable.ts b/src/migration/1762243747843-update_size_headerApi_and_tokenApi_field_ApiHistoryTable.ts new file mode 100644 index 00000000..bed2927e --- /dev/null +++ b/src/migration/1762243747843-update_size_headerApi_and_tokenApi_field_ApiHistoryTable.ts @@ -0,0 +1,20 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateSizeHeaderApiAndTokenApiFieldApiHistoryTable1762243747843 implements MigrationInterface { + name = 'UpdateSizeHeaderApiAndTokenApiFieldApiHistoryTable1762243747843' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`apiHistory\` DROP COLUMN \`headerApi\``); + await queryRunner.query(`ALTER TABLE \`apiHistory\` ADD \`headerApi\` longtext NULL COMMENT 'header'`); + await queryRunner.query(`ALTER TABLE \`apiHistory\` DROP COLUMN \`tokenApi\``); + await queryRunner.query(`ALTER TABLE \`apiHistory\` ADD \`tokenApi\` longtext NULL COMMENT 'token'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`apiHistory\` DROP COLUMN \`tokenApi\``); + await queryRunner.query(`ALTER TABLE \`apiHistory\` ADD \`tokenApi\` varchar(255) NULL COMMENT 'token'`); + await queryRunner.query(`ALTER TABLE \`apiHistory\` DROP COLUMN \`headerApi\``); + await queryRunner.query(`ALTER TABLE \`apiHistory\` ADD \`headerApi\` varchar(255) NULL COMMENT 'header'`); + } + +} From 5d742fa8be02e83e0c9fae0ad08588117d51c4af Mon Sep 17 00:00:00 2001 From: Adisak Date: Tue, 4 Nov 2025 15:17:52 +0700 Subject: [PATCH 21/26] #206 --- src/controllers/PositionController.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/PositionController.ts b/src/controllers/PositionController.ts index e9f8d99e..34be7a8e 100644 --- a/src/controllers/PositionController.ts +++ b/src/controllers/PositionController.ts @@ -3704,7 +3704,9 @@ export class PositionController extends Controller { dataMaster.current_holderId = _null; } await this.posMasterRepository.save(dataMaster, { data: request }); - await CreatePosMasterHistoryOfficer(dataMaster.id, request); + if (chkRevision?.orgRevisionIsCurrent) { + await CreatePosMasterHistoryOfficer(dataMaster.id, request); + } setLogDataDiff(request, { before, after: dataMaster }); return new HttpSuccess(); From 2f73ae28744aefefcced12332dce1e4d0724d82f Mon Sep 17 00:00:00 2001 From: harid Date: Wed, 5 Nov 2025 10:07:22 +0700 Subject: [PATCH 22/26] revert --- src/app.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app.ts b/src/app.ts index 368be40f..7f0e0220 100644 --- a/src/app.ts +++ b/src/app.ts @@ -66,9 +66,7 @@ async function main() { } }); - // const cronTime_Oct = "0 0 1 10 *"; - // Test #1912 - const cronTime_Oct = "0 0 4 11 *"; + const cronTime_Oct = "0 0 1 10 *"; cron.schedule(cronTime_Oct, async () => { try { const commandController = new CommandController(); From 46ae2296194c9239a14280e5ad38d28a48d9719f Mon Sep 17 00:00:00 2001 From: Adisak Date: Fri, 7 Nov 2025 10:05:30 +0700 Subject: [PATCH 23/26] migration --- src/entities/view/viewDirectorActing.ts | 3 + ...762422995264-update_viewDirectiorActing.ts | 122 ++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 src/migration/1762422995264-update_viewDirectiorActing.ts diff --git a/src/entities/view/viewDirectorActing.ts b/src/entities/view/viewDirectorActing.ts index bf99391b..d4029ebb 100644 --- a/src/entities/view/viewDirectorActing.ts +++ b/src/entities/view/viewDirectorActing.ts @@ -8,6 +8,7 @@ import { ViewColumn, ViewEntity } from "typeorm"; \`profileChild\`.\`lastName\` AS \`lastName\`, \`profileChild\`.\`citizenId\` AS \`citizenId\`, \`profileChild\`.\`position\` AS \`position\`, + \`profile\`.\`isProbation\` AS \`isProbation\`, CONCAT((CASE WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` @@ -71,6 +72,8 @@ export class viewDirectorActing { @ViewColumn() position: string; @ViewColumn() + isProbation: string; + @ViewColumn() posNo: string; @ViewColumn() posLevel: string; diff --git a/src/migration/1762422995264-update_viewDirectiorActing.ts b/src/migration/1762422995264-update_viewDirectiorActing.ts new file mode 100644 index 00000000..611a5347 --- /dev/null +++ b/src/migration/1762422995264-update_viewDirectiorActing.ts @@ -0,0 +1,122 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateViewDirectiorActing1762422995264 implements MigrationInterface { + name = 'UpdateViewDirectiorActing1762422995264' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP VIEW \`view_director_acting\``); + await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT + \`profileChild\`.\`id\` AS \`Id\`, + \`profileChild\`.\`prefix\` AS \`prefix\`, + \`profileChild\`.\`firstName\` AS \`firstName\`, + \`profileChild\`.\`lastName\` AS \`lastName\`, + \`profileChild\`.\`citizenId\` AS \`citizenId\`, + \`profileChild\`.\`position\` AS \`position\`, + \`profile\`.\`isProbation\` AS \`isProbation\`, + CONCAT((CASE + WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` + WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` + WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` + WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` + ELSE \`orgChild4Child\`.\`orgChild4ShortName\` + END), + \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, + \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, + \`posMaster\`.\`isDirector\` AS \`isDirector\`, + \`posLevel\`.\`posLevelName\` AS \`posLevel\`, + \`posType\`.\`posTypeName\` AS \`posType\`, + \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, + \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, + \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, + \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, + \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, + \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, + \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, + \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, + \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, + CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, + \`profile\`.\`id\` AS \`actFullNameId\`, + CONCAT(\`profile\`.\`prefix\`, + \`profile\`.\`firstName\`, + ' ', + \`profile\`.\`lastName\`) AS \`actFullName\` + FROM + (((((((((((((((\`posMasterAct\` + JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) + JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) + LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) + LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) + LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) + LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) + LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) + JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) + JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) + JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) + LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) + LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) + JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) + LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) + LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) + WHERE + (\`position\`.\`positionIsSelected\` = TRUE)`); + + } + + public async down(queryRunner: QueryRunner): Promise {; + await queryRunner.query(`DROP VIEW \`view_director_acting\``); + await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT + \`profileChild\`.\`id\` AS \`Id\`, + \`profileChild\`.\`prefix\` AS \`prefix\`, + \`profileChild\`.\`firstName\` AS \`firstName\`, + \`profileChild\`.\`lastName\` AS \`lastName\`, + \`profileChild\`.\`citizenId\` AS \`citizenId\`, + \`profileChild\`.\`position\` AS \`position\`, + CONCAT((CASE + WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` + WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` + WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` + WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` + ELSE \`orgChild4Child\`.\`orgChild4ShortName\` + END), + \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, + \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, + \`posMaster\`.\`isDirector\` AS \`isDirector\`, + \`posLevel\`.\`posLevelName\` AS \`posLevel\`, + \`posType\`.\`posTypeName\` AS \`posType\`, + \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, + \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, + \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, + \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, + \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, + \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, + \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, + \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, + \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, + CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, + \`profile\`.\`id\` AS \`actFullNameId\`, + CONCAT(\`profile\`.\`prefix\`, + \`profile\`.\`firstName\`, + ' ', + \`profile\`.\`lastName\`) AS \`actFullName\` + FROM + (((((((((((((((\`posMasterAct\` + JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) + JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) + LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) + LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) + LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) + LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) + LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) + JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) + JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) + JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) + LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) + LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) + JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) + LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) + LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) + WHERE + (\`position\`.\`positionIsSelected\` = TRUE)`); + } + +} From 7d5d6bb43e38c28d74d5d04e099197047f9576cf Mon Sep 17 00:00:00 2001 From: Adisak Date: Fri, 7 Nov 2025 12:30:03 +0700 Subject: [PATCH 24/26] migration --- src/entities/view/viewDirector.ts | 15 + src/entities/view/viewDirectorActing.ts | 4 + ...762422995264-update_viewDirectiorActing.ts | 122 -------- ...e_viewDirectior_and_viewDirectiorActing.ts | 290 ++++++++++++++++++ 4 files changed, 309 insertions(+), 122 deletions(-) delete mode 100644 src/migration/1762422995264-update_viewDirectiorActing.ts create mode 100644 src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts diff --git a/src/entities/view/viewDirector.ts b/src/entities/view/viewDirector.ts index a13f9ebf..d2ed5b65 100644 --- a/src/entities/view/viewDirector.ts +++ b/src/entities/view/viewDirector.ts @@ -31,6 +31,21 @@ import { ViewColumn, ViewEntity } from "typeorm"; posMaster.orgChild3Id AS orgChild3Id, posMaster.orgChild4Id AS orgChild4Id, CONCAT(posMaster.id, profile.id) AS \`key\`, + ( + SELECT hrms_organization.acting.actFullNameKeycloakId + FROM hrms_organization.view_director_acting acting + WHERE ((hrms_organization.acting.Id = hrms_organization.posMaster.current_holderId) + AND (hrms_organization.acting.orgRootId = hrms_organization.posMaster.orgRootId) + AND ((hrms_organization.acting.orgChild1Id = hrms_organization.posMaster.orgChild1Id) + OR (hrms_organization.acting.orgChild1Id IS NULL)) + AND ((hrms_organization.acting.orgChild2Id = hrms_organization.posMaster.orgChild2Id) + OR (hrms_organization.acting.orgChild2Id IS NULL)) + AND ((hrms_organization.acting.orgChild3Id = hrms_organization.posMaster.orgChild3Id) + OR (hrms_organization.acting.orgChild3Id IS NULL)) + AND ((hrms_organization.acting.orgChild4Id = hrms_organization.posMaster.orgChild4Id) + OR (hrms_organization.acting.orgChild4Id IS NULL))) + LIMIT 1 + ) AS actFullNameKeycloakId, ( SELECT actFullNameId FROM view_director_acting AS acting diff --git a/src/entities/view/viewDirectorActing.ts b/src/entities/view/viewDirectorActing.ts index d4029ebb..1f56d027 100644 --- a/src/entities/view/viewDirectorActing.ts +++ b/src/entities/view/viewDirectorActing.ts @@ -30,6 +30,10 @@ import { ViewColumn, ViewEntity } from "typeorm"; \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, + CONCAT(\`hrms_organization\`.\`posMaster\`.\`id\`, + \`profileChild\`.\`id\`) AS \`key\`, + \`hrms_organization\`.\`profile\`.\`id\` AS \`actFullNameId\`, + \`hrms_organization\`.\`profile\`.\`keycloak\` AS \`actFullNameKeycloakId\`, CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, \`profile\`.\`id\` AS \`actFullNameId\`, CONCAT(\`profile\`.\`prefix\`, diff --git a/src/migration/1762422995264-update_viewDirectiorActing.ts b/src/migration/1762422995264-update_viewDirectiorActing.ts deleted file mode 100644 index 611a5347..00000000 --- a/src/migration/1762422995264-update_viewDirectiorActing.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class UpdateViewDirectiorActing1762422995264 implements MigrationInterface { - name = 'UpdateViewDirectiorActing1762422995264' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`DROP VIEW \`view_director_acting\``); - await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT - \`profileChild\`.\`id\` AS \`Id\`, - \`profileChild\`.\`prefix\` AS \`prefix\`, - \`profileChild\`.\`firstName\` AS \`firstName\`, - \`profileChild\`.\`lastName\` AS \`lastName\`, - \`profileChild\`.\`citizenId\` AS \`citizenId\`, - \`profileChild\`.\`position\` AS \`position\`, - \`profile\`.\`isProbation\` AS \`isProbation\`, - CONCAT((CASE - WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` - WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` - WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` - WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` - ELSE \`orgChild4Child\`.\`orgChild4ShortName\` - END), - \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, - \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, - \`posMaster\`.\`isDirector\` AS \`isDirector\`, - \`posLevel\`.\`posLevelName\` AS \`posLevel\`, - \`posType\`.\`posTypeName\` AS \`posType\`, - \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, - \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, - \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, - \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, - \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, - \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, - \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, - \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, - \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, - CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, - \`profile\`.\`id\` AS \`actFullNameId\`, - CONCAT(\`profile\`.\`prefix\`, - \`profile\`.\`firstName\`, - ' ', - \`profile\`.\`lastName\`) AS \`actFullName\` - FROM - (((((((((((((((\`posMasterAct\` - JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) - JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) - LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) - LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) - LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) - LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) - LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) - JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) - JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) - JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) - LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) - LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) - JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) - LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) - LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) - WHERE - (\`position\`.\`positionIsSelected\` = TRUE)`); - - } - - public async down(queryRunner: QueryRunner): Promise {; - await queryRunner.query(`DROP VIEW \`view_director_acting\``); - await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT - \`profileChild\`.\`id\` AS \`Id\`, - \`profileChild\`.\`prefix\` AS \`prefix\`, - \`profileChild\`.\`firstName\` AS \`firstName\`, - \`profileChild\`.\`lastName\` AS \`lastName\`, - \`profileChild\`.\`citizenId\` AS \`citizenId\`, - \`profileChild\`.\`position\` AS \`position\`, - CONCAT((CASE - WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` - WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` - WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` - WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` - ELSE \`orgChild4Child\`.\`orgChild4ShortName\` - END), - \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, - \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, - \`posMaster\`.\`isDirector\` AS \`isDirector\`, - \`posLevel\`.\`posLevelName\` AS \`posLevel\`, - \`posType\`.\`posTypeName\` AS \`posType\`, - \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, - \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, - \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, - \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, - \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, - \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, - \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, - \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, - \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, - CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, - \`profile\`.\`id\` AS \`actFullNameId\`, - CONCAT(\`profile\`.\`prefix\`, - \`profile\`.\`firstName\`, - ' ', - \`profile\`.\`lastName\`) AS \`actFullName\` - FROM - (((((((((((((((\`posMasterAct\` - JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) - JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) - LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) - LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) - LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) - LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) - LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) - JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) - JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) - JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) - LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) - LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) - JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) - LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) - LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) - WHERE - (\`position\`.\`positionIsSelected\` = TRUE)`); - } - -} diff --git a/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts b/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts new file mode 100644 index 00000000..26c26b8f --- /dev/null +++ b/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts @@ -0,0 +1,290 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateViewDirectiorAndViewDirectiorActing1762489522691 implements MigrationInterface { + name = 'UpdateViewDirectiorAndViewDirectiorActing1762489522691' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM \`hrms_organization\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW", "view_director_acting", "hrms_organization"]); + await queryRunner.query(`DROP VIEW IF EXISTS \`view_director_acting\``); + // await queryRunner.query(`INSERT INTO \`hrms_organization\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["hrms_organization", "VIEW", "view_director", "SELECT \n profile.id AS Id,\n profile.prefix AS prefix,\n profile.firstName AS firstName,\n profile.lastName AS lastName,\n profile.citizenId AS citizenId,\n profile.position AS position,\n CONCAT(\n CASE \n WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName\n WHEN posMaster.orgChild2Id IS NULL THEN orgChild1.orgChild1ShortName\n WHEN posMaster.orgChild3Id IS NULL THEN orgChild2.orgChild2ShortName\n WHEN posMaster.orgChild4Id IS NULL THEN orgChild3.orgChild3ShortName\n ELSE orgChild4.orgChild4ShortName\n END,\n posMaster.posMasterNo\n ) AS posNo,\n posMaster.isDirector AS isDirector,\n posLevel.posLevelName AS posLevel,\n posType.posTypeName AS posType,\n posExecutive.posExecutiveName AS posExecutiveName,\n orgRoot.isDeputy AS isDeputy,\n orgChild1.isOfficer AS isOfficer,\n posMaster.orgRevisionId AS orgRevisionId,\n posMaster.orgRootId AS orgRootId,\n posMaster.orgChild1Id AS orgChild1Id,\n posMaster.orgChild2Id AS orgChild2Id,\n posMaster.orgChild3Id AS orgChild3Id,\n posMaster.orgChild4Id AS orgChild4Id,\n CONCAT(posMaster.id, profile.id) AS `key`,\n (\n SELECT hrms_organization.acting.actFullNameKeycloakId\n FROM hrms_organization.view_director_acting acting\n WHERE ((hrms_organization.acting.Id = hrms_organization.posMaster.current_holderId)\n AND (hrms_organization.acting.orgRootId = hrms_organization.posMaster.orgRootId)\n AND ((hrms_organization.acting.orgChild1Id = hrms_organization.posMaster.orgChild1Id)\n OR (hrms_organization.acting.orgChild1Id IS NULL))\n AND ((hrms_organization.acting.orgChild2Id = hrms_organization.posMaster.orgChild2Id)\n OR (hrms_organization.acting.orgChild2Id IS NULL))\n AND ((hrms_organization.acting.orgChild3Id = hrms_organization.posMaster.orgChild3Id)\n OR (hrms_organization.acting.orgChild3Id IS NULL))\n AND ((hrms_organization.acting.orgChild4Id = hrms_organization.posMaster.orgChild4Id)\n OR (hrms_organization.acting.orgChild4Id IS NULL)))\n LIMIT 1\n ) AS actFullNameKeycloakId,\n (\n SELECT actFullNameId \n FROM view_director_acting AS acting\n WHERE acting.Id = posMaster.current_holderId \n AND acting.orgRootId = posMaster.orgRootId \n AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL)\n AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL)\n AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL)\n AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL)\n LIMIT 1\n ) AS actFullNameId,\n (\n SELECT actFullName \n FROM view_director_acting AS acting\n WHERE acting.Id = posMaster.current_holderId \n AND acting.orgRootId = posMaster.orgRootId \n AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL)\n AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL)\n AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL)\n AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL)\n LIMIT 1\n ) AS actFullName\n FROM\n posMaster\n JOIN profile ON posMaster.current_holderId = profile.id\n LEFT JOIN orgRoot ON posMaster.orgRootId = orgRoot.id\n LEFT JOIN orgChild1 ON posMaster.orgChild1Id = orgChild1.id\n LEFT JOIN orgChild2 ON posMaster.orgChild2Id = orgChild2.id\n LEFT JOIN orgChild3 ON posMaster.orgChild3Id = orgChild3.id\n LEFT JOIN orgChild4 ON posMaster.orgChild4Id = orgChild4.id\n JOIN posLevel ON profile.posLevelId = posLevel.id\n JOIN posType ON profile.posTypeId = posType.id\n LEFT JOIN position ON posMaster.id = position.posMasterId\n LEFT JOIN posExecutive ON position.posExecutiveId = posExecutive.id\n INNER JOIN orgRevision ON posMaster.orgRevisionId = orgRevision.id\n WHERE\n (position.positionIsSelected = TRUE)\n AND (orgRevision.orgRevisionIsCurrent = TRUE\n AND orgRevision.orgRevisionIsDraft = FALSE)"]); + await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT + \`profileChild\`.\`id\` AS \`Id\`, + \`profileChild\`.\`prefix\` AS \`prefix\`, + \`profileChild\`.\`firstName\` AS \`firstName\`, + \`profileChild\`.\`lastName\` AS \`lastName\`, + \`profileChild\`.\`citizenId\` AS \`citizenId\`, + \`profileChild\`.\`position\` AS \`position\`, + \`profile\`.\`isProbation\` AS \`isProbation\`, + CONCAT((CASE + WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` + WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` + WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` + WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` + ELSE \`orgChild4Child\`.\`orgChild4ShortName\` + END), + \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, + \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, + \`posMaster\`.\`isDirector\` AS \`isDirector\`, + \`posLevel\`.\`posLevelName\` AS \`posLevel\`, + \`posType\`.\`posTypeName\` AS \`posType\`, + \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, + \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, + \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, + \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, + \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, + \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, + \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, + \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, + \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, + CONCAT(\`hrms_organization\`.\`profile\`.\`keycloak\`) AS \`actFullNameKeycloakId\`, + CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, + \`profile\`.\`id\` AS \`actFullNameId\`, + CONCAT(\`profile\`.\`prefix\`, + \`profile\`.\`firstName\`, + ' ', + \`profile\`.\`lastName\`) AS \`actFullName\` + FROM + (((((((((((((((\`posMasterAct\` + JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) + JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) + LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) + LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) + LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) + LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) + LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) + JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) + JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) + JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) + LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) + LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) + JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) + LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) + LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) + WHERE + (\`position\`.\`positionIsSelected\` = TRUE)`); + + await queryRunner.query(`DELETE FROM \`hrms_organization\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW", "view_director", "hrms_organization"]); + await queryRunner.query(`DROP VIEW IF EXISTS \`view_director\``); + // await queryRunner.query(`INSERT INTO \`hrms_organization\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["hrms_organization", "VIEW", "view_employee_pos_master", "SELECT \n employeePosMaster.id,\n employeePosMaster.posMasterNoPrefix,\n employeePosMaster.posMasterNo,\n employeePosMaster.posMasterNoSuffix,\n employeePosMaster.orgRevisionId,\n employeePosMaster.orgRootId,\n employeePosMaster.orgChild1Id,\n employeePosMaster.orgChild2Id,\n employeePosMaster.orgChild3Id,\n employeePosMaster.orgChild4Id,\n employeePosMaster.current_holderId,\n profileEmployee.id as profileId,\n profileEmployee.prefix,\n profileEmployee.firstName,\n profileEmployee.lastName,\n profileEmployee.citizenId,\n profileEmployee.position,\n profileEmployee.amount,\n profileEmployee.dateRetire,\n profileEmployee.birthDate,\n profileEmployee.salaryLevel,\n profileEmployee.group,\n orgRoot.id as rootId,\n orgRoot.orgRootShortName,\n orgRoot.orgRootOrder,\n orgRoot.orgRootName,\n orgChild1.id as child1Id,\n orgChild1.orgChild1ShortName,\n orgChild1.orgChild1Order,\n orgChild1.orgChild1Name,\n orgChild2.id as child2Id,\n orgChild2.orgChild2ShortName,\n orgChild2.orgChild2Order,\n orgChild2.orgChild2Name,\n orgChild3.id as child3Id,\n orgChild3.orgChild3ShortName,\n orgChild3.orgChild3Order,\n orgChild3.orgChild3Name,\n orgChild4.id as child4Id,\n orgChild4.orgChild4ShortName,\n orgChild4.orgChild4Order,\n orgChild4.orgChild4Name,\n position.id as positionId,\n position.positionIsSelected,\n position.posExecutiveId as positionPosExecutiveId,\n position.isSpecial,\n posExecutive.id as posExecutiveId,\n posExecutive.posExecutiveName,\n profileDiscipline.id as profileDisciplineId,\n profileDiscipline.date as disCriplineDate,\n profileLeave.id as profileLeaveId,\n profileAssessment.id as profileAssessmentId,\n profileAssessment.pointSum,\n employeePosLevel.id as posLevelId,\n employeePosLevel.posLevelName,\n\temployeePosType.id as posTypeId,\n employeePosType.posTypeName,\n employeePosType.posTypeShortName\n FROM \n employeePosMaster\n LEFT JOIN \n profileEmployee ON employeePosMaster.current_holderId = profileEmployee.id \n LEFT JOIN \n orgRoot ON employeePosMaster.orgRootId = orgRoot.id\n LEFT JOIN \n orgChild1 ON employeePosMaster.orgChild1Id = orgChild1.id\n LEFT JOIN \n orgChild2 ON employeePosMaster.orgChild2Id = orgChild2.id\n LEFT JOIN \n orgChild3 ON employeePosMaster.orgChild3Id = orgChild3.id\n LEFT JOIN \n orgChild4 ON employeePosMaster.orgChild4Id = orgChild4.id\n LEFT JOIN \n position ON employeePosMaster.id = position.posMasterId\n LEFT JOIN \n posExecutive ON position.posExecutiveId = posExecutive.id\n LEFT JOIN (\n SELECT *\n FROM profileDisciplineEmployee pd1\n WHERE pd1.date = (\n SELECT MAX(pd2.date)\n FROM profileDisciplineEmployee pd2\n WHERE pd2.profileId = pd1.profileId\n )\n ) AS profileDiscipline ON profileDiscipline.profileId = profileEmployee.id\n LEFT JOIN (\n SELECT pl1.*\n FROM profileLeave pl1\n INNER JOIN (\n SELECT profileId, MAX(createdAt) AS maxDate\n FROM profileLeave\n GROUP BY profileId\n ) pl2 ON pl1.profileId = pl2.profileId\n AND pl1.createdAt = pl2.maxDate\n ) AS profileLeave ON profileLeave.profileId = employeePosMaster.current_holderId\n LEFT JOIN (\n SELECT pa1.*\n FROM profileAssessment pa1\n INNER JOIN (\n SELECT profileId, MAX(createdAt) AS maxDate\n FROM profileAssessment\n GROUP BY profileId\n ) pa2 ON pa1.profileId = pa2.profileId\n AND pa1.createdAt = pa2.maxDate\n ) AS profileAssessment \n ON profileAssessment.profileId = profileEmployee.id\n LEFT JOIN \n employeePosLevel ON profileEmployee.posLevelId = employeePosLevel.id\n LEFT JOIN \n employeePosType ON profileEmployee.posTypeId = employeePosType.id\n WHERE \t\n employeePosMaster.current_holderId IS NOT NULL\n ORDER BY \n profileEmployee.citizenId ASC"]); + await queryRunner.query(`CREATE VIEW \`view_director\` AS SELECT + profile.id AS Id, + profile.prefix AS prefix, + profile.firstName AS firstName, + profile.lastName AS lastName, + profile.citizenId AS citizenId, + profile.position AS position, + CONCAT( + CASE + WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName + WHEN posMaster.orgChild2Id IS NULL THEN orgChild1.orgChild1ShortName + WHEN posMaster.orgChild3Id IS NULL THEN orgChild2.orgChild2ShortName + WHEN posMaster.orgChild4Id IS NULL THEN orgChild3.orgChild3ShortName + ELSE orgChild4.orgChild4ShortName + END, + posMaster.posMasterNo + ) AS posNo, + posMaster.isDirector AS isDirector, + posLevel.posLevelName AS posLevel, + posType.posTypeName AS posType, + posExecutive.posExecutiveName AS posExecutiveName, + orgRoot.isDeputy AS isDeputy, + orgChild1.isOfficer AS isOfficer, + posMaster.orgRevisionId AS orgRevisionId, + posMaster.orgRootId AS orgRootId, + posMaster.orgChild1Id AS orgChild1Id, + posMaster.orgChild2Id AS orgChild2Id, + posMaster.orgChild3Id AS orgChild3Id, + posMaster.orgChild4Id AS orgChild4Id, + CONCAT(posMaster.id, profile.id) AS \`key\`, + ( + SELECT hrms_organization.acting.actFullNameKeycloakId + FROM hrms_organization.view_director_acting acting + WHERE ((hrms_organization.acting.Id = hrms_organization.posMaster.current_holderId) + AND (hrms_organization.acting.orgRootId = hrms_organization.posMaster.orgRootId) + AND ((hrms_organization.acting.orgChild1Id = hrms_organization.posMaster.orgChild1Id) + OR (hrms_organization.acting.orgChild1Id IS NULL)) + AND ((hrms_organization.acting.orgChild2Id = hrms_organization.posMaster.orgChild2Id) + OR (hrms_organization.acting.orgChild2Id IS NULL)) + AND ((hrms_organization.acting.orgChild3Id = hrms_organization.posMaster.orgChild3Id) + OR (hrms_organization.acting.orgChild3Id IS NULL)) + AND ((hrms_organization.acting.orgChild4Id = hrms_organization.posMaster.orgChild4Id) + OR (hrms_organization.acting.orgChild4Id IS NULL))) + LIMIT 1 + ) AS actFullNameKeycloakId, + ( + SELECT actFullNameId + FROM view_director_acting AS acting + WHERE acting.Id = posMaster.current_holderId + AND acting.orgRootId = posMaster.orgRootId + AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL) + AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL) + AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL) + AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL) + LIMIT 1 + ) AS actFullNameId, + ( + SELECT actFullName + FROM view_director_acting AS acting + WHERE acting.Id = posMaster.current_holderId + AND acting.orgRootId = posMaster.orgRootId + AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL) + AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL) + AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL) + AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL) + LIMIT 1 + ) AS actFullName + FROM + posMaster + JOIN profile ON posMaster.current_holderId = profile.id + LEFT JOIN orgRoot ON posMaster.orgRootId = orgRoot.id + LEFT JOIN orgChild1 ON posMaster.orgChild1Id = orgChild1.id + LEFT JOIN orgChild2 ON posMaster.orgChild2Id = orgChild2.id + LEFT JOIN orgChild3 ON posMaster.orgChild3Id = orgChild3.id + LEFT JOIN orgChild4 ON posMaster.orgChild4Id = orgChild4.id + JOIN posLevel ON profile.posLevelId = posLevel.id + JOIN posType ON profile.posTypeId = posType.id + LEFT JOIN position ON posMaster.id = position.posMasterId + LEFT JOIN posExecutive ON position.posExecutiveId = posExecutive.id + INNER JOIN orgRevision ON posMaster.orgRevisionId = orgRevision.id + WHERE + (position.positionIsSelected = TRUE) + AND (orgRevision.orgRevisionIsCurrent = TRUE + AND orgRevision.orgRevisionIsDraft = FALSE)`); + + await queryRunner.query(`INSERT INTO \`hrms_organization\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["hrms_organization", "VIEW", "view_current_tenure_employee", "WITH resultData AS (\n SELECT\n commandDateAffect,\n positionName,\n positionCee,\n TIMESTAMPDIFF(\n DAY,\n LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) AS days_diff,\n TIMESTAMPDIFF(\n DAY,\n LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) / 365.2524 AS 'Years',\n TIMESTAMPDIFF(\n DAY,\n LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) / 30.4375 % 12 AS 'Months',\n TIMESTAMPDIFF(\n DAY,\n LAG(MIN(commandDateAffect)) OVER (ORDER BY commandDateAffect), MIN(commandDateAffect)) % 30.4375 AS 'Days',\n posNo,\n positionExecutive,\n positionType,\n positionLevel,\n OrgRoot,\n orgChild1,\n orgChild2,\n orgChild3,\n orgChild4,\n commandCode,\n commandName,\n commandNo,\n commandYear,\n remark,\n profileEmployeeId,\n ROW_NUMBER() OVER (PARTITION BY profileEmployeeId ORDER BY commandDateAffect ASC) AS orderNumber\n FROM (\n SELECT\n commandDateAffect,\n commandDateSign,\n positionName,\n positionCee,\n posNo,\n positionExecutive,\n positionType,\n positionLevel,\n OrgRoot,\n orgChild1,\n orgChild2,\n orgChild3,\n orgChild4,\n commandCode,\n commandName,\n commandNo,\n commandYear,\n remark,\n profileEmployeeId,\n LAG(commandDateSign) OVER (ORDER BY commandDateAffect ASC, commandDateSign ASC) AS prevCommandDateSign,\n ROW_NUMBER() OVER (ORDER BY commandDateAffect ASC, commandDateSign ASC) -\n ROW_NUMBER() OVER (PARTITION BY positionName ORDER BY commandDateAffect ASC, commandDateSign ASC) as groupedId\n FROM\n profileSalary\n WHERE\n commandCode IN (1, 2, 3, 4, 8, 10, 11, 12, 15, 16)\n ORDER BY\n commandDateAffect ASC, commandDateSign ASC\n ) AS groupedPosition\n WHERE\n prevCommandDateSign IS NULL OR commandDateSign >= prevCommandDateSign\n GROUP BY\n profileEmployeeId, groupedId, positionName\n )\n SELECT\n commandDateAffect,\n positionName,\n positionCee,\n days_diff,\n Years,\n Months,\n Days,\n posNo,\n positionExecutive,\n positionType,\n positionLevel,\n OrgRoot,\n orgChild1,\n orgChild2,\n orgChild3,\n orgChild4,\n commandCode,\n commandName,\n commandNo,\n commandYear,\n remark,\n profileEmployeeId,\n orderNumber\n FROM resultData\n\n UNION ALL\n\n SELECT\n CURDATE() AS commandDateAffect,\n NULL AS positionName,\n NULL AS positionCee,\n TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) AS days_diff,\n TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) / 365.2524 AS 'Years',\n TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) / 30.4375 % 12 AS 'Months',\n TIMESTAMPDIFF(DAY, MAX(commandDateAffect), CURDATE()) % 30.4375 AS 'Days',\n NULL AS posNo,\n NULL AS positionExecutive,\n NULL AS positionType,\n NULL AS positionLevel,\n NULL AS OrgRoot,\n NULL AS orgChild1,\n NULL AS orgChild2,\n NULL AS orgChild3,\n NULL AS orgChild4,\n NULL AS commandCode,\n NULL AS commandName,\n NULL AS commandNo,\n NULL AS commandYear,\n NULL AS remark,\n profileEmployeeId,\n NULL AS orderNumber\n FROM resultData"]); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DELETE FROM \`hrms_organization\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW", "view_director_acting", "hrms_organization"]); + await queryRunner.query(`DROP VIEW IF EXISTS \`view_director_acting\``); + await queryRunner.query(`CREATE VIEW \`view_director_acting\` AS SELECT + \`profileChild\`.\`id\` AS \`Id\`, + \`profileChild\`.\`prefix\` AS \`prefix\`, + \`profileChild\`.\`firstName\` AS \`firstName\`, + \`profileChild\`.\`lastName\` AS \`lastName\`, + \`profileChild\`.\`citizenId\` AS \`citizenId\`, + \`profileChild\`.\`position\` AS \`position\`, + CONCAT((CASE + WHEN (\`posMaster\`.\`orgChild1Id\` IS NULL) THEN \`orgRootChild\`.\`orgRootShortName\` + WHEN (\`posMaster\`.\`orgChild2Id\` IS NULL) THEN \`orgChild1Child\`.\`orgChild1ShortName\` + WHEN (\`posMaster\`.\`orgChild3Id\` IS NULL) THEN \`orgChild2Child\`.\`orgChild2ShortName\` + WHEN (\`posMaster\`.\`orgChild4Id\` IS NULL) THEN \`orgChild3Child\`.\`orgChild3ShortName\` + ELSE \`orgChild4Child\`.\`orgChild4ShortName\` + END), + \`posMaster\`.\`posMasterNo\`) AS \`posNo\`, + \`posMasterChild\`.\`isDirector\` AS \`isDirectorChild\`, + \`posMaster\`.\`isDirector\` AS \`isDirector\`, + \`posLevel\`.\`posLevelName\` AS \`posLevel\`, + \`posType\`.\`posTypeName\` AS \`posType\`, + \`posExecutive\`.\`posExecutiveName\` AS \`posExecutiveName\`, + \`orgRoot\`.\`isDeputy\` AS \`isDeputy\`, + \`orgChild1\`.\`isOfficer\` AS \`isOfficer\`, + \`posMaster\`.\`orgRevisionId\` AS \`orgRevisionId\`, + \`posMaster\`.\`orgRootId\` AS \`orgRootId\`, + \`posMaster\`.\`orgChild1Id\` AS \`orgChild1Id\`, + \`posMaster\`.\`orgChild2Id\` AS \`orgChild2Id\`, + \`posMaster\`.\`orgChild3Id\` AS \`orgChild3Id\`, + \`posMaster\`.\`orgChild4Id\` AS \`orgChild4Id\`, + CONCAT(\`posMaster\`.\`id\`, \`profileChild\`.\`id\`) AS \`key\`, + \`profile\`.\`id\` AS \`actFullNameId\`, + CONCAT(\`profile\`.\`prefix\`, + \`profile\`.\`firstName\`, + ' ', + \`profile\`.\`lastName\`) AS \`actFullName\` + FROM + (((((((((((((((\`posMasterAct\` + JOIN \`posMaster\` \`posMasterChild\` ON ((\`posMasterAct\`.\`posMasterChildId\` = \`posMasterChild\`.\`id\`))) + JOIN \`profile\` \`profileChild\` ON ((\`posMasterChild\`.\`current_holderId\` = \`profileChild\`.\`id\`))) + LEFT JOIN \`orgRoot\` \`orgRootChild\` ON ((\`posMasterChild\`.\`orgRootId\` = \`orgRootChild\`.\`id\`))) + LEFT JOIN \`orgChild1\` \`orgChild1Child\` ON ((\`posMasterChild\`.\`orgChild1Id\` = \`orgChild1Child\`.\`id\`))) + LEFT JOIN \`orgChild2\` \`orgChild2Child\` ON ((\`posMasterChild\`.\`orgChild2Id\` = \`orgChild2Child\`.\`id\`))) + LEFT JOIN \`orgChild3\` \`orgChild3Child\` ON ((\`posMasterChild\`.\`orgChild3Id\` = \`orgChild3Child\`.\`id\`))) + LEFT JOIN \`orgChild4\` \`orgChild4Child\` ON ((\`posMasterChild\`.\`orgChild4Id\` = \`orgChild4Child\`.\`id\`))) + JOIN \`posLevel\` ON ((\`profileChild\`.\`posLevelId\` = \`posLevel\`.\`id\`))) + JOIN \`posType\` ON ((\`profileChild\`.\`posTypeId\` = \`posType\`.\`id\`))) + JOIN \`posMaster\` ON ((\`posMasterAct\`.\`posMasterId\` = \`posMaster\`.\`id\`))) + LEFT JOIN \`orgRoot\` ON ((\`posMaster\`.\`orgRootId\` = \`orgRoot\`.\`id\`))) + LEFT JOIN \`orgChild1\` ON ((\`posMaster\`.\`orgChild1Id\` = \`orgChild1\`.\`id\`))) + JOIN \`profile\` ON ((\`posMaster\`.\`current_holderId\` = \`profile\`.\`id\`))) + LEFT JOIN \`position\` ON ((\`posMasterChild\`.\`id\` = \`position\`.\`posMasterId\`))) + LEFT JOIN \`posExecutive\` ON ((\`position\`.\`posExecutiveId\` = \`posExecutive\`.\`id\`))) + WHERE + (\`position\`.\`positionIsSelected\` = TRUE)`); + + // await queryRunner.query(`INSERT INTO \`hrms_organization\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["hrms_organization", "VIEW", "view_director_acting", "SELECT \n `profileChild`.`id` AS `Id`,\n `profileChild`.`prefix` AS `prefix`,\n `profileChild`.`firstName` AS `firstName`,\n `profileChild`.`lastName` AS `lastName`,\n `profileChild`.`citizenId` AS `citizenId`,\n `profileChild`.`position` AS `position`,\n CONCAT((CASE\n WHEN (`posMaster`.`orgChild1Id` IS NULL) THEN `orgRootChild`.`orgRootShortName`\n WHEN (`posMaster`.`orgChild2Id` IS NULL) THEN `orgChild1Child`.`orgChild1ShortName`\n WHEN (`posMaster`.`orgChild3Id` IS NULL) THEN `orgChild2Child`.`orgChild2ShortName`\n WHEN (`posMaster`.`orgChild4Id` IS NULL) THEN `orgChild3Child`.`orgChild3ShortName`\n ELSE `orgChild4Child`.`orgChild4ShortName`\n END),\n `posMaster`.`posMasterNo`) AS `posNo`,\n `posMasterChild`.`isDirector` AS `isDirectorChild`,\n `posMaster`.`isDirector` AS `isDirector`,\n `posLevel`.`posLevelName` AS `posLevel`,\n `posType`.`posTypeName` AS `posType`,\n `posExecutive`.`posExecutiveName` AS `posExecutiveName`,\n `orgRoot`.`isDeputy` AS `isDeputy`,\n `orgChild1`.`isOfficer` AS `isOfficer`,\n `posMaster`.`orgRevisionId` AS `orgRevisionId`,\n `posMaster`.`orgRootId` AS `orgRootId`,\n `posMaster`.`orgChild1Id` AS `orgChild1Id`,\n `posMaster`.`orgChild2Id` AS `orgChild2Id`,\n `posMaster`.`orgChild3Id` AS `orgChild3Id`,\n `posMaster`.`orgChild4Id` AS `orgChild4Id`,\n CONCAT(`posMaster`.`id`, `profileChild`.`id`) AS `key`,\n `profile`.`id` AS `actFullNameId`,\n CONCAT(`profile`.`prefix`,\n `profile`.`firstName`,\n ' ',\n `profile`.`lastName`) AS `actFullName`\n FROM\n (((((((((((((((`posMasterAct`\n JOIN `posMaster` `posMasterChild` ON ((`posMasterAct`.`posMasterChildId` = `posMasterChild`.`id`)))\n JOIN `profile` `profileChild` ON ((`posMasterChild`.`current_holderId` = `profileChild`.`id`)))\n LEFT JOIN `orgRoot` `orgRootChild` ON ((`posMasterChild`.`orgRootId` = `orgRootChild`.`id`)))\n LEFT JOIN `orgChild1` `orgChild1Child` ON ((`posMasterChild`.`orgChild1Id` = `orgChild1Child`.`id`)))\n LEFT JOIN `orgChild2` `orgChild2Child` ON ((`posMasterChild`.`orgChild2Id` = `orgChild2Child`.`id`)))\n LEFT JOIN `orgChild3` `orgChild3Child` ON ((`posMasterChild`.`orgChild3Id` = `orgChild3Child`.`id`)))\n LEFT JOIN `orgChild4` `orgChild4Child` ON ((`posMasterChild`.`orgChild4Id` = `orgChild4Child`.`id`)))\n JOIN `posLevel` ON ((`profileChild`.`posLevelId` = `posLevel`.`id`)))\n JOIN `posType` ON ((`profileChild`.`posTypeId` = `posType`.`id`)))\n JOIN `posMaster` ON ((`posMasterAct`.`posMasterId` = `posMaster`.`id`)))\n LEFT JOIN `orgRoot` ON ((`posMaster`.`orgRootId` = `orgRoot`.`id`)))\n LEFT JOIN `orgChild1` ON ((`posMaster`.`orgChild1Id` = `orgChild1`.`id`)))\n JOIN `profile` ON ((`posMaster`.`current_holderId` = `profile`.`id`)))\n LEFT JOIN `position` ON ((`posMasterChild`.`id` = `position`.`posMasterId`)))\n LEFT JOIN `posExecutive` ON ((`position`.`posExecutiveId` = `posExecutive`.`id`)))\n WHERE\n (`position`.`positionIsSelected` = TRUE)"]); + await queryRunner.query(`DELETE FROM \`hrms_organization\`.\`typeorm_metadata\` WHERE \`type\` = ? AND \`name\` = ? AND \`schema\` = ?`, ["VIEW", "view_director", "hrms_organization"]); + await queryRunner.query(`DROP VIEW IF EXISTS \`view_director\``); + await queryRunner.query(`CREATE VIEW \`view_director\` AS SELECT + profile.id AS Id, + profile.prefix AS prefix, + profile.firstName AS firstName, + profile.lastName AS lastName, + profile.citizenId AS citizenId, + profile.position AS position, + CONCAT( + CASE + WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName + WHEN posMaster.orgChild2Id IS NULL THEN orgChild1.orgChild1ShortName + WHEN posMaster.orgChild3Id IS NULL THEN orgChild2.orgChild2ShortName + WHEN posMaster.orgChild4Id IS NULL THEN orgChild3.orgChild3ShortName + ELSE orgChild4.orgChild4ShortName + END, + posMaster.posMasterNo + ) AS posNo, + posMaster.isDirector AS isDirector, + posLevel.posLevelName AS posLevel, + posType.posTypeName AS posType, + posExecutive.posExecutiveName AS posExecutiveName, + orgRoot.isDeputy AS isDeputy, + orgChild1.isOfficer AS isOfficer, + posMaster.orgRevisionId AS orgRevisionId, + posMaster.orgRootId AS orgRootId, + posMaster.orgChild1Id AS orgChild1Id, + posMaster.orgChild2Id AS orgChild2Id, + posMaster.orgChild3Id AS orgChild3Id, + posMaster.orgChild4Id AS orgChild4Id, + CONCAT(posMaster.id, profile.id) AS \`key\`, + ( + SELECT actFullNameId + FROM view_director_acting AS acting + WHERE acting.Id = posMaster.current_holderId + AND acting.orgRootId = posMaster.orgRootId + AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL) + AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL) + AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL) + AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL) + LIMIT 1 + ) AS actFullNameId, + ( + SELECT actFullName + FROM view_director_acting AS acting + WHERE acting.Id = posMaster.current_holderId + AND acting.orgRootId = posMaster.orgRootId + AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL) + AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL) + AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL) + AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL) + LIMIT 1 + ) AS actFullName + FROM + posMaster + JOIN profile ON posMaster.current_holderId = profile.id + LEFT JOIN orgRoot ON posMaster.orgRootId = orgRoot.id + LEFT JOIN orgChild1 ON posMaster.orgChild1Id = orgChild1.id + LEFT JOIN orgChild2 ON posMaster.orgChild2Id = orgChild2.id + LEFT JOIN orgChild3 ON posMaster.orgChild3Id = orgChild3.id + LEFT JOIN orgChild4 ON posMaster.orgChild4Id = orgChild4.id + JOIN posLevel ON profile.posLevelId = posLevel.id + JOIN posType ON profile.posTypeId = posType.id + LEFT JOIN position ON posMaster.id = position.posMasterId + LEFT JOIN posExecutive ON position.posExecutiveId = posExecutive.id + INNER JOIN orgRevision ON posMaster.orgRevisionId = orgRevision.id + WHERE + (position.positionIsSelected = TRUE) + AND (orgRevision.orgRevisionIsCurrent = TRUE + AND orgRevision.orgRevisionIsDraft = FALSE)`); + + // await queryRunner.query(`INSERT INTO \`hrms_organization\`.\`typeorm_metadata\`(\`database\`, \`schema\`, \`table\`, \`type\`, \`name\`, \`value\`) VALUES (DEFAULT, ?, DEFAULT, ?, ?, ?)`, ["hrms_organization", "VIEW", "view_director", "SELECT \n profile.id AS Id,\n profile.prefix AS prefix,\n profile.firstName AS firstName,\n profile.lastName AS lastName,\n profile.citizenId AS citizenId,\n profile.position AS position,\n CONCAT(\n CASE \n WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName\n WHEN posMaster.orgChild2Id IS NULL THEN orgChild1.orgChild1ShortName\n WHEN posMaster.orgChild3Id IS NULL THEN orgChild2.orgChild2ShortName\n WHEN posMaster.orgChild4Id IS NULL THEN orgChild3.orgChild3ShortName\n ELSE orgChild4.orgChild4ShortName\n END,\n posMaster.posMasterNo\n ) AS posNo,\n posMaster.isDirector AS isDirector,\n posLevel.posLevelName AS posLevel,\n posType.posTypeName AS posType,\n posExecutive.posExecutiveName AS posExecutiveName,\n orgRoot.isDeputy AS isDeputy,\n orgChild1.isOfficer AS isOfficer,\n posMaster.orgRevisionId AS orgRevisionId,\n posMaster.orgRootId AS orgRootId,\n posMaster.orgChild1Id AS orgChild1Id,\n posMaster.orgChild2Id AS orgChild2Id,\n posMaster.orgChild3Id AS orgChild3Id,\n posMaster.orgChild4Id AS orgChild4Id,\n CONCAT(posMaster.id, profile.id) AS `key`,\n (\n SELECT actFullNameId \n FROM view_director_acting AS acting\n WHERE acting.Id = posMaster.current_holderId \n AND acting.orgRootId = posMaster.orgRootId \n AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL)\n AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL)\n AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL)\n AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL)\n LIMIT 1\n ) AS actFullNameId,\n (\n SELECT actFullName \n FROM view_director_acting AS acting\n WHERE acting.Id = posMaster.current_holderId \n AND acting.orgRootId = posMaster.orgRootId \n AND (acting.orgChild1Id = posMaster.orgChild1Id OR acting.orgChild1Id IS NULL)\n AND (acting.orgChild2Id = posMaster.orgChild2Id OR acting.orgChild2Id IS NULL)\n AND (acting.orgChild3Id = posMaster.orgChild3Id OR acting.orgChild3Id IS NULL)\n AND (acting.orgChild4Id = posMaster.orgChild4Id OR acting.orgChild4Id IS NULL)\n LIMIT 1\n ) AS actFullName\n FROM\n posMaster\n JOIN profile ON posMaster.current_holderId = profile.id\n LEFT JOIN orgRoot ON posMaster.orgRootId = orgRoot.id\n LEFT JOIN orgChild1 ON posMaster.orgChild1Id = orgChild1.id\n LEFT JOIN orgChild2 ON posMaster.orgChild2Id = orgChild2.id\n LEFT JOIN orgChild3 ON posMaster.orgChild3Id = orgChild3.id\n LEFT JOIN orgChild4 ON posMaster.orgChild4Id = orgChild4.id\n JOIN posLevel ON profile.posLevelId = posLevel.id\n JOIN posType ON profile.posTypeId = posType.id\n LEFT JOIN position ON posMaster.id = position.posMasterId\n LEFT JOIN posExecutive ON position.posExecutiveId = posExecutive.id\n INNER JOIN orgRevision ON posMaster.orgRevisionId = orgRevision.id\n WHERE\n (position.positionIsSelected = TRUE)\n AND (orgRevision.orgRevisionIsCurrent = TRUE\n AND orgRevision.orgRevisionIsDraft = FALSE)"]); + } + +} From 13ed3450ddfbad17a52bf2d095aecf364d157ef1 Mon Sep 17 00:00:00 2001 From: Adisak Date: Fri, 7 Nov 2025 13:57:03 +0700 Subject: [PATCH 25/26] #208 and update migration --- src/controllers/ProfileController.ts | 12 +++++++----- src/entities/view/viewDirector.ts | 2 ++ ...1-update_viewDirectior_and_viewDirectiorActing.ts | 2 ++ 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 7a114b6e..e907d801 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -2886,8 +2886,8 @@ export class ProfileController extends Controller { } else if ((posMaster?.current_holder?.posLevel?.posLevelAuthority ?? null) == "GOVERNOR") { return new HttpSuccess({ data: [], total: 0 }); } - console.log(posMaster); - console.log(posMaster.id); + // console.log(posMaster); + // console.log(posMaster.id); let condition: any = { orgRootId: posMaster.orgRootId, id: Not(posMaster.current_holderId || ""), @@ -2917,9 +2917,9 @@ export class ProfileController extends Controller { condition.isDirector = true; conditionNow.isDirector = true; } - console.log(condition); - console.log("------------------"); - console.log(conditionNow); + // console.log(condition); + // console.log("------------------"); + // console.log(conditionNow); if (body.isAct == true) { const [lists, total] = await AppDataSource.getRepository(viewDirectorActing) .createQueryBuilder("viewDirectorActing") @@ -2928,6 +2928,7 @@ export class ProfileController extends Controller { qb.orWhere(condition).orWhere(conditionNow); }), ) + .andWhere("viewDirectorActing.isProbation = :isProbation", { isProbation: false }) .andWhere( new Brackets((qb) => { qb.orWhere( @@ -2992,6 +2993,7 @@ export class ProfileController extends Controller { qb.orWhere(condition).orWhere(conditionNow); }), ) + .andWhere("viewDirectorActing.isProbation = :isProbation", { isProbation: false }) .andWhere( new Brackets((qb) => { qb.orWhere( diff --git a/src/entities/view/viewDirector.ts b/src/entities/view/viewDirector.ts index d2ed5b65..717265e2 100644 --- a/src/entities/view/viewDirector.ts +++ b/src/entities/view/viewDirector.ts @@ -8,6 +8,8 @@ import { ViewColumn, ViewEntity } from "typeorm"; profile.lastName AS lastName, profile.citizenId AS citizenId, profile.position AS position, + profile.keycloak AS keycloakId, + profile.isProbation AS isProbation, CONCAT( CASE WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName diff --git a/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts b/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts index 26c26b8f..f3db9b44 100644 --- a/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts +++ b/src/migration/1762489522691-update_viewDirectior_and_viewDirectiorActing.ts @@ -73,6 +73,8 @@ export class UpdateViewDirectiorAndViewDirectiorActing1762489522691 implements M profile.lastName AS lastName, profile.citizenId AS citizenId, profile.position AS position, + profile.keycloak AS keycloakId, + profile.isProbation AS isProbation, CONCAT( CASE WHEN posMaster.orgChild1Id IS NULL THEN orgRoot.orgRootShortName From 7739af7d44ed4f36d43e0e4296b6cba475193caf Mon Sep 17 00:00:00 2001 From: Adisak Date: Fri, 7 Nov 2025 14:04:09 +0700 Subject: [PATCH 26/26] fix --- src/controllers/ProfileController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index e907d801..57d618c6 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -2993,7 +2993,7 @@ export class ProfileController extends Controller { qb.orWhere(condition).orWhere(conditionNow); }), ) - .andWhere("viewDirectorActing.isProbation = :isProbation", { isProbation: false }) + .andWhere("viewDirector.isProbation = :isProbation", { isProbation: false }) .andWhere( new Brackets((qb) => { qb.orWhere(