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: '' })}
/>
+
+
+
+
{isEditing && (