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 { ApprovalsSearch } from "./approvals-search"; import { Suspense } from "react"; import type { Metadata } from "next"; export const metadata: Metadata = { title: "Approvals" }; interface Props { searchParams: Promise<{ q?: string; costCentreRef?: string; dateFrom?: string; dateTo?: string; }>; } export default async function ApprovalsPage({ searchParams }: Props) { const session = await auth(); if (!session?.user) redirect("/login"); if (!hasPermission(session.user.role, "approve_po")) redirect("/dashboard"); const { q, costCentreRef, dateFrom } = await searchParams; const where: NonNullable[0]>["where"] = { status: "MGR_REVIEW", }; if (q?.trim()) { where.OR = [ { poNumber: { contains: q.trim(), mode: "insensitive" } }, { submitter: { name: { contains: q.trim(), mode: "insensitive" } } }, { title: { contains: q.trim(), mode: "insensitive" } }, ]; } if (costCentreRef) { if (costCentreRef.startsWith("v:")) where.vesselId = costCentreRef.slice(2); else if (costCentreRef.startsWith("s:")) where.siteId = costCentreRef.slice(2); } if (dateFrom) where.submittedAt = { gte: new Date(dateFrom) }; const [pending, vessels, sites] = await Promise.all([ db.purchaseOrder.findMany({ where, include: { submitter: true, vessel: true, site: { select: { name: true } }, account: true }, orderBy: { submittedAt: "asc" }, }), db.vessel.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), db.site.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), ]); const costCentres = [ ...vessels.map((v) => ({ ref: `v:${v.id}`, name: v.name })), ...sites.map((s) => ({ ref: `s:${s.id}`, name: s.name })), ]; return (

Approval Queue

{pending.length} order{pending.length !== 1 ? "s" : ""} awaiting your decision

{pending.length === 0 ? (

No purchase orders awaiting approval.

) : ( <> {/* ── Desktop table ─────────────────────────────────────────── */}
{pending.map((po) => ( ))}
PO Number Title Submitter Cost Centre Amount Submitted
{po.poNumber} {po.title} {po.submitter.name} {po.vessel?.name ?? po.site?.name ?? "—"} {formatCurrency(Number(po.totalAmount), po.currency)} {po.submittedAt ? formatDate(po.submittedAt) : "—"} Review →
{/* ── Mobile cards ──────────────────────────────────────────── */}
{pending.map((po) => (
{po.poNumber} {po.submittedAt ? formatDate(po.submittedAt) : "—"}

{po.title}

{po.submitter.name} · {po.vessel?.name ?? po.site?.name ?? "—"} {formatCurrency(Number(po.totalAmount), po.currency)}
Review →
))}
)}
); }