// ============================================================ // ویجت ۶ — شبکه‌ی وضعیت سفارش‌های در راه // جدول کمی سفارش‌های باز: متریال و تأمین‌کننده | سفارش‌شده | رسیده // | وضعیت (در راه / تحویل جزئی / تحویل کامل) + نوار پیشرفت. // داده از /pm/on-the-way (با برچسب برند و مشخصات و فیلتر سراسری). // ============================================================ import { Truck } from "lucide-react"; import { useInTransit } from "../../hooks/useDashboardData"; import type { InTransitRow } from "../../lib/types"; import { faNum } from "../../lib/formatters"; import { cn } from "../../lib/utils"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "../ui/table"; import { Badge } from "../ui/badge"; import { ChartCard, ChartEmpty, ChartLoading } from "./chartShared"; const STATE_META: Record< InTransitRow["state"], { label: string; cls: string; bar: string } > = { on_the_way: { label: "در راه", cls: "bg-amber-bg text-amber", bar: "bg-amber" }, partially_received: { label: "تحویل جزئی", cls: "bg-blue-bg text-[#1d4ed8]", bar: "bg-[#2563eb]" }, arrived: { label: "تحویل کامل", cls: "bg-green-bg text-green", bar: "bg-green" }, }; function specLabel(specs: Record): string { const parts = Object.entries(specs || {}); return parts.length ? parts.map(([k, v]) => `${k}: ${v}`).join("، ") : ""; } function num(v: string): number { const n = Number(v); return Number.isFinite(n) ? n : 0; } export function InTransitGrid() { const query = useInTransit(); const rows = query.data ?? []; return ( سفارش‌های در راه — وضعیت تحویل } sub="اقلام پذیرفته‌شده‌ی خرید تا رسیدن کامل به انبار" > {query.isLoading ? ( ) : rows.length === 0 ? ( ) : ( متریال / تأمین‌کننده سفارش‌شده رسیده تاکنون پیشرفت وضعیت {rows.map((r) => { const ordered = num(r.ordered_qty); const received = num(r.received_qty); const pct = ordered > 0 ? Math.min(100, Math.round((received / ordered) * 100)) : 0; const meta = STATE_META[r.state] ?? STATE_META.on_the_way; const specs = specLabel(r.specs); return (
{r.material.name}
{r.supplier.name} {r.brand ? ` · ${r.brand.name}` : ""}
{specs &&
{specs}
} {r.project && (
{r.project.name}
)}
{faNum(ordered.toLocaleString("en-US"))}
{r.unit?.name_fa || r.unit?.code}
{faNum(received.toLocaleString("en-US"))}
{faNum(pct)}٪
{meta.label} ); })}
)}
); }