summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/soap/ecc/mapper/bidding-and-pr-mapper.ts85
-rw-r--r--lib/soap/ecc/mapper/rfq-and-pr-mapper.ts83
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,
+ };
+ }
+}