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:
@@ -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
|
||||
|
||||
@@ -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) => ({
|
||||
|
||||
Reference in New Issue
Block a user