'use client'; import { useState } from 'react'; import { TrendingDown, ArrowDownRight, ArrowUpRight, ShoppingCart, DollarSign, AlertCircle, } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { formatCompactAmount } from '@/lib/utils/amount'; import { MultiSelectCombobox } from '@/components/ui/multi-select-combobox'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, PieChart, Pie, Cell, Legend, } from 'recharts'; import { formatKoreanAmount } from '@/lib/utils/amount'; import { CollapsibleDashboardCard } from '../components'; import type { PurchaseStatusData } from '../types'; interface PurchaseStatusSectionProps { data: PurchaseStatusData; } export function PurchaseStatusSection({ data }: PurchaseStatusSectionProps) { const [supplierFilter, setSupplierFilter] = useState([]); const filteredItems = data.dailyItems .filter((item) => supplierFilter.length === 0 || supplierFilter.includes(item.supplier)); const suppliers = [...new Set(data.dailyItems.map((item) => item.supplier))]; return (
} title="매입 현황" subtitle="당월 매입 실적" rightElement={ 당월 } > {/* 통계카드 3개 - 가로 배치 */}
{/* 누적 매입 */}
누적 매입
{formatKoreanAmount(data.cumulativePurchase)}
{/* 미결제 금액 */}
미결제 금액
{formatKoreanAmount(data.unpaidAmount)}
{/* 전년 동기 대비 */}
= 0 ? 'bg-red-50 border-red-200 dark:bg-red-900/30 dark:border-red-800' : 'bg-blue-50 border-blue-200 dark:bg-blue-900/30 dark:border-blue-800'}`} >
= 0 ? '#ef4444' : '#3b82f6' }} className="p-1.5 rounded-lg">
= 0 ? 'text-red-700 dark:text-red-300' : 'text-blue-700 dark:text-blue-300'}`}>전년 동기 대비
{data.yoyChange >= 0 ? '+' : ''}{data.yoyChange}% {data.yoyChange >= 0 ? : }
{/* 차트 2열 */}
{/* 월별 매입 추이 */}

월별 매입 추이

[formatKoreanAmount(Number(value) || 0), '매입']} />
{/* 자재 유형별 비율 (Donut) */}

자재 유형별 비율

({ name: r.name, value: r.value, percentage: r.percentage, color: r.color }) as Record)} cx="50%" cy="40%" innerRadius={40} outerRadius={65} dataKey="value" nameKey="name" > {data.materialRatio.map((entry, index) => ( ))} [formatKoreanAmount(value ?? 0), '금액']} /> { const item = data.materialRatio.find((r) => r.name === value); return `${value} ${item?.percentage ?? 0}%`; }} />
{/* 당월 매입 내역 (별도 카드) */} } title="당월 매입 내역" subtitle="당월 매입 거래 상세" bodyClassName="p-0" >
총 {filteredItems.length}건
({ value: s, label: s }))} value={supplierFilter} onChange={setSupplierFilter} placeholder="전체 공급처" className="w-full h-8 text-xs" />
{filteredItems.map((item, idx) => ( ))}
날짜 공급처 품목 금액 상태
{item.date} {item.supplier} {item.item} {item.amount.toLocaleString()}원 {item.status}
합계 {filteredItems.reduce((sum, item) => sum + item.amount, 0).toLocaleString()}원
); }