diff options
Diffstat (limited to 'components/common/selectors/procurement-manager/procurement-manager-service.ts')
| -rw-r--r-- | components/common/selectors/procurement-manager/procurement-manager-service.ts | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/components/common/selectors/procurement-manager/procurement-manager-service.ts b/components/common/selectors/procurement-manager/procurement-manager-service.ts new file mode 100644 index 00000000..e10b58b3 --- /dev/null +++ b/components/common/selectors/procurement-manager/procurement-manager-service.ts @@ -0,0 +1,199 @@ +"use server" + +import { oracleKnex } from '@/lib/oracle-db/db' +import { getUserByEmployeeNumber } from '@/lib/users/service' +import { updateUser } from '@/lib/users/repository' + +// 조달담당자 타입 정의 +export interface ProcurementManager { + PROCUREMENT_MANAGER_CODE: string // 조달담당자 코드 + DISPLAY_NAME: string // 담당자명 + DEPARTMENT_NAME: string // 부서명 + EMPLOYEE_NUMBER: string // 사번 + DEPARTMENT_CODE: string // 부서코드 + IS_ACTIVE: string // 사용 여부 +} + +// 조달담당자 + 사용자 정보 타입 +export interface ProcurementManagerWithUser extends ProcurementManager { + user?: { + id: number + name: string + email: string + employeeNumber: string | null + // 필요한 다른 사용자 필드들... + } | null +} + +// 테스트 환경용 폴백 데이터 +const FALLBACK_TEST_DATA: ProcurementManager[] = [ + { + PROCUREMENT_MANAGER_CODE: 'PM001', + DISPLAY_NAME: '홍길동', + DEPARTMENT_NAME: '조달팀', + EMPLOYEE_NUMBER: '2001234', + DEPARTMENT_CODE: 'D001', + IS_ACTIVE: 'Y' + }, + { + PROCUREMENT_MANAGER_CODE: 'PM002', + DISPLAY_NAME: '김영수', + DEPARTMENT_NAME: '구매지원팀', + EMPLOYEE_NUMBER: '2002345', + DEPARTMENT_CODE: 'D002', + IS_ACTIVE: 'Y' + }, + { + PROCUREMENT_MANAGER_CODE: 'PM003', + DISPLAY_NAME: '이민지', + DEPARTMENT_NAME: '조달관리팀', + EMPLOYEE_NUMBER: '2003456', + DEPARTMENT_CODE: 'D003', + IS_ACTIVE: 'Y' + }, + { + PROCUREMENT_MANAGER_CODE: 'PM004', + DISPLAY_NAME: '박서준', + DEPARTMENT_NAME: '자재조달팀', + EMPLOYEE_NUMBER: '2004567', + DEPARTMENT_CODE: 'D004', + IS_ACTIVE: 'Y' + }, + { + PROCUREMENT_MANAGER_CODE: 'PM005', + DISPLAY_NAME: '최지우', + DEPARTMENT_NAME: '조달기획팀', + EMPLOYEE_NUMBER: '2005678', + DEPARTMENT_CODE: 'D005', + IS_ACTIVE: 'Y' + }, +] + +/** + * 모든 조달담당자 목록 조회 (Oracle에서 전체 조회, 실패 시 폴백 데이터 사용) + * CMCTB_CDNM, CMCTB_CD 테이블에서 CD_CLF = 'MMK010' 조건으로 조회 + * 클라이언트에서 검색/필터링 수행 + */ +export async function getProcurementManagers(): Promise<{ + success: boolean + data: ProcurementManager[] + error?: string + isUsingFallback?: boolean +}> { + try { + console.log('📋 [getProcurementManagers] Oracle 쿼리 시작...') + + const result = await oracleKnex.raw(` + SELECT + NM.CD AS PROCUREMENT_MANAGER_CODE, + NM.CDNM AS DISPLAY_NAME, + NM.GRP_DSC AS DEPARTMENT_NAME, + CD.USR_DF_CHAR_1 AS EMPLOYEE_NUMBER, + CD.USR_DF_CHAR_2 AS DEPARTMENT_CODE, + CD.USR_DF_CHK_1 AS IS_ACTIVE + FROM CMCTB_CD CD + JOIN CMCTB_CDNM NM + ON CD.CD_CLF = NM.CD_CLF + AND CD.CD = NM.CD + AND CD.CD2 = NM.CD2 + AND CD.CD3 = NM.CD3 + WHERE CD.CD_CLF = 'MMK010' + AND CD.DEL_YN != 'Y' + ORDER BY NM.CD + `) + + // Oracle raw query의 결과는 rows 배열에 들어있음 + const rows = (result.rows || result) as Array<Record<string, unknown>> + + console.log(`✅ [getProcurementManagers] Oracle 쿼리 성공 - ${rows.length}건 조회`) + + // null 값 필터링 + const cleanedResult = rows + .filter((item) => + item.PROCUREMENT_MANAGER_CODE && + item.DISPLAY_NAME && + item.EMPLOYEE_NUMBER + ) + .map((item) => ({ + PROCUREMENT_MANAGER_CODE: String(item.PROCUREMENT_MANAGER_CODE), + DISPLAY_NAME: String(item.DISPLAY_NAME), + DEPARTMENT_NAME: String(item.DEPARTMENT_NAME || ''), + EMPLOYEE_NUMBER: String(item.EMPLOYEE_NUMBER), + DEPARTMENT_CODE: String(item.DEPARTMENT_CODE || ''), + IS_ACTIVE: String(item.IS_ACTIVE || 'Y') + })) + + console.log(`✅ [getProcurementManagers] 필터링 후 ${cleanedResult.length}건`) + + return { + success: true, + data: cleanedResult, + isUsingFallback: false + } + } catch (error) { + console.error('❌ [getProcurementManagers] Oracle 오류:', error) + console.log('🔄 [getProcurementManagers] 폴백 테스트 데이터 사용 (' + FALLBACK_TEST_DATA.length + '건)') + return { + success: true, + data: FALLBACK_TEST_DATA, + isUsingFallback: true + } + } +} + +/** + * 조달담당자(들)에 사용자 정보 추가 및 procurementManagerCode 업데이트 (1개 또는 여러 개 처리) + * 선택 시 해당 사용자의 procurementManagerCode를 조달담당자 코드로 업데이트 + * @param managers - 단일 또는 배열 형태의 조달담당자 + * @returns 사용자 정보가 포함된 조달담당자 배열 + */ +export async function addUsersToManagersAsync( + managers: ProcurementManager | ProcurementManager[] +): Promise<ProcurementManagerWithUser[]> { + try { + // 배열로 정규화 + const managersArray = Array.isArray(managers) ? managers : [managers] + + console.log(`👤 [addUsersToManagersAsync] ${managersArray.length}개 조달담당자에 대한 사용자 정보 조회 및 procurementManagerCode 업데이트 시작`) + + // 각 조달담당자에 대해 사용자 정보 조회 및 procurementManagerCode 업데이트 + const withUsers = await Promise.all( + managersArray.map(async (manager) => { + console.log(` 🔍 [addUsersToManagersAsync] 사번 ${manager.EMPLOYEE_NUMBER} 조회 중...`) + const user = await getUserByEmployeeNumber(manager.EMPLOYEE_NUMBER) + + if (user) { + console.log(` ✅ [addUsersToManagersAsync] 사번 ${manager.EMPLOYEE_NUMBER} → 사용자 찾음: ${user.name}`) + + // 사용자의 procurementManagerCode를 조달담당자 코드로 업데이트 + try { + console.log(` 📝 [addUsersToManagersAsync] 사용자 ${user.id}의 procurementManagerCode를 ${manager.PROCUREMENT_MANAGER_CODE}로 업데이트 중...`) + await updateUser(user.id, { procurementManagerCode: manager.PROCUREMENT_MANAGER_CODE }) + console.log(` ✅ [addUsersToManagersAsync] 사용자 ${user.id}의 procurementManagerCode 업데이트 완료`) + } catch (updateError) { + console.error(` ❌ [addUsersToManagersAsync] 사용자 ${user.id}의 procurementManagerCode 업데이트 실패:`, updateError) + } + } else { + console.log(` ⚠️ [addUsersToManagersAsync] 사번 ${manager.EMPLOYEE_NUMBER} → 사용자 없음`) + } + + return { + ...manager, + user: user ? { + id: user.id, + name: user.name, + email: user.email, + employeeNumber: user.employeeNumber, + } : null + } + }) + ) + + return withUsers + } catch (error) { + console.error('❌ [addUsersToManagersAsync] 오류:', error) + const managersArray = Array.isArray(managers) ? managers : [managers] + return managersArray.map(manager => ({ ...manager, user: null })) + } +} + |
