Anbieter: Kontakt + Kündigung als Stammdaten
Sieben neue optionale Felder am Provider (contactEmail, contactPhone, contactFax, contactAddress, cancellationEmail, cancellationFax, cancellationAddress). Postadressen TEXT, Rest VARCHAR(191). Migration mit IF NOT EXISTS. Modal "Anbieter bearbeiten" bekommt neue Sektion "Kontakt & Kündigung" mit zwei Untergruppen. Backend validiert Emails gegen isValidEmail (Header-Injection-Schutz), Telefon/Fax gegen sanitizePhoneField (kein CRLF), Postadressen via sanitizeNotes mit 500-Cap. Factory-Defaults Export/Import mitgezogen. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -292,6 +292,13 @@ function ProviderModal({
|
||||
portalUrl: '',
|
||||
usernameFieldName: '',
|
||||
passwordFieldName: '',
|
||||
contactEmail: '',
|
||||
contactPhone: '',
|
||||
contactFax: '',
|
||||
contactAddress: '',
|
||||
cancellationEmail: '',
|
||||
cancellationFax: '',
|
||||
cancellationAddress: '',
|
||||
isActive: true,
|
||||
// Pentest 47.1: bei Portal-URL-Domain-Wechsel muss der aufrufende
|
||||
// Admin sein eigenes Passwort mitsenden – Schutz gegen kompromittierten
|
||||
@@ -316,6 +323,13 @@ function ProviderModal({
|
||||
portalUrl: provider.portalUrl || '',
|
||||
usernameFieldName: provider.usernameFieldName || '',
|
||||
passwordFieldName: provider.passwordFieldName || '',
|
||||
contactEmail: provider.contactEmail || '',
|
||||
contactPhone: provider.contactPhone || '',
|
||||
contactFax: provider.contactFax || '',
|
||||
contactAddress: provider.contactAddress || '',
|
||||
cancellationEmail: provider.cancellationEmail || '',
|
||||
cancellationFax: provider.cancellationFax || '',
|
||||
cancellationAddress: provider.cancellationAddress || '',
|
||||
isActive: provider.isActive,
|
||||
currentPassword: '',
|
||||
});
|
||||
@@ -325,6 +339,13 @@ function ProviderModal({
|
||||
portalUrl: '',
|
||||
usernameFieldName: '',
|
||||
passwordFieldName: '',
|
||||
contactEmail: '',
|
||||
contactPhone: '',
|
||||
contactFax: '',
|
||||
contactAddress: '',
|
||||
cancellationEmail: '',
|
||||
cancellationFax: '',
|
||||
cancellationAddress: '',
|
||||
isActive: true,
|
||||
currentPassword: '',
|
||||
});
|
||||
@@ -434,6 +455,75 @@ function ProviderModal({
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="p-3 bg-gray-50 rounded-lg space-y-3">
|
||||
<p className="text-sm text-gray-600">
|
||||
<strong>Kontakt & Kündigung</strong> (optional)<br />
|
||||
Erreichbarkeit des Anbieters – wird im CRM zum Nachschlagen
|
||||
angezeigt, nicht an Portal-Kunden ausgespielt.
|
||||
</p>
|
||||
<div className="text-xs font-semibold text-gray-500 uppercase tracking-wide">Kontakt</div>
|
||||
<Input
|
||||
label="Kontakt-Emailadresse"
|
||||
type="email"
|
||||
value={formData.contactEmail}
|
||||
onChange={(e) => setFormData({ ...formData, contactEmail: e.target.value })}
|
||||
placeholder="z.B. service@anbieter.de"
|
||||
/>
|
||||
<Input
|
||||
label="Kontakt-Telefonnummer"
|
||||
value={formData.contactPhone}
|
||||
onChange={(e) => setFormData({ ...formData, contactPhone: e.target.value })}
|
||||
placeholder="z.B. +49 30 1234567"
|
||||
/>
|
||||
<Input
|
||||
label="Kontakt-Faxnummer"
|
||||
value={formData.contactFax}
|
||||
onChange={(e) => setFormData({ ...formData, contactFax: e.target.value })}
|
||||
placeholder="z.B. +49 30 7654321"
|
||||
/>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">
|
||||
Kontakt-Postadresse
|
||||
</label>
|
||||
<textarea
|
||||
value={formData.contactAddress}
|
||||
onChange={(e) => setFormData({ ...formData, contactAddress: e.target.value })}
|
||||
rows={3}
|
||||
maxLength={500}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
placeholder="z.B. Musteranbieter GmbH Musterstraße 1 12345 Berlin"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="pt-2 text-xs font-semibold text-gray-500 uppercase tracking-wide">Kündigung</div>
|
||||
<Input
|
||||
label="Kündigungs-Emailadresse"
|
||||
type="email"
|
||||
value={formData.cancellationEmail}
|
||||
onChange={(e) => setFormData({ ...formData, cancellationEmail: e.target.value })}
|
||||
placeholder="z.B. kuendigung@anbieter.de"
|
||||
/>
|
||||
<Input
|
||||
label="Kündigungs-Faxnummer"
|
||||
value={formData.cancellationFax}
|
||||
onChange={(e) => setFormData({ ...formData, cancellationFax: e.target.value })}
|
||||
placeholder="z.B. +49 30 9876543"
|
||||
/>
|
||||
<div>
|
||||
<label className="block text-sm font-medium text-gray-700 mb-1">
|
||||
Kündigungs-Postadresse
|
||||
</label>
|
||||
<textarea
|
||||
value={formData.cancellationAddress}
|
||||
onChange={(e) => setFormData({ ...formData, cancellationAddress: e.target.value })}
|
||||
rows={3}
|
||||
maxLength={500}
|
||||
className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500"
|
||||
placeholder="z.B. Musteranbieter GmbH Abteilung Kündigung Musterstraße 1 12345 Berlin"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{provider && (
|
||||
<label className="flex items-center gap-2">
|
||||
<input
|
||||
|
||||
@@ -396,6 +396,13 @@ export interface Provider {
|
||||
portalUrl?: string;
|
||||
usernameFieldName?: string;
|
||||
passwordFieldName?: string;
|
||||
contactEmail?: string;
|
||||
contactPhone?: string;
|
||||
contactFax?: string;
|
||||
contactAddress?: string;
|
||||
cancellationEmail?: string;
|
||||
cancellationFax?: string;
|
||||
cancellationAddress?: string;
|
||||
isActive: boolean;
|
||||
tariffs?: Tariff[];
|
||||
_count?: {
|
||||
|
||||
Reference in New Issue
Block a user