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; vesselId?: string; dateFrom?: 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, vesselId, 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 (vesselId) where.vesselId = vesselId; if (dateFrom) where.submittedAt = { gte: new Date(dateFrom) }; const [pending, vessels] = await Promise.all([ db.purchaseOrder.findMany({ where, include: { submitter: true, vessel: true, account: true }, orderBy: { submittedAt: "asc" }, }), db.vessel.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), ]); 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} {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} {formatCurrency(Number(po.totalAmount), po.currency)}
Review →
))}
)}
); }