summaryrefslogtreecommitdiff
path: root/components/common/selectors/procurement-manager/procurement-manager-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'components/common/selectors/procurement-manager/procurement-manager-service.ts')
-rw-r--r--components/common/selectors/procurement-manager/procurement-manager-service.ts199
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 }))
+ }
+}
+