diff options
| author | joonhoekim <26rote@gmail.com> | 2025-10-17 14:02:09 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-10-17 14:02:09 +0900 |
| commit | 776699c13e967dd9db61571bb917f4a4f7aa618d (patch) | |
| tree | 0abb6659cb1af6dc150b0a2d5abd0c3a21659762 /lib/soap | |
| parent | 0ee0f102634dd703aea7ad0b8a338eb5e9bdadab (diff) | |
(김준회) RFQ/Bidding ECC 삭제 요청 처리 대응, 생성/삭제 모두 트랜잭션 처리
Diffstat (limited to 'lib/soap')
| -rw-r--r-- | lib/soap/ecc/mapper/bidding-and-pr-mapper.ts | 85 | ||||
| -rw-r--r-- | lib/soap/ecc/mapper/rfq-and-pr-mapper.ts | 83 |
2 files changed, 168 insertions, 0 deletions
diff --git a/lib/soap/ecc/mapper/bidding-and-pr-mapper.ts b/lib/soap/ecc/mapper/bidding-and-pr-mapper.ts index a02ef9bf..5f3c7e78 100644 --- a/lib/soap/ecc/mapper/bidding-and-pr-mapper.ts +++ b/lib/soap/ecc/mapper/bidding-and-pr-mapper.ts @@ -624,4 +624,89 @@ export function validateECCBiddingData( isValid: errors.length === 0, errors, }; +} + +/** + * ECC Bidding 데이터를 삭제 (biddings/prItemsForBidding 테이블에서 삭제) + */ +export async function deleteECCBiddingData( + eccHeaders: ECCBidHeader[] +): Promise<{ success: boolean; message: string; deletedCount: number }> { + debugLog('ECC Bidding 데이터 삭제 시작', { + headerCount: eccHeaders.length, + }); + + try { + const result = await db.transaction(async (tx) => { + const deletedBiddings: string[] = []; + + for (const eccHeader of eccHeaders) { + const anfnr = eccHeader.ANFNR; + if (!anfnr) { + debugError('삭제할 ANFNR이 없음', { eccHeader }); + continue; + } + + // 1) 해당 ANFNR의 Bidding 찾기 + const existingBidding = await tx + .select({ id: biddings.id, biddingNumber: biddings.biddingNumber }) + .from(biddings) + .where(eq(biddings.ANFNR, anfnr)) + .limit(1); + + if (existingBidding.length === 0) { + debugLog(`ANFNR ${anfnr}에 해당하는 Bidding이 존재하지 않음`); + continue; + } + + const biddingId = existingBidding[0].id; + const biddingNumber = existingBidding[0].biddingNumber; + + // 2) prItemsForBidding 삭제 + const deletedItems = await tx + .delete(prItemsForBidding) + .where(eq(prItemsForBidding.biddingId, biddingId)); + + debugLog(`Bidding ${biddingNumber}의 PR 아이템 ${deletedItems.rowCount}개 삭제 완료`); + + // 3) prDocuments 삭제 (POS 파일 관련 문서) + const deletedDocuments = await tx + .delete(prDocuments) + .where(eq(prDocuments.biddingId, biddingId)); + + debugLog(`Bidding ${biddingNumber}의 문서 ${deletedDocuments.rowCount}개 삭제 완료`); + + // 4) biddings 삭제 + await tx + .delete(biddings) + .where(eq(biddings.id, biddingId)); + + deletedBiddings.push(biddingNumber); + debugLog(`Bidding ${biddingNumber} 삭제 완료`); + } + + return { deletedBiddings }; + }); + + debugSuccess('ECC Bidding 데이터 삭제 완료', { + deletedCount: result.deletedBiddings.length, + deletedBiddings: result.deletedBiddings, + }); + + return { + success: true, + message: `${result.deletedBiddings.length}개의 Bidding 데이터가 성공적으로 삭제되었습니다.`, + deletedCount: result.deletedBiddings.length, + }; + } catch (error) { + debugError('ECC Bidding 데이터 삭제 중 오류 발생', error); + return { + success: false, + message: + error instanceof Error + ? error.message + : '알 수 없는 오류가 발생했습니다.', + deletedCount: 0, + }; + } }
\ No newline at end of file diff --git a/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts b/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts index 0ca808ad..9180b4e2 100644 --- a/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts +++ b/lib/soap/ecc/mapper/rfq-and-pr-mapper.ts @@ -479,3 +479,86 @@ export function validateECCRfqData( errors, }; } + +/** + * ECC RFQ 데이터를 삭제 (rfqsLast/rfqPrItems 테이블에서 삭제) + */ +export async function deleteECCRfqData( + eccHeaders: ECCBidHeader[] +): Promise<{ success: boolean; message: string; deletedCount: number }> { + debugLog('ECC RFQ 데이터 삭제 시작', { + headerCount: eccHeaders.length, + }); + + try { + const result = await db.transaction(async (tx) => { + const deletedRfqs: (string | null)[] = []; + + for (const eccHeader of eccHeaders) { + const anfnr = eccHeader.ANFNR; + if (!anfnr) { + debugError('삭제할 ANFNR이 없음', { eccHeader }); + continue; + } + + // 1) 해당 ANFNR의 RFQ 찾기 + const existingRfq = await tx + .select({ id: rfqsLast.id, rfqCode: rfqsLast.rfqCode }) + .from(rfqsLast) + .where(eq(rfqsLast.ANFNR, anfnr)) + .limit(1); + + if (existingRfq.length === 0) { + debugLog(`ANFNR ${anfnr}에 해당하는 RFQ가 존재하지 않음`); + continue; + } + + const rfqId = existingRfq[0].id; + const rfqCode = existingRfq[0].rfqCode; + + if (!rfqCode) { + debugError('RFQ 코드가 없는 데이터는 건너뜀', { rfqId }); + continue; + } + + // 2) rfqPrItems 삭제 + const deletedItems = await tx + .delete(rfqPrItems) + .where(eq(rfqPrItems.rfqsLastId, rfqId)); + + debugLog(`RFQ ${rfqCode}의 PR 아이템 ${deletedItems.rowCount}개 삭제 완료`); + + // 3) rfqsLast 삭제 + await tx + .delete(rfqsLast) + .where(eq(rfqsLast.id, rfqId)); + + deletedRfqs.push(rfqCode); + debugLog(`RFQ ${rfqCode} 삭제 완료`); + } + + return { deletedRfqs }; + }); + + debugSuccess('ECC RFQ 데이터 삭제 완료', { + deletedCount: result.deletedRfqs.length, + deletedRfqs: result.deletedRfqs, + }); + + return { + success: true, + message: `${result.deletedRfqs.length}개의 RFQ 데이터가 성공적으로 삭제되었습니다.`, + deletedCount: result.deletedRfqs.length, + }; + } catch (error) { + debugError('ECC RFQ 데이터 삭제 중 오류 발생', error); + return { + success: false, + message: + error instanceof Error + ? error.message + : '알 수 없는 오류가 발생했습니다.', + deletedCount: 0, + }; + } +} |
