diff options
| author | joonhoekim <26rote@gmail.com> | 2025-07-09 12:16:43 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-07-09 12:25:40 +0000 |
| commit | ad4855620f4aa80841c4d7b1aa39d19ab2205f0e (patch) | |
| tree | 24dabc8e98390937b75967faa6c6e25a23a0f894 /lib/soap | |
| parent | e328f73e5c23df7af5096d31e80fd74d9070ebc7 (diff) | |
(김준회) 벤더 상세페이지 - 기본정보 구현중 (구매 정의서)
Diffstat (limited to 'lib/soap')
| -rw-r--r-- | lib/soap/mdg/send/vendor-master/action.ts | 122 |
1 files changed, 107 insertions, 15 deletions
diff --git a/lib/soap/mdg/send/vendor-master/action.ts b/lib/soap/mdg/send/vendor-master/action.ts index e96b93fc..ae0c2c89 100644 --- a/lib/soap/mdg/send/vendor-master/action.ts +++ b/lib/soap/mdg/send/vendor-master/action.ts @@ -267,34 +267,34 @@ async function fetchVendorData(vendorCode: string) { // SOAP 데이터 생성 (WSDL 구조에 맞춤) function buildSoapData(vendorData: NonNullable<Awaited<ReturnType<typeof fetchVendorData>>>) { - const { vendorHeader, addresses, adEmails, adFaxes, adPostals, adTels, adUrls, bpTaxnums, bpVengens } = vendorData; + const { vendorHeader, addresses, adFaxes, adPostals, adTels, bpTaxnums, bpVengens } = vendorData; // 값 추출 매핑 ------------------------------------ const mapping: Record<string, string | undefined> = { // Header BP_HEADER: vendorHeader?.VNDRCD, ZZSRMCD: 'EVCP', - TITLE: vendorHeader?.TITLE ?? '', - BU_SORT1: adPostals[0]?.VNDRNM_ABRV_1, - NAME_ORG1: adPostals[0]?.VNDRNM_1, - KTOKK: bpVengens[0]?.ACNT_GRP, + TITLE: '', // vendorHeader에 TITLE 필드가 없음 + BU_SORT1: adPostals[0]?.VNDRNM_ABRV_1 ?? undefined, + NAME_ORG1: adPostals[0]?.VNDRNM_1 ?? undefined, + KTOKK: bpVengens[0]?.ACNT_GRP ?? undefined, MASTERFLAG: 'X', IBND_TYPE: 'U', // Address mandatory (first) ADDRNO: addresses[0]?.ADDRNO, - AD_NATION: adPostals[0]?.INTL_ADR_VER_ID, - COUNTRY: adPostals[0]?.NTN_CD, - LANGU_COM: adPostals[0]?.LANG_KEY, - POST_COD1: adPostals[0]?.CITY_ZIP_NO, - CITY1: adPostals[0]?.VNDRNM_1, - MC_STREET: adPostals[0]?.ADR_1, + AD_NATION: adPostals[0]?.INTL_ADR_VER_ID ?? undefined, + COUNTRY: adPostals[0]?.NTN_CD ?? undefined, + LANGU_COM: adPostals[0]?.LANG_KEY ?? undefined, + POST_COD1: adPostals[0]?.CITY_ZIP_NO ?? undefined, + CITY1: adPostals[0]?.VNDRNM_1 ?? undefined, + MC_STREET: adPostals[0]?.ADR_1 ?? undefined, // Phone/Fax mandatory fields AD_CONSNO: '001', - T_COUNTRY: adTels[0]?.CTRY_CD ?? 'KR', - F_COUNTRY: adFaxes[0]?.CTRY_CD ?? 'KR', + T_COUNTRY: adTels[0]?.NTN_CD ?? 'KR', + F_COUNTRY: adFaxes[0]?.NTN_CD ?? 'KR', // Tax BP_TX_TYP: bpTaxnums[0]?.TX_NO_CTG ?? 'KR2', - TAXNUM: bpVengens[0]?.VAT_REG_NO, + TAXNUM: bpVengens[0]?.VAT_REG_NO ?? undefined, // Default others can be added as needed }; @@ -306,7 +306,7 @@ function buildSoapData(vendorData: NonNullable<Awaited<ReturnType<typeof fetchVe return true; }); - const supplierMaster: Record<string, any> = {}; + const supplierMaster: Record<string, string> = {}; uniqueFields.forEach(f => { supplierMaster[f.field] = mapping[f.field] ?? ''; }); @@ -620,6 +620,98 @@ export async function getVendorSendStatistics(): Promise<{ } } +// 테스트용 폼 데이터 송신 함수 (SOAP 라이브러리 사용) +export async function sendTestVendorDataToMDG(formData: Record<string, string>): Promise<{ + success: boolean; + message: string; + responseData?: any; +}> { + try { + console.log('🧪 테스트용 VENDOR 데이터 SOAP 송신 시작'); + + // CSV 파일 동적 로드 (더 안전함) + let csvFields: CsvField[] = []; + try { + const csvRaw = fs.readFileSync(CSV_PATH, 'utf-8'); + csvFields = parseCsv(csvRaw); + } catch (e) { + console.error('CSV 로딩 실패:', e); + return { + success: false, + message: 'CSV 필드 정의 파일을 로드할 수 없습니다.' + }; + } + + // 필수 필드 검증 + const requiredFields = csvFields.filter(f => f.mandatory).map(f => f.field); + const missingFields = requiredFields.filter(field => !formData[field]?.trim()); + + if (missingFields.length > 0) { + return { + success: false, + message: `필수 필드가 누락되었습니다: ${missingFields.join(', ')}` + }; + } + + // 필드 순서에 따라 데이터 생성 + const seen = new Set<string>(); + const uniqueFields = csvFields.filter(f => { + if (seen.has(f.field)) return false; + seen.add(f.field); + return true; + }); + + const supplierMaster: Record<string, string> = {}; + uniqueFields.forEach(f => { + supplierMaster[f.field] = formData[f.field] ?? ''; + }); + + // SOAP 요청 구조 생성 + const soapData = { + P2MD3007_S: { + SUPPLIER_MASTER: supplierMaster + } + }; + + console.log('📄 테스트 SOAP 데이터 생성 완료'); + + // SOAP 클라이언트로 요청 전송 + const responseData = await withSoapLogging( + 'OUTBOUND', + 'MDG', + 'IF_MDZ_EVCP_VENDOR_MASTER_TEST', + JSON.stringify(soapData), + async () => { + const client = await createSoapClient(); + + return new Promise<SoapResponse>((resolve, reject) => { + client.P2MD3007_AO(soapData, (err: SoapError | null, result: SoapResponse) => { + if (err) { + reject(err); + } else { + console.log('✅ 테스트 MDG 전송 성공'); + resolve(result); + } + }); + }); + } + ); + + return { + success: true, + message: '테스트 송신이 완료되었습니다.', + responseData + }; + + } catch (error) { + console.error('❌ 테스트 송신 실패:', error); + return { + success: false, + message: error instanceof Error ? error.message : 'Unknown error' + }; + } +} + // 직접 XML 전송 함수 (기존 호환성 유지) export async function sendVendorEnvelopeToMDG(envelope: string): Promise<{ success: boolean; |
