diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index b5e40dd4..a888eeff 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -3164,8 +3164,8 @@ export class CommandController extends Controller { posMaster.current_holderId = item.profileId; posMaster.lastUpdatedAt = new Date(); - posMaster.conditionReason = _null; - posMaster.isCondition = false; + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; if (posMasterOld != null) { await this.posMasterRepository.save(posMasterOld); await CreatePosMasterHistoryOfficer(posMasterOld.id, req); @@ -3555,7 +3555,7 @@ export class CommandController extends Controller { } }) if (curPosMaster && clearProfile.LeaveType != "RETIRE_OUT_EMP") { - await CreatePosMasterHistoryOfficer(curPosMaster.id, req); + await CreatePosMasterHistoryOfficer(curPosMaster.id, req, "DELETE"); } } @@ -3608,8 +3608,8 @@ export class CommandController extends Controller { } posMaster.current_holderId = profile.id; posMaster.lastUpdatedAt = new Date(); - posMaster.conditionReason = _null; - posMaster.isCondition = false; + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; await this.posMasterRepository.save(posMaster); const positionNew = await this.positionRepository.findOne({ where: { @@ -6067,8 +6067,8 @@ export class CommandController extends Controller { posMaster.current_holderId = profile.id; posMaster.lastUpdatedAt = new Date(); - posMaster.conditionReason = _null; - posMaster.isCondition = false; + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; if (posMasterOld != null) { await this.posMasterRepository.save(posMasterOld); await CreatePosMasterHistoryOfficer(posMasterOld.id, req); diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index 37663cc2..20511811 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -163,7 +163,7 @@ export class OrganizationController extends Controller { await sendToQueueOrgDraft(msg); return new HttpSuccess("Draft is being created... Processing in the background."); } catch (error: any) { - throw error; + throw error; } } @@ -3203,19 +3203,19 @@ export class OrganizationController extends Controller { try { // CheckQueueInProgress // console.log("🚀 ตรวจสอบว่ามีงานอยู่ในคิว"); - const [isBusyDraft, isBusyPublish] = await Promise.all([ - checkQueueInProgress(`${process.env.AMQ_QUEUE_ORG_DRAFT}`), - checkQueueInProgress(`${process.env.AMQ_QUEUE_ORG}`), - ]); - // console.log("✅ ตรวจสอบแล้ว Draft Busy:", isBusyDraft); - // console.log("✅ ตรวจสอบแล้ว Publish Busy:", isBusyPublish); - if (isBusyDraft || isBusyPublish) { - // console.log("🚫 พบว่ามีงานอยู่ในคิว — error") - throw new HttpError( - HttpStatusCode.CONFLICT, - "ไม่สามารถดำเนินการได้ หากกำลังเผยแพร่หรือสร้างแบบร่างโครงสร้างหน่วยงาน", - ); - } + const [isBusyDraft, isBusyPublish] = await Promise.all([ + checkQueueInProgress(`${process.env.AMQ_QUEUE_ORG_DRAFT}`), + checkQueueInProgress(`${process.env.AMQ_QUEUE_ORG}`), + ]); + // console.log("✅ ตรวจสอบแล้ว Draft Busy:", isBusyDraft); + // console.log("✅ ตรวจสอบแล้ว Publish Busy:", isBusyPublish); + if (isBusyDraft || isBusyPublish) { + // console.log("🚫 พบว่ามีงานอยู่ในคิว — error") + throw new HttpError( + HttpStatusCode.CONFLICT, + "ไม่สามารถดำเนินการได้ หากกำลังเผยแพร่หรือสร้างแบบร่างโครงสร้างหน่วยงาน", + ); + } const today = new Date(); today.setHours(0, 0, 0, 0); // Set time to the beginning of the day @@ -3252,7 +3252,7 @@ export class OrganizationController extends Controller { await sendToQueueOrg(msg); return new HttpSuccess(); } catch (error: any) { - throw error; + throw error; } } @@ -7723,17 +7723,18 @@ export class OrganizationController extends Controller { where: { orgRevision: { orgRevisionIsDraft: false, orgRevisionIsCurrent: true }, orgRoot: { isCommission: true }, + orgChild1Id: IsNull(), isDirector: true, current_holderId: Not(IsNull()), - posMasterActs: { statusReport: "DONE" }, - posMasterActChilds: { statusReport: "DONE" }, + // posMasterActs: { statusReport: "DONE" }, + // posMasterActChilds: { statusReport: "DONE" }, }, order: { posMasterOrder: "ASC", posMasterActChilds: { posMasterOrder: "ASC" } }, relations: [ "current_holder", - "posMasterActChilds", - "posMasterActChilds.posMasterChild", - "posMasterActChilds.posMasterChild.current_holder", + // "posMasterActChilds", + // "posMasterActChilds.posMasterChild", + // "posMasterActChilds.posMasterChild.current_holder", ], }); if (posMaster.length <= 0) { @@ -7743,6 +7744,23 @@ export class OrganizationController extends Controller { }); } if (posMaster[0].current_holder == null) { + const posMaster = await this.posMasterRepository.find({ + where: { + orgRevision: { orgRevisionIsDraft: false, orgRevisionIsCurrent: true }, + orgRoot: { isCommission: true }, + orgChild1Id: IsNull(), + isDirector: true, + posMasterActs: { statusReport: "DONE" }, + posMasterActChilds: { statusReport: "DONE" }, + }, + order: { posMasterOrder: "ASC", posMasterActChilds: { posMasterOrder: "ASC" } }, + relations: [ + "current_holder", + "posMasterActChilds", + "posMasterActChilds.posMasterChild", + "posMasterActChilds.posMasterChild.current_holder", + ], + }); if ( posMaster[0].posMasterActChilds.length <= 0 || posMaster[0].posMasterActChilds[0].posMasterChild == null || diff --git a/src/controllers/PositionController.ts b/src/controllers/PositionController.ts index 6208fc0d..7b5c27c4 100644 --- a/src/controllers/PositionController.ts +++ b/src/controllers/PositionController.ts @@ -961,37 +961,42 @@ export class PositionController extends Controller { if (!posMaster) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } - let orgRoot: any = null; let SName: any = null; + let revisionId:any = null; if (requestBody.orgRootId != null) orgRoot = await this.orgRootRepository.findOne({ where: { id: requestBody.orgRootId }, }); + revisionId = orgRoot?.orgRevisionId; if (!orgRoot) { let orgChild1: any = null; if (requestBody.orgChild1Id != null) orgChild1 = await this.child1Repository.findOne({ where: { id: requestBody.orgChild1Id }, }); + revisionId = orgChild1?.orgRevisionId; if (!orgChild1) { let orgChild2: any = null; if (requestBody.orgChild2Id != null) orgChild2 = await this.child2Repository.findOne({ where: { id: requestBody.orgChild2Id }, }); + revisionId = orgChild2?.orgRevisionId; if (!orgChild2) { let orgChild3: any = null; if (requestBody.orgChild3Id != null) orgChild3 = await this.child3Repository.findOne({ where: { id: requestBody.orgChild3Id }, }); + revisionId = orgChild3?.orgRevisionId; if (!orgChild3) { let orgChild4: any = null; if (requestBody.orgChild4Id != null) orgChild4 = await this.child4Repository.findOne({ where: { id: requestBody.orgChild4Id }, }); + revisionId = orgChild4?.orgRevisionId; if (!orgChild4) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงสร้าง"); } else { @@ -1089,7 +1094,6 @@ export class PositionController extends Controller { posMaster.orgRevisionId = orgRoot.orgRevisionId; SName = orgRoot.orgRootShortName; } - const chk_SName0 = await this.posMasterRepository.findOne({ where: { orgRevisionId: posMaster.orgRevisionId, @@ -1105,7 +1109,6 @@ export class PositionController extends Controller { "ไม่สามารถใส่เลขที่ตำแหน่งซ้ำกันได้", ); } - const chk_SName1 = await this.posMasterRepository.findOne({ where: { orgRevisionId: posMaster.orgRevisionId, @@ -1121,7 +1124,6 @@ export class PositionController extends Controller { "ไม่สามารถใส่เลขที่ตำแหน่งซ้ำกันได้", ); } - const chk_SName2 = await this.posMasterRepository.findOne({ where: { orgRevisionId: posMaster.orgRevisionId, @@ -1137,7 +1139,6 @@ export class PositionController extends Controller { "ไม่สามารถใส่เลขที่ตำแหน่งซ้ำกันได้", ); } - const chk_SName3 = await this.posMasterRepository.findOne({ where: { orgRevisionId: posMaster.orgRevisionId, @@ -1153,7 +1154,6 @@ export class PositionController extends Controller { "ไม่สามารถใส่เลขที่ตำแหน่งซ้ำกันได้", ); } - const chk_SName4 = await this.posMasterRepository.findOne({ where: { orgRevisionId: posMaster.orgRevisionId, @@ -1169,9 +1169,12 @@ export class PositionController extends Controller { ); } const before = null; - const chkRevision = await this.orgRevisionRepository.findOne({ - where: { id: orgRoot.orgRevisionId }, - }); + let chkRevision:any = null; + if(revisionId){ + chkRevision = await this.orgRevisionRepository.findOne({ + where: { id: revisionId }, + }); + } posMaster.createdUserId = request.user.sub; posMaster.createdFullName = request.user.name; posMaster.lastUpdateUserId = request.user.sub; @@ -1423,6 +1426,8 @@ export class PositionController extends Controller { x.positionName = x.posDictName; x.positionField = x.posDictField; x.posExecutiveId = x.posExecutiveId || null; + x.positionExecutiveField = x.posDictExecutiveField; + x.positionArea = x.posDictArea; x.createdUserId = request.user.sub; x.createdFullName = request.user.name; x.lastUpdateUserId = request.user.sub; @@ -3639,8 +3644,8 @@ export class PositionController extends Controller { // dataMaster.next_holderId = requestBody.profileId; dataMaster.lastUpdatedAt = new Date(); //add on - dataMaster.conditionReason = _null; - dataMaster.isCondition = false; + // dataMaster.conditionReason = _null; + // dataMaster.isCondition = false; //เช็คถ้า revision ปัจจุบันให้ปั๊มที่ profile const chkRevision = await this.orgRevisionRepository.findOne({ where: { id: dataMaster.orgRevisionId }, @@ -3693,7 +3698,7 @@ export class PositionController extends Controller { } if (dataMaster.orgRevision.orgRevisionIsCurrent) { - await CreatePosMasterHistoryOfficer(dataMaster.id, request); + await CreatePosMasterHistoryOfficer(dataMaster.id, request, "DELETE"); } let _profileId: string = ""; @@ -3712,9 +3717,8 @@ export class PositionController extends Controller { positionIsSelected: false, }); }); - if (dataMaster.orgRevision.orgRevisionIsCurrent) { - await CreatePosMasterHistoryOfficer(dataMaster.id, request); - } + + // //เช็คถ้า revision ปัจจุบันให้ปั๊มที่ profile // const chkRevision = await this.orgRevisionRepository.findOne({ // where: { id: dataMaster.orgRevisionId }, @@ -4935,8 +4939,8 @@ export class PositionController extends Controller { posMaster.current_holderId = body.profileId; posMaster.lastUpdatedAt = new Date(); const _null: any = null; - posMaster.conditionReason = _null; - posMaster.isCondition = false; + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; if (posMasterOld != null) { await this.posMasterRepository.save(posMasterOld); await CreatePosMasterHistoryOfficer(posMasterOld.id, request); diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 1cfa4565..81781adf 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -86,6 +86,7 @@ import { ProfileSalaryHistory } from "../entities/ProfileSalaryHistory"; import { ProfileAssistance } from "../entities/ProfileAssistance"; import { CommandRecive } from "../entities/CommandRecive"; import { EmployeePosMaster } from "../entities/EmployeePosMaster"; +import { getTopDegrees } from "../services/PositionService"; @Route("api/v1/org/profile") @Tags("Profile") @Security("bearerAuth") @@ -6292,7 +6293,9 @@ export class ProfileController extends Controller { // : undefined, // }) .where("current_holders.orgRevisionId = :orgRevisionId", { - orgRevisionId: (await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true } }))?.id + orgRevisionId: ( + await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true } }) + )?.id, }) .andWhere( _data.root != undefined && _data.root != null @@ -8148,7 +8151,7 @@ export class ProfileController extends Controller { salary: profile ? profile.amount : null, education: profile && profile.profileEducations.length > 0 - ? `${profile.profileEducations[0].degree ?? ""} ${profile.profileEducations[0].field ?? ""}` + ? await getTopDegrees(profile.profileEducations) : "-", statusCheckEdit: profile.statusCheckEdit, isEdit: permissionProflile?.isEdit ?? false, @@ -8345,7 +8348,7 @@ export class ProfileController extends Controller { mouthSalaryAmount: profile ? profile.mouthSalaryAmount : null, education: profile && profile.profileEducations.length > 0 - ? `${profile.profileEducations[0].degree ?? ""} ${profile.profileEducations[0].field ?? ""}` + ? await getTopDegrees(profile.profileEducations) : "", dateAppoint: profile.dateAppoint, avatarUrl: @@ -8497,7 +8500,7 @@ export class ProfileController extends Controller { salary: profile.amount, education: profile && profile.profileEducations.length > 0 - ? `${profile.profileEducations[0].degree ?? ""} ${profile.profileEducations[0].field ?? ""}` + ? await getTopDegrees(profile.profileEducations) : "-", }; diff --git a/src/controllers/ProfileEditController.ts b/src/controllers/ProfileEditController.ts index 5d257956..9e90d294 100644 --- a/src/controllers/ProfileEditController.ts +++ b/src/controllers/ProfileEditController.ts @@ -39,13 +39,15 @@ export class ProfileEditController extends Controller { @Query("pageSize") pageSize: number = 10, @Query("keyword") keyword: string = "", @Query("status") status: string = "", + @Query("sortBy") sortBy?: string, + @Query("descending") descending?: boolean, ) { const profile = await this.profileRepo.findOneBy({ keycloak: request.user.sub }); if (!profile) { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } - let [getProfileEdit, total] = await AppDataSource.getRepository(ProfileEdit) + let query = await AppDataSource.getRepository(ProfileEdit) .createQueryBuilder("ProfileEdit") .leftJoinAndSelect("ProfileEdit.profile", "profile") .where((qb) => { @@ -74,9 +76,18 @@ export class ProfileEditController extends Controller { }), ) .orderBy("ProfileEdit.createdAt", "DESC") - .skip((page - 1) * pageSize) - .take(pageSize) - .getManyAndCount(); + + if (sortBy) { + query = query.orderBy( + `ProfileEdit.${sortBy}`, + descending ? "DESC" : "ASC" + ); + } + + const [getProfileEdit, total] = await query + .skip((page - 1) * pageSize) + .take(pageSize) + .getManyAndCount(); const _data = getProfileEdit.map((item) => ({ id: item.id, diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index 1440c01f..04b43f87 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -78,6 +78,7 @@ import { ProfileAssistance } from "../entities/ProfileAssistance"; import { ProfileChangeName } from "../entities/ProfileChangeName"; import { ProfileChildren } from "../entities/ProfileChildren"; import { ProfileDuty } from "../entities/ProfileDuty"; +import { getTopDegrees } from "../services/PositionService"; @Route("api/v1/org/profile-employee") @Tags("ProfileEmployee") @Security("bearerAuth") @@ -1107,14 +1108,14 @@ export class ProfileEmployeeController extends Controller { : null, disciplineDetail: item.detail ?? null, refNo: Extension.ToThaiNumber(item.refCommandNo) ?? null, - level: item.level ?? "" + level: item.level ?? "", })) : [ { disciplineYear: "-", disciplineDetail: "-", refNo: "-", - level: "-" + level: "-", }, ]; @@ -1164,7 +1165,9 @@ export class ProfileEmployeeController extends Controller { salary: item.amount != null ? Extension.ToThaiNumber(item.amount.toLocaleString()) : null, special: - item.amountSpecial != null ? Extension.ToThaiNumber(item.amountSpecial.toLocaleString()) : null, + item.amountSpecial != null + ? Extension.ToThaiNumber(item.amountSpecial.toLocaleString()) + : null, rank: item.positionLevel != null ? Extension.ToThaiNumber(item.positionLevel) : null, refAll: item.remark ? Extension.ToThaiNumber(item.remark) : null, positionLevel: item.positionLevel @@ -1314,7 +1317,7 @@ export class ProfileEmployeeController extends Controller { "profileLeave.dateLeaveEnd AS dateLeaveEnd", "profileLeave.leaveDays AS leaveDays", "profileLeave.reason AS reason", - "leaveType.name as name" + "leaveType.name as name", ]) .where("profileLeave.profileEmployeeId = :profileId", { profileId: id }) .andWhere("leaveType.code IN (:...codes)", { codes: ["LV-008", "LV-009", "LV-010"] }) @@ -1324,10 +1327,12 @@ export class ProfileEmployeeController extends Controller { const leaves2 = leave2_raw.length > 0 ? leave2_raw.map((item) => ({ - date: item.dateLeaveStart && item.dateLeaveEnd - ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) + " - " - + Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd)) - : "-", + date: + item.dateLeaveStart && item.dateLeaveEnd + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveStart)) + + " - " + + Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.dateLeaveEnd)) + : "-", type: item.name || "-", leaveDays: item.leaveDays ? Extension.ToThaiNumber(item.leaveDays.toString()) : "-", reason: item.reason || "-", @@ -1389,24 +1394,25 @@ export class ProfileEmployeeController extends Controller { ]; const profileHistory = await this.profileHistoryRepo.find({ - where: { profileEmployeeId: id }, - order: { createdAt: "ASC" }, - }); - const history = profileHistory.length > 0 - ? profileHistory.map(item => ({ - birthDateOld: item.birthDateOld - ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.birthDateOld)) - : "", - birthDate: item.birthDate - ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.birthDate)) - : "", - })) - : [ - { - birthDateOld: "-", - birthDate: "-", - } - ] + where: { profileEmployeeId: id }, + order: { createdAt: "ASC" }, + }); + const history = + profileHistory.length > 0 + ? profileHistory.map((item) => ({ + birthDateOld: item.birthDateOld + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.birthDateOld)) + : "", + birthDate: item.birthDate + ? Extension.ToThaiNumber(Extension.ToThaiFullDate2(item.birthDate)) + : "", + })) + : [ + { + birthDateOld: "-", + birthDate: "-", + }, + ]; const position_raw = await this.salaryRepo.find({ where: { @@ -1555,15 +1561,16 @@ export class ProfileEmployeeController extends Controller { : "", pointSum: item.pointSum ? Extension.ToThaiNumber(item.pointSum.toString()) : "", pointSumTh: item.pointSum ? Extension.textPoint(item.pointSum) : "", - level: item.pointSum < 60.00 - ? "ต้องปรับปรุง (คะแนนต่ำกว่าร้อยละ ๖๐.๐๐)" - : item.pointSum <= 69.99 && item.pointSum >= 60.00 - ? "พอใช้ (คะแนนร้อยละ ๖๐.๐๐ - ๖๙.๙๙)" - : item.pointSum <= 79.99 && item.pointSum >= 70.00 - ? "ดี (คะแนนร้อยละ ๗๐.๐๐ - ๗๙.๙๙)" - : item.pointSum <= 89.99 && item.pointSum >= 80.00 - ? "ดีมาก (คะแนนร้อยละ ๘๐.๐๐ - ๘๙.๙๙)" - : "ดีเด่น (คะแนนร้อยละ ๙๐.๐๐ ขึ้นไป)" + level: + item.pointSum < 60.0 + ? "ต้องปรับปรุง (คะแนนต่ำกว่าร้อยละ ๖๐.๐๐)" + : item.pointSum <= 69.99 && item.pointSum >= 60.0 + ? "พอใช้ (คะแนนร้อยละ ๖๐.๐๐ - ๖๙.๙๙)" + : item.pointSum <= 79.99 && item.pointSum >= 70.0 + ? "ดี (คะแนนร้อยละ ๗๐.๐๐ - ๗๙.๙๙)" + : item.pointSum <= 89.99 && item.pointSum >= 80.0 + ? "ดีมาก (คะแนนร้อยละ ๘๐.๐๐ - ๘๙.๙๙)" + : "ดีเด่น (คะแนนร้อยละ ๙๐.๐๐ ขึ้นไป)", })) : [ { @@ -4012,26 +4019,28 @@ export class ProfileEmployeeController extends Controller { body: { fieldName: string; keyword?: string; - system?: string; + system?: string; }, ) { // ค้นหารายชื่อถ้าไม่ส่ง system มาให้ default ตามทะเบียนประวัติ - let _system:string ="SYS_REGISTRY_EMP"; - if(body.system) - _system = body.system; + let _system: string = "SYS_REGISTRY_EMP"; + if (body.system) _system = body.system; let _data = await new permission().PermissionOrgList(request, _system); - const findRevision = await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true } }); + const findRevision = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: true }, + }); if (!findRevision) { throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); } - let queryLike = "1=1" + let queryLike = "1=1"; switch (body.fieldName) { case "citizenId": queryLike = "profile.citizenId LIKE :keyword"; break; case "fullName": - queryLike = "CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; + queryLike = + "CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; break; case "position": @@ -4039,7 +4048,7 @@ export class ProfileEmployeeController extends Controller { break; case "posNo": - queryLike = ` + queryLike = ` CASE WHEN current_holders.orgChild4Id IS NOT NULL THEN CONCAT(orgChild4.orgChild4ShortName, " ", current_holders.posMasterNo) WHEN current_holders.orgChild3Id IS NOT NULL THEN CONCAT(orgChild3.orgChild3ShortName, " ", current_holders.posMasterNo) @@ -4063,10 +4072,10 @@ export class ProfileEmployeeController extends Controller { break; default: - queryLike = "1=1" + queryLike = "1=1"; break; } - + const [findProfile, total] = await this.profileRepo .createQueryBuilder("profile") .leftJoinAndSelect("profile.posType", "posType") @@ -5608,9 +5617,10 @@ export class ProfileEmployeeController extends Controller { posNo: orgRevisionRef?.posMasterNo, positionExecutive: "", positionType: profile.posType?.posTypeName, - positionLevel: profile.posType && profile.posLevel - ? `${profile.posType?.posTypeShortName} ${profile.posLevel?.posLevelName}` - : "", + positionLevel: + profile.posType && profile.posLevel + ? `${profile.posType?.posTypeShortName} ${profile.posLevel?.posLevelName}` + : "", amountSpecial: profile.amountSpecial, orgRoot: orgRootRef?.orgRootName, orgChild1: orgChild1Ref?.orgChild1Name, @@ -6366,7 +6376,7 @@ export class ProfileEmployeeController extends Controller { salary: profile.amount, education: profile && profile.profileEducations.length > 0 - ? `${profile.profileEducations[0].degree ?? ""} ${profile.profileEducations[0].field ?? ""}` + ? await getTopDegrees(profile.profileEducations) : "-", statusCheckEdit: profile.statusCheckEdit, isEdit: permissionProflile?.isEdit ?? false, diff --git a/src/controllers/ProfileEmployeeTempController.ts b/src/controllers/ProfileEmployeeTempController.ts index 2318da33..b00197a5 100644 --- a/src/controllers/ProfileEmployeeTempController.ts +++ b/src/controllers/ProfileEmployeeTempController.ts @@ -68,6 +68,7 @@ import permission from "../interfaces/permission"; import axios from "axios"; import { deleteUser } from "../keycloak"; import { ProfileSalaryHistory } from "../entities/ProfileSalaryHistory"; +import { getTopDegrees } from "../services/PositionService"; @Route("api/v1/org/profile-temp") @Tags("ProfileEmployee") @Security("bearerAuth") @@ -688,7 +689,9 @@ export class ProfileEmployeeTempController extends Controller { Salary: item.amount != null ? Extension.ToThaiNumber(item.amount.toLocaleString()) : null, Special: - item.amountSpecial != null ? Extension.ToThaiNumber(item.amountSpecial.toLocaleString()) : null, + item.amountSpecial != null + ? Extension.ToThaiNumber(item.amountSpecial.toLocaleString()) + : null, Rank: item.positionLevel != null ? Extension.ToThaiNumber(item.positionLevel) : null, RefAll: item.remark ? Extension.ToThaiNumber(item.remark) : null, PositionLevel: @@ -1142,8 +1145,8 @@ export class ProfileEmployeeTempController extends Controller { { statusTemp: "PENDING", type: "TEMP", - keycloak: request.user.sub - } + keycloak: request.user.sub, + }, ) .getManyAndCount(); const data = await Promise.all( @@ -1510,15 +1513,12 @@ export class ProfileEmployeeTempController extends Controller { } else if (searchField == "position") { queryLike = "profileEmployee.position LIKE :keyword"; } - let _conditionAll = - `current_holderTemps.orgRootId is null AND current_holderTemps.orgChild1Id is null AND + let _conditionAll = `current_holderTemps.orgRootId is null AND current_holderTemps.orgChild1Id is null AND current_holderTemps.orgChild2Id is null AND current_holderTemps.orgChild3Id is null AND current_holderTemps.orgChild4Id is null AND profileEmployee.createdUserId = :keycloak AND - profileEmployee.employeeClass = :type` - let _conditionFullname= - `CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword` - let _conditionCitizenId = - `profileEmployee.citizenId LIKE :keyword` + profileEmployee.employeeClass = :type`; + let _conditionFullname = `CONCAT(profileEmployee.prefix, profileEmployee.firstName, ' ', profileEmployee.lastName) LIKE :keyword`; + let _conditionCitizenId = `profileEmployee.citizenId LIKE :keyword`; const findRevision = await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true }, }); @@ -1611,42 +1611,29 @@ export class ProfileEmployeeTempController extends Controller { keyword2: `${posLevel}`, }, ) - .andWhere( - "profileEmployee.employeeClass = :type", { - type: type ? type.trim().toLocaleUpperCase() : "TEMP" - } - ) + .andWhere("profileEmployee.employeeClass = :type", { + type: type ? type.trim().toLocaleUpperCase() : "TEMP", + }) .orWhere( new Brackets((qb) => { if (!searchKeyword) { - qb.andWhere( - _conditionAll, - { - keycloak: request.user.sub, - type: type ? type.trim().toLocaleUpperCase() : "TEMP" - } - ) - } - else { + qb.andWhere(_conditionAll, { + keycloak: request.user.sub, + type: type ? type.trim().toLocaleUpperCase() : "TEMP", + }); + } else { if (searchField != "citizenId") { - qb.andWhere( - `${_conditionAll} AND ${_conditionFullname}`, - { + qb.andWhere(`${_conditionAll} AND ${_conditionFullname}`, { keyword: `%${searchKeyword}%`, keycloak: request.user.sub, - type: type ? type.trim().toLocaleUpperCase() : "TEMP" - }, - ) - } - else { - qb.andWhere( - `${_conditionAll} AND ${_conditionCitizenId}`, - { - keyword: `%${searchKeyword}%`, - keycloak: request.user.sub, - type: type ? type.trim().toLocaleUpperCase() : "TEMP" - }, - ) + type: type ? type.trim().toLocaleUpperCase() : "TEMP", + }); + } else { + qb.andWhere(`${_conditionAll} AND ${_conditionCitizenId}`, { + keyword: `%${searchKeyword}%`, + keycloak: request.user.sub, + type: type ? type.trim().toLocaleUpperCase() : "TEMP", + }); } } }), @@ -1660,18 +1647,20 @@ export class ProfileEmployeeTempController extends Controller { _data.current_holderTemps.length == 0 ? null : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && - _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != - null + _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) + ?.orgChild4 != null ? `${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${_data.current_holders.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) ?.orgChild3 != null ? `${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && + : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != + null && _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) ?.orgChild2 != null ? `${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && + : _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != + null && _data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) ?.orgChild1 != null ? `${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${_data.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` @@ -1844,46 +1833,46 @@ export class ProfileEmployeeTempController extends Controller { keyword: `%${requestBody.keyword}%`, }, ) - .orWhere( - requestBody.keyword != null && requestBody.keyword != "" - ? "profileEmployee.firstName LIKE :keyword" - : "1=1", - { - keyword: `%${requestBody.keyword}%`, - }, - ) - .orWhere( - requestBody.keyword != null && requestBody.keyword != "" - ? "profileEmployee.lastName LIKE :keyword" - : "1=1", - { - keyword: `%${requestBody.keyword}%`, - }, - ) - .orWhere( - requestBody.keyword != null && requestBody.keyword != "" - ? "CONCAT(profileEmployee.prefix,profileEmployee.firstName,' ',profileEmployee.lastName) LIKE :keyword" - : "1=1", - { - keyword: `%${requestBody.keyword}%`, - }, - ) - .orWhere( - requestBody.keyword != null && requestBody.keyword != "" - ? "CONCAT(profileEmployee.firstName,' ',profileEmployee.lastName) LIKE :keyword" - : "1=1", - { - keyword: `%${requestBody.keyword}%`, - }, - ) - .orWhere( - requestBody.keyword != null && requestBody.keyword != "" - ? "profileEmployee.citizenId LIKE :keyword" - : "1=1", - { - keyword: `%${requestBody.keyword}%`, - }, - ); + .orWhere( + requestBody.keyword != null && requestBody.keyword != "" + ? "profileEmployee.firstName LIKE :keyword" + : "1=1", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + requestBody.keyword != null && requestBody.keyword != "" + ? "profileEmployee.lastName LIKE :keyword" + : "1=1", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + requestBody.keyword != null && requestBody.keyword != "" + ? "CONCAT(profileEmployee.prefix,profileEmployee.firstName,' ',profileEmployee.lastName) LIKE :keyword" + : "1=1", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + requestBody.keyword != null && requestBody.keyword != "" + ? "CONCAT(profileEmployee.firstName,' ',profileEmployee.lastName) LIKE :keyword" + : "1=1", + { + keyword: `%${requestBody.keyword}%`, + }, + ) + .orWhere( + requestBody.keyword != null && requestBody.keyword != "" + ? "profileEmployee.citizenId LIKE :keyword" + : "1=1", + { + keyword: `%${requestBody.keyword}%`, + }, + ); // .orWhere( // requestBody.keyword != null && requestBody.keyword != "" // ? "profileEmployee.position LIKE :keyword" @@ -2194,19 +2183,20 @@ export class ProfileEmployeeTempController extends Controller { body: { fieldName: string; keyword?: string; - system?: string; + system?: string; }, ) { // ค้นหารายชื่อถ้าไม่ส่ง system มาให้ default ตามทะเบียนประวัติ - let _system:string ="SYS_REGISTRY_TEMP"; - if(body.system) - _system = body.system; + let _system: string = "SYS_REGISTRY_TEMP"; + if (body.system) _system = body.system; let _data = await new permission().PermissionOrgList(request, _system); - const findRevision = await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true } }); + const findRevision = await this.orgRevisionRepo.findOne({ + where: { orgRevisionIsCurrent: true }, + }); if (!findRevision) { throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); } - let queryLike = "1=1" + let queryLike = "1=1"; switch (body.fieldName) { case "citizenId": queryLike = "profile.citizenId LIKE :keyword"; @@ -2221,11 +2211,12 @@ export class ProfileEmployeeTempController extends Controller { break; case "fullName": - queryLike = "CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; + queryLike = + "CONCAT(profile.prefix, profile.firstName, ' ', profile.lastName) LIKE :keyword"; break; default: - queryLike = "1=1" + queryLike = "1=1"; break; } @@ -2298,18 +2289,20 @@ export class ProfileEmployeeTempController extends Controller { item.current_holderTemps.length == 0 ? null : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4 != - null + item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) + ?.orgChild4 != null ? `${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild4.orgChild4ShortName} ${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3 != - null + item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) + ?.orgChild3 != null ? `${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild3.orgChild3ShortName} ${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && + : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != + null && item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) ?.orgChild2 != null ? `${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild2.orgChild2ShortName} ${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` - : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && + : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != + null && item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) ?.orgChild1 != null ? `${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgChild1.orgChild1ShortName} ${item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.posMasterNo}` @@ -2323,7 +2316,8 @@ export class ProfileEmployeeTempController extends Controller { const root = item.current_holderTemps.length == 0 || (item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id) != null && - item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot == null) + item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot == + null) ? null : item.current_holderTemps.find((x) => x.orgRevisionId == findRevision.id)?.orgRoot; @@ -3458,9 +3452,10 @@ export class ProfileEmployeeTempController extends Controller { posNo: orgRevisionRef?.posMasterNo, positionExecutive: "", positionType: profile.posType?.posTypeName, - positionLevel: profile.posType && profile.posLevel - ? `${profile.posType?.posTypeShortName} ${profile.posLevel?.posLevelName}` - : "", + positionLevel: + profile.posType && profile.posLevel + ? `${profile.posType?.posTypeShortName} ${profile.posLevel?.posLevelName}` + : "", amountSpecial: profile.amountSpecial, orgRoot: orgRootRef?.orgRootName, orgChild1: orgChild1Ref?.orgChild1Name, @@ -4169,7 +4164,7 @@ export class ProfileEmployeeTempController extends Controller { salary: profile.amount, education: profile && profile.profileEducations.length > 0 - ? `${profile.profileEducations[0].degree ?? ""} ${profile.profileEducations[0].field ?? ""}` + ? await getTopDegrees(profile.profileEducations) : "-", }; @@ -4225,7 +4220,7 @@ export class ProfileEmployeeTempController extends Controller { }); return new HttpSuccess(); } - + /** * API แก้ไขเบอร์โทรศัพท์ ลูกจ้างชั่วคราว * diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index d3f947f7..94ac4362 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -690,7 +690,7 @@ export class ReportController extends Controller { "posMasters.positions.posExecutive", ], }); - const orgName = orgRootData[0].orgRootName??""; + const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { @@ -1288,8 +1288,12 @@ export class ReportController extends Controller { } } } - - return new HttpSuccess({ template: "report1", reportName: "report1", data: { org: orgName,data } }); + + return new HttpSuccess({ + template: "report1", + reportName: "report1", + data: { org: orgName, data }, + }); } /** @@ -1341,7 +1345,7 @@ export class ReportController extends Controller { "posMasters.positions.posExecutive", ], }); - const orgName = orgRootData[0].orgRootName??""; + const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { @@ -3462,7 +3466,11 @@ export class ReportController extends Controller { // sendWebSocket(metaData); // })(); - return new HttpSuccess({ template: "report2", reportName: "report2", data: { org: orgName ,data } }); + return new HttpSuccess({ + template: "report2", + reportName: "report2", + data: { org: orgName, data }, + }); } /** @@ -3733,20 +3741,18 @@ export class ReportController extends Controller { posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations - .filter(x => x.isEducation == true || x.isUse == true) - .sort( - (a, b) => { - // (b.finishDate == null ? 0 : b.finishDate.getTime()) - - // (a.finishDate == null ? 0 : a.finishDate.getTime()), - if (a.isEducation !== b.isEducation) { - return a.isEducation ? -1 : 1 - } - return b.level - a.level + .filter((x) => x.isEducation == true || x.isUse == true) + .sort((a, b) => { + // (b.finishDate == null ? 0 : b.finishDate.getTime()) - + // (a.finishDate == null ? 0 : a.finishDate.getTime()), + if (a.isEducation !== b.isEducation) { + return a.isEducation ? -1 : 1; } - ); + return b.level - a.level; + }); if (_education.length > 0) { // education = _education[0]; - education = _education.map((e:any) => e.degree).join(", ") + education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; @@ -4115,17 +4121,15 @@ export class ReportController extends Controller { posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations - .filter(x => x.isEducation == true || x.isUse == true) - .sort( - (a, b) => { - if (a.isEducation !== b.isEducation) { - return a.isEducation ? -1 : 1 - } - return b.level - a.level + .filter((x) => x.isEducation == true || x.isUse == true) + .sort((a, b) => { + if (a.isEducation !== b.isEducation) { + return a.isEducation ? -1 : 1; } - ); + return b.level - a.level; + }); if (_education.length > 0) { - education = _education.map((e:any) => e.degree).join(", ") + education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; @@ -4502,17 +4506,15 @@ export class ReportController extends Controller { posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations - .filter(x => x.isEducation == true || x.isUse == true) - .sort( - (a, b) => { - if (a.isEducation !== b.isEducation) { - return a.isEducation ? -1 : 1 - } - return b.level - a.level + .filter((x) => x.isEducation == true || x.isUse == true) + .sort((a, b) => { + if (a.isEducation !== b.isEducation) { + return a.isEducation ? -1 : 1; } - ); + return b.level - a.level; + }); if (_education.length > 0) { - education = _education.map((e:any) => e.degree).join(", ") + education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; @@ -4905,17 +4907,15 @@ export class ReportController extends Controller { posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations - .filter(x => x.isEducation == true || x.isUse == true) - .sort( - (a, b) => { - if (a.isEducation !== b.isEducation) { - return a.isEducation ? -1 : 1 - } - return b.level - a.level + .filter((x) => x.isEducation == true || x.isUse == true) + .sort((a, b) => { + if (a.isEducation !== b.isEducation) { + return a.isEducation ? -1 : 1; } - ); + return b.level - a.level; + }); if (_education.length > 0) { - education = _education.map((e:any) => e.degree).join(", ") + education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; @@ -5312,17 +5312,15 @@ export class ReportController extends Controller { posMaster.current_holder.profileEducations.length > 0 ) { let _education: any = posMaster.current_holder.profileEducations - .filter(x => x.isEducation == true || x.isUse == true) - .sort( - (a, b) => { - if (a.isEducation !== b.isEducation) { - return a.isEducation ? -1 : 1 - } - return b.level - a.level + .filter((x) => x.isEducation == true || x.isUse == true) + .sort((a, b) => { + if (a.isEducation !== b.isEducation) { + return a.isEducation ? -1 : 1; } - ); + return b.level - a.level; + }); if (_education.length > 0) { - education = _education.map((e:any) => e.degree).join(", ") + education = _education.map((e: any) => e.degree).join(", "); } } let salary: any = ""; @@ -5700,7 +5698,7 @@ export class ReportController extends Controller { "posMasters.positions.posExecutive", ], }); - const orgName = orgRootData[0].orgRootName??""; + const orgName = orgRootData[0].orgRootName ?? ""; const orgRootIds = orgRootData.map((orgRoot) => orgRoot.id) || null; const orgChild1Data = await this.child1Repository.find({ where: { @@ -6891,7 +6889,11 @@ export class ReportController extends Controller { } } } - return new HttpSuccess({ template: "report3", reportName: "report3", data: { org: orgName,data } }); + return new HttpSuccess({ + template: "report3", + reportName: "report3", + data: { org: orgName, data }, + }); } @Get("report4/{rootId}") diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 06b2059e..0938b267 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -809,6 +809,8 @@ export class WorkflowController extends Controller { pageSize: number; keycloakId?: string | null; type?: string | null; + sortBy?: string | null, + descending?: boolean, }, ) { const userKeycloak = body.keycloakId ?? request.user.sub; @@ -946,7 +948,7 @@ export class WorkflowController extends Controller { ? AppDataSource.getRepository(viewDirectorActing) : AppDataSource.getRepository(viewDirector); - const queryBuilder = repository.createQueryBuilder("entity"); + let queryBuilder = repository.createQueryBuilder("entity"); // 5. แยก WHERE conditions ให้เร็วขึ้น queryBuilder.where( @@ -985,6 +987,13 @@ export class WorkflowController extends Controller { ); } + if (body.sortBy) { + queryBuilder = queryBuilder.orderBy( + `entity.${body.sortBy}`, + body.descending ? "DESC" : "ASC" + ); + } + // 7. Execute พร้อมกัน - ใช้ Promise.all const [data, total] = await Promise.all([ queryBuilder diff --git a/src/entities/Registry.ts b/src/entities/Registry.ts index 95a4d63e..402b6e29 100644 --- a/src/entities/Registry.ts +++ b/src/entities/Registry.ts @@ -256,10 +256,10 @@ export class Registry extends EntityBase { birthdate: Date; @Column({ + type: "text", nullable: true, comment: "วุฒิการศึกษา", - length: 255, - default: null, + default: null }) degrees: string; @@ -350,18 +350,18 @@ export class Registry extends EntityBase { Educations: string; @Column({ + type: "text", nullable: true, comment: "ระดับศึกษา", - length: 255, - default: null, + default: null }) educationLevels: string; @Column({ + type: "text", nullable: true, comment: "สาขาวิชา/ทาง", - length: 255, - default: null, + default: null }) fields: string; } diff --git a/src/entities/RegistryEmployee.ts b/src/entities/RegistryEmployee.ts index 31d0a8b2..09c4815f 100644 --- a/src/entities/RegistryEmployee.ts +++ b/src/entities/RegistryEmployee.ts @@ -248,9 +248,9 @@ export class RegistryEmployee extends EntityBase { birthdate: Date; @Column({ + type: "text", nullable: true, comment: "วุฒิการศึกษา", - length: 255, default: null, }) degrees: string; @@ -313,18 +313,18 @@ export class RegistryEmployee extends EntityBase { Educations: string; @Column({ + type: "text", nullable: true, comment: "ระดับศึกษา", - length: 255, - default: null, + default: null }) educationLevels: string; @Column({ + type: "text", nullable: true, comment: "สาขาวิชา/ทาง", - length: 255, - default: null, + default: null }) fields: string; diff --git a/src/migration/1757484721787-update_dataType_fields_registry_and_registryEmpployee.ts b/src/migration/1757484721787-update_dataType_fields_registry_and_registryEmpployee.ts new file mode 100644 index 00000000..25ea2cb7 --- /dev/null +++ b/src/migration/1757484721787-update_dataType_fields_registry_and_registryEmpployee.ts @@ -0,0 +1,36 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateDataTypeFieldsRegistryAndRegistryEmpployee1757484721787 implements MigrationInterface { + name = 'UpdateDataTypeFieldsRegistryAndRegistryEmpployee1757484721787' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`degrees\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`degrees\` text NULL COMMENT 'วุฒิการศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`educationLevels\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`educationLevels\` text NULL COMMENT 'ระดับศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`fields\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`fields\` text NULL COMMENT 'สาขาวิชา/ทาง'`); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`degrees\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`degrees\` text NULL COMMENT 'วุฒิการศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`educationLevels\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`educationLevels\` text NULL COMMENT 'ระดับศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`fields\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`fields\` text NULL COMMENT 'สาขาวิชา/ทาง'`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`fields\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`fields\` varchar(255) NULL COMMENT 'สาขาวิชา/ทาง'`); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`educationLevels\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`educationLevels\` varchar(255) NULL COMMENT 'ระดับศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` DROP COLUMN \`degrees\``); + await queryRunner.query(`ALTER TABLE \`registryEmployee\` ADD \`degrees\` varchar(255) NULL COMMENT 'วุฒิการศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`fields\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`fields\` varchar(255) NULL COMMENT 'สาขาวิชา/ทาง'`); + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`educationLevels\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`educationLevels\` varchar(255) NULL COMMENT 'ระดับศึกษา'`); + await queryRunner.query(`ALTER TABLE \`registry\` DROP COLUMN \`degrees\``); + await queryRunner.query(`ALTER TABLE \`registry\` ADD \`degrees\` varchar(255) NULL COMMENT 'วุฒิการศึกษา'`); + } + +} diff --git a/src/services/PositionService.ts b/src/services/PositionService.ts index 87672292..3003cdb1 100644 --- a/src/services/PositionService.ts +++ b/src/services/PositionService.ts @@ -5,11 +5,13 @@ import { PosMaster } from "../entities/PosMaster"; import { PosMasterEmployeeHistory } from "../entities/PosMasterEmployeeHistory"; import { PosMasterEmployeeTempHistory } from "../entities/PosMasterEmployeeTempHistory"; import { PosMasterHistory } from "../entities/PosMasterHistory"; +import { ProfileEducation } from "../entities/ProfileEducation"; import { RequestWithUser } from "../middlewares/user"; export async function CreatePosMasterHistoryOfficer( posMasterId: string, request: RequestWithUser | null, + type?: string | null, ): Promise { try { await AppDataSource.transaction(async (manager) => { @@ -38,18 +40,20 @@ export async function CreatePosMasterHistoryOfficer( const h = new PosMasterHistory(); const selectedPosition = pm.positions.length > 0 - ? pm.positions.find((p) => p.positionIsSelected === true) ?? null + ? pm.positions.find((p) => p.positionIsSelected === true) ?? null : null; - h.ancestorDNA = pm.ancestorDNA? pm.ancestorDNA : _null; - h.prefix = pm.current_holder?.prefix || _null; - h.firstName = pm.current_holder?.firstName || _null; - h.lastName = pm.current_holder?.lastName || _null; + h.ancestorDNA = pm.ancestorDNA ? pm.ancestorDNA : _null; + if(!type || type != "DELETE"){ + h.prefix = pm.current_holder?.prefix || _null; + h.firstName = pm.current_holder?.firstName || _null; + h.lastName = pm.current_holder?.lastName || _null; + h.position = selectedPosition?.positionName ?? _null; + h.posType = selectedPosition?.posType?.posTypeName ?? _null; + h.posLevel = selectedPosition?.posLevel?.posLevelName ?? _null; + } h.posMasterNoPrefix = pm.posMasterNoPrefix ?? _null; h.posMasterNo = pm.posMasterNo ?? _null; h.posMasterNoSuffix = pm.posMasterNoSuffix ?? _null; - h.position = selectedPosition?.positionName ?? _null; - h.posType = selectedPosition?.posType?.posTypeName ?? _null; - h.posLevel = selectedPosition?.posLevel?.posLevelName ?? _null; h.posExecutive = selectedPosition?.posExecutive?.posExecutiveName ?? _null; h.shortName = [ @@ -214,3 +218,22 @@ export async function CreatePosMasterHistoryEmployeeTemp( return false; } } + +export async function getTopDegrees(educations: ProfileEducation[]): Promise { + // filter เฉพาะ isUse==true หรือ isEducation==true + const filtered = educations.filter((e) => e.isUse === true || e.isEducation === true); + // sort: isEducation==true ก่อน, ถ้าเท่ากัน sort ด้วย level น้อยสุด + const sorted = filtered.sort((a, b) => { + const aEdu = !!a.isEducation ? 0 : 1; + const bEdu = !!b.isEducation ? 0 : 1; + if (aEdu !== bEdu) return aEdu - bEdu; + const aLevel = typeof a.level === "number" ? a.level : Number.MAX_SAFE_INTEGER; + const bLevel = typeof b.level === "number" ? b.level : Number.MAX_SAFE_INTEGER; + return aLevel - bLevel; + }); + + return sorted + .map((e) => [e.degree, e.field].filter(Boolean).join(" ")) + .filter(Boolean) + .join("\n"); +} diff --git a/src/services/rabbitmq.ts b/src/services/rabbitmq.ts index d55667a6..dd57d886 100644 --- a/src/services/rabbitmq.ts +++ b/src/services/rabbitmq.ts @@ -571,11 +571,11 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise { } } item.current_holderId = item.next_holderId; - item.conditionReason = _null; - if (item.current_holderId) { - item.conditionReason = _null; - item.isCondition = false; - } + // item.conditionReason = _null; + // if (item.current_holderId) { + // item.conditionReason = _null; + // item.isCondition = false; + // } item.next_holderId = null; item.lastUpdateUserId = lastUpdateUserId; item.lastUpdateFullName = lastUpdateFullName; @@ -1760,10 +1760,10 @@ async function handler_org_draft(msg: amqp.ConsumeMessage): Promise { ) ) { posMaster.next_holderId = item.current_holderId; - if (posMaster.next_holderId) { - posMaster.conditionReason = _null; - posMaster.isCondition = false; - } + // if (posMaster.next_holderId) { + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; + // } } else { posMaster.next_holderId = null; posMaster.isSit = false; @@ -1856,10 +1856,10 @@ async function handler_org_draft(msg: amqp.ConsumeMessage): Promise { ) ) { posMaster.next_holderId = item.current_holderId; - if (posMaster.next_holderId) { - posMaster.conditionReason = _null; - posMaster.isCondition = false; - } + // if (posMaster.next_holderId) { + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; + // } } else { posMaster.next_holderId = null; posMaster.isSit = false; @@ -1954,10 +1954,10 @@ async function handler_org_draft(msg: amqp.ConsumeMessage): Promise { ) ) { posMaster.next_holderId = item.current_holderId; - if (posMaster.next_holderId) { - posMaster.conditionReason = _null; - posMaster.isCondition = false; - } + // if (posMaster.next_holderId) { + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; + // } } else { posMaster.next_holderId = null; posMaster.isSit = false; @@ -2054,10 +2054,10 @@ async function handler_org_draft(msg: amqp.ConsumeMessage): Promise { ) ) { posMaster.next_holderId = item.current_holderId; - if (posMaster.next_holderId) { - posMaster.conditionReason = _null; - posMaster.isCondition = false; - } + // if (posMaster.next_holderId) { + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; + // } } else { posMaster.next_holderId = null; posMaster.isSit = false; @@ -2157,10 +2157,10 @@ async function handler_org_draft(msg: amqp.ConsumeMessage): Promise { ) ) { posMaster.next_holderId = item.current_holderId; - if (posMaster.next_holderId) { - posMaster.conditionReason = _null; - posMaster.isCondition = false; - } + // if (posMaster.next_holderId) { + // posMaster.conditionReason = _null; + // posMaster.isCondition = false; + // } } else { posMaster.next_holderId = null; posMaster.isSit = false;