summaryrefslogtreecommitdiff
path: root/lib/rfq-last
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rfq-last')
-rw-r--r--lib/rfq-last/contract-actions.ts52
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) {