CRM-8463 — duplicate an existing contract into a new DRAFT contract.
The request body is the final, client-edited state of the copy (name,
optional product change, the final service lines, and the carry-over
selection). All behavior lives in
ContractsManager.duplicate_contract; this handler only maps its
result onto HTTP status codes:
The modal is a client-side editing surface: the user edits the copy before
anything is persisted, and this payload is the final result. The server
creates the new contract from the source plus these values — it never reads
a draft state. The duplicate is always created in DRAFT regardless of the
source's status.
name
Type: string
max length:
1024
required
Name for the new contract (FE pre-fills '
Copy')
acknowledgeOverlap
Type: boolean
Set true to proceed after the caller has acknowledged a dates-overlap conflict (see 409 response)