'use client'; import { Fragment } from 'react'; import { ContentSkeleton } from '@/components/ui/skeleton'; import { Checkbox } from '@/components/ui/checkbox'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { ExpenseEstimateData, ExpenseEstimateItem } from './types'; import { formatNumber as formatCurrency } from '@/lib/utils/amount'; interface ExpenseEstimateFormProps { data: ExpenseEstimateData; onChange: (data: ExpenseEstimateData) => void; isLoading?: boolean; } export function ExpenseEstimateForm({ data, onChange, isLoading }: ExpenseEstimateFormProps) { const items = data.items; const handleCheckChange = (id: string, checked: boolean) => { const newItems = items.map((item) => item.id === id ? { ...item, checked } : item ); const totalExpense = newItems.reduce((sum, item) => sum + item.amount, 0); onChange({ ...data, items: newItems, totalExpense, finalDifference: data.accountBalance - totalExpense, }); }; // 월별 그룹핑 const groupedByMonth = items.reduce((acc, item) => { const month = item.expectedPaymentDate.substring(0, 7); // YYYY-MM if (!acc[month]) { acc[month] = []; } acc[month].push(item); return acc; }, {} as Record); const getMonthSubtotal = (monthItems: ExpenseEstimateItem[]) => { return monthItems.reduce((sum, item) => sum + item.amount, 0); }; const totalExpense = items.reduce((sum, item) => sum + item.amount, 0); const accountBalance = data.accountBalance || 10000000; // Mock 계좌 잔액 const finalDifference = accountBalance - totalExpense; // 로딩 상태 if (isLoading) { return (

지출 예상 내역서 목록

); } // 빈 상태 if (items.length === 0) { return (

지출 예상 내역서 목록

등록된 지출 예상 항목이 없습니다.

지출 예상 항목을 먼저 등록해주세요.

); } return (
{/* 지출 예상 내역서 정보 */}

지출 예상 내역서 목록

예상 지급일 항목 지출금액 거래처 적록 {Object.entries(groupedByMonth).map(([month, monthItems]) => ( {monthItems.map((item) => ( handleCheckChange(item.id, !!checked)} /> {item.expectedPaymentDate} {item.category} {formatCurrency(item.amount)} {item.vendor} {item.memo} ))} {/* 월별 소계 */} {month.replace('-', '년 ')}월 계 {formatCurrency(getMonthSubtotal(monthItems))} ))} {/* 합계 행들 */} 지출 합계 {formatCurrency(totalExpense)} 계좌 잔액 {formatCurrency(accountBalance)} 최종 차액 = 0 ? 'text-blue-600' : 'text-red-600'}`}> {formatCurrency(finalDifference)}
); }