diff options
Diffstat (limited to 'lib/soap/ecc/mapper/common-mapper-utils.ts')
| -rw-r--r-- | lib/soap/ecc/mapper/common-mapper-utils.ts | 113 |
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 |
