From f0480ab4326767c54af62fede784f529896b88bc Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 30 Jul 2026 11:24:09 +0200 Subject: [PATCH] Vertragsformular: Copy-Buttons fuer Bankkarte (IBAN) + Ausweis In Kundendaten verknuepfen je ein Kopieren-Button neben dem Label. Kopiert nur den reinen Wert der aktuell gewaehlten Option: bei Bankkarte die IBAN ohne Namen, bei Ausweis die Ausweisnummer ohne (TYP). Button erscheint nur bei ausgewaehltem Eintrag. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/todo.md | 7 +++++ frontend/src/pages/contracts/ContractForm.tsx | 28 +++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/docs/todo.md b/docs/todo.md index d34b91b0..327d6b91 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,13 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **📋 Vertragsformular: Copy-Buttons für Bankkarte (IBAN) + Ausweis** (2026-07-30) + - In „Kundendaten verknüpfen" je ein Kopieren-Button neben dem Label, + kopiert nur den reinen Wert der aktuell gewählten Option: bei Bankkarte + die **IBAN ohne Namen**, bei Ausweis die **Ausweisnummer ohne (TYP)**. + - Button erscheint nur, wenn eine Karte/ein Ausweis ausgewählt ist + (`watch('bankCardId')`/`watch('identityDocumentId')` → Lookup). + - [x] **📧 Stressfrei-Mailbox: Passwort beim Anlegen verbindlich setzen** (2026-07-30) - Beim Anlegen einer Adresse mit „Echte Mailbox erstellen (IMAP/SMTP)" wird jetzt immer ein frisch generiertes Passwort **explizit am Provider diff --git a/frontend/src/pages/contracts/ContractForm.tsx b/frontend/src/pages/contracts/ContractForm.tsx index 1ff62374..1c195061 100644 --- a/frontend/src/pages/contracts/ContractForm.tsx +++ b/frontend/src/pages/contracts/ContractForm.tsx @@ -114,6 +114,8 @@ export default function ContractForm() { const customerId = watch('customerId'); const previousContractId = watch('previousContractId'); const selectedMeterId = watch('meterId'); + const selectedBankCardId = watch('bankCardId'); + const selectedDocumentId = watch('identityDocumentId'); // Fetch existing contract for edit const { data: contract } = useQuery({ @@ -720,6 +722,10 @@ export default function ContractForm() { const addresses = customer?.addresses || []; const bankCards = customer?.bankCards?.filter((c) => c.isActive) || []; const documents = customer?.identityDocuments?.filter((d) => d.isActive) || []; + // Aktuell im Dropdown gewählte Bankkarte/Ausweis – für die Copy-Buttons + // neben dem Label (nur reiner Wert: IBAN bzw. Ausweisnummer). + const selectedBankCard = bankCards.find((c) => c.id.toString() === String(selectedBankCardId)); + const selectedDocument = documents.find((d) => d.id.toString() === String(selectedDocumentId)); const meters = customer?.meters || []; const selectedMeter = meters.find(m => m.id.toString() === selectedMeterId); @@ -965,9 +971,14 @@ export default function ContractForm() {
- Ausweis - + + + Ausweis + + {selectedDocument && ( + + )} + } {...register('identityDocumentId')} options={documents.map((d) => ({