"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> 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 { 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 })) } }