diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-19 16:57:14 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-19 16:57:14 +0900 |
| commit | 3284b70bacb7074d86170b38b7ec6b01e2aa6954 (patch) | |
| tree | a8e5520e2463c57c1dc3f271875de2b14bbbccb5 /lib/rfq-last/contract-actions.ts | |
| parent | a07cad76810349096d768116d3d38ca7ad664e33 (diff) | |
(김준회) RFQ PO 생성 I/F 변경 (IF_EVCP_ECC_PO_CREATE 는 입찰 전용 PO 생성, IF_EVCP_ECC_RFQ_INFORMATION 은 RFQ PO 생성) - RFQ_INFORMATION은 MAINTAIN PO/VO, PO_INFORMATION은 PO List Management (SAP 메뉴)
Diffstat (limited to 'lib/rfq-last/contract-actions.ts')
| -rw-r--r-- | lib/rfq-last/contract-actions.ts | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/lib/rfq-last/contract-actions.ts b/lib/rfq-last/contract-actions.ts index a4be7e48..1323ba8a 100644 --- a/lib/rfq-last/contract-actions.ts +++ b/lib/rfq-last/contract-actions.ts @@ -11,7 +11,7 @@ import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" import { generateContractNumber } from "../general-contracts/service"; import { generateBiddingNumber } from "../bidding/service"; -import { createPurchaseOrder } from "@/lib/soap/ecc/send/create-po"; +import { sendRFQInformation } from "@/lib/soap/ecc/send/create-po-rfq"; import { getCurrentSAPDate } from "@/lib/soap/utils"; import { SoapResponseError } from "@/lib/soap/types"; @@ -212,32 +212,24 @@ export async function createPO(params: CreatePOParams) { const validIncotermsCode = incotermsCode as string; const validTaxCode = taxCode as string; - // 5. PO 데이터 구성 - const poData = { - T_Bidding_HEADER: [{ + // 5. RFQ 정보 데이터 구성 (IF_EVCP_ECC_RFQ_INFORMATION 인터페이스 사용) + const rfqInfoData = { + T_RFQ_HEADER: [{ // 필수 필드 ANFNR: validAnfnr, LIFNR: validVendorCode, - ZPROC_IND: '9', // 구매 처리 상태: 9 (기존 로그 기준) WAERS: currency, ZTERM: validPaymentTermsCode, INCO1: validIncotermsCode, INCO2: incotermsDescription.substring(0, 28), // SAP 최대 28자리 제한, incoterms 테이블의 description 사용 MWSKZ: validTaxCode, LANDS: vendorCountryCode, // 벤더 국가 코드 사용 - ZRCV_DT: getCurrentSAPDate(), - ZATTEN_IND: 'Y', // 참석 여부: Y (고정값) - IHRAN: getCurrentSAPDate(), - // Optional 필드 (명시적으로 포함 - 유지보수를 위해 구조 유지) - TEXT: rfqData.rfqTitle || rfqData.itemName || '', // PO Header note - ZDLV_CNTLR: rfqData.picCode || '', // Delivery Controller - ZDLV_PRICE_T: detailData.materialPriceRelatedYn ? 'Y' : 'N', // 납품대금연동제대상여부 - ZDLV_PRICE_NOTE: detailData.materialPriceRelatedYn ? '연동제 적용' : '', // 연동제 노트 - VSTEL: '', // Shipping Point (데이터 없음) - LSTEL: '', // Loading Point (데이터 없음) + // Optional 필드 + VSTEL: detailData.placeOfShipping || '', // Place of Shipping + LSTEL: detailData.placeOfDestination || '', // Place of Destination }], - T_Bidding_ITEM: prItems.map((item, index) => { + T_RFQ_ITEM: prItems.map((item, index) => { // 견적 아이템에서 실제 가격 정보 가져오기 (이미 검증됨) const quoteItem = quotationItemMap.get(item.id)!; // 검증 통과했으므로 non-null assertion @@ -259,23 +251,17 @@ export async function createPO(params: CreatePOParams) { // 필수 필드 ANFNR: validAnfnr, ANFPS: item.prItem || (index + 1).toString().padStart(5, '0'), // PR Item Number 사용 - LIFNR: validVendorCode, NETPR: unitPrice.toFixed(2), // 단가 (소수점 2자리) - PEINH: '1', // 가격 단위: 1 (표준값, 1단위당 가격) - BPRME: item.uom!, // 검증 통과했으므로 non-null assertion NETWR: totalPrice.toFixed(2), // 순액 (세금 제외) BRTWR: totalPrice.toFixed(2), // 총액: SAP이 taxCode(MWSKZ)로 세금 계산하도록 순액과 동일하게 전송 - LFDAT: deliveryDate, - // Optional 필드 (명시적으로 포함 - 유지보수를 위해 구조 유지) - ZCON_NO_PO: item.prNo || '', // PR Consolidation Number - EBELP: '', // Series PO Item Seq (시리즈 PO가 아니면 빈 값) + // Optional 필드 + LFDAT: deliveryDate, }; }) - // T_PR_RETURN은 응답용 필드이므로 요청에 포함하지 않음 }; - console.log('📤 SAP으로 PO 전송 시작:', { + console.log('📤 SAP으로 RFQ 정보 전송 시작:', { ANFNR: validAnfnr, LIFNR: validVendorCode, vendorName: vendorData.vendorName, @@ -296,19 +282,19 @@ export async function createPO(params: CreatePOParams) { }); // 디버깅: 전송 데이터 전체 로그 (서버 측 로그이므로 모든 정보 포함) - console.log('📦 PO 전송 데이터 (전체):', JSON.stringify(poData, null, 2)); + console.log('📦 RFQ 정보 전송 데이터 (전체):', JSON.stringify(rfqInfoData, null, 2)); - // 6. SAP SOAP 요청 전송 - const sapResult = await createPurchaseOrder(poData); + // 6. SAP SOAP 요청 전송 (RFQ 인터페이스 사용) + const sapResult = await sendRFQInformation(rfqInfoData); if (!sapResult.success) { - throw new Error(`SAP PO 생성 실패: ${sapResult.message}`); + throw new Error(`SAP RFQ 정보 전송 실패: ${sapResult.message}`); } - console.log('✅ SAP PO 전송 성공:', sapResult); + console.log('✅ SAP RFQ 정보 전송 성공:', sapResult); - // 7. 실제 PO 번호 추출 (SOAP 응답에서 추출하거나 ANFNR 사용) - const actualPoNumber = sapResult.bidding_number || validAnfnr; + // 7. 실제 RFQ 번호 추출 (SOAP 응답에서 추출하거나 ANFNR 사용) + const actualPoNumber = sapResult.rfq_number || validAnfnr; // 8. DB에 실제 PO 번호 저장 및 RFQ 상태 업데이트 await db.transaction(async (tx) => { @@ -346,7 +332,7 @@ export async function createPO(params: CreatePOParams) { return { success: true, - message: "PO가 성공적으로 생성되어 SAP로 전송되었습니다.", + message: "RFQ 정보가 성공적으로 SAP로 전송되었습니다.", poNumber: actualPoNumber, }; } catch (error) { |
