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) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 11:24:09 +02:00
co-authored by Claude Opus 4.8
parent c39d252f5f
commit f0480ab432
2 changed files with 29 additions and 6 deletions
+7
View File
@@ -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
+22 -6
View File
@@ -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() {
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<Select
label={
<LabelWithLink to={`/customers/${customerId}?tab=bankcards`} title="Bankkarten des Kunden in neuem Tab öffnen">
Bankkarte
</LabelWithLink>
<span className="inline-flex items-center gap-1">
<LabelWithLink to={`/customers/${customerId}?tab=bankcards`} title="Bankkarten des Kunden in neuem Tab öffnen">
Bankkarte
</LabelWithLink>
{selectedBankCard && (
<CopyButton value={selectedBankCard.iban} title="IBAN kopieren" />
)}
</span>
}
{...register('bankCardId')}
options={bankCards.map((c) => {
@@ -986,9 +997,14 @@ export default function ContractForm() {
<Select
label={
<LabelWithLink to={`/customers/${customerId}?tab=documents`} title="Ausweise des Kunden in neuem Tab öffnen">
Ausweis
</LabelWithLink>
<span className="inline-flex items-center gap-1">
<LabelWithLink to={`/customers/${customerId}?tab=documents`} title="Ausweise des Kunden in neuem Tab öffnen">
Ausweis
</LabelWithLink>
{selectedDocument && (
<CopyButton value={selectedDocument.documentNumber} title="Ausweisnummer kopieren" />
)}
</span>
}
{...register('identityDocumentId')}
options={documents.map((d) => ({