summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/[lng]/admin/mdg/page.tsx57
-rw-r--r--app/api/mdg/send-vendor-xml/route.ts28
-rw-r--r--app/api/mdg/send-vendor/route.ts28
3 files changed, 99 insertions, 14 deletions
diff --git a/app/[lng]/admin/mdg/page.tsx b/app/[lng]/admin/mdg/page.tsx
index 27416f25..e2926deb 100644
--- a/app/[lng]/admin/mdg/page.tsx
+++ b/app/[lng]/admin/mdg/page.tsx
@@ -61,6 +61,7 @@ const sampleDefaults: Record<string, string> = {
E_ADDRESS: 'contact@test.vendor.com',
BP_TX_TYP: 'KR2',
TAXNUM: '123-45-67890',
+ AD_CONSNO: '1',
};
// XML escape helper
@@ -99,6 +100,25 @@ export default function MDGTestPage() {
load();
}, []);
+ // XML 생성 유틸리티 (폼 데이터 -> SOAP Envelope)
+ const buildEnvelopeXml = (currentForm: Record<string, string>, defs: VendorFieldDef[]) => {
+ if (defs.length === 0) return '';
+ const bodyContent = defs.map((f) => {
+ const val = currentForm[f.name] ?? '';
+ return `<${f.name}>${escapeXml(val)}</${f.name}>`;
+ }).join('\n ');
+
+ const supplierXml = `<SUPPLIER_MASTER>\n ${bodyContent}\n </SUPPLIER_MASTER>`;
+
+ return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:p1=\"http://shi.samsung.co.kr/P2_MD/MDZ\">\n <soap:Header/>\n <soap:Body>\n <p1:MT_P2MD3007_S>\n <P2MD3007_S>\n ${supplierXml}\n </P2MD3007_S>\n </p1:MT_P2MD3007_S>\n </soap:Body>\n</soap:Envelope>`;
+ };
+
+ // 폼 데이터 변경 시 실시간 XML 생성
+ useEffect(() => {
+ const xml = buildEnvelopeXml(formData, fieldDefs);
+ setResultXml(xml);
+ }, [formData, fieldDefs]);
+
// 폼 데이터 업데이트
const updateField = (field: string, value: string) => {
setFormData(prev => ({ ...prev, [field]: value }));
@@ -114,33 +134,42 @@ export default function MDGTestPage() {
toast.success('폼이 기본값으로 리셋되었습니다.');
};
- // 테스트 송신 실행
+ // 테스트 송신 실행 (실제 서버 호출)
const handleTestSend = async () => {
try {
setIsLoading(true);
-
+
// 필수 필드 검증
const requiredFields = fieldDefs.filter(d => d.mandatory).map(d => d.name);
const missingFields = requiredFields.filter(field => !formData[field]?.trim());
-
+
if (missingFields.length > 0) {
toast.error(`필수 필드가 누락되었습니다: ${missingFields.join(', ')}`);
+ setIsLoading(false);
return;
}
-
- // XML 생성
- const bodyContent = fieldDefs.map(f => {
- const val = formData[f.name] ?? '';
- return `<${f.name}>${escapeXml(val)}</${f.name}>`;
- }).join('\n ');
- const supplierXml = `<SUPPLIER_MASTER>\n ${bodyContent}\n </SUPPLIER_MASTER>`;
+ // 서버 API 호출해 송신
+ const res = await fetch('/api/mdg/send-vendor-xml', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ envelope: resultXml }),
+ });
+
+ const json = await res.json();
+
+ if (!res.ok || !json.success) {
+ // 상세 오류 메시지 추출 (vendorCode 기반 또는 직접 오류 메시지)
+ const detailMsg = json?.results?.[0]?.error ?? json?.message ?? json?.responseText ?? '송신 실패';
+ toast.error(`송신 실패: ${detailMsg}`);
+ setIsLoading(false);
+ return;
+ }
- const envelope = `<?xml version="1.0" encoding="UTF-8"?>\n<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:p1=\"http://shi.samsung.co.kr/P2_MD/MDZ\">\n <soap:Header/>\n <soap:Body>\n <p1:MT_P2MD3007_S>\n <P2MD3007_S>\n ${supplierXml}\n </P2MD3007_S>\n </p1:MT_P2MD3007_S>\n </soap:Body>\n</soap:Envelope>`;
+ toast.success('MDG 송신이 완료되었습니다.');
- setResultXml(envelope);
- toast.success('요청 XML이 생성되었습니다. 하단 영역을 확인하세요.');
-
} catch (error) {
console.error('테스트 송신 실패:', error);
toast.error('테스트 송신 중 오류가 발생했습니다.');
diff --git a/app/api/mdg/send-vendor-xml/route.ts b/app/api/mdg/send-vendor-xml/route.ts
new file mode 100644
index 00000000..7f8d1daf
--- /dev/null
+++ b/app/api/mdg/send-vendor-xml/route.ts
@@ -0,0 +1,28 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { sendVendorEnvelopeToMDG } from '@/lib/soap/mdg/send/vendor-master/action';
+
+export async function POST(request: NextRequest) {
+ try {
+ const { envelope } = await request.json();
+
+ if (!envelope || typeof envelope !== 'string') {
+ return NextResponse.json(
+ { success: false, message: 'envelope(XML) is required' },
+ { status: 400 }
+ );
+ }
+
+ const result = await sendVendorEnvelopeToMDG(envelope);
+
+ return NextResponse.json(result);
+ } catch (error) {
+ console.error('[send-vendor-xml] error:', error);
+ return NextResponse.json(
+ {
+ success: false,
+ message: error instanceof Error ? error.message : 'Unknown error',
+ },
+ { status: 500 }
+ );
+ }
+} \ No newline at end of file
diff --git a/app/api/mdg/send-vendor/route.ts b/app/api/mdg/send-vendor/route.ts
new file mode 100644
index 00000000..2442b733
--- /dev/null
+++ b/app/api/mdg/send-vendor/route.ts
@@ -0,0 +1,28 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { sendSingleVendorToMDG } from '@/lib/soap/mdg/send/vendor-master/action';
+
+export async function POST(request: NextRequest) {
+ try {
+ const { vendorCode } = await request.json();
+
+ if (!vendorCode || typeof vendorCode !== 'string') {
+ return NextResponse.json(
+ { success: false, message: 'vendorCode is required' },
+ { status: 400 }
+ );
+ }
+
+ const result = await sendSingleVendorToMDG(vendorCode);
+
+ return NextResponse.json(result);
+ } catch (error) {
+ console.error('[send-vendor] error:', error);
+ return NextResponse.json(
+ {
+ success: false,
+ message: error instanceof Error ? error.message : 'Unknown error',
+ },
+ { status: 500 }
+ );
+ }
+} \ No newline at end of file