Mirrors the Place-of-Delivery (#19) pattern: an admin clause library that feeds the PO T&C fields as dropdowns. (No "work order" type — POs only, per steer.) - schema + migration: TermsCondition (category enum + text + isActive); the migration seeds the prior TC_DEFAULTS as the starting clauses. - permission manage_terms (Manager + SuperUser + Admin). - admin screen /admin/terms: table + Add/Edit dialogs + activate/deactivate + delete (mirrors /admin/delivery-locations); sidebar link under Administration. - PO forms (new / edit / manager-edit): the five named T&C slots (Delivery / Dispatch / Inspection / Transit Insurance / Payment Terms) become a shared <TermsField> select sourced from active clauses of that category; "Others" stays free text; the fixed boilerplate lines are untouched. - tc* columns stay free-text SNAPSHOTS (export/import unchanged); a current value not among active clauses is preserved as a "(current)" option. - tests: terms CRUD + permission guard + grouping helper (6). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
/**
|
|
* Terms & Conditions catalogue (issue #11) — admin-managed clauses that populate
|
|
* the PO's named T&C dropdowns. Each clause has a category matching one of the
|
|
* PO's tc* slots; the chosen clause is stored as a text snapshot in that column.
|
|
*/
|
|
import type { TermsCategory } from "@prisma/client";
|
|
|
|
// The five catalogued slots (the PO's "Others" stays free text; the fixed
|
|
// boilerplate lines are not catalogued). Order = display order.
|
|
export const TERMS_CATEGORIES: TermsCategory[] = [
|
|
"DELIVERY",
|
|
"DISPATCH",
|
|
"INSPECTION",
|
|
"TRANSIT_INSURANCE",
|
|
"PAYMENT_TERMS",
|
|
];
|
|
|
|
export const TERMS_CATEGORY_LABEL: Record<TermsCategory, string> = {
|
|
DELIVERY: "Delivery",
|
|
DISPATCH: "Dispatch Instructions",
|
|
INSPECTION: "Inspection",
|
|
TRANSIT_INSURANCE: "Transit Insurance",
|
|
PAYMENT_TERMS: "Payment Terms",
|
|
};
|
|
|
|
// PO tc* form field ⇄ catalogue category.
|
|
export const TC_FIELD_CATEGORY: Record<string, TermsCategory> = {
|
|
tcDelivery: "DELIVERY",
|
|
tcDispatch: "DISPATCH",
|
|
tcInspection: "INSPECTION",
|
|
tcTransitInsurance: "TRANSIT_INSURANCE",
|
|
tcPaymentTerms: "PAYMENT_TERMS",
|
|
};
|
|
|
|
// Server → client shape: active clause texts grouped by category.
|
|
export type TermsByCategory = Partial<Record<TermsCategory, string[]>>;
|