Anyone with create_po browsing a PO now sees a Duplicate action that
opens the New Purchase Order form prefilled from the source PO. Like the
existing cart→new-PO prefill, nothing is written until the user saves or
submits — a duplicate is just a clean draft of the editable order fields.
- po-detail.tsx: Duplicate link in the header, gated by
hasPermission(currentRole, "create_po") + !readOnly, linking to
/po/new?duplicate=<id>.
- po/new/page.tsx: when ?duplicate=<id> is present, fetch the source PO
and map it onto the form's initial props via the new pure helper.
- new-po-form.tsx: accept initial-value props for title, accounting code
(+ per-item toggle), project code, place of delivery, date required,
quotation/requisition refs, terms — following the existing prop pattern.
- lib/duplicate-po.ts: pure, unit-tested mapping (Decimals→numbers, dates
→yyyy-MM-dd, saved-terms snapshot with legacy tc* fallback). Attachments,
status/dates, payment data and audit history are intentionally not copied.
Fixes#142
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>