summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/api/(S-ERP)/(ECC)/IF_ECC_EVCP_PO_INFORMATION/route.ts116
-rw-r--r--db/schema/ECC/ecc.ts36
-rw-r--r--db/schema/projects.ts2
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(),
})