From f6089472ba4c005544931b0be175ba6bb44ca4a7 Mon Sep 17 00:00:00 2001 From: kittapath Date: Fri, 20 Dec 2024 10:03:23 +0700 Subject: [PATCH 1/5] edit log --- src/middlewares/logs.ts | 59 ++++++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 15 deletions(-) diff --git a/src/middlewares/logs.ts b/src/middlewares/logs.ts index b1d83ba4..1a4e00cb 100644 --- a/src/middlewares/logs.ts +++ b/src/middlewares/logs.ts @@ -1,6 +1,9 @@ import { NextFunction, Request, Response } from "express"; import { Client } from "@elastic/elasticsearch"; -import permission from "../interfaces/permission"; +import { AppDataSource } from "../database/data-source"; +import { PosMaster } from "../entities/PosMaster"; +import { OrgRevision } from "../entities/OrgRevision"; +import { Profile } from "../entities/Profile"; if (!process.env.ELASTICSEARCH_INDEX) { throw new Error("Require ELASTICSEARCH_INDEX to store log."); @@ -19,48 +22,74 @@ const LOG_LEVEL_MAP: Record = { const elasticsearch = new Client({ node: `${process.env.ELASTICSEARCH_PROTOCOL}://${process.env.ELASTICSEARCH_HOST}:${process.env.ELASTICSEARCH_PORT}`, }); + async function logMiddleware(req: Request, res: Response, next: NextFunction) { if (!req.url.startsWith("/api/")) return next(); let data: any; + const repoPosmaster = AppDataSource.getRepository(PosMaster); + const repoProfile = AppDataSource.getRepository(Profile); + const repoRevision = AppDataSource.getRepository(OrgRevision); + const originalJson = res.json; res.json = function (v: any) { data = v; return originalJson.call(this, v); }; - const timestamp = new Date().toISOString(); const start = performance.now(); req.app.locals.logData = {}; + const revision = await repoRevision.findOne({ + where: { + orgRevisionIsCurrent: true, + orgRevisionIsDraft: false, + }, + }); + res.on("finish", async () => { try { if (!req.url.startsWith("/api/")) return; + let system = "organization"; + if (req.url.startsWith("/api/v1/org/keycloak/log/sso")) system = "inout"; + if (req.url.startsWith("/api/v1/org/metadata/")) system = "master"; + if (req.url.startsWith("/api/v1/org/pos/position/")) system = "master"; + if (req.url.startsWith("/api/v1/org/pos/type/")) system = "master"; + if (req.url.startsWith("/api/v1/org/employee/pos/position/")) system = "master"; + if (req.url.startsWith("/api/v1/org/employee/pos/type/")) system = "master"; + if (req.url.startsWith("/api/v1/org/auth/authRoleAttr/")) system = "admin"; + if (req.url.startsWith("/api/v1/org/auth/authRole/")) system = "admin"; + // if (req.url.startsWith("/api/v1/org/keycloak")) system = "admin"; + if (req.url.startsWith("/api/v1/org/pos/admin/master/list")) system = "admin"; + if (req.url.startsWith("/api/v1/org/super-admin/{id}")) system = "admin"; + if (req.url.startsWith("/api/v1/org/permission-org/")) system = "admin"; + if (req.url.startsWith("/api/v1/org/pos/assign/")) system = "admin"; + if (req.url.startsWith("/api/v1/org/profile/")) system = "registry"; + if (req.url.startsWith("/api/v1/org/profile-employee/")) system = "registry"; + if (req.url.startsWith("/api/v1/org/profile-temp/")) system = "registry"; const level = LOG_LEVEL_MAP[process.env.LOG_LEVEL ?? "debug"] || 4; + const profileByKeycloak = await repoProfile.findOne({ + where: { keycloak: req.app.locals.logData.userId }, + }); + const rootId = await repoPosmaster.findOne({ + where: { + current_holderId: profileByKeycloak?.id, + orgRevisionId: revision?.id, + }, + select: ["orgRootId"], + }); if (level === 1 && res.statusCode < 500) return; if (level === 2 && res.statusCode < 400) return; if (level === 3 && res.statusCode < 200) return; - - const token = req.headers["authorization"]; - let rootId = null; - - try { - rootId = token - ? await new permission().checkOrg(token, req.app.locals.logData.userId) - : null; - } catch (err) { - console.warn("Error fetching rootId:", err); - } - const obj = { logType: res.statusCode >= 500 ? "error" : res.statusCode >= 400 ? "warning" : "info", ip: req.ip, rootId: rootId?.orgRootId ?? null, - systemName: "evaluation", + systemName: system, startTimeStamp: timestamp, endTimeStamp: new Date().toISOString(), processTime: performance.now() - start, From be2b1fa161b9218e0d7a4ee3dcf8abc6aa3e4d43 Mon Sep 17 00:00:00 2001 From: kittapath Date: Fri, 20 Dec 2024 11:11:40 +0700 Subject: [PATCH 2/5] =?UTF-8?q?=E0=B8=AD=E0=B8=AD=E0=B8=81=E0=B8=84?= =?UTF-8?q?=E0=B8=B3=E0=B8=AA=E0=B8=B1=E0=B9=88=E0=B8=87=E0=B8=A5=E0=B8=B9?= =?UTF-8?q?=E0=B8=81=E0=B8=88=E0=B9=89=E0=B8=B2=E0=B8=87=E0=B8=A7=E0=B8=B4?= =?UTF-8?q?=E0=B8=99=E0=B8=B1=E0=B8=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/CommandController.ts | 214 ++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 8 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index fa177ea3..ae303916 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -1251,19 +1251,23 @@ export class CommandController extends Controller { client_secret: process.env.AUTH_ACCOUNT_SECRET, grant_type: "client_credentials", }; - + const postData = querystring.stringify(body); - + // get admin token - const response = await axios.post(`${process.env.KC_URL}/realms/${process.env.KC_REALM}/protocol/openid-connect/token`, postData, { - headers: { - "Content-Type": "application/x-www-form-urlencoded", - api_key: process.env.API_KEY, + const response = await axios.post( + `${process.env.KC_URL}/realms/${process.env.KC_REALM}/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; - + command.forEach(async (x) => { const path = commandTypePath(x.commandType.code); if (path == null) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบประเภทคำสั่งนี้ในระบบ"); @@ -2746,6 +2750,200 @@ export class CommandController extends Controller { return new HttpSuccess(); } + @Post("excexute/salary-employee-leave-discipline") + public async newSalaryEmployeeAndUpdateLeaveDiscipline( + @Request() req: RequestWithUser, + @Body() + body: { + data: { + profileId: string; + date?: Date | null; + refCommandNo?: string | null; + salaryRef?: string | null; + isLeave: boolean | null; + leaveReason?: string | null; + dateLeave?: Date | null; + refCommandDate?: Date | null; + detail?: string | null; + level?: string | null; + unStigma?: string | null; + commandId?: string | null; + amount?: Double | null; + positionSalaryAmount?: Double | null; + mouthSalaryAmount?: Double | null; + isGovernment?: boolean | null; + }[]; + }, + ) { + await Promise.all( + body.data.map(async (item) => { + const profile = await this.profileEmployeeRepository.findOne({ + relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + where: { id: item.profileId }, + order: { + profileSalary: { + order: "DESC", + }, + }, + }); + if (!profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); + } + const orgRevision = await this.orgRevisionRepo.findOne({ + where: { + orgRevisionIsCurrent: true, + orgRevisionIsDraft: false, + }, + }); + const shortName = + !profile.current_holders || profile.current_holders.length == 0 + ? null + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild4 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild4.orgChild4ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild3 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild3.orgChild3ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild2 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild2.orgChild2ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild1 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild1.orgChild1ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgRoot != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgRoot.orgRootShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : null; + // let position = + // profile.current_holders + // .filter((x) => x.orgRevisionId == orgRevision?.id)[0] + // ?.positions?.filter((pos) => pos.positionIsSelected === true)[0] ?? null; + // ประวัติตำแหน่ง + const data = new ProfileSalary(); + const meta = { + profileEmployeeId: profile.id, + commandId: item.commandId, + date: item.date, + refCommandNo: item.refCommandNo, + templateDoc: item.salaryRef, + position: profile.position, + positionType: profile.posType.posTypeName, + positionLevel: profile.posLevel.posLevelName, + posNo: shortName ? shortName : "-", + // positionLine: position?.positionField ?? "-", + // positionPathSide: position?.positionArea ?? "-", + // positionExecutive: position?.posExecutive?.posExecutiveName ?? "-", + amount: item.amount ? item.amount : null, + positionSalaryAmount: item.positionSalaryAmount ? item.positionSalaryAmount : null, + mouthSalaryAmount: item.mouthSalaryAmount ? item.mouthSalaryAmount : null, + order: + profile.profileSalary.length >= 0 + ? profile.profileSalary.length > 0 + ? profile.profileSalary[0].order + 1 + : 1 + : null, + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + dateGovernment: new Date(), + isGovernment: item.isGovernment, + }; + + Object.assign(data, meta); + const history = new ProfileSalaryHistory(); + Object.assign(history, { ...data, id: undefined }); + + await this.salaryRepo.save(data); + history.profileSalaryId = data.id; + await this.salaryHistoryRepo.save(history); + + // ประวัติวินัย + const dataDis = new ProfileDiscipline(); + + const metaDis = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + }; + + Object.assign(dataDis, { + ...body, + ...metaDis, + profileEmployeeId: item.profileId, + profileId: undefined, + }); + const historyDis = new ProfileDisciplineHistory(); + Object.assign(historyDis, { ...dataDis, id: undefined }); + + await this.disciplineRepository.save(dataDis); + historyDis.profileDisciplineId = dataDis.id; + await this.disciplineHistoryRepository.save(historyDis); + + // ทะเบียนประวัติ + if (item.isLeave != null) { + const _profile = await this.profileEmployeeRepository.findOne({ + where: { id: item.profileId }, + }); + if (!_profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); + } + const _null: any = null; + _profile.isLeave = item.isLeave; + _profile.leaveReason = item.leaveReason ?? _null; + _profile.dateLeave = item.dateLeave ?? _null; + _profile.lastUpdateUserId = req.user.sub; + _profile.lastUpdateFullName = req.user.name; + _profile.lastUpdatedAt = new Date(); + const exceptClear = await checkExceptCommandType(String(item.commandId)); + if (item.isLeave == true && !exceptClear) { + await removeProfileInOrganize(_profile.id, "EMPLOYEE"); + } + //คำสั่งพักราชการ หรือ ให้ออกจากราชการไว้ก่อน solutionเดิม ให้ disable user ไว้แต่ยังไม่ลบ เปลี่ยนเป็นลบ user ออกเลย + else if (item.isLeave == true && exceptClear && _profile.keycloak != null) { + // const enableActive = await enableStatus(_profile.keycloak, false); + // if (!enableActive) throw new Error("Failed. Cannot change enable status."); + const delUserKeycloak = await deleteUser(_profile.keycloak); + if (delUserKeycloak) { + _profile.keycloak = _null; + _profile.roleKeycloaks = []; + _profile.isActive = false; + } + } + const clearProfile = await checkCommandType(String(item.commandId)); + if (clearProfile) { + if (_profile.keycloak != null) { + const delUserKeycloak = await deleteUser(_profile.keycloak); + if (delUserKeycloak) { + _profile.keycloak = _null; + _profile.roleKeycloaks = []; + _profile.isActive = false; + } + } + _profile.position = _null; + _profile.posTypeId = _null; + _profile.posLevelId = _null; + } + await this.profileEmployeeRepository.save(_profile); + } + }), + ); + + return new HttpSuccess(); + } + @Post("excexute/salary-probation") public async newSalaryAndUpdateLeaveDisciplinefgh( @Request() req: RequestWithUser, From 84ebb4a11b2dda11bb0026fd84bb835627da40b4 Mon Sep 17 00:00:00 2001 From: Bright Date: Fri, 20 Dec 2024 11:52:34 +0700 Subject: [PATCH 3/5] =?UTF-8?q?fix=20=E0=B8=A3=E0=B8=B2=E0=B8=A2=E0=B8=81?= =?UTF-8?q?=E0=B8=B2=E0=B8=A3=E0=B8=A5=E0=B8=B2=E0=B8=AD=E0=B8=AD=E0=B8=81?= =?UTF-8?q?=E0=B8=A5=E0=B8=B9=E0=B8=81=E0=B8=88=E0=B9=89=E0=B8=B2=E0=B8=87?= =?UTF-8?q?=E0=B8=82=E0=B9=89=E0=B8=AD=E0=B8=A1=E0=B8=B9=E0=B8=A5=E0=B9=80?= =?UTF-8?q?=E0=B8=87=E0=B8=B4=E0=B8=99=E0=B9=80=E0=B8=94=E0=B8=B7=E0=B8=AD?= =?UTF-8?q?=E0=B8=99=E0=B9=84=E0=B8=A1=E0=B9=88=E0=B9=81=E0=B8=AA=E0=B8=94?= =?UTF-8?q?=E0=B8=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/CommandController.ts | 2 ++ src/controllers/ProfileController.ts | 1 + src/controllers/ProfileDevelopmentController.ts | 2 +- src/controllers/ProfileEmployeeController.ts | 3 ++- src/controllers/ProfileEmployeeTempController.ts | 3 ++- 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index ae303916..614051e8 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -1734,12 +1734,14 @@ export class CommandController extends Controller { }); } commandRecive.amount = salaryData ? salaryData.amount : null_; + commandRecive.amountSpecial = salaryData ? salaryData.amountSpecial : null_; commandRecive.positionSalaryAmount = salaryData ? salaryData.positionSalaryAmount : null_; commandRecive.mouthSalaryAmount = salaryData ? salaryData.mouthSalaryAmount : null_; } else { commandRecive.amount = null_; + commandRecive.amountSpecial = null_; commandRecive.positionSalaryAmount = null_; commandRecive.mouthSalaryAmount = null_; } diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index ed5a1e4b..be236f11 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -4863,6 +4863,7 @@ export class ProfileController extends Controller { node: null, nodeId: null, salary: profile ? profile.amount : null, + amountSpecial: profile ? profile.amountSpecial : null }; if (_profile.child4Id != null) { diff --git a/src/controllers/ProfileDevelopmentController.ts b/src/controllers/ProfileDevelopmentController.ts index b9017db8..1d9149dd 100644 --- a/src/controllers/ProfileDevelopmentController.ts +++ b/src/controllers/ProfileDevelopmentController.ts @@ -172,7 +172,7 @@ export class ProfileDevelopmentController extends Controller { summary: null, point: null, name: data.name, - achievement10: "มีผลการพัฒนาและมีการดำเนินการตามเป้าหมายการนำไปพัฒนางาน1", + achievement10: "มีผลการพัฒนาและมีการดำเนินการตามเป้าหมายการนำไปพัฒนางาน", achievement5: "มีผลการพัฒนาแต่ยังไม่ได้ดำเนินการตามเป้าหมายการนำไปพัฒนางาน", achievement0: "ไม่ได้ดำเนินการพัฒนา", isDevelopment70: data.isDevelopment70, diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index d9d2f070..dff5fe59 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -2064,7 +2064,8 @@ export class ProfileEmployeeController extends Controller { child4ShortName: child4 == null ? null : child4.orgChild4ShortName, node: null, nodeId: null, - salary: profile.amount, + salary: profile ? profile.amount : null, + amountSpecial: profile ? profile.amountSpecial : null }; return new HttpSuccess(_profile); } diff --git a/src/controllers/ProfileEmployeeTempController.ts b/src/controllers/ProfileEmployeeTempController.ts index addb4af8..52bed431 100644 --- a/src/controllers/ProfileEmployeeTempController.ts +++ b/src/controllers/ProfileEmployeeTempController.ts @@ -1866,7 +1866,8 @@ export class ProfileEmployeeTempController extends Controller { ? null : profile.current_holders.find((x) => x.orgRevisionId == orgRevisionPublish.id)?.orgChild4 .orgChild4Name, - salary: profile.amount, + salary: profile ? profile.amount : null, + amountSpecial: profile ? profile.amountSpecial : null }; return new HttpSuccess(_profile); } From 9eac546f55cd007430a39527f52e951d510b7c24 Mon Sep 17 00:00:00 2001 From: kittapath Date: Fri, 20 Dec 2024 12:00:55 +0700 Subject: [PATCH 4/5] =?UTF-8?q?=E0=B9=81=E0=B8=81=E0=B9=89=20=E0=B8=AD?= =?UTF-8?q?=E0=B8=AD=E0=B8=81=E0=B8=84=E0=B8=B3=E0=B8=AA=E0=B8=B1=E0=B9=88?= =?UTF-8?q?=E0=B8=87=E0=B8=A7=E0=B8=B4=E0=B8=99=E0=B8=B1=E0=B8=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/CommandController.ts | 423 +++++++++++++++++++-------- 1 file changed, 295 insertions(+), 128 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index ae303916..c65c39f8 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -2568,6 +2568,7 @@ export class CommandController extends Controller { body: { data: { profileId: string; + profileType?: string | null; date?: Date | null; refCommandNo?: string | null; salaryRef?: string | null; @@ -2588,149 +2589,141 @@ export class CommandController extends Controller { ) { await Promise.all( body.data.map(async (item) => { - const profile = await this.profileRepository.findOne({ - relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], - where: { id: item.profileId }, - order: { - profileSalary: { - order: "DESC", + if (item.profileType && item.profileType.trim().toUpperCase() == "OFFICER") { + const profile = await this.profileRepository.findOne({ + relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + where: { id: item.profileId }, + order: { + profileSalary: { + order: "DESC", + }, }, - }, - }); - if (!profile) { - throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); - } - const orgRevision = await this.orgRevisionRepo.findOne({ - where: { - orgRevisionIsCurrent: true, - orgRevisionIsDraft: false, - }, - }); - const shortName = - !profile.current_holders || profile.current_holders.length == 0 - ? null - : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && - profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) - ?.orgChild4 != null - ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild4.orgChild4ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + }); + if (!profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); + } + const orgRevision = await this.orgRevisionRepo.findOne({ + where: { + orgRevisionIsCurrent: true, + orgRevisionIsDraft: false, + }, + }); + const shortName = + !profile.current_holders || profile.current_holders.length == 0 + ? null : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) - ?.orgChild3 != null - ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild3.orgChild3ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + ?.orgChild4 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild4.orgChild4ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) - ?.orgChild2 != null - ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild2.orgChild2ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + ?.orgChild3 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild3.orgChild3ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) - ?.orgChild1 != null - ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild1.orgChild1ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + ?.orgChild2 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild2.orgChild2ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) - ?.orgRoot != null - ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgRoot.orgRootShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` - : null; - let position = - profile.current_holders - .filter((x) => x.orgRevisionId == orgRevision?.id)[0] - ?.positions?.filter((pos) => pos.positionIsSelected === true)[0] ?? null; - // ประวัติตำแหน่ง - const data = new ProfileSalary(); - const meta = { - profileId: profile.id, - commandId: item.commandId, - date: item.date, - refCommandNo: item.refCommandNo, - templateDoc: item.salaryRef, - position: profile.position, - positionType: profile.posType.posTypeName, - positionLevel: profile.posLevel.posLevelName, - posNo: shortName ? shortName : "-", - positionLine: position?.positionField ?? "-", - positionPathSide: position?.positionArea ?? "-", - positionExecutive: position?.posExecutive?.posExecutiveName ?? "-", - amount: item.amount ? item.amount : null, - positionSalaryAmount: item.positionSalaryAmount ? item.positionSalaryAmount : null, - mouthSalaryAmount: item.mouthSalaryAmount ? item.mouthSalaryAmount : null, - order: - profile.profileSalary.length >= 0 - ? profile.profileSalary.length > 0 - ? profile.profileSalary[0].order + 1 - : 1 - : null, - createdUserId: req.user.sub, - createdFullName: req.user.name, - lastUpdateUserId: req.user.sub, - lastUpdateFullName: req.user.name, - createdAt: new Date(), - lastUpdatedAt: new Date(), - dateGovernment: new Date(), - isGovernment: item.isGovernment, - }; + ?.orgChild1 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild1.orgChild1ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgRoot != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgRoot.orgRootShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : null; + let position = + profile.current_holders + .filter((x) => x.orgRevisionId == orgRevision?.id)[0] + ?.positions?.filter((pos) => pos.positionIsSelected === true)[0] ?? null; + // ประวัติตำแหน่ง + const data = new ProfileSalary(); + const meta = { + profileId: profile.id, + commandId: item.commandId, + date: item.date, + refCommandNo: item.refCommandNo, + templateDoc: item.salaryRef, + position: profile.position, + positionType: profile.posType.posTypeName, + positionLevel: profile.posLevel.posLevelName, + posNo: shortName ? shortName : "-", + positionLine: position?.positionField ?? "-", + positionPathSide: position?.positionArea ?? "-", + positionExecutive: position?.posExecutive?.posExecutiveName ?? "-", + amount: item.amount ? item.amount : null, + positionSalaryAmount: item.positionSalaryAmount ? item.positionSalaryAmount : null, + mouthSalaryAmount: item.mouthSalaryAmount ? item.mouthSalaryAmount : null, + order: + profile.profileSalary.length >= 0 + ? profile.profileSalary.length > 0 + ? profile.profileSalary[0].order + 1 + : 1 + : null, + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + dateGovernment: new Date(), + isGovernment: item.isGovernment, + }; - Object.assign(data, meta); - const history = new ProfileSalaryHistory(); - Object.assign(history, { ...data, id: undefined }); + Object.assign(data, meta); + const history = new ProfileSalaryHistory(); + Object.assign(history, { ...data, id: undefined }); - await this.salaryRepo.save(data); - history.profileSalaryId = data.id; - await this.salaryHistoryRepo.save(history); + await this.salaryRepo.save(data); + history.profileSalaryId = data.id; + await this.salaryHistoryRepo.save(history); - // ประวัติวินัย - const dataDis = new ProfileDiscipline(); + // ประวัติวินัย + const dataDis = new ProfileDiscipline(); - const metaDis = { - createdUserId: req.user.sub, - createdFullName: req.user.name, - lastUpdateUserId: req.user.sub, - lastUpdateFullName: req.user.name, - createdAt: new Date(), - lastUpdatedAt: new Date(), - }; + const metaDis = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + }; - Object.assign(dataDis, { ...body, ...metaDis }); - const historyDis = new ProfileDisciplineHistory(); - Object.assign(historyDis, { ...dataDis, id: undefined }); + Object.assign(dataDis, { ...body, ...metaDis }); + const historyDis = new ProfileDisciplineHistory(); + Object.assign(historyDis, { ...dataDis, id: undefined }); - await this.disciplineRepository.save(dataDis); - historyDis.profileDisciplineId = dataDis.id; - await this.disciplineHistoryRepository.save(historyDis); + await this.disciplineRepository.save(dataDis); + historyDis.profileDisciplineId = dataDis.id; + await this.disciplineHistoryRepository.save(historyDis); - // ทะเบียนประวัติ - if (item.isLeave != null) { - const _profile = await this.profileRepository.findOne({ - where: { id: item.profileId }, - }); - if (!_profile) { - throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); - } - const _null: any = null; - _profile.isLeave = item.isLeave; - _profile.leaveReason = item.leaveReason ?? _null; - _profile.dateLeave = item.dateLeave ?? _null; - _profile.lastUpdateUserId = req.user.sub; - _profile.lastUpdateFullName = req.user.name; - _profile.lastUpdatedAt = new Date(); - const exceptClear = await checkExceptCommandType(String(item.commandId)); - if (item.isLeave == true && !exceptClear) { - await removeProfileInOrganize(_profile.id, "OFFICER"); - } - //คำสั่งพักราชการ หรือ ให้ออกจากราชการไว้ก่อน solutionเดิม ให้ disable user ไว้แต่ยังไม่ลบ เปลี่ยนเป็นลบ user ออกเลย - else if (item.isLeave == true && exceptClear && _profile.keycloak != null) { - // const enableActive = await enableStatus(_profile.keycloak, false); - // if (!enableActive) throw new Error("Failed. Cannot change enable status."); - const delUserKeycloak = await deleteUser(_profile.keycloak); - if (delUserKeycloak) { - _profile.keycloak = _null; - _profile.roleKeycloaks = []; - _profile.isActive = false; + // ทะเบียนประวัติ + if (item.isLeave != null) { + const _profile = await this.profileRepository.findOne({ + where: { id: item.profileId }, + }); + if (!_profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); } - } - const clearProfile = await checkCommandType(String(item.commandId)); - if (clearProfile) { - if (_profile.keycloak != null) { + const _null: any = null; + _profile.isLeave = item.isLeave; + _profile.leaveReason = item.leaveReason ?? _null; + _profile.dateLeave = item.dateLeave ?? _null; + _profile.lastUpdateUserId = req.user.sub; + _profile.lastUpdateFullName = req.user.name; + _profile.lastUpdatedAt = new Date(); + const exceptClear = await checkExceptCommandType(String(item.commandId)); + if (item.isLeave == true && !exceptClear) { + await removeProfileInOrganize(_profile.id, "OFFICER"); + } + //คำสั่งพักราชการ หรือ ให้ออกจากราชการไว้ก่อน solutionเดิม ให้ disable user ไว้แต่ยังไม่ลบ เปลี่ยนเป็นลบ user ออกเลย + else if (item.isLeave == true && exceptClear && _profile.keycloak != null) { + // const enableActive = await enableStatus(_profile.keycloak, false); + // if (!enableActive) throw new Error("Failed. Cannot change enable status."); const delUserKeycloak = await deleteUser(_profile.keycloak); if (delUserKeycloak) { _profile.keycloak = _null; @@ -2738,11 +2731,185 @@ export class CommandController extends Controller { _profile.isActive = false; } } - _profile.position = _null; - _profile.posTypeId = _null; - _profile.posLevelId = _null; + const clearProfile = await checkCommandType(String(item.commandId)); + if (clearProfile) { + if (_profile.keycloak != null) { + const delUserKeycloak = await deleteUser(_profile.keycloak); + if (delUserKeycloak) { + _profile.keycloak = _null; + _profile.roleKeycloaks = []; + _profile.isActive = false; + } + } + _profile.position = _null; + _profile.posTypeId = _null; + _profile.posLevelId = _null; + } + await this.profileRepository.save(_profile); + } + } else { + const profile = await this.profileEmployeeRepository.findOne({ + relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + where: { id: item.profileId }, + order: { + profileSalary: { + order: "DESC", + }, + }, + }); + if (!profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); + } + const orgRevision = await this.orgRevisionRepo.findOne({ + where: { + orgRevisionIsCurrent: true, + orgRevisionIsDraft: false, + }, + }); + const shortName = + !profile.current_holders || profile.current_holders.length == 0 + ? null + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild4 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild4.orgChild4ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild3 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild3.orgChild3ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild2 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild2.orgChild2ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgChild1 != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgChild1.orgChild1ShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) != + null && + profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id) + ?.orgRoot != null + ? `${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.orgRoot.orgRootShortName}${profile.current_holders.find((x) => x.orgRevisionId == orgRevision?.id)?.posMasterNo}` + : null; + // let position = + // profile.current_holders + // .filter((x) => x.orgRevisionId == orgRevision?.id)[0] + // ?.positions?.filter((pos) => pos.positionIsSelected === true)[0] ?? null; + // ประวัติตำแหน่ง + const data = new ProfileSalary(); + const meta = { + profileEmployeeId: profile.id, + commandId: item.commandId, + date: item.date, + refCommandNo: item.refCommandNo, + templateDoc: item.salaryRef, + position: profile.position, + positionType: profile.posType.posTypeName, + positionLevel: profile.posLevel.posLevelName, + posNo: shortName ? shortName : "-", + // positionLine: position?.positionField ?? "-", + // positionPathSide: position?.positionArea ?? "-", + // positionExecutive: position?.posExecutive?.posExecutiveName ?? "-", + amount: item.amount ? item.amount : null, + positionSalaryAmount: item.positionSalaryAmount ? item.positionSalaryAmount : null, + mouthSalaryAmount: item.mouthSalaryAmount ? item.mouthSalaryAmount : null, + order: + profile.profileSalary.length >= 0 + ? profile.profileSalary.length > 0 + ? profile.profileSalary[0].order + 1 + : 1 + : null, + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + dateGovernment: new Date(), + isGovernment: item.isGovernment, + }; + + Object.assign(data, meta); + const history = new ProfileSalaryHistory(); + Object.assign(history, { ...data, id: undefined }); + + await this.salaryRepo.save(data); + history.profileSalaryId = data.id; + await this.salaryHistoryRepo.save(history); + + // ประวัติวินัย + const dataDis = new ProfileDiscipline(); + + const metaDis = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + createdAt: new Date(), + lastUpdatedAt: new Date(), + }; + + Object.assign(dataDis, { + ...body, + ...metaDis, + profileEmployeeId: item.profileId, + profileId: undefined, + }); + const historyDis = new ProfileDisciplineHistory(); + Object.assign(historyDis, { ...dataDis, id: undefined }); + + await this.disciplineRepository.save(dataDis); + historyDis.profileDisciplineId = dataDis.id; + await this.disciplineHistoryRepository.save(historyDis); + + // ทะเบียนประวัติ + if (item.isLeave != null) { + const _profile = await this.profileEmployeeRepository.findOne({ + where: { id: item.profileId }, + }); + if (!_profile) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); + } + const _null: any = null; + _profile.isLeave = item.isLeave; + _profile.leaveReason = item.leaveReason ?? _null; + _profile.dateLeave = item.dateLeave ?? _null; + _profile.lastUpdateUserId = req.user.sub; + _profile.lastUpdateFullName = req.user.name; + _profile.lastUpdatedAt = new Date(); + const exceptClear = await checkExceptCommandType(String(item.commandId)); + if (item.isLeave == true && !exceptClear) { + await removeProfileInOrganize(_profile.id, "EMPLOYEE"); + } + //คำสั่งพักราชการ หรือ ให้ออกจากราชการไว้ก่อน solutionเดิม ให้ disable user ไว้แต่ยังไม่ลบ เปลี่ยนเป็นลบ user ออกเลย + else if (item.isLeave == true && exceptClear && _profile.keycloak != null) { + // const enableActive = await enableStatus(_profile.keycloak, false); + // if (!enableActive) throw new Error("Failed. Cannot change enable status."); + const delUserKeycloak = await deleteUser(_profile.keycloak); + if (delUserKeycloak) { + _profile.keycloak = _null; + _profile.roleKeycloaks = []; + _profile.isActive = false; + } + } + const clearProfile = await checkCommandType(String(item.commandId)); + if (clearProfile) { + if (_profile.keycloak != null) { + const delUserKeycloak = await deleteUser(_profile.keycloak); + if (delUserKeycloak) { + _profile.keycloak = _null; + _profile.roleKeycloaks = []; + _profile.isActive = false; + } + } + _profile.position = _null; + _profile.posTypeId = _null; + _profile.posLevelId = _null; + } + await this.profileEmployeeRepository.save(_profile); } - await this.profileRepository.save(_profile); } }), ); From 8ddef76726b9a716b95f6a03e3f694ac31f07ab5 Mon Sep 17 00:00:00 2001 From: kittapath Date: Fri, 20 Dec 2024 12:15:04 +0700 Subject: [PATCH 5/5] add relation child command --- src/controllers/CommandController.ts | 44 ++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 7022d310..88051bbc 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -2593,7 +2593,18 @@ export class CommandController extends Controller { body.data.map(async (item) => { if (item.profileType && item.profileType.trim().toUpperCase() == "OFFICER") { const profile = await this.profileRepository.findOne({ - relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + relations: [ + "profileSalary", + "posLevel", + "posType", + "current_holders", + "current_holders.orgRoot", + "current_holders.orgChild1", + "current_holders.orgChild2", + "current_holders.orgChild3", + "current_holders.orgChild4", + "roleKeycloaks", + ], where: { id: item.profileId }, order: { profileSalary: { @@ -2751,7 +2762,18 @@ export class CommandController extends Controller { } } else { const profile = await this.profileEmployeeRepository.findOne({ - relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + relations: [ + "profileSalary", + "posLevel", + "posType", + "current_holders", + "current_holders.orgRoot", + "current_holders.orgChild1", + "current_holders.orgChild2", + "current_holders.orgChild3", + "current_holders.orgChild4", + "roleKeycloaks", + ], where: { id: item.profileId }, order: { profileSalary: { @@ -2947,7 +2969,18 @@ export class CommandController extends Controller { await Promise.all( body.data.map(async (item) => { const profile = await this.profileEmployeeRepository.findOne({ - relations: ["profileSalary", "posLevel", "posType", "current_holders", "roleKeycloaks"], + relations: [ + "profileSalary", + "posLevel", + "posType", + "current_holders", + "current_holders.orgRoot", + "current_holders.orgChild1", + "current_holders.orgChild2", + "current_holders.orgChild3", + "current_holders.orgChild4", + "roleKeycloaks", + ], where: { id: item.profileId }, order: { profileSalary: { @@ -3275,6 +3308,11 @@ export class CommandController extends Controller { "posType", "posLevel", "current_holders", + "current_holders.orgRoot", + "current_holders.orgChild1", + "current_holders.orgChild2", + "current_holders.orgChild3", + "current_holders.orgChild4", "current_holders.positions", "current_holders.positions.posExecutive", ],