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 <noreply@anthropic.com>
This commit is contained in:
@@ -181,11 +181,9 @@ export async function updateCustomer(req: Request, res: Response): Promise<void>
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data: any = pickCustomerUpdate(req.body);
|
const data: any = pickCustomerUpdate(req.body);
|
||||||
// E-Mail ist Pflichtfeld – darf per Update nicht geleert werden.
|
// E-Mail ist nur beim ANLEGEN Pflicht – beim Bearbeiten darf ein
|
||||||
if ('email' in data && (!data.email || !String(data.email).trim())) {
|
// Bestandskunde ohne E-Mail bleiben (die Domain-Prüfung oben greift aber
|
||||||
res.status(400).json({ success: false, error: 'E-Mail-Adresse ist ein Pflichtfeld.' } as ApiResponse);
|
// weiterhin, falls doch eine gesetzt wird).
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pentest 60.3 (MEDIUM, 2026-06-01): pickCustomerUpdate macht nur
|
// Pentest 60.3 (MEDIUM, 2026-06-01): pickCustomerUpdate macht nur
|
||||||
// stripHtml; CRLF und andere Control-Chars überlebten. Phone/Mobile
|
// stripHtml; CRLF und andere Control-Chars überlebten. Phone/Mobile
|
||||||
@@ -214,8 +212,7 @@ export async function updateCustomer(req: Request, res: Response): Promise<void>
|
|||||||
data.birthDate = new Date(data.birthDate);
|
data.birthDate = new Date(data.birthDate);
|
||||||
}
|
}
|
||||||
// Leere Strings in optionalen Feldern zu null konvertieren
|
// Leere Strings in optionalen Feldern zu null konvertieren
|
||||||
// 'email' NICHT nullable – ist Pflichtfeld (leer wird oben schon abgelehnt).
|
const nullableFields = ['salutation', 'birthPlace', 'phone', 'mobile', 'email', 'companyName', 'taxNumber', 'businessRegistration', 'commercialRegister', 'commercialRegisterNumber', 'notes'];
|
||||||
const nullableFields = ['salutation', 'birthPlace', 'phone', 'mobile', 'companyName', 'taxNumber', 'businessRegistration', 'commercialRegister', 'commercialRegisterNumber', 'notes'];
|
|
||||||
for (const field of nullableFields) {
|
for (const field of nullableFields) {
|
||||||
if (data[field] === '') data[field] = null;
|
if (data[field] === '') data[field] = null;
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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-
|
- 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
|
Providern konfigurierten Domain (oder Subdomain) liegen → man trägt so keine
|
||||||
verwaltete Weiterleitungs-/Mailbox-Adresse als private Adresse ein. E-Mail ist
|
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.
|
- Helper `getConfiguredEmailDomains`/`emailUsesDomain` im emailProvider-Service.
|
||||||
|
|
||||||
- [x] **⚡ Energievertrag: Ankreuzfeld „Keine Bonis erwünscht"** (2026-08-18)
|
- [x] **⚡ Energievertrag: Ankreuzfeld „Keine Bonis erwünscht"** (2026-08-18)
|
||||||
|
|||||||
@@ -200,9 +200,9 @@ export default function CustomerForm() {
|
|||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<Input
|
<Input
|
||||||
label="E-Mail *"
|
label={isEdit ? 'E-Mail' : 'E-Mail *'}
|
||||||
type="email"
|
type="email"
|
||||||
{...register('email', { required: 'E-Mail ist erforderlich' })}
|
{...register('email', isEdit ? {} : { required: 'E-Mail ist erforderlich' })}
|
||||||
error={errors.email?.message}
|
error={errors.email?.message}
|
||||||
/>
|
/>
|
||||||
<p className="mt-1 text-xs text-gray-500">
|
<p className="mt-1 text-xs text-gray-500">
|
||||||
|
|||||||
Reference in New Issue
Block a user