Replaces the free-text "Place of Delivery" with a dropdown sourced from a new admin-managed Delivery Locations list (each = a Company FK + free-text address). - schema + migration: new DeliveryLocation model (companyId, address, isActive). - permission: manage_delivery_locations granted to Manager + SuperUser + Admin (Manager-accessible, not admin-only, per the issue). - admin screen /admin/delivery-locations: table + Add/Edit dialogs + activate/deactivate + delete (mirrors /admin/sites); sidebar link under Administration for Manager/SuperUser/Admin. - PO forms (new / edit / manager-edit): shared <DeliveryLocationField> native select populated from active locations, formatted "Company — address". - PurchaseOrder.placeOfDelivery stays a free-text SNAPSHOT (no FK) — the dropdown only changes how the value is picked, so export/import/historical POs are unchanged, and an edit preserves a current value not in the list as a "(current)" option. Deleting a location is therefore always safe. - tests: delivery-location CRUD + permission guard (6). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
35 lines
1.1 KiB
TypeScript
35 lines
1.1 KiB
TypeScript
import { auth } from "@/auth";
|
|
import { db } from "@/lib/db";
|
|
import { hasPermission } from "@/lib/permissions";
|
|
import { redirect } from "next/navigation";
|
|
import { DeliveryLocationsTable } from "./delivery-locations-table";
|
|
import type { Metadata } from "next";
|
|
|
|
export const metadata: Metadata = { title: "Delivery Locations" };
|
|
|
|
export default async function DeliveryLocationsPage() {
|
|
const session = await auth();
|
|
if (!session?.user) redirect("/login");
|
|
if (!hasPermission(session.user.role, "manage_delivery_locations")) redirect("/dashboard");
|
|
|
|
const [locations, companies] = await Promise.all([
|
|
db.deliveryLocation.findMany({
|
|
orderBy: [{ isActive: "desc" }, { createdAt: "desc" }],
|
|
include: { company: { select: { name: true } } },
|
|
}),
|
|
db.company.findMany({ where: { isActive: true }, orderBy: { name: "asc" }, select: { id: true, name: true } }),
|
|
]);
|
|
|
|
return (
|
|
<DeliveryLocationsTable
|
|
companies={companies}
|
|
locations={locations.map((l) => ({
|
|
id: l.id,
|
|
companyId: l.companyId,
|
|
companyName: l.company.name,
|
|
address: l.address,
|
|
isActive: l.isActive,
|
|
}))}
|
|
/>
|
|
);
|
|
}
|