import { auth } from "@/auth"; import { db } from "@/lib/db"; import { hasPermission, submitterCanViewAll } 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 { HistoryFilters } from "./history-filters"; import { resolvePagination } from "@/lib/pagination"; import { Suspense } from "react"; import type { Metadata } from "next"; import type { POStatus } from "@prisma/client"; export const metadata: Metadata = { title: "History" }; const PER_PAGE_OPTIONS = [25, 50, 100]; const DEFAULT_PER_PAGE = 25; interface Props { searchParams: Promise<{ dateFrom?: string; dateTo?: string; approvedFrom?: string; approvedTo?: string; vesselId?: string; status?: string | string[]; page?: string; perPage?: string; }>; } export default async function HistoryPage({ searchParams }: Props) { const session = await auth(); if (!session?.user) redirect("/login"); // Report-export holders see History; submitters get read+export access when the // submitter-view-all feature flag is on. if ( !hasPermission(session.user.role, "export_reports") && !submitterCanViewAll(session.user.role) ) { redirect("/dashboard"); } const { dateFrom, dateTo, approvedFrom, approvedTo, vesselId, status, page: pageParam, perPage: perPageParam } = await searchParams; const where: NonNullable[0]>["where"] = {}; if (dateFrom || dateTo) { const createdAt: { gte?: Date; lt?: Date } = {}; if (dateFrom) createdAt.gte = new Date(dateFrom); if (dateTo) { const end = new Date(dateTo); end.setDate(end.getDate() + 1); createdAt.lt = end; } where.createdAt = createdAt; } if (approvedFrom || approvedTo) { const approvedAt: { gte?: Date; lt?: Date } = {}; if (approvedFrom) approvedAt.gte = new Date(approvedFrom); if (approvedTo) { const end = new Date(approvedTo); end.setDate(end.getDate() + 1); approvedAt.lt = end; } where.approvedAt = approvedAt; } if (vesselId) where.vesselId = vesselId; const statuses = (Array.isArray(status) ? status : status ? [status] : []).filter(Boolean); if (statuses.length > 0) where.status = { in: statuses as POStatus[] }; const total = await db.purchaseOrder.count({ where }); const { perPage, page, totalPages, skip, take } = resolvePagination({ perPageParam, pageParam, total, options: PER_PAGE_OPTIONS, defaultPerPage: DEFAULT_PER_PAGE, }); const [orders, vessels] = await Promise.all([ db.purchaseOrder.findMany({ where, include: { submitter: true, vessel: true, account: true }, orderBy: { createdAt: "desc" }, skip, take, }), db.vessel.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }), ]); // Shared filter params for the pagination footer links (everything except `page`). const pageParams = new URLSearchParams(); if (dateFrom) pageParams.set("dateFrom", dateFrom); if (dateTo) pageParams.set("dateTo", dateTo); if (approvedFrom) pageParams.set("approvedFrom", approvedFrom); if (approvedTo) pageParams.set("approvedTo", approvedTo); if (vesselId) pageParams.set("vesselId", vesselId); for (const s of statuses) pageParams.append("status", s); pageParams.set("perPage", String(perPage)); const pageHref = (p: number) => { const params = new URLSearchParams(pageParams); params.set("page", String(p)); return `/history?${params.toString()}`; }; const firstRow = total === 0 ? 0 : skip + 1; const lastRow = skip + orders.length; const exportParams = new URLSearchParams({ format: "csv" }); if (dateFrom) exportParams.set("dateFrom", dateFrom); if (dateTo) exportParams.set("dateTo", dateTo); if (approvedFrom) exportParams.set("approvedFrom", approvedFrom); if (approvedTo) exportParams.set("approvedTo", approvedTo); if (vesselId) exportParams.set("vesselId", vesselId); for (const s of statuses) exportParams.append("status", s); return (

PO History

Export PDF Export CSV
{orders.map((po) => ( ))}
PO Number Title Cost Centre Submitter Status Amount Created
{po.poNumber} {po.title} {po.vessel.name} {po.submitter.name} {formatCurrency(Number(po.totalAmount), po.currency)} {formatDate(po.createdAt)}
{orders.length === 0 && (
No purchase orders found.
)}
{total > 0 && (
Showing {firstRow}–{lastRow} of {total}
{page > 1 ? ( Previous ) : ( Previous )} Page {page} of {totalPages} {page < totalPages ? ( Next ) : ( Next )}
)}
); }