From 8964820542d047252d1cc97d98793d21c266e693 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Tue, 18 Aug 2026 14:26:03 +0200 Subject: [PATCH] Kunde-E-Mail: Pflicht nur beim Anlegen, nicht beim Bearbeiten Bestandskunden ohne E-Mail bleiben editierbar. Beim Anlegen ist E-Mail weiterhin Pflicht (Frontend required + Backend createCustomer). Die Domain-Pruefung (keine verwaltete Provider-Domain) greift unveraendert bei create UND update, falls eine E-Mail gesetzt wird. Co-Authored-By: Claude Opus 4.8 --- backend/src/controllers/customer.controller.ts | 11 ++++------- docs/todo.md | 3 ++- frontend/src/pages/customers/CustomerForm.tsx | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/backend/src/controllers/customer.controller.ts b/backend/src/controllers/customer.controller.ts index fb6a2bac..1d9b88b9 100644 --- a/backend/src/controllers/customer.controller.ts +++ b/backend/src/controllers/customer.controller.ts @@ -181,11 +181,9 @@ export async function updateCustomer(req: Request, res: Response): Promise return; } const data: any = pickCustomerUpdate(req.body); - // E-Mail ist Pflichtfeld – darf per Update nicht geleert werden. - if ('email' in data && (!data.email || !String(data.email).trim())) { - res.status(400).json({ success: false, error: 'E-Mail-Adresse ist ein Pflichtfeld.' } as ApiResponse); - return; - } + // E-Mail ist nur beim ANLEGEN Pflicht – beim Bearbeiten darf ein + // Bestandskunde ohne E-Mail bleiben (die Domain-Prüfung oben greift aber + // weiterhin, falls doch eine gesetzt wird). // Pentest 60.3 (MEDIUM, 2026-06-01): pickCustomerUpdate macht nur // stripHtml; CRLF und andere Control-Chars überlebten. Phone/Mobile @@ -214,8 +212,7 @@ export async function updateCustomer(req: Request, res: Response): Promise data.birthDate = new Date(data.birthDate); } // Leere Strings in optionalen Feldern zu null konvertieren - // 'email' NICHT nullable – ist Pflichtfeld (leer wird oben schon abgelehnt). - const nullableFields = ['salutation', 'birthPlace', 'phone', 'mobile', 'companyName', 'taxNumber', 'businessRegistration', 'commercialRegister', 'commercialRegisterNumber', 'notes']; + const nullableFields = ['salutation', 'birthPlace', 'phone', 'mobile', 'email', 'companyName', 'taxNumber', 'businessRegistration', 'commercialRegister', 'commercialRegisterNumber', 'notes']; for (const field of nullableFields) { if (data[field] === '') data[field] = null; } diff --git a/docs/todo.md b/docs/todo.md index fd034a6e..fc22a445 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -111,7 +111,8 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung - Private Kunden-E-Mail (`Customer.email`) darf nicht auf einer bei den E-Mail- Providern konfigurierten Domain (oder Subdomain) liegen → man trägt so keine verwaltete Weiterleitungs-/Mailbox-Adresse als private Adresse ein. E-Mail ist - jetzt Pflichtfeld (Frontend `required` + Backend create/update). + **nur beim Anlegen** Pflicht (Bestandskunden ohne E-Mail bleiben editierbar); + die Domain-Prüfung greift aber bei create UND update, falls eine gesetzt wird. - Helper `getConfiguredEmailDomains`/`emailUsesDomain` im emailProvider-Service. - [x] **⚡ Energievertrag: Ankreuzfeld „Keine Bonis erwünscht"** (2026-08-18) diff --git a/frontend/src/pages/customers/CustomerForm.tsx b/frontend/src/pages/customers/CustomerForm.tsx index 55c461ae..685d928e 100644 --- a/frontend/src/pages/customers/CustomerForm.tsx +++ b/frontend/src/pages/customers/CustomerForm.tsx @@ -200,9 +200,9 @@ export default function CustomerForm() {