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 { buildAccountGroups } from "@/lib/cost-centre-groups"; import { buildPoHistoryWhere } from "@/lib/history-filter"; import { resolvePagination } from "@/lib/pagination"; import { Suspense } from "react"; import type { Metadata } from "next"; 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; accountId?: 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, accountId, status, page: pageParam, perPage: perPageParam } = await searchParams; const statuses = (Array.isArray(status) ? status : status ? [status] : []).filter(Boolean); const where = await buildPoHistoryWhere({ dateFrom, dateTo, approvedFrom, approvedTo, vesselId, accountId, statuses, }); 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, leafAccounts] = 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 } }), db.account.findMany({ where: { isActive: true, children: { none: {} } }, orderBy: { code: "asc" }, select: { id: true, code: true, name: true, parent: { select: { name: true, code: true, parent: { select: { name: true, code: true } } } } }, }), ]); const accounts = buildAccountGroups(leafAccounts); // 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); if (accountId) pageParams.set("accountId", accountId); 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); if (accountId) exportParams.set("accountId", accountId); for (const s of statuses) exportParams.append("status", s); return (
| PO Number | Title | Cost Centre | Accounting Code | Submitter | Status | Amount | Created |
|---|---|---|---|---|---|---|---|
| {po.poNumber} | {po.title} | {po.vessel.name} | {po.account.code} {po.account.name} | {po.submitter.name} |
|
{formatCurrency(Number(po.totalAmount), po.currency)} | {formatDate(po.createdAt)} |