summaryrefslogtreecommitdiff
path: root/lib/soap
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-07-09 12:16:43 +0000
committerjoonhoekim <26rote@gmail.com>2025-07-09 12:25:40 +0000
commitad4855620f4aa80841c4d7b1aa39d19ab2205f0e (patch)
tree24dabc8e98390937b75967faa6c6e25a23a0f894 /lib/soap
parente328f73e5c23df7af5096d31e80fd74d9070ebc7 (diff)
(김준회) 벤더 상세페이지 - 기본정보 구현중 (구매 정의서)
Diffstat (limited to 'lib/soap')
-rw-r--r--lib/soap/mdg/send/vendor-master/action.ts122
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;