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
|
## ✅ 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)
|
- [x] **📧 Stressfrei-Mailbox: Passwort beim Anlegen verbindlich setzen** (2026-07-30)
|
||||||
- Beim Anlegen einer Adresse mit „Echte Mailbox erstellen (IMAP/SMTP)"
|
- Beim Anlegen einer Adresse mit „Echte Mailbox erstellen (IMAP/SMTP)"
|
||||||
wird jetzt immer ein frisch generiertes Passwort **explizit am Provider
|
wird jetzt immer ein frisch generiertes Passwort **explizit am Provider
|
||||||
|
|||||||
@@ -114,6 +114,8 @@ export default function ContractForm() {
|
|||||||
const customerId = watch('customerId');
|
const customerId = watch('customerId');
|
||||||
const previousContractId = watch('previousContractId');
|
const previousContractId = watch('previousContractId');
|
||||||
const selectedMeterId = watch('meterId');
|
const selectedMeterId = watch('meterId');
|
||||||
|
const selectedBankCardId = watch('bankCardId');
|
||||||
|
const selectedDocumentId = watch('identityDocumentId');
|
||||||
|
|
||||||
// Fetch existing contract for edit
|
// Fetch existing contract for edit
|
||||||
const { data: contract } = useQuery({
|
const { data: contract } = useQuery({
|
||||||
@@ -720,6 +722,10 @@ export default function ContractForm() {
|
|||||||
const addresses = customer?.addresses || [];
|
const addresses = customer?.addresses || [];
|
||||||
const bankCards = customer?.bankCards?.filter((c) => c.isActive) || [];
|
const bankCards = customer?.bankCards?.filter((c) => c.isActive) || [];
|
||||||
const documents = customer?.identityDocuments?.filter((d) => d.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 meters = customer?.meters || [];
|
||||||
const selectedMeter = meters.find(m => m.id.toString() === selectedMeterId);
|
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">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||||
<Select
|
<Select
|
||||||
label={
|
label={
|
||||||
<LabelWithLink to={`/customers/${customerId}?tab=bankcards`} title="Bankkarten des Kunden in neuem Tab öffnen">
|
<span className="inline-flex items-center gap-1">
|
||||||
Bankkarte
|
<LabelWithLink to={`/customers/${customerId}?tab=bankcards`} title="Bankkarten des Kunden in neuem Tab öffnen">
|
||||||
</LabelWithLink>
|
Bankkarte
|
||||||
|
</LabelWithLink>
|
||||||
|
{selectedBankCard && (
|
||||||
|
<CopyButton value={selectedBankCard.iban} title="IBAN kopieren" />
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
}
|
}
|
||||||
{...register('bankCardId')}
|
{...register('bankCardId')}
|
||||||
options={bankCards.map((c) => {
|
options={bankCards.map((c) => {
|
||||||
@@ -986,9 +997,14 @@ export default function ContractForm() {
|
|||||||
|
|
||||||
<Select
|
<Select
|
||||||
label={
|
label={
|
||||||
<LabelWithLink to={`/customers/${customerId}?tab=documents`} title="Ausweise des Kunden in neuem Tab öffnen">
|
<span className="inline-flex items-center gap-1">
|
||||||
Ausweis
|
<LabelWithLink to={`/customers/${customerId}?tab=documents`} title="Ausweise des Kunden in neuem Tab öffnen">
|
||||||
</LabelWithLink>
|
Ausweis
|
||||||
|
</LabelWithLink>
|
||||||
|
{selectedDocument && (
|
||||||
|
<CopyButton value={selectedDocument.documentNumber} title="Ausweisnummer kopieren" />
|
||||||
|
)}
|
||||||
|
</span>
|
||||||
}
|
}
|
||||||
{...register('identityDocumentId')}
|
{...register('identityDocumentId')}
|
||||||
options={documents.map((d) => ({
|
options={documents.map((d) => ({
|
||||||
|
|||||||
Reference in New Issue
Block a user