From 912e2bc761d7d57bd33d68cb5050da43dea59636 Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Fri, 24 Oct 2025 11:42:16 +0900
Subject: (김준회) ecc/mdg 테스트 페이지 수정
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/[lng]/admin/ecc/page.tsx | 474 +++++++++++++++++++++++++++++++++----------
app/[lng]/admin/mdg/page.tsx | 26 +--
2 files changed, 378 insertions(+), 122 deletions(-)
(limited to 'app')
diff --git a/app/[lng]/admin/ecc/page.tsx b/app/[lng]/admin/ecc/page.tsx
index 257ecfea..cd09e213 100644
--- a/app/[lng]/admin/ecc/page.tsx
+++ b/app/[lng]/admin/ecc/page.tsx
@@ -10,7 +10,7 @@ import { Label } from '@/components/ui/label'
import { Badge } from '@/components/ui/badge'
import { Separator } from '@/components/ui/separator'
import { Alert, AlertDescription } from '@/components/ui/alert'
-import { Loader2, Play, CheckCircle, XCircle, Send } from 'lucide-react'
+import { Loader2, Play, CheckCircle, XCircle, Send, Plus, Minus } from 'lucide-react'
import { toast } from 'sonner'
// SOAP 송신 함수들 import
@@ -125,36 +125,96 @@ export default function ECCSenderTestPage() {
// PO 생성 테스트
const [poData, setPoData] = useState({
- // 헤더 정보
- ANFNR: 'TEST001',
- LIFNR: '1000000001',
- ZPROC_IND: 'A',
- ANGNR: 'TEST001',
- WAERS: 'KRW',
- ZTERM: '0001',
- INCO1: 'FOB',
- INCO2: 'Seoul, Korea',
- MWSKZ: 'V0',
- LANDS: 'KR',
- ZRCV_DT: '20241201',
- ZATTEN_IND: 'Y',
- IHRAN: '20241201',
- TEXT: 'Test PO Creation',
- // 아이템 정보
- ANFPS: '00001',
- NETPR: '1000.00',
- PEINH: '1',
- BPRME: 'EA',
- NETWR: '1000.00',
- BRTWR: '1100.00',
- LFDAT: '20241201',
- // PR 반환 정보
- EBELN: 'PR001',
- EBELP: '00001',
- MSGTY: 'S',
- MSGTXT: 'Test message'
+ header: {
+ ANFNR: 'TEST001',
+ LIFNR: '1000000001',
+ ZPROC_IND: 'A',
+ ANGNR: 'TEST001',
+ WAERS: 'KRW',
+ ZTERM: '0001',
+ INCO1: 'FOB',
+ INCO2: 'Seoul, Korea',
+ MWSKZ: 'V0',
+ LANDS: 'KR',
+ ZRCV_DT: '20241201',
+ ZATTEN_IND: 'Y',
+ IHRAN: '20241201',
+ TEXT: 'Test PO Creation',
+ LSTEL: '',
+ VSTEL: '',
+ ZDLV_CNTLR: '',
+ ZDLV_PRICE_NOTE: '',
+ ZDLV_PRICE_T: ''
+ },
+ items: [{
+ ANFNR: 'TEST001',
+ ANFPS: '00001',
+ LIFNR: '1000000001',
+ NETPR: '1000.00',
+ PEINH: '1',
+ BPRME: 'EA',
+ NETWR: '1000.00',
+ BRTWR: '1100.00',
+ LFDAT: '20241201',
+ EBELP: '',
+ ZCON_NO_PO: ''
+ }],
+ prReturn: [{
+ ANFNR: 'TEST001',
+ ANFPS: '00001',
+ EBELN: 'PR001',
+ EBELP: '00001',
+ MSGTY: 'S',
+ MSGTXT: 'Test message'
+ }]
})
+ // PO 아이템 관리 함수들
+ const addPoItem = () => {
+ const newItemIndex = poData.items.length + 1
+ setPoData(prev => ({
+ ...prev,
+ items: [...prev.items, {
+ ANFNR: prev.header.ANFNR,
+ ANFPS: String(newItemIndex).padStart(5, '0'),
+ LIFNR: prev.header.LIFNR,
+ NETPR: '0.00',
+ PEINH: '1',
+ BPRME: 'EA',
+ NETWR: '0.00',
+ BRTWR: '0.00',
+ LFDAT: prev.header.IHRAN,
+ EBELP: '',
+ ZCON_NO_PO: ''
+ }]
+ }))
+ }
+
+ const removePoItem = (index: number) => {
+ if (poData.items.length > 1) {
+ setPoData(prev => ({
+ ...prev,
+ items: prev.items.filter((_, i) => i !== index)
+ }))
+ }
+ }
+
+ const updatePoItem = (index: number, field: string, value: string) => {
+ setPoData(prev => ({
+ ...prev,
+ items: prev.items.map((item, i) =>
+ i === index ? { ...item, [field]: value } : item
+ )
+ }))
+ }
+
+ const updatePoHeader = (field: string, value: string) => {
+ setPoData(prev => ({
+ ...prev,
+ header: { ...prev.header, [field]: value }
+ }))
+ }
+
return (
@@ -513,87 +573,188 @@ export default function ECCSenderTestPage() {
PO (Purchase Order) 생성
- 구매주문 생성 요청을 ECC로 전송합니다. (IF_ECC_EVCP_PO_CREATE)
+ 구매주문 생성 요청을 ECC로 전송합니다. (IF_ECC_EVCP_PO_CREATE) - 하나의 PO에 여러 PR 아이템들을 포함시키는 구조
-
+
+ {/* PO 헤더 정보 */}
-
PO 헤더 정보
-
+
+
PO 헤더 정보
+
+ {poData.items.length}개 아이템
+
+
+
-
-
PO 아이템 정보
-
- 입찰 아이템번호 (필수)
+ 지급조건 (ZTERM) *
setPoData(prev => ({ ...prev, ANFPS: e.target.value }))}
- placeholder="입찰 아이템번호"
+ id="po-zterm"
+ value={poData.header.ZTERM}
+ onChange={(e) => updatePoHeader('ZTERM', e.target.value)}
+ placeholder="지급조건 (ZTERM)"
/>
- 순가격 (필수)
+ 인코텀즈1 (INCO1) *
setPoData(prev => ({ ...prev, NETPR: e.target.value }))}
- placeholder="순가격"
+ id="po-inco1"
+ value={poData.header.INCO1}
+ onChange={(e) => updatePoHeader('INCO1', e.target.value)}
+ placeholder="인코텀즈1 (INCO1)"
+ />
+
+
+ 인코텀즈2 (INCO2) *
+ updatePoHeader('INCO2', e.target.value)}
+ placeholder="인코텀즈2 (INCO2)"
+ />
+
+
+ 세금코드 (MWSKZ) *
+ updatePoHeader('MWSKZ', e.target.value)}
+ placeholder="세금코드 (MWSKZ)"
/>
- 주문단위 (필수)
+ 국가키 (LANDS) *
setPoData(prev => ({ ...prev, BPRME: e.target.value }))}
- placeholder="주문단위 (예: EA)"
+ id="po-lands"
+ value={poData.header.LANDS}
+ onChange={(e) => updatePoHeader('LANDS', e.target.value)}
+ placeholder="국가키 (LANDS)"
/>
- 납기일 (필수)
+ 수령일 (ZRCV_DT) *
setPoData(prev => ({ ...prev, LFDAT: e.target.value }))}
- placeholder="YYYYMMDD 형식"
+ id="po-zrcv-dt"
+ value={poData.header.ZRCV_DT}
+ onChange={(e) => updatePoHeader('ZRCV_DT', e.target.value)}
+ placeholder="수령일 (ZRCV_DT)"
+ />
+
+
+ 참석지시자 (ZATTEN_IND) *
+ updatePoHeader('ZATTEN_IND', e.target.value)}
+ placeholder="참석지시자 (ZATTEN_IND)"
+ />
+
+
+ 입찰마감일 (IHRAN) *
+ updatePoHeader('IHRAN', e.target.value)}
+ placeholder="입찰마감일 (IHRAN)"
+ />
+
+
+ 텍스트 (TEXT)
+ updatePoHeader('TEXT', e.target.value)}
+ placeholder="텍스트 (TEXT)"
+ />
+
+
+ 배송지점 (LSTEL)
+ updatePoHeader('LSTEL', e.target.value)}
+ placeholder="배송지점 (LSTEL)"
+ />
+
+
+ 출하지점 (VSTEL)
+ updatePoHeader('VSTEL', e.target.value)}
+ placeholder="출하지점 (VSTEL)"
+ />
+
+
+ 납품담당자 (ZDLV_CNTLR)
+ updatePoHeader('ZDLV_CNTLR', e.target.value)}
+ placeholder="납품담당자 (ZDLV_CNTLR)"
+ />
+
+
+ 가격노트 (ZDLV_PRICE_NOTE)
+ updatePoHeader('ZDLV_PRICE_NOTE', e.target.value)}
+ placeholder="가격노트 (ZDLV_PRICE_NOTE)"
+ />
+
+
+ 가격유형 (ZDLV_PRICE_T)
+ updatePoHeader('ZDLV_PRICE_T', e.target.value)}
+ placeholder="가격유형 (ZDLV_PRICE_T)"
/>
@@ -601,6 +762,133 @@ export default function ECCSenderTestPage() {
+ {/* PO 아이템 정보 */}
+
+
+
PO 아이템 정보
+
+
+ 아이템 추가
+
+
+
+ {poData.items.map((item, index) => (
+
+
+
아이템 #{index + 1}
+ {poData.items.length > 1 && (
+ removePoItem(index)}
+ size="sm"
+ variant="destructive"
+ className="flex items-center gap-1"
+ >
+
+ 삭제
+
+ )}
+
+
+
+ 입찰번호 (ANFNR) *
+ updatePoItem(index, 'ANFNR', e.target.value)}
+ placeholder="입찰번호 (ANFNR)"
+ />
+
+
+ 입찰 아이템번호 (ANFPS) *
+ updatePoItem(index, 'ANFPS', e.target.value)}
+ placeholder="입찰 아이템번호 (ANFPS)"
+ />
+
+
+ 공급업체 계정 (LIFNR) : 벤더코드 *
+ updatePoItem(index, 'LIFNR', e.target.value)}
+ placeholder="공급업체 계정 (LIFNR) : 벤더코드"
+ />
+
+
+ 순가격 (NETPR) *
+ updatePoItem(index, 'NETPR', e.target.value)}
+ placeholder="순가격 (NETPR)"
+ />
+
+
+ 가격단위 (PEINH) *
+ updatePoItem(index, 'PEINH', e.target.value)}
+ placeholder="가격단위 (PEINH)"
+ />
+
+
+ 주문단위 (BPRME) *
+ updatePoItem(index, 'BPRME', e.target.value)}
+ placeholder="주문단위 (BPRME)"
+ />
+
+
+ 순금액 (NETWR) *
+ updatePoItem(index, 'NETWR', e.target.value)}
+ placeholder="순금액 (NETWR)"
+ />
+
+
+ 총금액 (BRTWR) *
+ updatePoItem(index, 'BRTWR', e.target.value)}
+ placeholder="총금액 (BRTWR)"
+ />
+
+
+ 납기일 (LFDAT) *
+ updatePoItem(index, 'LFDAT', e.target.value)}
+ placeholder="납기일 (LFDAT)"
+ />
+
+
+ 구매오더 품번 (EBELP)
+ updatePoItem(index, 'EBELP', e.target.value)}
+ placeholder="구매오더 품번 (EBELP)"
+ />
+
+
+ 계약번호 (ZCON_NO_PO)
+ updatePoItem(index, 'ZCON_NO_PO', e.target.value)}
+ placeholder="계약번호 (ZCON_NO_PO)"
+ />
+
+
+
+ ))}
+
+
+
+
runTest('PO 생성 (샘플)', () => createTestPurchaseOrder())}
@@ -614,41 +902,9 @@ export default function ECCSenderTestPage() {
runTest('PO 생성 (사용자)', async () => {
const poRequest = {
- T_Bidding_HEADER: [{
- ANFNR: poData.ANFNR,
- LIFNR: poData.LIFNR,
- ZPROC_IND: poData.ZPROC_IND,
- ANGNR: poData.ANGNR,
- WAERS: poData.WAERS,
- ZTERM: poData.ZTERM,
- INCO1: poData.INCO1,
- INCO2: poData.INCO2,
- MWSKZ: poData.MWSKZ,
- LANDS: poData.LANDS,
- ZRCV_DT: poData.ZRCV_DT,
- ZATTEN_IND: poData.ZATTEN_IND,
- IHRAN: poData.IHRAN,
- TEXT: poData.TEXT
- }],
- T_Bidding_ITEM: [{
- ANFNR: poData.ANFNR,
- ANFPS: poData.ANFPS,
- LIFNR: poData.LIFNR,
- NETPR: poData.NETPR,
- PEINH: poData.PEINH,
- BPRME: poData.BPRME,
- NETWR: poData.NETWR,
- BRTWR: poData.BRTWR,
- LFDAT: poData.LFDAT
- }],
- T_PR_RETURN: [{
- ANFNR: poData.ANFNR,
- ANFPS: poData.ANFPS,
- EBELN: poData.EBELN,
- EBELP: poData.EBELP,
- MSGTY: poData.MSGTY,
- MSGTXT: poData.MSGTXT
- }]
+ T_Bidding_HEADER: [poData.header],
+ T_Bidding_ITEM: poData.items,
+ T_PR_RETURN: poData.prReturn
}
return createPurchaseOrder(poRequest)
})}
@@ -656,7 +912,7 @@ export default function ECCSenderTestPage() {
>
{isLoading['PO 생성 (사용자)'] && }
- 사용자 데이터로 생성
+ 사용자 데이터로 생성 ({poData.items.length}개 아이템)
diff --git a/app/[lng]/admin/mdg/page.tsx b/app/[lng]/admin/mdg/page.tsx
index 1bf37667..1f4a1ee8 100644
--- a/app/[lng]/admin/mdg/page.tsx
+++ b/app/[lng]/admin/mdg/page.tsx
@@ -34,34 +34,34 @@ const parseCSV = (csv: string): VendorFieldDef[] => {
// 기존 샘플 기본값 (필요 시 확장)
const sampleDefaults: Record
= {
- BP_HEADER: 'TEST001',
+ BP_HEADER: 'TEST002',
ZZSRMCD: 'EVCP',
- SORT1: 'TEST VENDOR',
+ SORT1: '테스트 벤더 회사',
NAME1: '테스트 벤더 회사',
- KTOKK: 'Z001',
+ KTOKK: 'LIEF',
J_1KFTBUS: '제조업',
- J_1KFTIND: 'IT',
- MASTERFLAG: 'X',
- IBND_TYPE: 'U',
- ZZREQID: 'TESTUSER01',
+ J_1KFTIND: '건설업외',
+ MASTERFLAG: 'V',
+ IBND_TYPE: 'I',
+ ZZREQID: 'HUIN84.KIM',
ADDRNO: '',
NATION: '',
COUNTRY: 'KR',
- LANGU: 'K',
+ LANGU: '',
POST_CODE1: '06292',
CITY1: '서울시',
CITY2: '강남구',
- REGION: '11',
+ REGION: '',
STREET: '테헤란로 123',
TEL_NUMBER: '02-1234-5678',
FAX_NUMBER: '02-1234-5679',
URI_ADDR: 'https://test.vendor.com',
SMTP_ADDR: 'contact@test.vendor.com',
- TAXTYPE: 'KR2',
- TAXNUM: '123-45-67890',
+ TAXTYPE: '9501010000000',
+ TAXNUM: '1234567890',
CONSNUMBER: '1',
- BP_TX_TYP: 'KR2',
- R3_USER: 'Y',
+ BP_TX_TYP: '9501010000000',
+ R3_USER: '0',
};
export default function MDGTestPage() {
--
cgit v1.2.3