summaryrefslogtreecommitdiff
path: root/components/common/selectors/procurement-manager/procurement-manager-service.ts
blob: e10b58b3ef52ebe6c1314a7b9ada2557daea896e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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 }))
  }
}