'use client'; import { useState } from 'react'; import { TrendingDown, ArrowDownRight, ArrowUpRight, ShoppingCart, DollarSign, AlertCircle, } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; 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 type { PurchaseStatusData } from '../types'; interface PurchaseStatusSectionProps { data: PurchaseStatusData; showDailyDetail?: boolean; } const formatAmount = (value: number) => { if (value >= 100000000) return `${(value / 100000000).toFixed(1)}억`; if (value >= 10000) return `${(value / 10000).toFixed(0)}만`; return value.toLocaleString(); }; export function PurchaseStatusSection({ data, showDailyDetail = true }: PurchaseStatusSectionProps) { const [supplierFilter, setSupplierFilter] = useState([]); const [sortOrder, setSortOrder] = useState('date-desc'); const filteredItems = data.dailyItems .filter((item) => supplierFilter.length === 0 || supplierFilter.includes(item.supplier)) .sort((a, b) => { if (sortOrder === 'date-desc') return b.date.localeCompare(a.date); if (sortOrder === 'date-asc') return a.date.localeCompare(b.date); if (sortOrder === 'amount-desc') return b.amount - a.amount; return a.amount - b.amount; }); const suppliers = [...new Set(data.dailyItems.map((item) => item.supplier))]; return (
{/* 다크 헤더 */}

매입 현황

당월 매입 실적

당월
{/* 통계카드 3개 */}
{/* 누적 매입 */}
누적 매입
{formatKoreanAmount(data.cumulativePurchase)}
{/* 미결제 금액 */}
미결제 금액
{formatKoreanAmount(data.unpaidAmount)}
{/* 전년 동기 대비 */}
= 0 ? '#fef2f2' : '#eff6ff', borderColor: data.yoyChange >= 0 ? '#fecaca' : '#bfdbfe', }} className="rounded-xl p-4 border" >
= 0 ? '#ef4444' : '#3b82f6' }} className="p-1.5 rounded-lg">
= 0 ? '#dc2626' : '#1d4ed8' }} className="text-sm font-medium">전년 동기 대비
{data.yoyChange >= 0 ? '+' : ''}{data.yoyChange}% {data.yoyChange >= 0 ? : }
{/* 차트 2열 */}
{/* 월별 매입 추이 */}

월별 매입 추이

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

자재 유형별 비율

({ name: r.name, value: r.value, percentage: r.percentage, color: r.color }) as Record)} cx="50%" cy="50%" innerRadius={50} outerRadius={80} dataKey="value" nameKey="name" label={({ name, payload }) => `${name} ${(payload as { percentage?: number })?.percentage ?? 0}%`} > {data.materialRatio.map((entry, index) => ( ))}
{/* 당월 매입 내역 테이블 */} {showDailyDetail && (

당월 매입 내역

({ value: s, label: s }))} value={supplierFilter} onChange={setSupplierFilter} placeholder="전체 공급처" className="w-[160px] 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()}원
)}
); }