diff --git a/src/controllers/CommandController.ts b/src/controllers/CommandController.ts index 5c801315..90ea9a38 100644 --- a/src/controllers/CommandController.ts +++ b/src/controllers/CommandController.ts @@ -99,6 +99,7 @@ import { CreatePosMasterHistoryOfficer, } from "../services/PositionService"; import { PostRetireToExprofile } from "./ExRetirementController"; +import { LeaveType } from "../entities/LeaveType" @Route("api/v1/org/command") @Tags("Command") @Security("bearerAuth") @@ -154,7 +155,7 @@ export class CommandController extends Controller { private insigniaHistoryRepo = AppDataSource.getRepository(ProfileInsigniaHistory); private genderRepo = AppDataSource.getRepository(Gender); private avatarRepository = AppDataSource.getRepository(ProfileAvatar); - + private leaveType = AppDataSource.getRepository(LeaveType); /** * API list รายการคำสั่ง * @@ -5766,10 +5767,15 @@ export class CommandController extends Controller { ) { let _posNumCodeSit: string = ""; let _posNumCodeSitAbb: string = ""; + let commandType: any = "" const _command = await this.commandRepository.findOne({ where: { id: body.data.find((x) => x.commandId)?.commandId ?? "" }, }); if (_command) { + commandType = await this.commandTypeRepository.findOne({ + select: { code: true }, + where: { id: _command.commandTypeId } + }); if (_command?.isBangkok?.toLocaleUpperCase() == "OFFICE") { const orgRootDeputy = await this.orgRootRepository.findOne({ where: { @@ -5807,11 +5813,15 @@ export class CommandController extends Controller { .orgRootShortName ?? ""; } } + const leaveType = await this.leaveType.findOne({ + select:{ id: true, limit: true, code: true }, + where:{ code: "LV-005" } + }); await Promise.all( body.data.map(async (item) => { const profile = await this.profileRepository.findOne({ relations: [ - "profileSalary", + // "profileSalary", "posType", "posLevel", "current_holders", @@ -5822,16 +5832,21 @@ export class CommandController extends Controller { "current_holders.orgChild4", ], where: { id: item.profileId }, - order: { - profileSalary: { - order: "DESC", - }, - }, + // order: { + // profileSalary: { + // order: "DESC", + // }, + // }, }); if (!profile) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลทะเบียนประวัตินี้"); } - + const lastSalary = await this.salaryRepo.findOne({ + where: { profileId: item.profileId }, + select: ["order"], + order: { order: "DESC" }, + }); + const nextOrder = lastSalary ? lastSalary.order + 1 : 1; const orgRevision = await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true, @@ -5892,12 +5907,13 @@ export class CommandController extends Controller { amountSpecial: item.amountSpecial ? item.amountSpecial : 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, + // order: + // profile.profileSalary.length >= 0 + // ? profile.profileSalary.length > 0 + // ? profile.profileSalary[0].order + 1 + // : 1 + // : null, + order: nextOrder, orgRoot: orgRootRef?.orgRootName ?? null, orgChild1: orgChild1Ref?.orgChild1Name ?? null, orgChild2: orgChild2Ref?.orgChild2Name ?? null, @@ -5928,19 +5944,41 @@ export class CommandController extends Controller { await this.salaryHistoryRepo.save(history); }), ); - const checkCommandType = await this.commandRepository.findOne({ - where: { id: body.data.length > 0 ? body.data[0].commandId?.toString() : "" }, - relations: ["commandType"], - }); - if (checkCommandType?.commandType.code == "C-PM-11") { - const profile = await this.profileRepository.find({ - where: { id: In(body.data.map((x) => x.profileId)) }, - }); - const data = profile.map((x) => ({ - ...x, - isProbation: false, - })); - await this.profileRepository.save(data); + // const checkCommandType = await this.commandRepository.findOne({ + // where: { id: body.data.length > 0 ? body.data[0].commandId?.toString() : "" }, + // relations: ["commandType"], + // }); + if (commandType && String(commandType.code) == "C-PM-11") { + // const profile = await this.profileRepository.find({ + // where: { id: In(body.data.map((x) => x.profileId)) }, + // }); + // const data = profile.map((x) => ({ + // ...x, + // isProbation: false, + // })); + // await this.profileRepository.save(data); + const profileIds = body.data.map((x) => x.profileId); + await this.profileRepository.update( + { id: In(profileIds) }, + { isProbation: false } + ); + // Task #2304 อัปเดตจำนวนสิทธิ์การลา เมื่อผ่านทดลองงานฯ + if (leaveType != null) { + await Promise.all( + body.data.map((item) => + new CallAPI().PutData(req, `/leave-beginning/schedule`, { + profileId: item.profileId, + leaveTypeId: leaveType.id, + leaveYear: item.commandYear, + leaveDays: leaveType.limit, + leaveDaysUsed: 0, + leaveCount: 0, + beginningLeaveDays: 0, + beginningLeaveCount: 0, + }) + ) + ); + } } return new HttpSuccess(); } @@ -6461,7 +6499,7 @@ export class CommandController extends Controller { await this.salaryHistoryRepo.save(history, { data: req }); if (profileEmployee.profileInsignias.length > 0) { - _oldInsigniaIds = profileEmployee.profileInsignias.map((x: any) => x.id); + _oldInsigniaIds = profileEmployee.profileInsignias.filter().map((x: any) => x.id); } await removeProfileInOrganize(profileEmployee.id, "EMPLOYEE"); if (profileEmployee.keycloak != null) { @@ -6679,7 +6717,7 @@ export class CommandController extends Controller { profileEdu.profileId = profile.id; const educationLevel = await this.profileEducationRepo.findOne({ select: ["id", "level", "profileId"], - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { level: "DESC" }, }); profileEdu.level = educationLevel == null ? 1 : educationLevel.level + 1; @@ -6871,7 +6909,7 @@ export class CommandController extends Controller { // Insignia if (_oldInsigniaIds.length > 0) { const _insignias = await this.insigniaRepo.find({ - where: { id: In(_oldInsigniaIds) }, + where: { id: In(_oldInsigniaIds), isDeleted: false }, order: { createdAt: "ASC" }, }); for (const oldInsignia of _insignias) { diff --git a/src/controllers/ImportDataController.ts b/src/controllers/ImportDataController.ts index 99e931ea..1c71f9b0 100644 --- a/src/controllers/ImportDataController.ts +++ b/src/controllers/ImportDataController.ts @@ -2475,8 +2475,8 @@ export class ImportDataController extends Controller { }); const educationLevel = await this.profileEducationRepo.findOne({ - select: ["id", "level", "profileId"], - where: { profileId: _item.id }, + select: ["id", "level", "profileId", "isDeleted"], + where: { profileId: _item.id, isDeleted: false }, order: { level: "DESC" }, }); @@ -2607,8 +2607,8 @@ export class ImportDataController extends Controller { }); const educationLevel = await this.profileEducationRepo.findOne({ - select: ["id", "level", "profileEmployeeId"], - where: { profileEmployeeId: _item.id }, + select: ["id", "level", "profileEmployeeId", "isDeleted"], + where: { profileEmployeeId: _item.id, isDeleted: false }, order: { level: "DESC" }, }); @@ -2740,8 +2740,8 @@ export class ImportDataController extends Controller { }); const educationLevel = await this.profileEducationRepo.findOne({ - select: ["id", "level", "profileEmployeeId"], - where: { profileEmployeeId: _item.id }, + select: ["id", "level", "profileEmployeeId", "isDeleted"], + where: { profileEmployeeId: _item.id, isDeleted: false }, order: { level: "DESC" }, }); @@ -5799,7 +5799,7 @@ export class ImportDataController extends Controller { }, }); const eduLevel = await this.profileEducationRepo.findOne({ - where: { profileId: _item.id }, + where: { profileId: _item.id, isDeleted: false }, order: { startDate: "DESC", }, diff --git a/src/controllers/OrgChild1Controller.ts b/src/controllers/OrgChild1Controller.ts index 7ba65f60..6e44af05 100644 --- a/src/controllers/OrgChild1Controller.ts +++ b/src/controllers/OrgChild1Controller.ts @@ -204,6 +204,9 @@ export class OrgChild1Controller { child1.orgChild1Order = order == null || order.orgChild1Order == null ? 1 : order.orgChild1Order + 1; await this.child1Repository.save(child1, { data: request }); + // update ancestorDNA = id row + child1.ancestorDNA = child1.id; + await this.child1Repository.save(child1, { data: request }); setLogDataDiff(request, { before, after: child1 }); return new HttpSuccess(); } diff --git a/src/controllers/OrgChild2Controller.ts b/src/controllers/OrgChild2Controller.ts index b0ff4b88..28ce564f 100644 --- a/src/controllers/OrgChild2Controller.ts +++ b/src/controllers/OrgChild2Controller.ts @@ -164,6 +164,9 @@ export class OrgChild2Controller extends Controller { child2.orgChild2Order = order == null || order.orgChild2Order == null ? 1 : order.orgChild2Order + 1; await this.child2Repository.save(child2, { data: request }); + // update ancestorDNA = id row + child2.ancestorDNA = child2.id; + await this.child2Repository.save(child2, { data: request }); setLogDataDiff(request, { before, after: child2 }); return new HttpSuccess(); } diff --git a/src/controllers/OrgChild3Controller.ts b/src/controllers/OrgChild3Controller.ts index 3ba365ae..4ed10804 100644 --- a/src/controllers/OrgChild3Controller.ts +++ b/src/controllers/OrgChild3Controller.ts @@ -132,6 +132,9 @@ export class OrgChild3Controller { child3.orgChild3Order = order == null || order.orgChild3Order == null ? 1 : order.orgChild3Order + 1; await this.child3Repository.save(child3, { data: request }); + // update ancestorDNA = id row + child3.ancestorDNA = child3.id; + await this.child3Repository.save(child3, { data: request }); setLogDataDiff(request, { before, after: child3 }); return new HttpSuccess(); } diff --git a/src/controllers/OrgChild4Controller.ts b/src/controllers/OrgChild4Controller.ts index a43b7234..e18c15f9 100644 --- a/src/controllers/OrgChild4Controller.ts +++ b/src/controllers/OrgChild4Controller.ts @@ -163,6 +163,9 @@ export class OrgChild4Controller extends Controller { child4.orgChild4Order = order == null || order.orgChild4Order == null ? 1 : order.orgChild4Order + 1; await this.child4Repository.save(child4, { data: request }); + // update ancestorDNA = id row + child4.ancestorDNA = child4.id; + await this.child4Repository.save(child4, { data: request }); setLogDataDiff(request, { before, after: child4 }); return new HttpSuccess(); diff --git a/src/controllers/OrgRootController.ts b/src/controllers/OrgRootController.ts index 9e6e428f..45bf1436 100644 --- a/src/controllers/OrgRootController.ts +++ b/src/controllers/OrgRootController.ts @@ -203,6 +203,9 @@ export class OrgRootController extends Controller { orgRoot.lastUpdatedAt = new Date(); orgRoot.orgRootOrder = order == null || order.orgRootOrder == null ? 1 : order.orgRootOrder + 1; await this.orgRootRepository.save(orgRoot, { data: request }); + // update ancestorDNA = id row + orgRoot.ancestorDNA = orgRoot.id; + await this.orgRootRepository.save(orgRoot, { data: request }); setLogDataDiff(request, { before, after: orgRoot }); return new HttpSuccess(); diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index a4ef7ac6..d1b47518 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -53,11 +53,13 @@ import { } from "../keycloak"; // import { getPositionCounts, getCounts, getRootCounts } from "../services/OrganizationService"; import { + BatchSavePosMasterHistoryOfficer, CreatePosMasterHistoryEmployee, CreatePosMasterHistoryOfficer, + SavePosMasterHistoryOfficer, } from "../services/PositionService"; import { orgStructureCache } from "../utils/OrgStructureCache"; -import { OrgIdMapping, AllOrgMappings } from "../interfaces/OrgMapping"; +import { OrgIdMapping, AllOrgMappings, SavePosMasterHistory } from "../interfaces/OrgMapping"; @Route("api/v1/org") @Tags("Organization") @@ -7930,13 +7932,13 @@ export class OrganizationController extends Controller { const currentRevisionId = currentRevision.id; // ตรวจสอบว่ามี rootDnaId ในโครงสร้างร่าง และในโครงสร้างปัจจุบันหรือไม่ - const [orgRootDraft, orgRootCurrent] = await Promise.all([ + let [orgRootDraft, orgRootCurrent] = await Promise.all([ this.orgRootRepository.findOne({ where: { ancestorDNA: rootDnaId, orgRevisionId: drafRevisionId, }, - select: ["id"], + // select: ["id"], }), this.orgRootRepository.findOne({ where: { @@ -7948,8 +7950,23 @@ export class OrganizationController extends Controller { ]); if (!orgRootDraft) return new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลโครงสร้างร่าง"); + + // if current record not found, create new one + if (!orgRootCurrent) { + // Create new current record using draft's ID + const newCurrentRoot = queryRunner.manager.create(OrgRoot, { + ...orgRootDraft, + id: undefined, // Let database generate new ID + orgRevisionId: currentRevisionId, // Change to current revision + }); + + const savedRoot = await queryRunner.manager.save(OrgRoot, newCurrentRoot); + orgRootCurrent = savedRoot; // Use saved record for sync + } + // Part 1: Differential sync of organization structure (bottom-up) // Build mapping incrementally as we process each level + const allMappings: AllOrgMappings = { orgRoot: { byAncestorDNA: new Map(), byDraftId: new Map() }, orgChild1: { byAncestorDNA: new Map(), byDraftId: new Map() }, @@ -7964,16 +7981,39 @@ export class OrganizationController extends Controller { // Process from top (Root) to bottom (Child4) to handle foreign key constraints // OrgRoot (sync first - no parent dependencies) - const orgRootResult = await this.syncOrgLevel( - queryRunner, - OrgRoot, - this.orgRootRepository, - drafRevisionId, - currentRevisionId, - allMappings, - orgRootDraft?.id, - orgRootCurrent?.id, - ); + // If we manually created orgRootCurrent, skip syncOrgLevel and set up mapping directly + // to avoid double insert (syncOrgLevel would try to insert again because IDs don't match) + let orgRootResult: { + mapping: OrgIdMapping; + counts: { deleted: number; updated: number; inserted: number }; + }; + if ( + orgRootCurrent && + orgRootDraft && + orgRootCurrent.ancestorDNA === orgRootDraft.ancestorDNA + ) { + // Manually created - set up mapping directly + const rootMapping: OrgIdMapping = { + byAncestorDNA: new Map([[orgRootDraft.ancestorDNA, orgRootCurrent.id]]), + byDraftId: new Map([[orgRootDraft.id, orgRootCurrent.id]]), + }; + orgRootResult = { + mapping: rootMapping, + counts: { deleted: 0, updated: 0, inserted: 1 }, // Count as insert since we created it + }; + } else { + // Not manually created - use normal syncOrgLevel flow + orgRootResult = await this.syncOrgLevel( + queryRunner, + OrgRoot, + this.orgRootRepository, + drafRevisionId, + currentRevisionId, + allMappings, + orgRootDraft?.id, + orgRootCurrent?.id, + ); + } allMappings.orgRoot = orgRootResult.mapping; orgSyncStats.orgRoot = orgRootResult.counts; @@ -8061,9 +8101,28 @@ export class OrganizationController extends Controller { // Clear current_holderId for positions that will have new holders const nextHolderIds = posMasterDraft .filter((x) => x.next_holderId != null) - .map((x) => x.next_holderId); + .map((x) => x.next_holderId) as string[]; if (nextHolderIds.length > 0) { + // FIX: Fetch positions first before updating (to avoid race condition) + const posMastersToUpdate = await queryRunner.manager.find(PosMaster, { + where: { + orgRevisionId: currentRevisionId, + current_holderId: In(nextHolderIds), + }, + }); + + // Save history BEFORE clearing current_holderId + const historyOps = posMastersToUpdate + .filter((x) => x.orgRootId != orgRootCurrent?.id) + .map((pos) => ({ + posMasterDnaId: pos.ancestorDNA, + profileId: null, + pm: null, + })); + await BatchSavePosMasterHistoryOfficer(queryRunner, historyOps); + + // Now clear current_holderId await queryRunner.manager.update( PosMaster, { @@ -8110,6 +8169,13 @@ export class OrganizationController extends Controller { // Then delete posMaster records await queryRunner.manager.delete(PosMaster, toDeleteIds); + + const deleteHistoryOps = toDelete.map((pos) => ({ + posMasterDnaId: pos.ancestorDNA, + profileId: null, + pm: null, + })); + await BatchSavePosMasterHistoryOfficer(queryRunner, deleteHistoryOps); } // 2.4 Process draft positions (UPDATE or INSERT) @@ -8160,6 +8226,10 @@ export class OrganizationController extends Controller { }); toUpdate.push(current); + if (draftPos.next_holderId === null) { + await SavePosMasterHistoryOfficer(queryRunner, draftPos.ancestorDNA, null, null); + } + // Track mapping for position sync posMasterMapping.set(draftPos.id, [current.id, draftPos.next_holderId]); } else { @@ -8176,6 +8246,7 @@ export class OrganizationController extends Controller { current_holderId: draftPos.next_holderId, statusReport: "DONE", }); + toInsert.push(newPosMaster); } } @@ -8231,6 +8302,11 @@ export class OrganizationController extends Controller { console.error("Error moving draft to current:", error); await queryRunner.rollbackTransaction(); throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาดในการย้ายโครงสร้าง"); + } finally { + if (queryRunner.isTransactionActive) { + await queryRunner.rollbackTransaction(); + } + await queryRunner.release(); } } @@ -8499,107 +8575,6 @@ export class OrganizationController extends Controller { }; } - /** - * Helper function: Sync positions for a PosMaster - * Handles DELETE/UPDATE/INSERT for positions associated with a posMaster - * - * @deprecated Kept as fallback - use syncAllPositionsBatch for better performance - */ - private async syncPositionsForPosMaster( - queryRunner: any, - draftPosMasterId: string, - currentPosMasterId: string, - _draftRevisionId: string, - _currentRevisionId: string, - nextHolderId: string | null | undefined, - ): Promise<{ deleted: number; updated: number; inserted: number }> { - // Fetch draft and current positions for this posMaster - const [draftPositions, currentPositions] = await Promise.all([ - queryRunner.manager.find(Position, { - where: { - posMasterId: draftPosMasterId, - }, - order: { orderNo: "ASC" }, - }), - queryRunner.manager.find(Position, { - where: { - posMasterId: currentPosMasterId, - }, - }), - ]); - - // If no draft positions, delete all current positions - if (draftPositions.length === 0) { - if (currentPositions.length > 0) { - await queryRunner.manager.delete( - Position, - currentPositions.map((p: any) => p.id), - ); - } - return { deleted: currentPositions.length, updated: 0, inserted: 0 }; - } - - // Build maps for tracking - const currentByOrderNo = new Map(currentPositions.map((p: any) => [p.orderNo, p])); - - // DELETE: Current positions not in draft (by orderNo) - const draftOrderNos = new Set(draftPositions.map((p: any) => p.orderNo)); - const toDelete = currentPositions.filter((p: any) => !draftOrderNos.has(p.orderNo)); - - if (toDelete.length > 0) { - await queryRunner.manager.delete( - Position, - toDelete.map((p: any) => p.id), - ); - } - - // UPDATE and INSERT - let updatedCount = 0; - let insertedCount = 0; - for (const draftPos of draftPositions) { - const current: any = currentByOrderNo.get(draftPos.orderNo); - - if (current) { - // UPDATE existing position - await queryRunner.manager.update(Position, current.id, { - positionName: draftPos.positionName, - positionField: draftPos.positionField, - posTypeId: draftPos.posTypeId, - posLevelId: draftPos.posLevelId, - posExecutiveId: draftPos.posExecutiveId, - positionExecutiveField: draftPos.positionExecutiveField, - positionArea: draftPos.positionArea, - isSpecial: draftPos.isSpecial, - orderNo: draftPos.orderNo, - positionIsSelected: draftPos.positionIsSelected, - lastUpdateFullName: draftPos.lastUpdateFullName, - lastUpdatedAt: new Date(), - }); - updatedCount++; - } else { - // INSERT new position - const newPosition = queryRunner.manager.create(Position, { - ...draftPos, - id: undefined, - posMasterId: currentPosMasterId, - }); - await queryRunner.manager.save(newPosition); - insertedCount++; - } - - // update profile - if (nextHolderId != null && draftPos.positionIsSelected) { - await queryRunner.manager.update(Profile, nextHolderId, { - position: draftPos.positionName, - posTypeId: draftPos.posTypeId, - posLevelId: draftPos.posLevelId, - }); - } - } - - return { deleted: toDelete.length, updated: updatedCount, inserted: insertedCount }; - } - /** * Batch version: Sync positions for ALL posMasters in a single operation * This significantly reduces database round trips for large organizations @@ -8612,18 +8587,27 @@ export class OrganizationController extends Controller { ): Promise<{ deleted: number; updated: number; inserted: number }> { // Extract draft and current posMaster IDs const draftPosMasterIds = Array.from(posMasterMapping.keys()); - const currentPosMasterIds = Array.from(posMasterMapping.values()).map(([currentId]) => currentId); + const currentPosMasterIds = Array.from(posMasterMapping.values()).map( + ([currentId]) => currentId, + ); if (draftPosMasterIds.length === 0) { return { deleted: 0, updated: 0, inserted: 0 }; } + // Fetch draft PosMasters with relations for history tracking + const draftPosMasters = await queryRunner.manager.find(PosMaster, { + where: { id: In(draftPosMasterIds) }, + relations: ["orgRoot", "orgChild1", "orgChild2", "orgChild3", "orgChild4", "next_holder"], + }); + // Fetch ALL positions for ALL posMasters in just 2 queries const [allDraftPositions, allCurrentPositions] = await Promise.all([ queryRunner.manager.find(Position, { where: { posMasterId: In(draftPosMasterIds), }, + relations: ["posType", "posLevel", "posExecutive"], order: { orderNo: "ASC" }, }), queryRunner.manager.find(Position, { @@ -8652,10 +8636,21 @@ export class OrganizationController extends Controller { // Collect all operations const allToDelete: string[] = []; + const allToDeleteHistory: string[] = []; const allToUpdate: Array<{ id: string; data: any }> = []; const allToInsert: Array = []; const profileUpdates: Map = new Map(); + // Create a map for quick lookup of draft PosMasters with relations + const draftPosMasterMap = new Map(draftPosMasters.map((pm: PosMaster) => [pm.id, pm])); + + // Collect PosMasterHistory calls for selected positions + const historyCalls: Array<{ + ancestorDNA: string; + profileId: string | null; + historyData: SavePosMasterHistory; + }> = []; + // Process each posMaster mapping for (const [draftPosMasterId, [currentPosMasterId, nextHolderId]] of posMasterMapping) { const draftPositions = draftPositionsByMaster.get(draftPosMasterId) || []; @@ -8664,6 +8659,7 @@ export class OrganizationController extends Controller { // If no draft positions, mark all current positions for deletion if (draftPositions.length === 0) { allToDelete.push(...currentPositions.map((p: any) => p.id)); + allToDeleteHistory.push(...currentPositions.map((p: any) => p.ancestorDNA)); continue; } @@ -8675,6 +8671,7 @@ export class OrganizationController extends Controller { for (const currentPos of currentPositions) { if (!draftOrderNos.has(currentPos.orderNo)) { allToDelete.push(currentPos.id); + allToDeleteHistory.push(currentPos.ancestorDNA); } } @@ -8717,6 +8714,44 @@ export class OrganizationController extends Controller { posTypeId: draftPos.posTypeId, posLevelId: draftPos.posLevelId, }); + + // Collect history data for the selected position + const draftPosMaster = draftPosMasterMap.get(draftPosMasterId) as any; + if (draftPosMaster && draftPosMaster.ancestorDNA) { + // Find the selected position from draft positions + const selectedPos = + draftPositions.find((p) => p.positionIsSelected === true) || draftPos; + historyCalls.push({ + ancestorDNA: draftPosMaster.ancestorDNA, + profileId: nextHolderId, + historyData: { + prefix: draftPosMaster.next_holder?.prefix ?? null, + firstName: draftPosMaster.next_holder?.firstName ?? null, + lastName: draftPosMaster.next_holder?.lastName ?? null, + position: selectedPos.positionName ?? null, + posType: (selectedPos as any).posType?.posTypeName ?? null, + posLevel: (selectedPos as any).posLevel?.posLevelName ?? null, + posExecutive: (selectedPos as any).posExecutive?.posExecutiveName ?? null, + profileId: nextHolderId, + rootDnaId: draftPosMaster.orgRoot?.ancestorDNA ?? null, + child1DnaId: draftPosMaster.orgChild1?.ancestorDNA ?? null, + child2DnaId: draftPosMaster.orgChild2?.ancestorDNA ?? null, + child3DnaId: draftPosMaster.orgChild3?.ancestorDNA ?? null, + child4DnaId: draftPosMaster.orgChild4?.ancestorDNA ?? null, + shortName: + [ + draftPosMaster.orgChild4?.orgChild4ShortName, + draftPosMaster.orgChild3?.orgChild3ShortName, + draftPosMaster.orgChild2?.orgChild2ShortName, + draftPosMaster.orgChild1?.orgChild1ShortName, + draftPosMaster.orgRoot?.orgRootShortName, + ].find((s) => typeof s === "string" && s.trim().length > 0) ?? null, + posMasterNoPrefix: draftPosMaster.posMasterNoPrefix ?? null, + posMasterNo: draftPosMaster.posMasterNo ?? null, + posMasterNoSuffix: draftPosMaster.posMasterNoSuffix ?? null, + }, + }); + } } } } @@ -8729,16 +8764,22 @@ export class OrganizationController extends Controller { // Bulk DELETE if (allToDelete.length > 0) { await queryRunner.manager.delete(Position, allToDelete); + const deleteOps = allToDeleteHistory.map((ancestorDNA) => ({ + posMasterDnaId: ancestorDNA, + profileId: null, + pm: null, + })); + await BatchSavePosMasterHistoryOfficer(queryRunner, deleteOps); deletedCount = allToDelete.length; } - // Bulk UPDATE (batch by 500 to avoid query size limits) + // Bulk UPDATE (batch by 100 to avoid query size limits) if (allToUpdate.length > 0) { - const batchSize = 500; + const batchSize = 100; for (let i = 0; i < allToUpdate.length; i += batchSize) { const batch = allToUpdate.slice(i, i + batchSize); await Promise.all( - batch.map(({ id, data }) => queryRunner.manager.update(Position, id, data)) + batch.map(({ id, data }) => queryRunner.manager.update(Position, id, data)), ); } updatedCount = allToUpdate.length; @@ -8746,7 +8787,7 @@ export class OrganizationController extends Controller { // Bulk INSERT if (allToInsert.length > 0) { - const batchSize = 500; + const batchSize = 100; for (let i = 0; i < allToInsert.length; i += batchSize) { const batch = allToInsert.slice(i, i + batchSize); await queryRunner.manager.save(Position, batch); @@ -8759,8 +8800,20 @@ export class OrganizationController extends Controller { const profileUpdateEntries = Array.from(profileUpdates.entries()); await Promise.all( profileUpdateEntries.map(([profileId, data]) => - queryRunner.manager.update(Profile, profileId, data) - ) + queryRunner.manager.update(Profile, profileId, data), + ), + ); + } + + // Save PosMasterHistory for updated positions + if (historyCalls.length > 0) { + await BatchSavePosMasterHistoryOfficer( + queryRunner, + historyCalls.map(({ ancestorDNA, profileId, historyData }) => ({ + posMasterDnaId: ancestorDNA, + profileId, + pm: historyData, + })), ); } diff --git a/src/controllers/OrganizationDotnetController.ts b/src/controllers/OrganizationDotnetController.ts index 16566685..8f5dd6ac 100644 --- a/src/controllers/OrganizationDotnetController.ts +++ b/src/controllers/OrganizationDotnetController.ts @@ -1359,7 +1359,7 @@ export class OrganizationDotnetController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); @@ -1542,7 +1542,7 @@ export class OrganizationDotnetController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); @@ -2379,7 +2379,7 @@ export class OrganizationDotnetController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); @@ -2694,7 +2694,7 @@ export class OrganizationDotnetController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); @@ -7441,7 +7441,7 @@ export class OrganizationDotnetController extends Controller { : []; const profileEducations = await this.educationRepo.find({ - where: { profileEmployeeId: profile!.id }, + where: { profileEmployeeId: profile!.id, isDeleted: false }, order: { level: "ASC" }, }); _educations = profileEducations.length > 0 @@ -7581,7 +7581,7 @@ export class OrganizationDotnetController extends Controller { : []; const profileEducations = await this.educationRepo.find({ - where: { profileId: profile!.id }, + where: { profileId: profile!.id, isDeleted: false }, order: { level: "ASC" }, }); _educations = profileEducations.length > 0 diff --git a/src/controllers/OrganizationUnauthorizeController.ts b/src/controllers/OrganizationUnauthorizeController.ts index d2ec617d..deaa1f35 100644 --- a/src/controllers/OrganizationUnauthorizeController.ts +++ b/src/controllers/OrganizationUnauthorizeController.ts @@ -423,6 +423,7 @@ export class OrganizationUnauthorizeController extends Controller { year: body.year.toString(), pointSum: MoreThanOrEqual(90), period: body.period.toLocaleUpperCase(), + isDeleted: false } } ); @@ -884,6 +885,7 @@ export class OrganizationUnauthorizeController extends Controller { year: body.year.toString(), pointSum: MoreThanOrEqual(90), period: body.period.toLocaleUpperCase(), + isDeleted: false } } ); @@ -1088,7 +1090,7 @@ export class OrganizationUnauthorizeController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); @@ -1403,7 +1405,7 @@ export class OrganizationUnauthorizeController extends Controller { order: { commandDateAffect: "DESC" }, }), this.insigniaRepo.findOne({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { receiveDate: "DESC" }, }), ]); diff --git a/src/controllers/PosMasterActController.ts b/src/controllers/PosMasterActController.ts index 179b4791..b6e09e5b 100644 --- a/src/controllers/PosMasterActController.ts +++ b/src/controllers/PosMasterActController.ts @@ -715,6 +715,7 @@ export class PosMasterActController extends Controller { "lastUpdateFullName", "lastUpdatedAt", "dateEnd", + "isDeleted" ], where: { profileId, status: true, isDeleted: false }, }); diff --git a/src/controllers/ProfileAbilityController.ts b/src/controllers/ProfileAbilityController.ts index 0fd2c117..c8012057 100644 --- a/src/controllers/ProfileAbilityController.ts +++ b/src/controllers/ProfileAbilityController.ts @@ -40,7 +40,7 @@ export class ProfileAbilityController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { @@ -55,7 +55,7 @@ export class ProfileAbilityController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { diff --git a/src/controllers/ProfileAbilityEmployeeController.ts b/src/controllers/ProfileAbilityEmployeeController.ts index 3ac38706..d7ba3ae9 100644 --- a/src/controllers/ProfileAbilityEmployeeController.ts +++ b/src/controllers/ProfileAbilityEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileAbilityEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { @@ -58,7 +58,7 @@ export class ProfileAbilityEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { diff --git a/src/controllers/ProfileAbilityEmployeeTempController.ts b/src/controllers/ProfileAbilityEmployeeTempController.ts index 0c0b3723..624c8ded 100644 --- a/src/controllers/ProfileAbilityEmployeeTempController.ts +++ b/src/controllers/ProfileAbilityEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileAbilityEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { @@ -57,7 +57,7 @@ export class ProfileAbilityEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const getProfileAbilityId = await this.profileAbilityRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAbilityId) { diff --git a/src/controllers/ProfileAssessmentsController.ts b/src/controllers/ProfileAssessmentsController.ts index f8ca30e0..53906cb2 100644 --- a/src/controllers/ProfileAssessmentsController.ts +++ b/src/controllers/ProfileAssessmentsController.ts @@ -41,7 +41,7 @@ export class ProfileAssessmentsController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssessments = await this.profileAssessmentsRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssessments) { @@ -59,7 +59,7 @@ export class ProfileAssessmentsController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const getProfileAssessments = await this.profileAssessmentsRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssessments) { diff --git a/src/controllers/ProfileAssessmentsEmployeeController.ts b/src/controllers/ProfileAssessmentsEmployeeController.ts index 26127f3e..0f7f3d81 100644 --- a/src/controllers/ProfileAssessmentsEmployeeController.ts +++ b/src/controllers/ProfileAssessmentsEmployeeController.ts @@ -41,7 +41,7 @@ export class ProfileAssessmentsEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssessments = await this.profileAssessmentsRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssessments) { @@ -61,6 +61,7 @@ export class ProfileAssessmentsEmployeeController extends Controller { const getProfileAssessments = await this.profileAssessmentsRepository.find({ where: { profileEmployeeId: profileEmployeeId, + isDeleted: false }, order: { createdAt: "ASC" }, }); diff --git a/src/controllers/ProfileAssessmentsEmployeeTempController.ts b/src/controllers/ProfileAssessmentsEmployeeTempController.ts index 2aa62ff7..b6bc45e6 100644 --- a/src/controllers/ProfileAssessmentsEmployeeTempController.ts +++ b/src/controllers/ProfileAssessmentsEmployeeTempController.ts @@ -41,7 +41,7 @@ export class ProfileAssessmentsEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssessments = await this.profileAssessmentsRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssessments) { @@ -60,6 +60,7 @@ export class ProfileAssessmentsEmployeeTempController extends Controller { const getProfileAssessments = await this.profileAssessmentsRepository.find({ where: { profileEmployeeId: profileEmployeeId, + isDeleted: false }, order: { createdAt: "ASC" }, }); diff --git a/src/controllers/ProfileAssistanceController.ts b/src/controllers/ProfileAssistanceController.ts index abff2a9f..3690f5e6 100644 --- a/src/controllers/ProfileAssistanceController.ts +++ b/src/controllers/ProfileAssistanceController.ts @@ -40,7 +40,7 @@ export class ProfileAssistanceController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { @@ -55,7 +55,7 @@ export class ProfileAssistanceController extends Controller { // if (_workflow == false) // await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { diff --git a/src/controllers/ProfileAssistanceEmployeeController.ts b/src/controllers/ProfileAssistanceEmployeeController.ts index cbd816b9..88617322 100644 --- a/src/controllers/ProfileAssistanceEmployeeController.ts +++ b/src/controllers/ProfileAssistanceEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileAssistanceEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { @@ -58,7 +58,7 @@ export class ProfileAssistanceEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { diff --git a/src/controllers/ProfileAssistanceEmployeeTempController.ts b/src/controllers/ProfileAssistanceEmployeeTempController.ts index 534dafa2..da37c3a5 100644 --- a/src/controllers/ProfileAssistanceEmployeeTempController.ts +++ b/src/controllers/ProfileAssistanceEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileAssistanceEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { @@ -57,7 +57,7 @@ export class ProfileAssistanceEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const getProfileAssistanceId = await this.profileAssistanceRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); if (!getProfileAssistanceId) { diff --git a/src/controllers/ProfileCertificateController.ts b/src/controllers/ProfileCertificateController.ts index 88d5c492..5cbc019a 100644 --- a/src/controllers/ProfileCertificateController.ts +++ b/src/controllers/ProfileCertificateController.ts @@ -40,7 +40,7 @@ export class ProfileCertificateController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.certificateRepo.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -52,7 +52,7 @@ export class ProfileCertificateController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const record = await this.certificateRepo.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileCertificateEmployeeController.ts b/src/controllers/ProfileCertificateEmployeeController.ts index fb6474e0..6bb4c1df 100644 --- a/src/controllers/ProfileCertificateEmployeeController.ts +++ b/src/controllers/ProfileCertificateEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileCertificateEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.certificateRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -52,7 +52,7 @@ export class ProfileCertificateEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const record = await this.certificateRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileCertificateEmployeeTempController.ts b/src/controllers/ProfileCertificateEmployeeTempController.ts index 20ec902b..f5619023 100644 --- a/src/controllers/ProfileCertificateEmployeeTempController.ts +++ b/src/controllers/ProfileCertificateEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileCertificateEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.certificateRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -51,7 +51,7 @@ export class ProfileCertificateEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const record = await this.certificateRepo.find({ - where: { profileEmployeeId }, + where: { profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileChangeNameController.ts b/src/controllers/ProfileChangeNameController.ts index 92ce5350..5b772f12 100644 --- a/src/controllers/ProfileChangeNameController.ts +++ b/src/controllers/ProfileChangeNameController.ts @@ -41,7 +41,7 @@ export class ProfileChangeNameController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.changeNameRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -53,7 +53,7 @@ export class ProfileChangeNameController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.changeNameRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileChangeNameEmployeeController.ts b/src/controllers/ProfileChangeNameEmployeeController.ts index 51ff0b8e..547368e1 100644 --- a/src/controllers/ProfileChangeNameEmployeeController.ts +++ b/src/controllers/ProfileChangeNameEmployeeController.ts @@ -41,7 +41,7 @@ export class ProfileChangeNameEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.changeNameRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -53,7 +53,7 @@ export class ProfileChangeNameEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const lists = await this.changeNameRepository.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileChangeNameEmployeeTempController.ts b/src/controllers/ProfileChangeNameEmployeeTempController.ts index 152279d6..f7a141f7 100644 --- a/src/controllers/ProfileChangeNameEmployeeTempController.ts +++ b/src/controllers/ProfileChangeNameEmployeeTempController.ts @@ -41,7 +41,7 @@ export class ProfileChangeNameEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.changeNameRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -52,7 +52,7 @@ export class ProfileChangeNameEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.changeNameRepository.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileChildrenController.ts b/src/controllers/ProfileChildrenController.ts index 27075758..577b6781 100644 --- a/src/controllers/ProfileChildrenController.ts +++ b/src/controllers/ProfileChildrenController.ts @@ -41,7 +41,7 @@ export class ProfileChildrenController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.childrenRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -53,7 +53,7 @@ export class ProfileChildrenController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.childrenRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileChildrenEmployeeController.ts b/src/controllers/ProfileChildrenEmployeeController.ts index a8792e7b..7a0cd772 100644 --- a/src/controllers/ProfileChildrenEmployeeController.ts +++ b/src/controllers/ProfileChildrenEmployeeController.ts @@ -41,7 +41,7 @@ export class ProfileChildrenEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.childrenRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -53,7 +53,7 @@ export class ProfileChildrenEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const lists = await this.childrenRepository.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileChildrenEmployeeTempController.ts b/src/controllers/ProfileChildrenEmployeeTempController.ts index 4ee31e5f..2134e954 100644 --- a/src/controllers/ProfileChildrenEmployeeTempController.ts +++ b/src/controllers/ProfileChildrenEmployeeTempController.ts @@ -41,7 +41,7 @@ export class ProfileChildrenEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.childrenRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -52,7 +52,7 @@ export class ProfileChildrenEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.childrenRepository.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 41fe95e7..14a77d7f 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -322,8 +322,8 @@ export class ProfileController extends Controller { ]; const educations = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { level: "ASC" }, }); const Education = @@ -575,8 +575,8 @@ export class ProfileController extends Controller { let _child4 = child4?.orgChild4Name; const cert_raw = await this.certificateRepository.find({ - where: { profileId: id }, - select: ["certificateType", "issuer", "certificateNo", "issueDate"], + select: ["certificateType", "issuer", "certificateNo", "issueDate", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const certs = @@ -596,8 +596,8 @@ export class ProfileController extends Controller { }, ]; const training_raw = await this.trainingRepository.find({ - select: ["startDate", "endDate", "place", "department", "name"], - where: { profileId: id }, + select: ["startDate", "endDate", "place", "department", "name", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const trainings = @@ -633,8 +633,8 @@ export class ProfileController extends Controller { ]; const discipline_raw = await this.disciplineRepository.find({ - select: ["refCommandDate", "refCommandNo", "detail"], - where: { profileId: id }, + select: ["refCommandDate", "refCommandNo", "detail", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const disciplines = @@ -655,8 +655,8 @@ export class ProfileController extends Controller { ]; const education_raw = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileId: id, isDeleted: false }, // order: { lastUpdatedAt: "DESC" }, order: { level: "ASC" }, }); @@ -756,7 +756,7 @@ export class ProfileController extends Controller { insigniaType: true, }, }, - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { receiveDate: "ASC" }, }); const insignias = @@ -796,7 +796,7 @@ export class ProfileController extends Controller { const leave_raw = await this.profileLeaveRepository.find({ relations: { leaveType: true }, - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { dateLeaveStart: "ASC" }, }); const leaves = @@ -1052,8 +1052,8 @@ export class ProfileController extends Controller { let _child4 = child4?.orgChild4Name; const cert_raw = await this.certificateRepository.find({ - where: { profileId: id }, - select: ["certificateType", "issuer", "certificateNo", "issueDate", "expireDate"], + select: ["certificateType", "issuer", "certificateNo", "issueDate", "expireDate", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const certs = @@ -1087,8 +1087,8 @@ export class ProfileController extends Controller { }, ]; const training_raw = await this.trainingRepository.find({ - select: ["place", "department", "name", "duration"], - where: { profileId: id }, + select: ["place", "department", "name", "duration", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const trainings = @@ -1109,8 +1109,8 @@ export class ProfileController extends Controller { ]; const discipline_raw = await this.disciplineRepository.find({ - select: ["refCommandDate", "refCommandNo", "detail", "level"], - where: { profileId: id }, + select: ["refCommandDate", "refCommandNo", "detail", "level", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const disciplines = @@ -1135,6 +1135,7 @@ export class ProfileController extends Controller { const education_raw = await this.profileEducationRepo .createQueryBuilder("education") .where("education.profileId = :profileId", { profileId: id }) + .andWhere("education.isDeleted = :isDeleted", { isDeleted: false }) .orderBy("CASE WHEN education.isEducation = true THEN 1 ELSE 2 END", "ASC") .addOrderBy("education.level", "ASC") .getMany(); @@ -1245,13 +1246,14 @@ export class ProfileController extends Controller { "page", "refCommandDate", "note", + "isDeleted" ], relations: { insignia: { insigniaType: true, }, }, - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { receiveDate: "ASC" }, }); const insignias = @@ -1294,6 +1296,7 @@ export class ProfileController extends Controller { .createQueryBuilder("profileLeave") .leftJoinAndSelect("profileLeave.leaveType", "leaveType") .select([ + "profileLeave.isDeleted", "profileLeave.leaveTypeId", "leaveType.name as name", "leaveType.code as code", @@ -1303,6 +1306,7 @@ export class ProfileController extends Controller { ]) .addSelect("SUM(profileLeave.leaveDays)", "totalLeaveDays") .where("profileLeave.profileId = :profileId", { profileId: id }) + .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("profileLeave.status = :status", { status: "approve" }) .groupBy("profileLeave.leaveTypeId") .orderBy("code", "ASC") @@ -1354,6 +1358,7 @@ export class ProfileController extends Controller { .createQueryBuilder("profileLeave") .leftJoinAndSelect("profileLeave.leaveType", "leaveType") .select([ + "profileLeave.isDeleted AS isDeleted", "profileLeave.dateLeaveStart AS dateLeaveStart", "profileLeave.dateLeaveEnd AS dateLeaveEnd", "profileLeave.leaveDays AS leaveDays", @@ -1361,6 +1366,7 @@ export class ProfileController extends Controller { "leaveType.name as name", ]) .where("profileLeave.profileId = :profileId", { profileId: id }) + .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("leaveType.code IN (:...codes)", { codes: ["LV-008", "LV-009", "LV-010"] }) .andWhere("profileLeave.status = :status", { status: "approve" }) .orderBy("leaveType.code", "ASC") @@ -1387,7 +1393,7 @@ export class ProfileController extends Controller { }, ]; const children_raw = await this.profileChildrenRepository.find({ - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, }); const children = children_raw.length > 0 @@ -1410,7 +1416,7 @@ export class ProfileController extends Controller { }, ]; const changeName_raw = await this.changeNameRepository.find({ - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const changeName = @@ -1504,13 +1510,13 @@ export class ProfileController extends Controller { ]; const actposition_raw = await this.profileActpositionRepo.find({ - select: ["dateStart", "dateEnd", "position"], + select: ["dateStart", "dateEnd", "position", "isDeleted"], where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const assistance_raw = await this.profileAssistanceRepository.find({ - select: ["dateStart", "dateEnd", "commandName", "agency", "document"], - where: { profileId: id }, + select: ["dateStart", "dateEnd", "commandName", "agency", "document", "isDeleted"], + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); @@ -1566,7 +1572,7 @@ export class ProfileController extends Controller { ]; const actposition = [..._actposition, ..._assistance]; const duty_raw = await this.dutyRepository.find({ - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const duty = @@ -1593,7 +1599,7 @@ export class ProfileController extends Controller { }, ]; const assessments_raw = await this.profileAssessmentsRepository.find({ - where: { profileId: id }, + where: { profileId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const assessments = @@ -9093,7 +9099,7 @@ export class ProfileController extends Controller { )?.posMasterNo; const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileId: item.id }, + where: { profileId: item.id, isDeleted: false }, order: { level: "ASC" }, }); @@ -11106,7 +11112,7 @@ export class ProfileController extends Controller { } const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileId: item.id }, + where: { profileId: item.id, isDeleted: false }, order: { level: "ASC" }, }); diff --git a/src/controllers/ProfileDisciplineController.ts b/src/controllers/ProfileDisciplineController.ts index 9edfd89d..e7ec5a94 100644 --- a/src/controllers/ProfileDisciplineController.ts +++ b/src/controllers/ProfileDisciplineController.ts @@ -40,7 +40,7 @@ export class ProfileDisciplineController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.disciplineRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -52,7 +52,7 @@ export class ProfileDisciplineController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.disciplineRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -63,7 +63,7 @@ export class ProfileDisciplineController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_SALARY_OFFICER"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_SALARY_OFFICER"); const lists = await this.disciplineRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileDisciplineEmployeeController.ts b/src/controllers/ProfileDisciplineEmployeeController.ts index efb3842b..22dd3f24 100644 --- a/src/controllers/ProfileDisciplineEmployeeController.ts +++ b/src/controllers/ProfileDisciplineEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileDisciplineEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -52,7 +52,7 @@ export class ProfileDisciplineEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileId); const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -63,7 +63,7 @@ export class ProfileDisciplineEmployeeController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_WAGE"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_WAGE"); const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileDisciplineEmployeeTempController.ts b/src/controllers/ProfileDisciplineEmployeeTempController.ts index b408dfe1..b1100ab2 100644 --- a/src/controllers/ProfileDisciplineEmployeeTempController.ts +++ b/src/controllers/ProfileDisciplineEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileDisciplineEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -51,7 +51,7 @@ export class ProfileDisciplineEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -62,7 +62,7 @@ export class ProfileDisciplineEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_WAGE"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_WAGE"); const lists = await this.disciplineRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileDutyController.ts b/src/controllers/ProfileDutyController.ts index 36aee9ea..43161383 100644 --- a/src/controllers/ProfileDutyController.ts +++ b/src/controllers/ProfileDutyController.ts @@ -36,7 +36,7 @@ export class ProfileDutyController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.dutyRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -48,7 +48,7 @@ export class ProfileDutyController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.dutyRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileDutyEmployeeController.ts b/src/controllers/ProfileDutyEmployeeController.ts index 811ce550..82a3e9b4 100644 --- a/src/controllers/ProfileDutyEmployeeController.ts +++ b/src/controllers/ProfileDutyEmployeeController.ts @@ -36,7 +36,7 @@ export class ProfileDutyEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.dutyRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -48,7 +48,7 @@ export class ProfileDutyEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileId); const lists = await this.dutyRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileDutyEmployeeTempController.ts b/src/controllers/ProfileDutyEmployeeTempController.ts index 31e83d27..09f8f843 100644 --- a/src/controllers/ProfileDutyEmployeeTempController.ts +++ b/src/controllers/ProfileDutyEmployeeTempController.ts @@ -36,7 +36,7 @@ export class ProfileDutyEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.dutyRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -47,7 +47,7 @@ export class ProfileDutyEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.dutyRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileEducationsController.ts b/src/controllers/ProfileEducationsController.ts index 43843960..e9013eea 100644 --- a/src/controllers/ProfileEducationsController.ts +++ b/src/controllers/ProfileEducationsController.ts @@ -42,7 +42,7 @@ export class ProfileEducationsController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { @@ -57,7 +57,7 @@ export class ProfileEducationsController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { diff --git a/src/controllers/ProfileEducationsEmployeeController.ts b/src/controllers/ProfileEducationsEmployeeController.ts index cde8c6ec..c81a7309 100644 --- a/src/controllers/ProfileEducationsEmployeeController.ts +++ b/src/controllers/ProfileEducationsEmployeeController.ts @@ -42,7 +42,7 @@ export class ProfileEducationsEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { @@ -60,7 +60,7 @@ export class ProfileEducationsEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { diff --git a/src/controllers/ProfileEducationsEmployeeTempController.ts b/src/controllers/ProfileEducationsEmployeeTempController.ts index e90dfc1c..a63c88f7 100644 --- a/src/controllers/ProfileEducationsEmployeeTempController.ts +++ b/src/controllers/ProfileEducationsEmployeeTempController.ts @@ -42,7 +42,7 @@ export class ProfileEducationsEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { @@ -59,7 +59,7 @@ export class ProfileEducationsEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const getProfileEducation = await this.profileEducationRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { level: "ASC" }, }); if (!getProfileEducation) { diff --git a/src/controllers/ProfileEmployeeController.ts b/src/controllers/ProfileEmployeeController.ts index e87adcac..6b2e6688 100644 --- a/src/controllers/ProfileEmployeeController.ts +++ b/src/controllers/ProfileEmployeeController.ts @@ -317,8 +317,8 @@ export class ProfileEmployeeController extends Controller { ]; const educations = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileEmployeeId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { level: "ASC" }, }); const Education = @@ -571,8 +571,8 @@ export class ProfileEmployeeController extends Controller { let _child4 = child4?.orgChild4Name; const cert_raw = await this.certificateRepository.find({ - where: { profileEmployeeId: id }, - select: ["certificateType", "issuer", "certificateNo", "issueDate"], + select: ["certificateType", "issuer", "certificateNo", "issueDate", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const certs = @@ -592,8 +592,8 @@ export class ProfileEmployeeController extends Controller { }, ]; const training_raw = await this.trainingRepository.find({ - select: ["startDate", "endDate", "place", "department"], - where: { profileEmployeeId: id }, + select: ["startDate", "endDate", "place", "department", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const trainings = @@ -629,8 +629,8 @@ export class ProfileEmployeeController extends Controller { ]; const discipline_raw = await this.disciplineRepository.find({ - select: ["refCommandDate", "refCommandNo", "detail"], - where: { profileEmployeeId: id }, + select: ["refCommandDate", "refCommandNo", "detail", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const disciplines = @@ -651,8 +651,8 @@ export class ProfileEmployeeController extends Controller { ]; const education_raw = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileEmployeeId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, // order: { lastUpdatedAt: "DESC" }, order: { level: "ASC" }, }); @@ -752,7 +752,7 @@ export class ProfileEmployeeController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { receiveDate: "ASC" }, }); const insignias = @@ -792,7 +792,7 @@ export class ProfileEmployeeController extends Controller { const leave_raw = await this.profileLeaveRepository.find({ relations: { leaveType: true }, - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { dateLeaveStart: "ASC" }, }); const leaves = @@ -1048,8 +1048,8 @@ export class ProfileEmployeeController extends Controller { let _child4 = child4?.orgChild4Name; const cert_raw = await this.certificateRepository.find({ - where: { profileEmployeeId: id }, - select: ["certificateType", "issuer", "certificateNo", "issueDate", "expireDate"], + select: ["certificateType", "issuer", "certificateNo", "issueDate", "expireDate", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const certs = @@ -1083,8 +1083,8 @@ export class ProfileEmployeeController extends Controller { }, ]; const training_raw = await this.trainingRepository.find({ - select: ["place", "department", "name", "duration"], - where: { profileEmployeeId: id }, + select: ["place", "department", "name", "duration", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const trainings = @@ -1105,8 +1105,8 @@ export class ProfileEmployeeController extends Controller { ]; const discipline_raw = await this.disciplineRepository.find({ - select: ["refCommandDate", "refCommandNo", "detail", "level"], - where: { profileEmployeeId: id }, + select: ["refCommandDate", "refCommandNo", "detail", "level", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const disciplines = @@ -1131,6 +1131,7 @@ export class ProfileEmployeeController extends Controller { const education_raw = await this.profileEducationRepo .createQueryBuilder("education") .where("education.profileEmployeeId = :profileId", { profileId: id }) + .andWhere("education.isDeleted = :isDeleted", { isDeleted: false }) .orderBy("CASE WHEN education.isEducation = true THEN 1 ELSE 2 END", "ASC") .addOrderBy("education.level", "ASC") .getMany(); @@ -1241,13 +1242,14 @@ export class ProfileEmployeeController extends Controller { "page", "refCommandDate", "note", + "isDeleted" ], relations: { insignia: { insigniaType: true, }, }, - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { receiveDate: "ASC" }, }); const insignias = @@ -1290,6 +1292,7 @@ export class ProfileEmployeeController extends Controller { .createQueryBuilder("profileLeave") .leftJoinAndSelect("profileLeave.leaveType", "leaveType") .select([ + "profileLeave.isDeleted", "profileLeave.leaveTypeId", "leaveType.name as name", "leaveType.code as code", @@ -1299,6 +1302,7 @@ export class ProfileEmployeeController extends Controller { ]) .addSelect("SUM(profileLeave.leaveDays)", "totalLeaveDays") .where("profileLeave.profileEmployeeId = :profileId", { profileId: id }) + .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("profileLeave.status = :status", { status: "approve" }) .groupBy("profileLeave.leaveTypeId") .orderBy("code", "ASC") @@ -1350,6 +1354,7 @@ export class ProfileEmployeeController extends Controller { .createQueryBuilder("profileLeave") .leftJoinAndSelect("profileLeave.leaveType", "leaveType") .select([ + "profileLeave.isDeleted AS isDeleted", "profileLeave.dateLeaveStart AS dateLeaveStart", "profileLeave.dateLeaveEnd AS dateLeaveEnd", "profileLeave.leaveDays AS leaveDays", @@ -1357,6 +1362,7 @@ export class ProfileEmployeeController extends Controller { "leaveType.name as name", ]) .where("profileLeave.profileEmployeeId = :profileId", { profileId: id }) + .andWhere("profileLeave.isDeleted = :isDeleted", { isDeleted: false }) .andWhere("leaveType.code IN (:...codes)", { codes: ["LV-008", "LV-009", "LV-010"] }) .andWhere("profileLeave.status = :status", { status: "approve" }) .orderBy("leaveType.code", "ASC") @@ -1383,7 +1389,7 @@ export class ProfileEmployeeController extends Controller { }, ]; const children_raw = await this.profileChildrenRepository.find({ - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, }); const children = children_raw.length > 0 @@ -1406,7 +1412,7 @@ export class ProfileEmployeeController extends Controller { }, ]; const changeName_raw = await this.changeNameRepository.find({ - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const changeName = @@ -1500,13 +1506,13 @@ export class ProfileEmployeeController extends Controller { ]; const actposition_raw = await this.profileActpositionRepo.find({ - select: ["dateStart", "dateEnd", "position"], + select: ["dateStart", "dateEnd", "position", "isDeleted"], where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const assistance_raw = await this.profileAssistanceRepository.find({ - select: ["dateStart", "dateEnd", "commandName", "agency", "document"], - where: { profileEmployeeId: id }, + select: ["dateStart", "dateEnd", "commandName", "agency", "document", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); @@ -1562,7 +1568,7 @@ export class ProfileEmployeeController extends Controller { ]; const actposition = [..._actposition, ..._assistance]; const duty_raw = await this.dutyRepository.find({ - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const duty = @@ -1589,7 +1595,7 @@ export class ProfileEmployeeController extends Controller { }, ]; const assessments_raw = await this.profileAssessmentsRepository.find({ - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const assessments = @@ -3854,7 +3860,7 @@ export class ProfileEmployeeController extends Controller { )?.posMasterNo; const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileEmployeeId: item.id }, + where: { profileEmployeeId: item.id, isDeleted: false }, order: { level: "ASC" }, }); @@ -5953,7 +5959,7 @@ export class ProfileEmployeeController extends Controller { } const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileEmployeeId: item.id }, + where: { profileEmployeeId: item.id, isDeleted: false }, order: { level: "ASC" }, }); diff --git a/src/controllers/ProfileEmployeeTempController.ts b/src/controllers/ProfileEmployeeTempController.ts index efe59ca2..096b3190 100644 --- a/src/controllers/ProfileEmployeeTempController.ts +++ b/src/controllers/ProfileEmployeeTempController.ts @@ -289,8 +289,8 @@ export class ProfileEmployeeTempController extends Controller { }, ]; const educations = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileEmployeeId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { level: "ASC" }, }); const Education = @@ -547,8 +547,8 @@ export class ProfileEmployeeTempController extends Controller { let _child4 = child4?.orgChild4Name; const cert_raw = await this.certificateRepository.find({ - where: { profileEmployeeId: id }, - select: ["certificateType", "issuer", "certificateNo", "issueDate"], + select: ["certificateType", "issuer", "certificateNo", "issueDate", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, order: { createdAt: "ASC" }, }); const certs = @@ -627,8 +627,8 @@ export class ProfileEmployeeTempController extends Controller { ]; const education_raw = await this.profileEducationRepo.find({ - select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute"], - where: { profileEmployeeId: id }, + select: ["startDate", "endDate", "educationLevel", "degree", "field", "institute", "isDeleted"], + where: { profileEmployeeId: id, isDeleted: false }, // order: { lastUpdatedAt: "DESC" }, order: { level: "ASC" }, }); @@ -734,7 +734,7 @@ export class ProfileEmployeeTempController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { receiveDate: "ASC" }, }); const insignias = @@ -774,7 +774,7 @@ export class ProfileEmployeeTempController extends Controller { const leave_raw = await this.profileLeaveRepository.find({ relations: { leaveType: true }, - where: { profileEmployeeId: id }, + where: { profileEmployeeId: id, isDeleted: false }, order: { dateLeaveStart: "ASC" }, }); const leaves = @@ -2370,7 +2370,7 @@ export class ProfileEmployeeTempController extends Controller { )?.posMasterNo; const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileEmployeeId: item.id }, + where: { profileEmployeeId: item.id, isDeleted: false }, order: { level: "ASC" }, }); @@ -4043,7 +4043,7 @@ export class ProfileEmployeeTempController extends Controller { )?.posMasterNo; const latestProfileEducation = await this.profileEducationRepo.findOne({ - where: { profileEmployeeId: item.id }, + where: { profileEmployeeId: item.id, isDeleted: false }, order: { level: "ASC" }, }); diff --git a/src/controllers/ProfileHonorController.ts b/src/controllers/ProfileHonorController.ts index 114c76b3..057f6ad0 100644 --- a/src/controllers/ProfileHonorController.ts +++ b/src/controllers/ProfileHonorController.ts @@ -36,7 +36,7 @@ export class ProfileHonorController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.honorRepo.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -48,7 +48,7 @@ export class ProfileHonorController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const record = await this.honorRepo.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileHonorEmployeeController.ts b/src/controllers/ProfileHonorEmployeeController.ts index 11e6ddf8..bacb5ca5 100644 --- a/src/controllers/ProfileHonorEmployeeController.ts +++ b/src/controllers/ProfileHonorEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileHonorEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.honorRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -52,7 +52,7 @@ export class ProfileHonorEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileEmployeeId); const record = await this.honorRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileHonorEmployeeTempController.ts b/src/controllers/ProfileHonorEmployeeTempController.ts index e163aa05..dbf1ceb3 100644 --- a/src/controllers/ProfileHonorEmployeeTempController.ts +++ b/src/controllers/ProfileHonorEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileHonorEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const record = await this.honorRepo.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -51,7 +51,7 @@ export class ProfileHonorEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileEmployeeId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const record = await this.honorRepo.find({ - where: { profileEmployeeId: profileEmployeeId }, + where: { profileEmployeeId: profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileInsigniaController.ts b/src/controllers/ProfileInsigniaController.ts index 47e267f4..af871c69 100644 --- a/src/controllers/ProfileInsigniaController.ts +++ b/src/controllers/ProfileInsigniaController.ts @@ -50,7 +50,7 @@ export class ProfileInsigniaController extends Controller { insigniaType: true, }, }, - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -67,7 +67,7 @@ export class ProfileInsigniaController extends Controller { insigniaType: true, }, }, - where: { profileId }, + where: { profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileInsigniaEmployeeController.ts b/src/controllers/ProfileInsigniaEmployeeController.ts index 1921a5fd..e0d3ad82 100644 --- a/src/controllers/ProfileInsigniaEmployeeController.ts +++ b/src/controllers/ProfileInsigniaEmployeeController.ts @@ -47,7 +47,7 @@ export class ProfileInsigniaEmployeeController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -64,7 +64,7 @@ export class ProfileInsigniaEmployeeController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId }, + where: { profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileInsigniaEmployeeTempController.ts b/src/controllers/ProfileInsigniaEmployeeTempController.ts index c0f3ef71..6f11cec3 100644 --- a/src/controllers/ProfileInsigniaEmployeeTempController.ts +++ b/src/controllers/ProfileInsigniaEmployeeTempController.ts @@ -47,7 +47,7 @@ export class ProfileInsigniaEmployeeTempController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -63,7 +63,7 @@ export class ProfileInsigniaEmployeeTempController extends Controller { insigniaType: true, }, }, - where: { profileEmployeeId }, + where: { profileEmployeeId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileLeaveController.ts b/src/controllers/ProfileLeaveController.ts index f5601c02..a6624bbb 100644 --- a/src/controllers/ProfileLeaveController.ts +++ b/src/controllers/ProfileLeaveController.ts @@ -120,7 +120,7 @@ export class ProfileLeaveController extends Controller { } const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -136,6 +136,7 @@ export class ProfileLeaveController extends Controller { where: { profileId: profileId, // status: Not("cancel") + isDeleted: false }, order: { createdAt: "ASC" }, }); @@ -148,7 +149,7 @@ export class ProfileLeaveController extends Controller { if (_workflow == false) await new permission().PermissionGet(req, "SYS_SALARY_OFFICER"); const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileId }, + where: { profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileLeaveEmployeeController.ts b/src/controllers/ProfileLeaveEmployeeController.ts index feb6891e..ade4a5c4 100644 --- a/src/controllers/ProfileLeaveEmployeeController.ts +++ b/src/controllers/ProfileLeaveEmployeeController.ts @@ -43,7 +43,7 @@ export class ProfileLeaveEmployeeController extends Controller { } const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -56,7 +56,7 @@ export class ProfileLeaveEmployeeController extends Controller { await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileId); const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -68,7 +68,7 @@ export class ProfileLeaveEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionGet(req, "SYS_WAGE"); const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileLeaveEmployeeTempController.ts b/src/controllers/ProfileLeaveEmployeeTempController.ts index 39506d32..85960fa5 100644 --- a/src/controllers/ProfileLeaveEmployeeTempController.ts +++ b/src/controllers/ProfileLeaveEmployeeTempController.ts @@ -43,7 +43,7 @@ export class ProfileLeaveEmployeeTempController extends Controller { } const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -55,7 +55,7 @@ export class ProfileLeaveEmployeeTempController extends Controller { if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); @@ -67,7 +67,7 @@ export class ProfileLeaveEmployeeTempController extends Controller { if (_workflow == false) await new permission().PermissionGet(req, "SYS_WAGE"); const record = await this.leaveRepo.find({ relations: { leaveType: true }, - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(record); diff --git a/src/controllers/ProfileNopaidController.ts b/src/controllers/ProfileNopaidController.ts index 491aaae5..d0760d13 100644 --- a/src/controllers/ProfileNopaidController.ts +++ b/src/controllers/ProfileNopaidController.ts @@ -36,7 +36,7 @@ export class ProfileNopaidController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.nopaidRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -48,7 +48,7 @@ export class ProfileNopaidController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.nopaidRepository.find({ - where: { profileId }, + where: { profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileNopaidEmployeeController.ts b/src/controllers/ProfileNopaidEmployeeController.ts index fd5b7353..e5849e8e 100644 --- a/src/controllers/ProfileNopaidEmployeeController.ts +++ b/src/controllers/ProfileNopaidEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileNopaidEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.nopaidRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -51,7 +51,7 @@ export class ProfileNopaidEmployeeController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_EMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_EMP"); const lists = await this.nopaidRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileNopaidEmployeeTempController.ts b/src/controllers/ProfileNopaidEmployeeTempController.ts index 37dec407..fe6edab3 100644 --- a/src/controllers/ProfileNopaidEmployeeTempController.ts +++ b/src/controllers/ProfileNopaidEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileNopaidEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.nopaidRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -51,7 +51,7 @@ export class ProfileNopaidEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.nopaidRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileOtherController.ts b/src/controllers/ProfileOtherController.ts index 79ae8c8f..430af83e 100644 --- a/src/controllers/ProfileOtherController.ts +++ b/src/controllers/ProfileOtherController.ts @@ -37,7 +37,7 @@ export class ProfileOtherController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.otherRepository.find({ - where: { profileId: profile.id }, + where: { profileId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -49,7 +49,7 @@ export class ProfileOtherController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_OFFICER", profileId); const lists = await this.otherRepository.find({ - where: { profileId: profileId }, + where: { profileId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileOtherEmployeeController.ts b/src/controllers/ProfileOtherEmployeeController.ts index 0a6622b6..c8894afe 100644 --- a/src/controllers/ProfileOtherEmployeeController.ts +++ b/src/controllers/ProfileOtherEmployeeController.ts @@ -40,7 +40,7 @@ export class ProfileOtherEmployeeController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.otherRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -52,7 +52,7 @@ export class ProfileOtherEmployeeController extends Controller { if (_workflow == false) await new permission().PermissionOrgUserGet(req, "SYS_REGISTRY_EMP", profileId); const lists = await this.otherRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ProfileOtherEmployeeTempController.ts b/src/controllers/ProfileOtherEmployeeTempController.ts index 38962384..c20914fe 100644 --- a/src/controllers/ProfileOtherEmployeeTempController.ts +++ b/src/controllers/ProfileOtherEmployeeTempController.ts @@ -40,7 +40,7 @@ export class ProfileOtherEmployeeTempController extends Controller { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.otherRepository.find({ - where: { profileEmployeeId: profile.id }, + where: { profileEmployeeId: profile.id, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); @@ -51,7 +51,7 @@ export class ProfileOtherEmployeeTempController extends Controller { let _workflow = await new permission().Workflow(req, profileId, "SYS_REGISTRY_TEMP"); if (_workflow == false) await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.otherRepository.find({ - where: { profileEmployeeId: profileId }, + where: { profileEmployeeId: profileId, isDeleted: false }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); diff --git a/src/controllers/ReportController.ts b/src/controllers/ReportController.ts index 2e72fc6b..3966fb21 100644 --- a/src/controllers/ReportController.ts +++ b/src/controllers/ReportController.ts @@ -3659,8 +3659,9 @@ export class ReportController extends Controller { if (profileIds.length > 0) { educationsData = await this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...profileIds)", { profileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -3844,8 +3845,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -4025,8 +4027,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -4206,8 +4209,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -4385,8 +4389,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -8955,8 +8960,9 @@ export class ReportController extends Controller { if (profileIds.length > 0) { educationsData = await this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...profileIds)", { profileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -9146,8 +9152,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child1ProfileIds)", { child1ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -9333,8 +9340,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child2ProfileIds)", { child2ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -9521,8 +9529,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child3ProfileIds)", { child3ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, @@ -9708,8 +9717,9 @@ export class ReportController extends Controller { this.profileEducationRepository .createQueryBuilder("pe") - .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level"]) + .select(["pe.profileId", "pe.finishDate", "pe.degree", "pe.level", "pe.isDeleted"]) .where("pe.profileId IN (:...child4ProfileIds)", { child4ProfileIds }) + .andWhere("pe.isDeleted = :isDeleted", { isDeleted: false }) .andWhere( `(pe.profileId, COALESCE(pe.finishDate, '1900-01-01'), pe.level) IN ( SELECT pe2.profileId, diff --git a/src/entities/ProfileAbility.ts b/src/entities/ProfileAbility.ts index d2ea83d4..dcba7ee1 100644 --- a/src/entities/ProfileAbility.ts +++ b/src/entities/ProfileAbility.ts @@ -82,6 +82,13 @@ export class ProfileAbility extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileAbilityHistory, (profileAbilityHistory) => profileAbilityHistory.histories, diff --git a/src/entities/ProfileAbilityHistory.ts b/src/entities/ProfileAbilityHistory.ts index 16b0de99..01aff27b 100644 --- a/src/entities/ProfileAbilityHistory.ts +++ b/src/entities/ProfileAbilityHistory.ts @@ -66,6 +66,13 @@ export class ProfileAbilityHistory extends EntityBase { }) profileAbilityId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileAbility, (profileAbility) => profileAbility.profileAbilityHistorys) @JoinColumn({ name: "profileAbilityId" }) histories: ProfileAbility; diff --git a/src/entities/ProfileAssessment.ts b/src/entities/ProfileAssessment.ts index 6ae060ed..f08ad25e 100644 --- a/src/entities/ProfileAssessment.ts +++ b/src/entities/ProfileAssessment.ts @@ -100,6 +100,13 @@ export class ProfileAssessment extends EntityBase { }) pointSumTotal: number; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileAssessmentHistory, (profileAssessmentHistory) => profileAssessmentHistory.histories, diff --git a/src/entities/ProfileAssessmentHistory.ts b/src/entities/ProfileAssessmentHistory.ts index 224ea49c..5bfe8524 100644 --- a/src/entities/ProfileAssessmentHistory.ts +++ b/src/entities/ProfileAssessmentHistory.ts @@ -96,6 +96,13 @@ export class ProfileAssessmentHistory extends EntityBase { }) profileAssessmentId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileAssessment, (profileAssessment) => profileAssessment.profileAssessmentHistorys, diff --git a/src/entities/ProfileAssistance.ts b/src/entities/ProfileAssistance.ts index ad01f585..06cd9ffb 100644 --- a/src/entities/ProfileAssistance.ts +++ b/src/entities/ProfileAssistance.ts @@ -94,6 +94,13 @@ export class ProfileAssistance extends EntityBase { }) commandId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => Command, (command) => command.profileSalarys) @JoinColumn({ name: "commandId" }) command: Command; diff --git a/src/entities/ProfileAssistanceHistory.ts b/src/entities/ProfileAssistanceHistory.ts index 344c6dc0..8a106203 100644 --- a/src/entities/ProfileAssistanceHistory.ts +++ b/src/entities/ProfileAssistanceHistory.ts @@ -62,6 +62,13 @@ export class ProfileAssistanceHistory extends EntityBase { }) profileAssistanceId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileAssistance, (profileAssistance) => profileAssistance.profileAssistanceHistorys, diff --git a/src/entities/ProfileCertificate.ts b/src/entities/ProfileCertificate.ts index 730bde73..867c7797 100644 --- a/src/entities/ProfileCertificate.ts +++ b/src/entities/ProfileCertificate.ts @@ -74,6 +74,13 @@ export class ProfileCertificate extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileCertificateHistory, (profileCertificateHistory) => profileCertificateHistory.histories, diff --git a/src/entities/ProfileCertificateHistory.ts b/src/entities/ProfileCertificateHistory.ts index 022d1e17..0e9a0834 100644 --- a/src/entities/ProfileCertificateHistory.ts +++ b/src/entities/ProfileCertificateHistory.ts @@ -58,6 +58,13 @@ export class ProfileCertificateHistory extends EntityBase { }) profileCertificateId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileCertificate, (profileCertificate) => profileCertificate.profileCertificateHistories, diff --git a/src/entities/ProfileChangeName.ts b/src/entities/ProfileChangeName.ts index 74767fa2..b02117fc 100644 --- a/src/entities/ProfileChangeName.ts +++ b/src/entities/ProfileChangeName.ts @@ -77,6 +77,13 @@ export class ProfileChangeName extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileChangeNameHistory, (profileChangeNameHistory) => profileChangeNameHistory.histories, diff --git a/src/entities/ProfileChangeNameHistory.ts b/src/entities/ProfileChangeNameHistory.ts index 619344dd..5d296161 100644 --- a/src/entities/ProfileChangeNameHistory.ts +++ b/src/entities/ProfileChangeNameHistory.ts @@ -60,6 +60,13 @@ export class ProfileChangeNameHistory extends EntityBase { }) profileChangeNameId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileChangeName, (profileChangeName) => profileChangeName.profileChangeNameHistories, diff --git a/src/entities/ProfileChildren.ts b/src/entities/ProfileChildren.ts index 23f3b507..d4f07c72 100644 --- a/src/entities/ProfileChildren.ts +++ b/src/entities/ProfileChildren.ts @@ -72,6 +72,13 @@ export class ProfileChildren extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => Profile, (Profile) => Profile.profileChildrens) @JoinColumn({ name: "profileId" }) profile: Profile; diff --git a/src/entities/ProfileChildrenHistory.ts b/src/entities/ProfileChildrenHistory.ts index 39e34b74..a402c41e 100644 --- a/src/entities/ProfileChildrenHistory.ts +++ b/src/entities/ProfileChildrenHistory.ts @@ -55,6 +55,13 @@ export class ProfileChildrenHistory extends EntityBase { }) profileChildrenId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + // @ManyToOne(() => ProfileChildren, (profileChildren) => profileChildren.profileChildrenHistories) // @JoinColumn({ name: "profileChildrenId" }) // histories: ProfileChildren; diff --git a/src/entities/ProfileDiscipline.ts b/src/entities/ProfileDiscipline.ts index 6220b712..0065528b 100644 --- a/src/entities/ProfileDiscipline.ts +++ b/src/entities/ProfileDiscipline.ts @@ -82,6 +82,13 @@ export class ProfileDiscipline extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileDisciplineHistory, (profileDisciplineHistory) => profileDisciplineHistory.histories, diff --git a/src/entities/ProfileDisciplineHistory.ts b/src/entities/ProfileDisciplineHistory.ts index f265a825..e7dfee58 100644 --- a/src/entities/ProfileDisciplineHistory.ts +++ b/src/entities/ProfileDisciplineHistory.ts @@ -65,6 +65,13 @@ export class ProfileDisciplineHistory extends EntityBase { }) isUpload: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileDiscipline, (profileDiscipline) => profileDiscipline.profileDisciplineHistories, diff --git a/src/entities/ProfileDuty.ts b/src/entities/ProfileDuty.ts index 5684f650..7c2d8338 100644 --- a/src/entities/ProfileDuty.ts +++ b/src/entities/ProfileDuty.ts @@ -82,6 +82,13 @@ export class ProfileDuty extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany(() => ProfileDutyHistory, (profileDutyHistory) => profileDutyHistory.histories) profileDutyHistories: ProfileDutyHistory[]; diff --git a/src/entities/ProfileDutyHistory.ts b/src/entities/ProfileDutyHistory.ts index e00f4d5f..24c61a5c 100644 --- a/src/entities/ProfileDutyHistory.ts +++ b/src/entities/ProfileDutyHistory.ts @@ -66,6 +66,13 @@ export class ProfileDutyHistory extends EntityBase { }) profileDutyId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileDuty, (profileDuty) => profileDuty.profileDutyHistories) @JoinColumn({ name: "profileDutyId" }) histories: ProfileDuty; diff --git a/src/entities/ProfileEducation.ts b/src/entities/ProfileEducation.ts index 351aeec0..0b7c6f6e 100644 --- a/src/entities/ProfileEducation.ts +++ b/src/entities/ProfileEducation.ts @@ -196,6 +196,13 @@ export class ProfileEducation extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany( () => ProfileEducationHistory, (profileEducationHistory) => profileEducationHistory.histories, diff --git a/src/entities/ProfileEducationHistory.ts b/src/entities/ProfileEducationHistory.ts index 7a8d5497..6ffb118c 100644 --- a/src/entities/ProfileEducationHistory.ts +++ b/src/entities/ProfileEducationHistory.ts @@ -166,6 +166,13 @@ export class ProfileEducationHistory extends EntityBase { }) profileEducationId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne( () => ProfileEducation, (profileEducation) => profileEducation.profileEducationHistories, diff --git a/src/entities/ProfileHonor.ts b/src/entities/ProfileHonor.ts index 481e195f..73ec072f 100644 --- a/src/entities/ProfileHonor.ts +++ b/src/entities/ProfileHonor.ts @@ -89,6 +89,13 @@ export class ProfileHonor extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany(() => ProfileHonorHistory, (profileHonorHistory) => profileHonorHistory.histories) profileHonorHistories: ProfileHonorHistory[]; diff --git a/src/entities/ProfileHonorHistory.ts b/src/entities/ProfileHonorHistory.ts index 59338365..d22137ab 100644 --- a/src/entities/ProfileHonorHistory.ts +++ b/src/entities/ProfileHonorHistory.ts @@ -73,6 +73,13 @@ export class ProfileHonorHistory extends EntityBase { }) isUpload: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileHonor, (profileHonor) => profileHonor.profileHonorHistories) @JoinColumn({ name: "profileHonorId" }) histories: ProfileHonor; diff --git a/src/entities/ProfileInsignia.ts b/src/entities/ProfileInsignia.ts index b7fa824d..d09e71ee 100644 --- a/src/entities/ProfileInsignia.ts +++ b/src/entities/ProfileInsignia.ts @@ -137,6 +137,13 @@ export class ProfileInsignia extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => Insignia, (v) => v.profileInsignias) insignia: Insignia; diff --git a/src/entities/ProfileInsigniaHistory.ts b/src/entities/ProfileInsigniaHistory.ts index cc4fa5d7..4381b900 100644 --- a/src/entities/ProfileInsigniaHistory.ts +++ b/src/entities/ProfileInsigniaHistory.ts @@ -65,6 +65,13 @@ export class ProfileInsigniaHistory extends EntityBase { }) profileInsigniaId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileInsignia, (profileInsignia) => profileInsignia.profileInsigniaHistories) @JoinColumn({ name: "profileInsigniaId" }) histories: ProfileInsignia; diff --git a/src/entities/ProfileLeave.ts b/src/entities/ProfileLeave.ts index 2728b32b..f037e303 100644 --- a/src/entities/ProfileLeave.ts +++ b/src/entities/ProfileLeave.ts @@ -100,6 +100,13 @@ export class ProfileLeave extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany(() => ProfileLeaveHistory, (v) => v.profileLeave) histories: ProfileLeaveHistory[]; @@ -124,6 +131,13 @@ export class ProfileLeaveHistory extends ProfileLeave { }) profileLeaveId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean = false; + @ManyToOne(() => ProfileLeave, (v) => v.histories) profileLeave: ProfileLeave; } diff --git a/src/entities/ProfileNopaid.ts b/src/entities/ProfileNopaid.ts index 1f90025f..7eb2e82f 100644 --- a/src/entities/ProfileNopaid.ts +++ b/src/entities/ProfileNopaid.ts @@ -74,6 +74,13 @@ export class ProfileNopaid extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany(() => ProfileNopaidHistory, (profileNopaidHistory) => profileNopaidHistory.histories) profileNopaidHistories: ProfileNopaidHistory[]; diff --git a/src/entities/ProfileNopaidHistory.ts b/src/entities/ProfileNopaidHistory.ts index 905395ef..6bb14d0b 100644 --- a/src/entities/ProfileNopaidHistory.ts +++ b/src/entities/ProfileNopaidHistory.ts @@ -58,6 +58,13 @@ export class ProfileNopaidHistory extends EntityBase { }) profileNopaidId: string; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileNopaid, (profileNopaid) => profileNopaid.profileNopaidHistories) @JoinColumn({ name: "profileNopaidId" }) histories: ProfileNopaid; diff --git a/src/entities/ProfileOther.ts b/src/entities/ProfileOther.ts index b64171ed..497886be 100644 --- a/src/entities/ProfileOther.ts +++ b/src/entities/ProfileOther.ts @@ -44,6 +44,13 @@ export class ProfileOther extends EntityBase { }) isEntry: boolean; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @OneToMany(() => ProfileOtherHistory, (profileOtherHistory) => profileOtherHistory.histories) profileOtherHistories: ProfileOtherHistory[]; diff --git a/src/entities/ProfileOtherHistory.ts b/src/entities/ProfileOtherHistory.ts index 15ea3588..654425a7 100644 --- a/src/entities/ProfileOtherHistory.ts +++ b/src/entities/ProfileOtherHistory.ts @@ -28,6 +28,13 @@ export class ProfileOtherHistory extends EntityBase { }) date: Date; + @Column({ + nullable: false, + comment: "สถานะลบข้อมูล", + default: false, + }) + isDeleted: boolean; + @ManyToOne(() => ProfileOther, (profileOther) => profileOther.profileOtherHistories) @JoinColumn({ name: "profileOtherId" }) histories: ProfileOther; diff --git a/src/interfaces/OrgMapping.ts b/src/interfaces/OrgMapping.ts index 1cdea98f..b0eb21bf 100644 --- a/src/interfaces/OrgMapping.ts +++ b/src/interfaces/OrgMapping.ts @@ -22,3 +22,23 @@ export interface AllOrgMappings { orgChild3: OrgIdMapping; orgChild4: OrgIdMapping; } + +export interface SavePosMasterHistory { + prefix: string | null; + firstName: string | null; + lastName: string | null; + position: string | null; + posType: string | null; + posLevel: string | null; + posExecutive: string | null; + profileId: string | null; + rootDnaId: string | null; + child1DnaId: string | null; + child2DnaId: string | null; + child3DnaId: string | null; + child4DnaId: string | null; + shortName: string | null; + posMasterNoPrefix: string | null; + posMasterNo: string | null; + posMasterNoSuffix: string | null; +} diff --git a/src/interfaces/call-api.ts b/src/interfaces/call-api.ts index 398246c9..16986335 100644 --- a/src/interfaces/call-api.ts +++ b/src/interfaces/call-api.ts @@ -100,6 +100,52 @@ class CallAPI { } } + // Put + public async PutData(request: any, @Path() path: any, sendData: any, log = true) { + const token = "Bearer " + request.headers.authorization.replace("Bearer ", ""); + const url = process.env.API_URL + path; + + try { + const response = await axios.put(url, sendData, { + headers: { + Authorization: `${token}`, + "Content-Type": "application/json", + api_key: process.env.API_KEY, + }, + }); + + if (log) + addLogSequence(request, { + action: "request", + status: "success", + description: "connected", + request: { + method: "PUT", + url: url, + payload: JSON.stringify(sendData), + response: JSON.stringify(response.data.result), + }, + }); + + return response.data.result; + } catch (error) { + if (log) + addLogSequence(request, { + action: "request", + status: "error", + description: "unconnected", + request: { + method: "PUT", + url: url, + payload: JSON.stringify(sendData), + response: JSON.stringify(error), + }, + }); + + throw error; + } + } + //Delete File public async DeleteFile(request: any, @Path() path: any) { const token = "Bearer " + request.headers.authorization.replace("Bearer ", ""); diff --git a/src/migration/1770870836370-add_fields_isDeleted.ts b/src/migration/1770870836370-add_fields_isDeleted.ts new file mode 100644 index 00000000..6d04805c --- /dev/null +++ b/src/migration/1770870836370-add_fields_isDeleted.ts @@ -0,0 +1,74 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddFieldsIsDeleted1770870836370 implements MigrationInterface { + name = 'AddFieldsIsDeleted1770870836370' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileCertificateHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileCertificate\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileInsigniaHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileInsignia\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileHonorHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileHonor\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAssessmentHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAssessment\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileLeave\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileLeaveHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileDutyHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileDuty\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileNopaidHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileNopaid\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileDisciplineHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileDiscipline\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileChangeNameHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileChangeName\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileEducationHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileEducation\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAbilityHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAbility\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileOtherHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileOther\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileChildrenHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileChildren\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileSalaryHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileSalary\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAssistanceHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileAssistance\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + await queryRunner.query(`ALTER TABLE \`profileSalaryBackup\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT 0`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileSalaryBackup\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAssistance\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAssistanceHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileSalary\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileSalaryHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileChildren\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileChildrenHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileOther\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileOtherHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAbility\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAbilityHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileEducation\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileEducationHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileChangeName\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileChangeNameHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileDiscipline\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileDisciplineHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileNopaid\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileNopaidHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileDuty\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileDutyHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileLeaveHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileLeave\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAssessment\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileAssessmentHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileHonor\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileHonorHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileInsignia\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileInsigniaHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileCertificate\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileCertificateHistory\` DROP COLUMN \`isDeleted\``); + } + +} diff --git a/src/migration/1770872734016-move_fields_isDeleted_in_tables_profileSalary.ts b/src/migration/1770872734016-move_fields_isDeleted_in_tables_profileSalary.ts new file mode 100644 index 00000000..31d4a79c --- /dev/null +++ b/src/migration/1770872734016-move_fields_isDeleted_in_tables_profileSalary.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class MoveFieldsIsDeletedInTablesProfileSalary1770872734016 implements MigrationInterface { + name = 'MoveFieldsIsDeletedInTablesProfileSalary1770872734016' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileSalaryHistory\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileSalary\` DROP COLUMN \`isDeleted\``); + await queryRunner.query(`ALTER TABLE \`profileSalaryBackup\` DROP COLUMN \`isDeleted\``); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileSalaryBackup\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE \`profileSalary\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT '0'`); + await queryRunner.query(`ALTER TABLE \`profileSalaryHistory\` ADD \`isDeleted\` tinyint NOT NULL COMMENT 'สถานะลบข้อมูล' DEFAULT '0'`); + + } + +} diff --git a/src/migration/1770875727560-add_indexes_for_performance.ts b/src/migration/1770875727560-add_indexes_for_performance.ts new file mode 100644 index 00000000..c08e82ab --- /dev/null +++ b/src/migration/1770875727560-add_indexes_for_performance.ts @@ -0,0 +1,62 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class AddIndexesForPerformance1770875727560 implements MigrationInterface { + name = "AddIndexesForPerformance1770875727560"; + + public async up(queryRunner: QueryRunner): Promise { + // Index for posMasterHistory lookups + await queryRunner.query(` + CREATE INDEX IDX_posMasterHistory_ancestorDNA + ON posMasterHistory(ancestorDNA, createdAt DESC) + `); + + // Index for org tables lookups + await queryRunner.query(` + CREATE INDEX IDX_orgRoot_ancestorDNA_revision + ON orgRoot(ancestorDNA, orgRevisionId) + `); + + await queryRunner.query(` + CREATE INDEX IDX_orgChild1_ancestorDNA_revision + ON orgChild1(ancestorDNA, orgRevisionId) + `); + + await queryRunner.query(` + CREATE INDEX IDX_orgChild2_ancestorDNA_revision + ON orgChild2(ancestorDNA, orgRevisionId) + `); + + await queryRunner.query(` + CREATE INDEX IDX_orgChild3_ancestorDNA_revision + ON orgChild3(ancestorDNA, orgRevisionId) + `); + + await queryRunner.query(` + CREATE INDEX IDX_orgChild4_ancestorDNA_revision + ON orgChild4(ancestorDNA, orgRevisionId) + `); + + // Index for posMaster lookups + await queryRunner.query(` + CREATE INDEX IDX_posMaster_revision_org + ON posMaster(orgRevisionId, orgRootId, orgChild1Id, orgChild2Id, orgChild3Id, orgChild4Id) + `); + + await queryRunner.query(` + CREATE INDEX IDX_posMaster_ancestorDNA + ON posMaster(ancestorDNA) + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP INDEX IDX_position_posMasterId ON position`); + await queryRunner.query(`DROP INDEX IDX_posMaster_ancestorDNA ON posMaster`); + await queryRunner.query(`DROP INDEX IDX_posMaster_revision_org ON posMaster`); + await queryRunner.query(`DROP INDEX IDX_orgChild4_ancestorDNA_revision ON orgChild4`); + await queryRunner.query(`DROP INDEX IDX_orgChild3_ancestorDNA_revision ON orgChild3`); + await queryRunner.query(`DROP INDEX IDX_orgChild2_ancestorDNA_revision ON orgChild2`); + await queryRunner.query(`DROP INDEX IDX_orgChild1_ancestorDNA_revision ON orgChild1`); + await queryRunner.query(`DROP INDEX IDX_orgRoot_ancestorDNA_revision ON orgRoot`); + await queryRunner.query(`DROP INDEX IDX_posMasterHistory_ancestorDNA ON posMasterHistory`); + } +} diff --git a/src/services/PositionService.ts b/src/services/PositionService.ts index 67cbecef..64fb58a4 100644 --- a/src/services/PositionService.ts +++ b/src/services/PositionService.ts @@ -1,3 +1,5 @@ +import { In } from "typeorm"; +import { SavePosMasterHistory } from "./../interfaces/OrgMapping"; import { AppDataSource } from "../database/data-source"; import { EmployeePosMaster } from "../entities/EmployeePosMaster"; import { EmployeeTempPosMaster } from "../entities/EmployeeTempPosMaster"; @@ -44,9 +46,9 @@ export async function CreatePosMasterHistoryOfficer( where: { id: pm.orgRevisionId, orgRevisionIsCurrent: true, - orgRevisionIsDraft: false - } - }) + orgRevisionIsDraft: false, + }, + }); const _null: any = null; const h = new PosMasterHistory(); const selectedPosition = @@ -260,3 +262,144 @@ export async function getTopDegrees(educations: ProfileEducation[]): Promise { + try { + // Type workaround: entity columns are nullable but types don't reflect it + const _null: any = null; + const repoPosMasterHistory = queryRunner.manager.getRepository(PosMasterHistory); + const pmh = await repoPosMasterHistory.findOne({ + where: { + ancestorDNA: posMasterDnaId, + }, + order: { createdAt: "DESC" }, + }); + + // Check if we need to insert a new history record + const shouldInsert = !pmh && profileId && pm; + const profileChanged = pmh && pmh.profileId !== profileId; + + if (shouldInsert || profileChanged) { + // insert new record + const newPmh = new PosMasterHistory(); + newPmh.ancestorDNA = posMasterDnaId; + newPmh.prefix = pm?.prefix ?? _null; + newPmh.firstName = pm?.firstName ?? _null; + newPmh.lastName = pm?.lastName ?? _null; + newPmh.position = pm?.position ?? _null; + newPmh.posType = pm?.posType ?? _null; + newPmh.posLevel = pm?.posLevel ?? _null; + newPmh.posExecutive = pm?.posExecutive ?? _null; + newPmh.profileId = profileId ?? _null; + newPmh.rootDnaId = pm?.rootDnaId ?? _null; + newPmh.child1DnaId = pm?.child1DnaId ?? _null; + newPmh.child2DnaId = pm?.child2DnaId ?? _null; + newPmh.child3DnaId = pm?.child3DnaId ?? _null; + newPmh.child4DnaId = pm?.child4DnaId ?? _null; + newPmh.shortName = pm?.shortName ?? _null; + newPmh.posMasterNoPrefix = pm?.posMasterNoPrefix ?? _null; + newPmh.posMasterNo = pm?.posMasterNo ?? _null; + newPmh.posMasterNoSuffix = pm?.posMasterNoSuffix ?? _null; + // Add audit fields for data integrity + newPmh.createdUserId = "system"; + newPmh.createdFullName = "system"; + newPmh.lastUpdateUserId = "system"; + newPmh.lastUpdateFullName = "system"; + newPmh.createdAt = new Date(); + newPmh.lastUpdatedAt = new Date(); + await queryRunner.manager.save(PosMasterHistory, newPmh); + return true; + } + return true; + } catch (err) { + console.error("SavePosMasterHistoryOfficer error:", err); + return false; + } +} + +export interface BatchPosMasterHistoryOperation { + posMasterDnaId: string; + profileId: string | null; + pm: SavePosMasterHistory | null; +} + +export async function BatchSavePosMasterHistoryOfficer( + queryRunner: any, + operations: BatchPosMasterHistoryOperation[], +): Promise { + if (operations.length === 0) return true; + + try { + const repoPosMasterHistory = queryRunner.manager.getRepository(PosMasterHistory); + const dnaIds = operations.map((op) => op.posMasterDnaId); + + // Fetch all existing history records in ONE query + const existingHistory = await repoPosMasterHistory.find({ + where: { ancestorDNA: In(dnaIds) }, + order: { createdAt: "DESC" }, + }); + + // Build lookup map + const historyByDna = new Map(); + for (const h of existingHistory) { + if (!historyByDna.has(h.ancestorDNA)) { + historyByDna.set(h.ancestorDNA, []); + } + historyByDna.get(h.ancestorDNA)!.push(h); + } + + // Process operations and collect new records + const newRecords: PosMasterHistory[] = []; + const _null: any = null; + + for (const op of operations) { + const existing = historyByDna.get(op.posMasterDnaId)?.[0]; + const shouldInsert = !existing && op.profileId && op.pm; + const profileChanged = existing && existing.profileId !== op.profileId; + + if (shouldInsert || profileChanged) { + const newPmh = new PosMasterHistory(); + newPmh.ancestorDNA = op.posMasterDnaId; + newPmh.prefix = op.pm?.prefix ?? _null; + newPmh.firstName = op.pm?.firstName ?? _null; + newPmh.lastName = op.pm?.lastName ?? _null; + newPmh.position = op.pm?.position ?? _null; + newPmh.posType = op.pm?.posType ?? _null; + newPmh.posLevel = op.pm?.posLevel ?? _null; + newPmh.posExecutive = op.pm?.posExecutive ?? _null; + newPmh.profileId = op.profileId ?? _null; + newPmh.rootDnaId = op.pm?.rootDnaId ?? _null; + newPmh.child1DnaId = op.pm?.child1DnaId ?? _null; + newPmh.child2DnaId = op.pm?.child2DnaId ?? _null; + newPmh.child3DnaId = op.pm?.child3DnaId ?? _null; + newPmh.child4DnaId = op.pm?.child4DnaId ?? _null; + newPmh.shortName = op.pm?.shortName ?? _null; + newPmh.posMasterNoPrefix = op.pm?.posMasterNoPrefix ?? _null; + newPmh.posMasterNo = op.pm?.posMasterNo ?? _null; + newPmh.posMasterNoSuffix = op.pm?.posMasterNoSuffix ?? _null; + newPmh.createdUserId = "system"; + newPmh.createdFullName = "system"; + newPmh.lastUpdateUserId = "system"; + newPmh.lastUpdateFullName = "system"; + newPmh.createdAt = new Date(); + newPmh.lastUpdatedAt = new Date(); + newRecords.push(newPmh); + } + } + + // Batch insert all new records + if (newRecords.length > 0) { + await queryRunner.manager.save(PosMasterHistory, newRecords); + } + + return true; + } catch (err) { + console.error("BatchSavePosMasterHistoryOfficer error:", err); + return false; + } +}