From 616cb77c0d0c1807b058effce2c5c2b7e2a27924 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 9 Jul 2026 12:22:17 +0200 Subject: [PATCH] Bankkarte: optionales Beschreibung-Feld MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neues optionales Freitext-Feld `description` (TEXT NULL) auf BankCard – z.B. "Geschäftskonto", "gemeinsames Konto mit Partner". Migration mit IF NOT EXISTS. Backend service create/update nimmt description entgegen. Frontend: - BankCard-Type um description ergänzt. - BankCardModal: neue Textarea zwischen Ablaufdatum und Aktiv- Checkbox mit Placeholder-Hilfetext. - Bank-Kartenübersicht zeigt die Beschreibung kursiv unter den bestehenden Feldern, falls gesetzt (whitespace-pre-line für mehrzeilige Notizen). Co-Authored-By: Claude Opus 4.7 --- .../migration.sql | 6 ++++++ backend/prisma/schema.prisma | 1 + backend/src/services/customer.service.ts | 2 ++ .../src/pages/customers/CustomerDetail.tsx | 19 ++++++++++++++++++- frontend/src/types/index.ts | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 backend/prisma/migrations/20260709100000_bankcard_description/migration.sql diff --git a/backend/prisma/migrations/20260709100000_bankcard_description/migration.sql b/backend/prisma/migrations/20260709100000_bankcard_description/migration.sql new file mode 100644 index 00000000..7249639b --- /dev/null +++ b/backend/prisma/migrations/20260709100000_bankcard_description/migration.sql @@ -0,0 +1,6 @@ +-- Optionale Freitext-Beschreibung pro Bankkarte (z.B. "Geschäftskonto", +-- "gemeinsames Konto mit Partner"). TEXT statt VARCHAR, weil Notizen +-- gelegentlich länger werden dürfen. + +ALTER TABLE `BankCard` + ADD COLUMN IF NOT EXISTS `description` TEXT NULL; diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index dd38756c..c09aa4ac 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -327,6 +327,7 @@ model BankCard { bankName String? expiryDate DateTime? documentPath String? // Pfad zur hochgeladenen PDF + description String? @db.Text // Freitext-Notiz (z.B. "Geschäftskonto", "gemeinsames Konto mit Partner") isActive Boolean @default(true) contracts Contract[] createdAt DateTime @default(now()) diff --git a/backend/src/services/customer.service.ts b/backend/src/services/customer.service.ts index 0ffe80ce..91961b81 100644 --- a/backend/src/services/customer.service.ts +++ b/backend/src/services/customer.service.ts @@ -317,6 +317,7 @@ export async function createBankCard( bic?: string; bankName?: string; expiryDate?: Date; + description?: string; } ) { return prisma.bankCard.create({ @@ -336,6 +337,7 @@ export async function updateBankCard( bic?: string; bankName?: string; expiryDate?: Date; + description?: string; isActive?: boolean; } ) { diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 788c3d28..d5b31b84 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -961,6 +961,11 @@ function BankCardsTab({ Gültig bis: {formatDate(card.expiryDate)}

)} + {card.description && ( +

+ {card.description} +

+ )} {/* Dokument-Upload Bereich */}
@@ -2657,6 +2662,7 @@ function BankCardModal({ bic: bankCard?.bic || '', bankName: bankCard?.bankName || '', expiryDate: bankCard?.expiryDate ? new Date(bankCard.expiryDate).toISOString().split('T')[0] : '', + description: bankCard?.description || '', isActive: bankCard?.isActive ?? true, }); @@ -2672,7 +2678,7 @@ function BankCardModal({ onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['customer', customerId] }); onClose(); - setFormData({ accountHolder: '', iban: '', bic: '', bankName: '', expiryDate: '', isActive: true }); + setFormData({ accountHolder: '', iban: '', bic: '', bankName: '', expiryDate: '', description: '', isActive: true }); }, }); @@ -2743,6 +2749,17 @@ function BankCardModal({ onClear={() => setFormData({ ...formData, expiryDate: '' })} /> +
+ +