Vertrag kopieren: neuen eigenstaendigen Vertrag aus Vorlage anlegen

Kopieren-Button in der Vertragsansicht oeffnet das Neu-Formular unter
/contracts/new?copyFrom=<id> mit allen Daten des Quellvertrags
vorbefuellt. Beim Speichern entsteht ein frischer, unabhaengiger
Vertrag (kein previousContractId-Link, kein VVL).

Use-Case: neuer Mobilfunk-/o.ae. Vertrag ist meist fast identisch;
nur Preis, Laufzeit, Kunden-/Vertragsnummer, Anbieter/Tarif aendern
sich - der Rest bleibt gleich.

Im Kopier-Modus geleert (Integritaet/Eindeutigkeit): Status->DRAFT,
Vorgaenger-Link, alle Datumsfelder, Kunden-/Vertragsnummer beim
Anbieter + Plattform-Nummern, Portal-Zugang. SIM-Karten & Rufnummern
werden nicht uebernommen. Rest (Anbieter/Tarif/Preise/Detailfelder/
Notizen) bleibt als Vorlage.

Rein Frontend (ContractForm copy-Mode + Button in ContractDetail),
kein neuer Endpoint - nutzt bestehendes Create.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-03 12:44:49 +02:00
co-authored by Claude Opus 4.8
parent 5bbb7dfffe
commit a2ed0e94f1
3 changed files with 98 additions and 12 deletions
@@ -1956,6 +1956,18 @@ export default function ContractDetail() {
</Button>
</Link>
)}
{hasPermission('contracts:create') && (
<Link
to={`/contracts/new?copyFrom=${contractId}&customerId=${c.customerId}`}
state={pushHistory(currentPath, location.state)}
title="Alle Daten dieses Vertrags in einen neuen, eigenständigen Vertrag übernehmen"
>
<Button variant="secondary">
<Copy className="w-4 h-4 mr-2" />
Kopieren
</Button>
</Link>
)}
{hasPermission('contracts:update') && (
<Link to={`/contracts/${id}/edit`} state={pushHistory(currentPath, location.state)}>
<Button variant="secondary">