From 8497e5df57eaf53394a209b83de71bca24b1583c Mon Sep 17 00:00:00 2001 From: waruneeauy Date: Thu, 19 Feb 2026 16:29:36 +0700 Subject: [PATCH] fix: case clear position all in draft to public to current --- src/controllers/OrganizationController.ts | 72 +++++++++++++++++++---- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index efb0f679..74b90213 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -8294,6 +8294,15 @@ export class OrganizationController extends Controller { orgChild4: [...allMappings.orgChild4.byDraftId.keys()], }; + // Get current organization IDs from the mappings (moved up for reuse) + const currentOrgIds = { + orgRoot: [...allMappings.orgRoot.byDraftId.values()], + orgChild1: [...allMappings.orgChild1.byDraftId.values()], + orgChild2: [...allMappings.orgChild2.byDraftId.values()], + orgChild3: [...allMappings.orgChild3.byDraftId.values()], + orgChild4: [...allMappings.orgChild4.byDraftId.values()], + }; + // Get draft positions that belong to any org under the rootDnaId const posMasterDraft = await this.posMasterRepository.find({ where: [ @@ -8305,8 +8314,58 @@ export class OrganizationController extends Controller { ], }); - if (posMasterDraft.length <= 0) - return new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลตำแหน่งในโครงสร้างร่าง"); + // Special case: If draft has no positions, delete all current positions + if (posMasterDraft.length <= 0) { + // Fetch current positions + const posMasterCurrent = await this.posMasterRepository.find({ + where: [ + { orgRevisionId: currentRevisionId, orgRootId: In(currentOrgIds.orgRoot) }, + { orgRevisionId: currentRevisionId, orgChild1Id: In(currentOrgIds.orgChild1) }, + { orgRevisionId: currentRevisionId, orgChild2Id: In(currentOrgIds.orgChild2) }, + { orgRevisionId: currentRevisionId, orgChild3Id: In(currentOrgIds.orgChild3) }, + { orgRevisionId: currentRevisionId, orgChild4Id: In(currentOrgIds.orgChild4) }, + ], + }); + + if (posMasterCurrent.length > 0) { + const toDeleteIds = posMasterCurrent.map((p) => p.id); + + // Cascade delete positions first + await queryRunner.manager.delete(Position, { posMasterId: In(toDeleteIds) }); + + // Then delete posMaster records + await queryRunner.manager.delete(PosMaster, toDeleteIds); + + // Save history + const deleteHistoryOps = posMasterCurrent.map((pos) => ({ + posMasterDnaId: pos.ancestorDNA, + profileId: null, + pm: null, + })); + await BatchSavePosMasterHistoryOfficer(queryRunner, deleteHistoryOps); + } + + // Build summary for this special case + const summary = { + message: "ย้ายโครงสร้างสำเร็จ", + organization: { + orgRoot: orgSyncStats.orgRoot, + orgChild1: orgSyncStats.orgChild1, + orgChild2: orgSyncStats.orgChild2, + orgChild3: orgSyncStats.orgChild3, + orgChild4: orgSyncStats.orgChild4, + }, + positionMaster: { + deleted: posMasterCurrent.length, + updated: 0, + inserted: 0, + }, + position: { deleted: 0, updated: 0, inserted: 0 }, + }; + + await queryRunner.commitTransaction(); + return new HttpSuccess(summary); + } // Clear current_holderId for positions that will have new holders const nextHolderIds = posMasterDraft @@ -8344,15 +8403,6 @@ export class OrganizationController extends Controller { } // 2.2 Fetch current positions for comparison - // Get current organization IDs from the mappings - const currentOrgIds = { - orgRoot: [...allMappings.orgRoot.byDraftId.values()], - orgChild1: [...allMappings.orgChild1.byDraftId.values()], - orgChild2: [...allMappings.orgChild2.byDraftId.values()], - orgChild3: [...allMappings.orgChild3.byDraftId.values()], - orgChild4: [...allMappings.orgChild4.byDraftId.values()], - }; - const posMasterCurrent = await this.posMasterRepository.find({ where: [ { orgRevisionId: currentRevisionId, orgRootId: In(currentOrgIds.orgRoot) },