import { auth } from "@/auth"; import { db } from "@/lib/db"; import { redirect } from "next/navigation"; import { ImportForm } from "./import-form"; import type { CostCentreOption, AccountGroup } from "@/app/(portal)/po/new/new-po-form"; import type { Metadata } from "next"; export const metadata: Metadata = { title: "Import Purchase Order" }; export default async function ImportPoPage() { const session = await auth(); if (!session?.user) redirect("/login"); const { role } = session.user; if (!["MANAGER", "SUPERUSER", "ADMIN"].includes(role)) redirect("/dashboard"); const [vessels, sites, accounts, vendors] = await Promise.all([ db.vessel.findMany({ where: { isActive: true }, orderBy: { name: "asc" }, select: { id: true, name: true, code: true } }), db.site.findMany({ where: { isActive: true }, orderBy: { name: "asc" }, select: { id: true, name: true, code: 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 } } } } }, }), db.vendor.findMany({ orderBy: { name: "asc" } }), ]); const accountGroupMap = new Map(); for (const a of accounts) { const subLabel = a.parent ? `${a.parent.code} — ${a.parent.name}` : "Uncategorised"; const topLabel = a.parent?.parent ? `${a.parent.parent.name} › ` : ""; const groupKey = `${topLabel}${subLabel}`; if (!accountGroupMap.has(groupKey)) accountGroupMap.set(groupKey, []); accountGroupMap.get(groupKey)!.push(a); } const accountGroups: AccountGroup[] = Array.from(accountGroupMap.entries()).map(([group, items]) => ({ group, items })); const costCentres: CostCentreOption[] = [ ...vessels.map((v) => ({ ref: `v:${v.id}`, label: `${v.code} — ${v.name}`, group: "Vessels" as const })), ...sites.map((s) => ({ ref: `s:${s.id}`, label: `${s.code} — ${s.name}`, group: "Sites" as const })), ]; return (

Import Purchase Order

Upload a Pelagia-format Excel PO file. Line items and vendor details are extracted automatically. You then select the cost centre, accounting code, and confirm before saving as a draft.

); }