diff options
| -rw-r--r-- | app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts | 116 | ||||
| -rw-r--r-- | db/schema/ECC/ecc.ts | 36 | ||||
| -rw-r--r-- | db/schema/projects.ts | 2 |
3 files changed, 86 insertions, 68 deletions
diff --git a/app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts b/app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts index c2b9db46..6b882852 100644 --- a/app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts +++ b/app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts @@ -88,14 +88,18 @@ export async function POST(request: NextRequest) { async () => { console.log('๐ PO_INFORMATION ์์ ์์, ๋ฐ์ดํฐ ๊ธธ์ด:', body.length); - // 1) XML ํ์ฑ - const parser = createXMLParser(['T_HD', 'T_DT', 'T_PAY', 'T_KN', 'T_NOTE', 'T_NOTE2']); + // 1) XML ํ์ฑ - ์ค์ XML ๊ตฌ์กฐ์ ๋ง๊ฒ ์์ + const parser = createXMLParser(['ZMM_HD', 'ZMM_DT', 'ZMM_PAY', 'ZMM_KN', 'ZMM_NOTE', 'ZMM_NOTE2']); const parsedData = parser.parse(body); + console.log('๐ ํ์ฑ๋ XML ๋ฐ์ดํฐ ๊ตฌ์กฐ:', JSON.stringify(parsedData, null, 2)); // 2) SOAP Body ๋๋ ๋ฃจํธ์์ ์์ฒญ ๋ฐ์ดํฐ ์ถ์ถ const requestData = extractRequestData(parsedData, 'IF_ECC_EVCP_PO_INFORMATIONReq'); + console.log('๐ ์ถ์ถ๋ ์์ฒญ ๋ฐ์ดํฐ:', JSON.stringify(requestData, null, 2)); + if (!requestData) { console.error('์ ํจํ ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค'); + console.error('ํ์ฑ๋ ๋ฐ์ดํฐ ํค๋ค:', Object.keys(parsedData)); throw new Error('Missing request data - IF_ECC_EVCP_PO_INFORMATIONReq not found'); } @@ -149,55 +153,68 @@ export async function POST(request: NextRequest) { // ๋ฐ์ดํฐ ๋ณํ ๋ฐ ์ ์ฅ ๊ด๋ จ ์ ํธ๋ฆฌํฐ // ----------------------------------------------------------------------------- -// Root XML Request ํ์
+// Root XML Request ํ์
- ์ค์ XML ๊ตฌ์กฐ์ ๋ง๊ฒ ์์ type PORequestXML = { CHG_GB?: string; - T_HD?: HeaderXML[]; - T_DT?: DetailXML[]; - T_PAY?: PaymentXML[]; - T_KN?: AccountXML[]; - T_NOTE?: NoteXML[]; - T_NOTE2?: Note2XML[]; + ZMM_HD?: HeaderXML[]; + ZMM_DT?: DetailXML[]; + ZMM_PAY?: PaymentXML[]; + ZMM_KN?: AccountXML[]; + ZMM_NOTE?: NoteXML[]; + ZMM_NOTE2?: Note2XML[]; }; -// XML -> DB ๋ฐ์ดํฐ ๋ณํ ํจ์ +// XML -> DB ๋ฐ์ดํฐ ๋ณํ ํจ์ - ์ค์ฒฉ ๊ตฌ์กฐ ์ฒ๋ฆฌ function transformPOData(requestData: PORequestXML): ProcessedPOData[] { - const headers = requestData.T_HD || []; - const details = requestData.T_DT || []; - const payments = requestData.T_PAY || []; - const accounts = requestData.T_KN || []; - const notes = requestData.T_NOTE || []; - const notes2 = requestData.T_NOTE2 || []; + console.log('๐ ๋ณํํ ์์ฒญ ๋ฐ์ดํฐ:', JSON.stringify(requestData, null, 2)); + + const headers = requestData.ZMM_HD || []; + console.log(`๐ ์ฒ๋ฆฌํ Header ์: ${headers.length}`); return headers.map((header) => { const headerKey = header.EBELN || ''; const fkData = { EBELN: headerKey }; - - // Header ๋ณํ + console.log(`๐ฆ ์ฒ๋ฆฌ ์ค์ธ Header: ${headerKey}`); + + // Header ๋ณํ (ZMM_DT, ZMM_NOTE, ZMM_NOTE2 ํ๋ ์ ์ธ) + const headerFields = { ...header }; + delete (headerFields as any).ZMM_DT; + delete (headerFields as any).ZMM_NOTE; + delete (headerFields as any).ZMM_NOTE2; + const headerConverted = convertXMLToDBData<HeaderData>( - header as Record<string, string | undefined>, - undefined // Header๋ ์์ฒด ํ๋๋ง ์ฌ์ฉ + headerFields as Record<string, string | undefined>, + undefined ); - // ํด๋น Header์ Detail๋ค ํํฐ ํ ๋ณํ (ZMM_KN๋ ํจ๊ป ์ฒ๋ฆฌ) - const relatedDetails = details.filter((detail) => detail.EBELN === headerKey); - const detailsWithAccounts: DetailWithAccounts[] = relatedDetails.map((detail) => { + // Header ๋ด๋ถ์ ์ค์ฒฉ๋ ZMM_DT ์ฒ๋ฆฌ + const detailsFromHeader = (header as any).ZMM_DT || []; + console.log(`๐ ${headerKey}์ Detail ์: ${detailsFromHeader.length}`); + + const detailsWithAccounts: DetailWithAccounts[] = detailsFromHeader.map((detail: any) => { const detailKey = detail.EBELP || ''; const detailFkData = { EBELN: headerKey, EBELP: detailKey }; + console.log(`๐ ์ฒ๋ฆฌ ์ค์ธ Detail: ${headerKey}-${detailKey}`); - // Detail ๋ณํ + // Detail ๋ณํ (ZMM_KN ํ๋ ์ ์ธ) + const detailFields = { ...detail }; + delete detailFields.ZMM_KN; + const detailConverted = convertXMLToDBData<DetailData>( - detail as Record<string, string | undefined>, + detailFields as Record<string, string | undefined>, fkData ); - // ํด๋น Detail์ Account๋ค ํํฐ ํ ๋ณํ (EBELN + EBELP๋ก ๋งค์นญ) - const relatedAccounts = accounts.filter( - (account) => account.EBELN === headerKey && account.EBELP === detailKey - ); + // Detail ๋ด๋ถ์ ์ค์ฒฉ๋ ZMM_KN ์ฒ๋ฆฌ + const accountsFromDetail = detail.ZMM_KN || []; + console.log(`๐ณ ${headerKey}-${detailKey}์ Account ์: ${Array.isArray(accountsFromDetail) ? accountsFromDetail.length : (accountsFromDetail ? 1 : 0)}`); + + // ZMM_KN์ด ๋ฐฐ์ด์ด ์๋ ๊ฒฝ์ฐ ๋ฐฐ์ด๋ก ๋ณํ + const accountsArray = Array.isArray(accountsFromDetail) ? accountsFromDetail : (accountsFromDetail ? [accountsFromDetail] : []); + const accountsConverted = processNestedArray( - relatedAccounts, - (account) => + accountsArray, + (account: any) => convertXMLToDBData<AccountData>(account as Record<string, string | undefined>, detailFkData), detailFkData ); @@ -212,40 +229,41 @@ function transformPOData(requestData: PORequestXML): ProcessedPOData[] { const detailsConverted = detailsWithAccounts.map(d => d.detail); const allAccountsConverted = detailsWithAccounts.flatMap(d => d.accounts); - // ํด๋น Header์ Payment๋ค ํํฐ ํ ๋ณํ - const relatedPayments = payments.filter((payment) => payment.EBELN === headerKey); - const paymentsConverted = processNestedArray( - relatedPayments, - (payment) => - convertXMLToDBData<PaymentData>(payment as Record<string, string | undefined>, fkData), - fkData - ); - - // ํด๋น Header์ Note๋ค ํํฐ ํ ๋ณํ - const relatedNotes = notes.filter((note) => note.EBELN === headerKey); + // Header ๋ด๋ถ์ ์ค์ฒฉ๋ ZMM_NOTE ์ฒ๋ฆฌ + const notesFromHeader = (header as any).ZMM_NOTE || []; + console.log(`๐ ${headerKey}์ Note ์: ${Array.isArray(notesFromHeader) ? notesFromHeader.length : (notesFromHeader ? 1 : 0)}`); + + const notesArray = Array.isArray(notesFromHeader) ? notesFromHeader : (notesFromHeader ? [notesFromHeader] : []); const notesConverted = processNestedArray( - relatedNotes, - (note) => + notesArray, + (note: any) => convertXMLToDBData<NoteData>(note as Record<string, string | undefined>, fkData), fkData ); - // ํด๋น Header์ Note2๋ค ํํฐ ํ ๋ณํ - const relatedNotes2 = notes2.filter((note2) => note2.EBELN === headerKey); + // Header ๋ด๋ถ์ ์ค์ฒฉ๋ ZMM_NOTE2 ์ฒ๋ฆฌ + const notes2FromHeader = (header as any).ZMM_NOTE2 || []; + console.log(`๐ ${headerKey}์ Note2 ์: ${Array.isArray(notes2FromHeader) ? notes2FromHeader.length : (notes2FromHeader ? 1 : 0)}`); + + const notes2Array = Array.isArray(notes2FromHeader) ? notes2FromHeader : (notes2FromHeader ? [notes2FromHeader] : []); const notes2Converted = processNestedArray( - relatedNotes2, - (note2) => + notes2Array, + (note2: any) => convertXMLToDBData<Note2Data>(note2 as Record<string, string | undefined>, fkData), fkData ); + // ZMM_PAY๋ ๋ณ๋ ์ฒ๋ฆฌ (ํ์ฌ XML์๋ ์์ง๋ง ๊ตฌ์กฐ์ ์ ์ง) + const paymentsConverted: PaymentData[] = []; + + console.log(`โ
${headerKey} ๋ณํ ์๋ฃ - Details: ${detailsConverted.length}, Accounts: ${allAccountsConverted.length}, Notes: ${notesConverted.length}, Notes2: ${notes2Converted.length}`); + return { header: headerConverted, details: detailsConverted, payments: paymentsConverted, notes: notesConverted, notes2: notes2Converted, - // accounts๋ ์ด์ detail๊ณผ ํจ๊ป ์ฒ๋ฆฌ๋๋ฏ๋ก ๋ณ๋๋ก ์ ์ฅํ์ง ์์ accounts: allAccountsConverted, }; }); diff --git a/db/schema/ECC/ecc.ts b/db/schema/ECC/ecc.ts index af726678..4d4198c7 100644 --- a/db/schema/ECC/ecc.ts +++ b/db/schema/ECC/ecc.ts @@ -22,7 +22,7 @@ export const PR_INFORMATION_T_BID_HEADER = ECCSchema.table( EKGRP: varchar({ length: 10 }), // Purchaing Group // From: IF_ECC_EVCP_PR_INFORMATION.wsdl EKORG: varchar({ length: 10 }), // Purchasing Organization // From: IF_ECC_EVCP_PR_INFORMATION.wsdl WERKS: varchar({ length: 10 }), // Plant // From: IF_ECC_EVCP_PR_INFORMATION.wsdl - ZBSART: varchar({ length: 10 }).notNull(), // Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required + ZBSART: varchar({ length: 10 }), // Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required ZRFQ_TRS_DT: varchar({ length: 10 }), // Date on Creating Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl ZRFQ_TRS_TM: varchar({ length: 10 }), // Time of Creating Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl @@ -37,10 +37,10 @@ export const PR_INFORMATION_T_BID_ITEM = ECCSchema.table( { id: integer('id').primaryKey().generatedByDefaultAsIdentity(), ANFNR: varchar({ length: 10 }).notNull().references(() => PR_INFORMATION_T_BID_HEADER.ANFNR), // Bidding/RFQ Number // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required - ANFPS: varchar({ length: 10 }).notNull(), // Item Number of Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required + ANFPS: varchar({ length: 10 }), // Item Number of Bidding // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required AUFNR: varchar({ length: 12 }), // Order Number // From: IF_ECC_EVCP_PR_INFORMATION.wsdl - BANFN: varchar({ length: 10 }).notNull(), // Purchase Requisition Number // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required - BANPO: varchar({ length: 10 }).notNull(), // Item Number of Purchase Requisition // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required + BANFN: varchar({ length: 10 }), // Purchase Requisition Number // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required + BANPO: varchar({ length: 10 }), // Item Number of Purchase Requisition // From: IF_ECC_EVCP_PR_INFORMATION.wsdl // Required BPRME: varchar({ length: 10 }), // Order Price Unit (Purchasing) // From: IF_ECC_EVCP_PR_INFORMATION.wsdl BRGEW: decimal({ precision: 15, scale: 3 }), // Gross Weight // From: IF_ECC_EVCP_PR_INFORMATION.wsdl DISMM: varchar({ length: 10 }), // MRP Type // From: IF_ECC_EVCP_PR_INFORMATION.wsdl @@ -87,19 +87,19 @@ export const ZMM_PCR = ECCSchema.table('ZMM_PCR', { // 2,ZMM_PCR,PCR_REQ_SEQ,M,NUMC,5,PCR ์์ฒญ์๋ฒ PCR_REQ_SEQ: varchar({ length: 255 }).notNull(), // 3,ZMM_PCR,PCR_REQ_DATE,M,DATS,8,PCR ์์ฒญ์ผ์ - PCR_REQ_DATE: varchar({ length: 255 }).notNull(), + PCR_REQ_DATE: varchar({ length: 255 }), // 4,ZMM_PCR,EBELN,M,CHAR,10,๊ตฌ๋งค์ค๋ - EBELN: varchar({ length: 255 }).notNull(), + EBELN: varchar({ length: 255 }), // 5,ZMM_PCR,EBELP,M,NUMC,5,๊ตฌ๋งค์ค๋ ํ๋ฒ - EBELP: varchar({ length: 255 }).notNull(), + EBELP: varchar({ length: 255 }), // 6,ZMM_PCR,PCR_TYPE,M,CHAR,2,"๋ฌผ๋/Spec ๋ณ๊ฒฝ Type : Q, W, S, QW" - PCR_TYPE: varchar({ length: 255 }).notNull(), + PCR_TYPE: varchar({ length: 255 }), // 7,ZMM_PCR,PSPID,,CHAR,24,ํ๋ก์ ํธ PSPID: varchar({ length: 255 }), // 8,ZMM_PCR,BANFN,M,CHAR,10,๊ตฌ๋งค์์ฒญ - BANFN: varchar({ length: 255 }).notNull(), + BANFN: varchar({ length: 255 }), // 9,ZMM_PCR,BNFPO,M,NUMC,5,๊ตฌ๋งค์์ฒญ ํ๋ฒ - BNFPO: varchar({ length: 255 }).notNull(), + BNFPO: varchar({ length: 255 }), // 10,ZMM_PCR,MATNR,,CHAR,18,์์ฌ๋ฒํธ MATNR: varchar({ length: 255 }), // 11,ZMM_PCR,MAKTX,,CHAR,40,์์ฌ๋ช
@@ -358,7 +358,7 @@ export const ZMM_PAY = ECCSchema.table('ZMM_PAY', { EBELN: varchar({ length: 255 }).notNull().references(() => ZMM_HD.EBELN), // 69,ZMM_HD/ZMM_PAY,ZPAYSEQ,M,CHAR,2,์ ๊ธ๊ธ์ฐจ์ - ZPAYSEQ: varchar({ length: 255 }).notNull(), + ZPAYSEQ: varchar({ length: 255 }), // 70,ZMM_HD/ZMM_PAY,ZADVTYP,M,CHAR,1,์ ๊ธ๊ธํ์
ZADVTYP: varchar({ length: 255 }), // 71,ZMM_HD/ZMM_PAY,ZDWPRT,M,NUMC,3,์ ๊ธ๊ธ๋น์จ @@ -632,9 +632,9 @@ export const ZMM_NOTE = ECCSchema.table('ZMM_NOTE', { EBELN: varchar({ length: 255 }).notNull().references(() => ZMM_HD.EBELN), // 187,ZMM_HD/ZMM_NOTE,ZNOTE_SER,M,NUMC,4,๋ฐ์ฃผ Note ์๋ฒ - ZNOTE_SER: varchar({ length: 255 }).notNull(), + ZNOTE_SER: varchar({ length: 255 }), // 188,ZMM_HD/ZMM_NOTE,ZNOTE_TXT,M,CHAR,4000,๋ฐ์ฃผ Note Text - ZNOTE_TXT: varchar({ length: 10000 }).notNull(), + ZNOTE_TXT: varchar({ length: 10000 }), createdAt: timestamp('created_at').defaultNow().notNull(), updatedAt: timestamp('updated_at').defaultNow().notNull(), @@ -649,9 +649,9 @@ export const ZMM_NOTE2 = ECCSchema.table('ZMM_NOTE2', { EBELN: varchar({ length: 255 }).notNull().references(() => ZMM_HD.EBELN), // 189,ZMM_HD/ZMM_NOTE2,ZDLV_PRICE_SER,,NUMC,4,์ฐ๋์ Note ์๋ฒ - ZDLV_PRICE_SER: varchar({ length: 255 }).notNull(), + ZDLV_PRICE_SER: varchar({ length: 255 }), // 190,ZMM_HD/ZMM_NOTE2,ZDLV_PRICE_NOTE,,CHAR,4000,์ฐ๋์ Note Text - ZDLV_PRICE_NOTE: varchar({ length: 10000 }).notNull(), + ZDLV_PRICE_NOTE: varchar({ length: 10000 }), createdAt: timestamp('created_at').defaultNow().notNull(), updatedAt: timestamp('updated_at').defaultNow().notNull(), @@ -669,11 +669,11 @@ export const T_CHANGE_PR = ECCSchema.table('T_CHANGE_PR', { // 1,๋ฉํ๋ฐ์ดํฐ(์ ์ฅํ์ง ์์),IV_ERDAT,M,,DATS,8,,Reject Date // 2,๋ฉํ๋ฐ์ดํฐ(์ ์ฅํ์ง ์์),IV_ERZET,M,,TIMS,6,,Reject Time // 3,T_CHANGE_PR,BANFN,M,,CHAR,10,,Purchase Requisition Number - BANFN: varchar({ length: 255 }).notNull(), + BANFN: varchar({ length: 255 }), // 4,T_CHANGE_PR,BANPO,M,,NUMC,5,,Item Number of Purchase Requisition - BANPO: varchar({ length: 255 }).notNull(), + BANPO: varchar({ length: 255 }), // 5,T_CHANGE_PR,ZCHG_NO,M,,CHAR,10,,Change Number - ZCHG_NO: varchar({ length: 255 }).notNull(), + ZCHG_NO: varchar({ length: 255 }), // 6,T_CHANGE_PR,ZACC_IND,,,CHAR,1,,P/R Accept Indicator ZACC_IND: varchar({ length: 255 }), // 7,T_CHANGE_PR,PCR_REQ,,,CHAR,10,,PCR Request No. diff --git a/db/schema/projects.ts b/db/schema/projects.ts index ee3dbf27..e4e2553a 100644 --- a/db/schema/projects.ts +++ b/db/schema/projects.ts @@ -5,7 +5,7 @@ export const projects = pgTable("projects", { code: varchar("code", { length: 50 }).notNull(), name: text("name").notNull(), type: varchar("type", { length: 20 }).default("ship").notNull(), - pspid: char('pspid', { length: 24 }).unique(), // ํ๋ก์ ํธID (ECC), TODO: ๋งคํ ํ์ + // pspid: char('pspid', { length: 24 }).unique(), // ํ๋ก์ ํธID = code ํ๋ createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }) |
