'use client'; import { useMemo } from 'react'; import { Plus, Trash2, AlertTriangle } from 'lucide-react'; import { Input } from '@/components/ui/input'; import { DatePicker } from '@/components/ui/date-picker'; import { Label } from '@/components/ui/label'; import { CurrencyInput } from '@/components/ui/currency-input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import type { BillFormData } from '../types'; import { HISTORY_TYPE_OPTIONS } from '../constants'; interface HistorySectionProps { formData: BillFormData; updateField: (field: K, value: BillFormData[K]) => void; isViewMode: boolean; isElectronic: boolean; maxSplitCount: number; onAddInstallment: () => void; onRemoveInstallment: (id: string) => void; onUpdateInstallment: (id: string, field: string, value: string | number) => void; } export function HistorySection({ formData, updateField, isViewMode, isElectronic, maxSplitCount, onAddInstallment, onRemoveInstallment, onUpdateInstallment, }: HistorySectionProps) { const splitEndorsementStats = useMemo(() => { const splits = formData.installments.filter(inst => inst.type === 'splitEndorsement'); const totalAmount = splits.reduce((sum, inst) => sum + inst.amount, 0); return { count: splits.length, totalAmount, remaining: formData.amount - totalAmount }; }, [formData.installments, formData.amount]); return ( 이력 관리 {!isViewMode && ( )}
{/* 분할배서 토글 */}
updateField('isSplit', c)} disabled={isViewMode} /> {formData.isSplit && ( 최대 {maxSplitCount}회 )}
{formData.isSplit && isElectronic && (
전자어음 분할배서: 최초 배서인에 한해 5회 미만 가능 (전자어음법 제6조)
)} {formData.isSplit && splitEndorsementStats.count > 0 && (
원금액: ₩ {formData.amount.toLocaleString()} | 분할배서 합계: ₩ {splitEndorsementStats.totalAmount.toLocaleString()} | 잔액: ₩ {splitEndorsementStats.remaining.toLocaleString()} {splitEndorsementStats.remaining < 0 && ( 금액 초과 )}
)}
{/* 이력 테이블 */}
No 일자 처리구분 금액 상대처 비고 {!isViewMode && 삭제} {formData.installments.length === 0 ? ( 등록된 이력이 없습니다 ) : formData.installments.map((inst, idx) => ( {idx + 1} onUpdateInstallment(inst.id, 'date', d)} size="sm" disabled={isViewMode} /> onUpdateInstallment(inst.id, 'amount', v ?? 0)} className="h-8 text-sm" disabled={isViewMode} /> onUpdateInstallment(inst.id, 'counterparty', e.target.value)} placeholder="거래처/은행" className="h-8 text-sm" disabled={isViewMode} /> onUpdateInstallment(inst.id, 'note', e.target.value)} className="h-8 text-sm" disabled={isViewMode} /> {!isViewMode && ( )} ))}
); }