/** * 월 예상 지출 (MonthlyExpense) + 카드/가지급금 (CardManagement) 변환 */ import type { ExpectedExpenseApiResponse, CardTransactionApiResponse, LoanDashboardApiResponse, TaxSimulationApiResponse, } from '../types'; import type { MonthlyExpenseData, CardManagementData, CheckPoint, CheckPointType, } from '@/components/business/CEODashboard/types'; import { formatAmount, calculateChangeRate } from './common'; // ============================================ // 월 예상 지출 (MonthlyExpense) // ============================================ /** * 당월 예상 지출 CheckPoints 생성 */ function generateMonthlyExpenseCheckPoints(api: ExpectedExpenseApiResponse): CheckPoint[] { const checkPoints: CheckPoint[] = []; // 총 예상 지출 checkPoints.push({ id: 'me-total', type: 'info' as CheckPointType, message: `이번 달 예상 지출은 ${formatAmount(api.total_amount)}입니다.`, highlights: [ { text: formatAmount(api.total_amount), color: 'blue' as const }, ], }); return checkPoints; } /** * ExpectedExpense API 응답 → Frontend 타입 변환 * 주의: 실제 API는 상세 분류(매입/카드/어음 등)를 제공하지 않음 * by_transaction_type에서 추출하거나 기본값 사용 */ export function transformMonthlyExpenseResponse(api: ExpectedExpenseApiResponse): MonthlyExpenseData { // transaction_type별 금액 추출 const purchaseTotal = api.by_transaction_type['purchase']?.total ?? 0; const cardTotal = api.by_transaction_type['card']?.total ?? 0; const billTotal = api.by_transaction_type['bill']?.total ?? 0; return { cards: [ { id: 'me1', label: '매입', amount: purchaseTotal, }, { id: 'me2', label: '카드', amount: cardTotal, }, { id: 'me3', label: '발행어음', amount: billTotal, }, { id: 'me4', label: '총 예상 지출 합계', amount: api.total_amount, }, ], checkPoints: generateMonthlyExpenseCheckPoints(api), }; } // ============================================ // 카드/가지급금 (CardManagement) // ============================================ /** * 카드/가지급금 CheckPoints 생성 */ function generateCardManagementCheckPoints(api: CardTransactionApiResponse): CheckPoint[] { const checkPoints: CheckPoint[] = []; // 전월 대비 변화 const changeRate = calculateChangeRate(api.current_month_total, api.previous_month_total); if (Math.abs(changeRate) > 10) { const type: CheckPointType = changeRate > 0 ? 'warning' : 'info'; checkPoints.push({ id: 'cm-change', type, message: `당월 카드 사용액이 전월 대비 ${changeRate > 0 ? '+' : ''}${changeRate.toFixed(1)}% 변동했습니다.`, highlights: [ { text: `${changeRate > 0 ? '+' : ''}${changeRate.toFixed(1)}%`, color: changeRate > 0 ? 'red' as const : 'green' as const }, ], }); } // 당월 사용액 checkPoints.push({ id: 'cm-current', type: 'info' as CheckPointType, message: `당월 카드 사용 총 ${formatAmount(api.current_month_total)}입니다.`, highlights: [ { text: formatAmount(api.current_month_total), color: 'blue' as const }, ], }); return checkPoints; } /** * CardTransaction API 응답 → Frontend 타입 변환 * 4개 카드 구조: * - cm1: 카드 사용액 (CardTransaction API) * - cm2: 가지급금 (LoanDashboard API) * - cm3: 법인세 예상 가중 (TaxSimulation API - corporate_tax.difference) * - cm4: 대표자 종합세 예상 가중 (TaxSimulation API - income_tax.difference) */ export function transformCardManagementResponse( summaryApi: CardTransactionApiResponse, loanApi?: LoanDashboardApiResponse | null, taxApi?: TaxSimulationApiResponse | null, fallbackData?: CardManagementData ): CardManagementData { const changeRate = calculateChangeRate(summaryApi.current_month_total, summaryApi.previous_month_total); // cm2: 가지급금 금액 (LoanDashboard API 또는 fallback) const loanAmount = loanApi?.summary?.total_outstanding ?? fallbackData?.cards[1]?.amount ?? 0; // cm3: 법인세 예상 가중 (TaxSimulation API 또는 fallback) const corporateTaxDifference = taxApi?.corporate_tax?.difference ?? fallbackData?.cards[2]?.amount ?? 0; // cm4: 대표자 종합세 예상 가중 (TaxSimulation API 또는 fallback) const incomeTaxDifference = taxApi?.income_tax?.difference ?? fallbackData?.cards[3]?.amount ?? 0; // 가지급금 경고 배너 표시 여부 결정 (가지급금 잔액 > 0이면 표시) const hasLoanWarning = loanAmount > 0; return { // 가지급금 관련 경고 배너 (가지급금 있을 때만 표시) warningBanner: hasLoanWarning ? fallbackData?.warningBanner : undefined, cards: [ // cm1: 카드 사용액 (CardTransaction API) { id: 'cm1', label: '카드', amount: summaryApi.current_month_total, previousLabel: `전월 대비 ${changeRate > 0 ? '+' : ''}${changeRate.toFixed(1)}%`, }, // cm2: 가지급금 (LoanDashboard API) { id: 'cm2', label: '가지급금', amount: loanAmount, }, // cm3: 법인세 예상 가중 (TaxSimulation API) { id: 'cm3', label: '법인세 예상 가중', amount: corporateTaxDifference, }, // cm4: 대표자 종합세 예상 가중 (TaxSimulation API) { id: 'cm4', label: '대표자 종합세 예상 가중', amount: incomeTaxDifference, }, ], checkPoints: generateCardManagementCheckPoints(summaryApi), }; }