import { auth } from "@/auth"; import { db } from "@/lib/db"; import { hasPermission } from "@/lib/permissions"; import { redirect } from "next/navigation"; import Link from "next/link"; import { formatCurrency, formatDate } from "@/lib/utils"; import { PoStatusBadge } from "@/components/po/po-status-badge"; import { PaymentHistoryFilters } from "./payment-history-filters"; import { Suspense } from "react"; import type { Metadata } from "next"; export const metadata: Metadata = { title: "Payment History" }; interface Props { searchParams: Promise<{ dateFrom?: string; dateTo?: string; vesselId?: string; }>; } export default async function PaymentHistoryPage({ searchParams }: Props) { const session = await auth(); if (!session?.user) redirect("/login"); if (!hasPermission(session.user.role, "view_all_pos")) redirect("/dashboard"); const { dateFrom, dateTo, vesselId } = await searchParams; const where: NonNullable[0]>["where"] = { status: { in: ["PAID_DELIVERED", "CLOSED"] }, }; if (dateFrom) where.paidAt = { ...where.paidAt as object, gte: new Date(dateFrom) }; if (dateTo) { const end = new Date(dateTo); end.setDate(end.getDate() + 1); where.paidAt = { ...where.paidAt as object, lt: end }; } if (vesselId) where.vesselId = vesselId; const [orders, vessels, totalResult] = await Promise.all([ db.purchaseOrder.findMany({ where, include: { submitter: true, vessel: true, site: { select: { name: true } }, account: true, vendor: true, }, orderBy: { paidAt: "desc" }, take: 200, }), db.vessel.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), db.purchaseOrder.aggregate({ _sum: { totalAmount: true }, where, }), ]); const totalPaid = Number(totalResult._sum.totalAmount ?? 0); return (

Payment History

POs marked as paid or fully closed

{/* Summary stat */}

Total Paid

{formatCurrency(totalPaid)}

Orders

{orders.length}

{orders.map((po) => ( ))}
PO Number Title Cost Centre Vendor Submitter Status Payment Ref Amount Paid
{po.poNumber} {po.title} {po.vessel.name} {po.vendor?.name ?? "—"} {po.submitter.name} {po.paymentRef ?? "—"} {formatCurrency(Number(po.totalAmount), po.currency)} {po.paidAt ? formatDate(po.paidAt) : "—"}
{orders.length === 0 && (
No paid orders found.
)}
{orders.length === 200 && (

Showing first 200 results — refine filters to narrow results.

)}
); }