import { Text } from "@/components/ui/text"; import { formatVendorPortalDateTime } from "@/domain/vendor-portal/lib/status-helpers"; import type { VendorPortalDispatchDetail } from "@/domain/vendor-portal/types/vendor-portal"; type DispatchSnapshotDetailsProps = { data: VendorPortalDispatchDetail; locked: boolean; }; function resolveCanonicalService(workOrder: VendorPortalDispatchDetail["workOrder"]): string { if (workOrder?.service) { return workOrder.service; } return [workOrder?.trade, workOrder?.subTrade].filter(Boolean).join(" · "); } function DispatchCommercialDetails({ data }: Pick) { const service = resolveCanonicalService(data.workOrder); return (
{data.workOrder != null && Boolean(data.workOrder.internalWONumber) && (
WO # {data.workOrder.internalWONumber}
)} {Boolean(service) && (
Service {service}
)} {Boolean(data.poNumber) && (
PO # {data.poNumber}
)} {data.nteAmount != null && (
NTE ${Number(data.nteAmount).toFixed(2)}
)}
Invoice {data.invoiceStatus || "Not Submitted"} {data.invoiceNumber ? ` · ${data.invoiceNumber}` : ""}
Payment {data.paymentStatus || "Unavailable"}
{Boolean(data.scheduledDate) && (
Scheduled {formatVendorPortalDateTime(data.scheduledDate)}
)} {Boolean(data.statusUpdatedAt) && (
Status updated {formatVendorPortalDateTime(data.statusUpdatedAt)}
)}
); } function DispatchLocationDetails({ data }: Pick) { if (data.location == null) { return null; } const address = [ data.location.address, data.location.city, data.location.state, data.location.zipCode, ] .filter(Boolean) .join(", "); return ( <> Location {Boolean(data.workOrder?.siteCode) && (
Site code {data.workOrder?.siteCode}
)}
{data.location.name}
{address}
); } function DispatcherContactDetails({ data }: Pick) { const contact = data.dispatcherContact; if (!contact || (!contact.name && !contact.email && !contact.phone)) { return null; } return ( <> Dispatcher {Boolean(contact.name) && (
Name {contact.name}
)} {Boolean(contact.email) && (
Email {contact.email}
)} {Boolean(contact.phone) && (
Phone {contact.phone}
)} ); } export function DispatchSnapshotDetails({ data, locked }: DispatchSnapshotDetailsProps) { const description = data.description || data.workOrder?.description; return ( <> {locked && ( This dispatch is {data.status.toLowerCase()} and locked to further changes. Comments remain open. )} {Boolean(description) && ( <> Description
{description}
)} ); }