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:{' '}