summaryrefslogtreecommitdiff
path: root/components/common/selectors/currency/currency-service.ts
blob: 4e73f07783e20a6d20aca126e61ea95bbd01f0fe (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
"use server"

import { oracleKnex } from '@/lib/oracle-db/db'

// 통화 타입 정의
export interface Currency {
  CURRENCY_CODE: string // 통화 코드 (예: KRW, USD, JPY)
  CURRENCY_NAME: string // 통화 이름/설명
  DECIMAL_PLACES: number // 입력가능 소수점 자리수
}

// 테스트 환경용 폴백 데이터
const FALLBACK_TEST_DATA: Currency[] = [
  { CURRENCY_CODE: 'KRW', CURRENCY_NAME: '원화(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 0 },
  { CURRENCY_CODE: 'USD', CURRENCY_NAME: '미국 달러(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 2 },
  { CURRENCY_CODE: 'EUR', CURRENCY_NAME: '유로(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 2 },
  { CURRENCY_CODE: 'JPY', CURRENCY_NAME: '일본 엔화(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 0 },
  { CURRENCY_CODE: 'CNY', CURRENCY_NAME: '중국 위안(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 2 },
  { CURRENCY_CODE: 'GBP', CURRENCY_NAME: '영국 파운드(테스트데이터 - 오라클 페칭 실패시)', DECIMAL_PLACES: 2 },
]

/**
 * 통화 코드별 소수점 자리수 반환
 * - 원화(KRW): 0
 * - 엔화(JPY): 0
 * - 기타: 2
 */
function getDecimalPlaces(currencyCode: string): number {
  const code = currencyCode.toUpperCase()
  if (code === 'KRW' || code === 'JPY') {
    return 0
  }
  return 2
}

/**
 * 모든 통화 목록 조회 (Oracle에서 전체 조회, 실패 시 폴백 데이터 사용)
 * CMCTB_CD, CMCTB_CDNM 테이블에서 CD_CLF = 'SPB032' 조건으로 조회
 * 클라이언트에서 검색/필터링 수행
 */
export async function getCurrencies(): Promise<{
  success: boolean
  data: Currency[]
  error?: string
  isUsingFallback?: boolean
}> {
  try {
    console.log('📋 [getCurrencies] Oracle 쿼리 시작...')

    const result = await oracleKnex.raw(`
      SELECT CD.CD AS CURRENCY_CODE, NM.GRP_DSC AS CURRENCY_NAME
        FROM CMCTB_CD CD
       INNER 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 = 'SPB032'
         AND NM.DEL_YN = 'N'
         AND CD.DEL_YN = 'N'
      ORDER BY CD.USR_DF_CHAR_8 ASC, CD.CD ASC
    `)

    // Oracle raw query의 결과는 rows 배열에 들어있음
    const rows = (result.rows || result) as Array<Record<string, unknown>>
    
    console.log(`✅ [getCurrencies] Oracle 쿼리 성공 - ${rows.length}건 조회`)
    
    // null 값 필터링 및 소수점 자리수 추가
    const cleanedResult = rows
      .filter((item) => 
        item.CURRENCY_CODE && 
        item.CURRENCY_NAME
      )
      .map((item) => {
        const currencyCode = String(item.CURRENCY_CODE)
        return {
          CURRENCY_CODE: currencyCode,
          CURRENCY_NAME: String(item.CURRENCY_NAME),
          DECIMAL_PLACES: getDecimalPlaces(currencyCode)
        }
      })

    console.log(`✅ [getCurrencies] 필터링 후 ${cleanedResult.length}건`)

    return {
      success: true,
      data: cleanedResult,
      isUsingFallback: false
    }
  } catch (error) {
    console.error('❌ [getCurrencies] Oracle 오류:', error)
    console.log('🔄 [getCurrencies] 폴백 테스트 데이터 사용 (' + FALLBACK_TEST_DATA.length + '건)')
    return {
      success: true,
      data: FALLBACK_TEST_DATA,
      isUsingFallback: true
    }
  }
}