"use client" import { Card, CardContent } from "@/shared/components/ui/card" import { Separator } from "@/shared/components/ui/separator" import { formatCurrency, formatEnum } from "@/shared/utils/formatters" import { cn } from "@/shared/lib/utils" import { useInvoice } from "./invoice-context" export function InvoiceTotalsSummary() { const invoice = useInvoice() if (!invoice) return null const parts = invoice.invoice_parts ?? [] const services = invoice.invoice_services ?? [] const expenses = invoice.invoice_expenses ?? [] const discount = invoice.discount const displayTotal = parseFloat(String(invoice.total ?? 0)) || 0 const paid = parseFloat(String(invoice.payments_recieved ?? invoice.received_payment ?? 0)) || 0 const balanceDue = parseFloat(String(invoice.balance_due ?? 0)) || 0 const hasItems = parts.length > 0 || services.length > 0 || expenses.length > 0 if (!hasItems && displayTotal === 0) return null const subTotal = parseFloat(String(invoice.sub_total ?? 0)) || 0 function lineTotal(items: { quantity?: string | number; rate?: string | number }[]) { return items.reduce((sum, item) => { const qty = parseFloat(String(item.quantity ?? 0)) const rate = parseFloat(String(item.rate ?? 0)) return sum + (isNaN(qty) || isNaN(rate) ? 0 : qty * rate) }, 0) } return (
{hasItems && ( <> {parts.length > 0 && (
Parts ({parts.length}) {formatCurrency(lineTotal(parts))}
)} {services.length > 0 && (
Services ({services.length}) {formatCurrency(lineTotal(services))}
)} {expenses.length > 0 && (
Expenses ({expenses.length}) {formatCurrency(lineTotal(expenses))}
)} )}
Subtotal {formatCurrency(subTotal)}
{discount && discount !== "no" && (
Discount ({formatEnum(discount)}) Applied
)}
Total {formatCurrency(displayTotal)}
{paid > 0 && (
Amount Received – {formatCurrency(paid)}
)}
0 ? "bg-primary/10 text-primary" : "bg-green-500/10 text-green-600", )}> Balance Due {formatCurrency(balanceDue)}
) }