'use client'; import { Fragment } from 'react'; import { Checkbox } from '@/components/ui/checkbox'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { ExpenseEstimateData, ExpenseEstimateItem } from './types'; interface ExpenseEstimateFormProps { data: ExpenseEstimateData; onChange: (data: ExpenseEstimateData) => void; } // Mock 데이터 생성 const generateMockEstimateItems = (): ExpenseEstimateItem[] => { return [ { id: '1', checked: false, expectedPaymentDate: '2025-11-12', category: '통신 서비스', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, { id: '2', checked: false, expectedPaymentDate: '2025-11-12', category: '인건 대행', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, { id: '3', checked: false, expectedPaymentDate: '2025-11-12', category: '통신 서비스', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, { id: '4', checked: false, expectedPaymentDate: '2025-11-12', category: '인건 대행', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, // 11월 소계 후 { id: '5', checked: false, expectedPaymentDate: '2025-12-12', category: '기타서비스 12월분', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, { id: '6', checked: false, expectedPaymentDate: '2025-12-12', category: '통신 서비스', amount: 1000000, vendor: '회사명', memo: '국민 1234 홍길동' }, ]; }; export function ExpenseEstimateForm({ data, onChange }: ExpenseEstimateFormProps) { // Mock 데이터 초기화 const items = data.items.length > 0 ? data.items : generateMockEstimateItems(); const formatCurrency = (amount: number) => { return new Intl.NumberFormat('ko-KR').format(amount); }; 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; 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)}
); }