From a2ed0e94f112593a21192880d0ee2757cd55b871 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 3 Aug 2026 12:44:49 +0200 Subject: [PATCH] Vertrag kopieren: neuen eigenstaendigen Vertrag aus Vorlage anlegen Kopieren-Button in der Vertragsansicht oeffnet das Neu-Formular unter /contracts/new?copyFrom= 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) --- docs/todo.md | 17 ++++ .../src/pages/contracts/ContractDetail.tsx | 12 +++ frontend/src/pages/contracts/ContractForm.tsx | 81 ++++++++++++++++--- 3 files changed, 98 insertions(+), 12 deletions(-) diff --git a/docs/todo.md b/docs/todo.md index 668c6115..cf5a1e90 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **📄➕ Vertrag kopieren (neuer eigenständiger Vertrag aus Vorlage)** (2026-08-03) + - „Kopieren"-Button in der Vertragsansicht (`contracts:create`) → öffnet das + Neu-Formular unter `/contracts/new?copyFrom=&customerId=` mit + ALLEN Daten des Quellvertrags vorbefüllt. Beim Speichern entsteht ein + frischer, unabhängiger Vertrag (kein `previousContractId`-Link, kein VVL). + - Use-Case: neuer Mobilfunk-/o.ä. Vertrag ist meist fast identisch – nur + Preis, Laufzeit, Kunden-/Vertragsnummer, Anbieter/Tarif ändern sich. + - Geleert im Kopier-Modus (Integrität / Eindeutigkeit): Status→DRAFT, + Vorgänger-Link, alle Datumsfelder (Start/Ende/Installation/Kündigungs- + bestätigung), Kunden-/Vertragsnummer beim Anbieter + Plattform-Nummern, + Portal-Benutzer/Passwort. **Nicht** übernommen: SIM-Karten & Rufnummern + (hardware-/vertragsspezifisch, eindeutige Nummern). Rest (Anbieter/Tarif, + Preise, alle Detailfelder, Notizen) bleibt als Vorlage. + - Rein Frontend (`ContractForm` copy-Mode + Button in `ContractDetail`); + kein neuer Endpoint – nutzt bestehendes Create. Blauer Hinweis-Banner + „Kopie … neuer eigenständiger Vertrag" im Formular. + - [~] **🖱️ PDF-Drag-and-Drop aus Bankkarte/Ausweis — VERWORFEN** (2026-07-30) - Idee: hinterlegten Scan per Drag direkt in Mail-Anhang/Datei-Explorer ziehen. Über mehrere Iterationen durchgespielt (Chromium-`DownloadURL` diff --git a/frontend/src/pages/contracts/ContractDetail.tsx b/frontend/src/pages/contracts/ContractDetail.tsx index e212d3cd..12c69217 100644 --- a/frontend/src/pages/contracts/ContractDetail.tsx +++ b/frontend/src/pages/contracts/ContractDetail.tsx @@ -1956,6 +1956,18 @@ export default function ContractDetail() { )} + {hasPermission('contracts:create') && ( + + + + )} {hasPermission('contracts:update') && (

- {isEdit ? 'Vertrag bearbeiten' : 'Neuer Vertrag'} + {isEdit ? 'Vertrag bearbeiten' : isCopy ? 'Neuer Vertrag (Kopie)' : 'Neuer Vertrag'}

+ {isCopy && ( +

+ + Kopie eines bestehenden Vertrags – wird als neuer eigenständiger Vertrag gespeichert. + Anbieter/Tarif, Preise, Kunden-/Vertragsnummern und Daten bitte prüfen. +

+ )} {customer && (

Kunde:{' '}