summaryrefslogtreecommitdiff
path: root/lib/soap/ecc/mapper/common-mapper-utils.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-10-20 14:25:05 +0900
committerjoonhoekim <26rote@gmail.com>2025-10-20 14:25:05 +0900
commitfdf72957d6ce5b5fec8e1b2999701d5f5a119cc3 (patch)
tree7f1dd370c8f51fe15df33c9d0f8bd34d35be9dec /lib/soap/ecc/mapper/common-mapper-utils.ts
parent28b9664c3a6aab2786e2429b2a8ae57f557856e2 (diff)
(김준회) PCR 인터페이스 수신시 비즈니스테이블로 매핑 처리 및 필요 공통함수들 작성
Diffstat (limited to 'lib/soap/ecc/mapper/common-mapper-utils.ts')
-rw-r--r--lib/soap/ecc/mapper/common-mapper-utils.ts113
1 files changed, 102 insertions, 11 deletions
diff --git a/lib/soap/ecc/mapper/common-mapper-utils.ts b/lib/soap/ecc/mapper/common-mapper-utils.ts
index 8558f058..cf5e0fdb 100644
--- a/lib/soap/ecc/mapper/common-mapper-utils.ts
+++ b/lib/soap/ecc/mapper/common-mapper-utils.ts
@@ -12,14 +12,19 @@
import { debugLog, debugSuccess, debugError } from '@/lib/debug-utils';
import db from '@/db/db';
-import { users } from '@/db/schema';
+import { users, vendors } from '@/db/schema';
import { projects } from '@/db/schema/projects';
import { EQUP_MASTER_MATL_CHARASGN } from '@/db/schema/MDG/mdg';
import { eq } from 'drizzle-orm';
+import { oracleKnex } from '@/lib/oracle-db/db';
/**
* 담당자 정보 조회 함수 (EKGRP 기반)
- * EKGRP(구매그룹코드)를 users 테이블의 userCode와 매칭하여 사용자 정보 반환
+ *
+ * 조회 순서:
+ * 1. Oracle DB에서 구매그룹코드(EKGRP)로 사번(EMPLOYEE_NUMBER) 조회
+ * 2. 사번으로 users 테이블의 employeeNumber와 매칭하여 사용자 정보 조회
+ * 3. 폴백: users 테이블의 userCode = EKGRP로 직접 조회
*/
export async function findUserInfoByEKGRP(EKGRP: string | null): Promise<{
userId: number;
@@ -35,8 +40,63 @@ export async function findUserInfoByEKGRP(EKGRP: string | null): Promise<{
return null;
}
- // users 테이블에서 userCode로 직접 조회
- const userResult = await db
+ // 1. Oracle DB에서 구매그룹코드로 사번 조회
+ try {
+ debugLog('Oracle DB에서 구매그룹코드로 사번 조회 시도', { EKGRP });
+
+ const oracleResult = await oracleKnex.raw(`
+ SELECT
+ CD.USR_DF_CHAR_9 AS EMPLOYEE_NUMBER
+ FROM CMCTB_CDNM NM
+ JOIN CMCTB_CD CD
+ ON NM.CD_CLF = CD.CD_CLF
+ AND NM.CD = CD.CD
+ AND NM.CD2 = CD.CD3
+ WHERE NM.CD_CLF = 'MMA070'
+ AND CD.CD = :ekgrp
+ AND CD.DEL_YN != 'Y'
+ `, { ekgrp: EKGRP });
+
+ const rows = (oracleResult.rows || oracleResult) as Array<Record<string, unknown>>;
+
+ if (rows && rows.length > 0 && rows[0].EMPLOYEE_NUMBER) {
+ const employeeNumber = String(rows[0].EMPLOYEE_NUMBER);
+ debugLog('Oracle에서 사번 조회 성공', { EKGRP, employeeNumber });
+
+ // 2. 사번으로 users 테이블에서 사용자 조회
+ const userByEmployeeNumber = await db
+ .select({
+ id: users.id,
+ name: users.name,
+ email: users.email,
+ phone: users.phone
+ })
+ .from(users)
+ .where(eq(users.employeeNumber, employeeNumber))
+ .limit(1);
+
+ if (userByEmployeeNumber.length > 0) {
+ const userInfo = {
+ userId: userByEmployeeNumber[0].id,
+ userName: userByEmployeeNumber[0].name,
+ userEmail: userByEmployeeNumber[0].email,
+ userPhone: userByEmployeeNumber[0].phone
+ };
+ debugSuccess('사번으로 담당자 찾음 (Oracle 경로)', { EKGRP, employeeNumber, userInfo });
+ return userInfo;
+ } else {
+ debugLog('사번에 해당하는 사용자를 찾을 수 없음, 폴백 시도', { employeeNumber });
+ }
+ } else {
+ debugLog('Oracle에서 구매그룹코드에 해당하는 사번을 찾을 수 없음, 폴백 시도', { EKGRP });
+ }
+ } catch (oracleError) {
+ debugError('Oracle 조회 중 오류, 폴백 시도', { EKGRP, error: oracleError });
+ }
+
+ // 3. 폴백: users 테이블에서 userCode로 직접 조회
+ debugLog('폴백: userCode로 직접 조회 시도', { EKGRP });
+ const userByUserCode = await db
.select({
id: users.id,
name: users.name,
@@ -47,18 +107,18 @@ export async function findUserInfoByEKGRP(EKGRP: string | null): Promise<{
.where(eq(users.userCode, EKGRP))
.limit(1);
- if (userResult.length === 0) {
- debugError('EKGRP에 해당하는 사용자를 찾을 수 없음', { EKGRP });
+ if (userByUserCode.length === 0) {
+ debugError('EKGRP에 해당하는 사용자를 찾을 수 없음 (모든 경로 실패)', { EKGRP });
return null;
}
const userInfo = {
- userId: userResult[0].id,
- userName: userResult[0].name,
- userEmail: userResult[0].email,
- userPhone: userResult[0].phone
+ userId: userByUserCode[0].id,
+ userName: userByUserCode[0].name,
+ userEmail: userByUserCode[0].email,
+ userPhone: userByUserCode[0].phone
};
- debugSuccess('담당자 찾음', { EKGRP, userInfo });
+ debugSuccess('담당자 찾음 (폴백 경로)', { EKGRP, userInfo });
return userInfo;
} catch (error) {
debugError('담당자 찾기 중 오류 발생', { EKGRP, error });
@@ -211,3 +271,34 @@ export interface ProjectInfo {
id: number;
name: string;
}
+
+/**
+ * 협력업체 코드(LIFNR)로 vendorId 찾기
+ * LIFNR = 벤더코드 (ex. A0001234)
+ * vendors 테이블의 vendorCode 필드와 비교하여 vendorId를 찾음
+ */
+export async function findVendorIdByLIFNR(lifnr: string | null | undefined): Promise<number | null> {
+ if (!lifnr || !lifnr.trim()) {
+ debugLog('LIFNR이 없음');
+ return null;
+ }
+
+ try {
+ // vendorCode 또는 vendorSapCode로 조회
+ const vendor = await db
+ .select({ id: vendors.id })
+ .from(vendors)
+ .where(eq(vendors.vendorCode, lifnr.trim()))
+ .limit(1);
+
+ if (vendor.length > 0) {
+ return vendor[0].id;
+ }
+
+ debugLog(`LIFNR ${lifnr}에 해당하는 vendor를 찾을 수 없음`);
+ return null;
+ } catch (error) {
+ debugError('Vendor 조회 중 오류 발생', { lifnr, error });
+ return null;
+ }
+} \ No newline at end of file