"use client" import { FileText, Calendar, Hash, Building2, AlertTriangle, CheckCircle2, TimerIcon, ShoppingCart, CreditCard, } from "lucide-react" import { Card, CardContent, CardHeader, CardTitle, } from "@/shared/components/ui/card" import { Badge } from "@/shared/components/ui/badge" import { cn } from "@/shared/lib/utils" import { formatDate, formatCurrency, formatEnum } from "@/shared/utils/formatters" import { getFullName } from "@/shared/utils/getFullName" import { useBill } from "./bill-context" function InfoItem({ icon: Icon, label, value, }: { icon: React.ComponentType<{ className?: string }> label: string value?: string | null }) { return (
{label} {value || }
) } const statusVariantMap: Record = { draft: "secondary", open: "default", un_paid: "destructive", partially_paid: "secondary", paid: "default", } function getDueInfo(dueDateStr?: string, status?: string) { if (!dueDateStr) return null const now = new Date() const due = new Date(dueDateStr) const diffMs = due.getTime() - now.getTime() const diffDays = Math.ceil(diffMs / (1000 * 60 * 60 * 24)) const isPaid = status === "paid" if (isPaid) return { label: formatDate(dueDateStr), variant: "neutral" as const } if (diffDays < 0) return { label: `${Math.abs(diffDays)} days overdue`, variant: "overdue" as const } if (diffDays === 0) return { label: "Due today", variant: "today" as const } if (diffDays <= 7) return { label: `Due in ${diffDays} day${diffDays === 1 ? "" : "s"}`, variant: "soon" as const } return { label: formatDate(dueDateStr), variant: "neutral" as const } } export function BillGeneralInfo() { const bill = useBill() if (!bill) return null const vendor = bill.vendor || {} const department = bill.department || null const jobCard = bill.job_card || null const purchaseOrder = bill.purchase_order || null const dueInfo = getDueInfo(bill.bill_due_date as string | undefined, bill.status as string | undefined) return (
{/* ── Summary Hero ── */}
{/* Status */} Status
{bill.status === "paid" && } {bill.status === "un_paid" && } {(bill.status === "draft" || bill.status === "open") && } {formatEnum(String(bill.status ?? ""))}
{bill.bill_number && ( {bill.bill_number} )}
{/* Due Date */} Due Date {formatDate(bill.bill_due_date) || "—"} {dueInfo && dueInfo.variant !== "neutral" && ( {dueInfo.label} )} {/* Vendor */} Vendor {vendor.company_name || getFullName(vendor) || "—"}
{/* ── Bill Details ── */} Bill Details
{jobCard?.order_number && ( )} {purchaseOrder?.order_number && ( )} {bill.tax?.name && ( )}
{/* ── Notes ── */} {bill.notes && ( Notes

{bill.notes}

)}
) }