From 4f07104239cb85fc8c7022f8d4737d2cd654ff43 Mon Sep 17 00:00:00 2001
From: Kevin Adametz
Date: Mon, 6 Jul 2026 08:32:59 +0000
Subject: [PATCH] Zentrale Rechts-E-Mail info@pressekonto.com fuer alle
Rechtstexte
User-Entscheidung 06.07.: info@pressekonto.com ist die Haupt-E-Mail fuer
alle rechtlichen Anliegen. Zentral in config/legal.php (LEGAL_CONTACT_EMAIL),
verwendet von Impressum, AGB, Datenschutz, /melden und /richtlinien auf
allen drei Domains. Support-Kontakt bleibt je Brand (CONTACT_EMAIL_*),
REPORT_EMAIL_* ist nur noch optionales separates DSA-Postfach. Nebenbei
den verunglueckten Enterprise-Hinweis auf der Buchungsseite repariert
(E-Mail war ohne Trennung angeklebt).
Co-Authored-By: Claude Fable 5
---
.env.example | 10 +++++++---
config/legal.php | 14 ++++++++++++++
dev/release/entwicklungsplan-release.md | 3 ++-
.../views/livewire/customer/bookings.blade.php | 2 +-
resources/views/web/agb.blade.php | 2 +-
resources/views/web/datenschutz.blade.php | 2 +-
resources/views/web/impressum.blade.php | 4 ++--
resources/views/web/melden.blade.php | 2 +-
resources/views/web/richtlinien.blade.php | 2 +-
tests/Feature/Web/StaticPagesTest.php | 4 ++++
10 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/.env.example b/.env.example
index 351b3110..6226e36f 100644
--- a/.env.example
+++ b/.env.example
@@ -188,9 +188,13 @@ CONTACT_EMAIL_PRESSEKONTO=
CONTACT_EMAIL_PRESSEECHO=
CONTACT_EMAIL_BUSINESSPORTAL=
-# DSA-Kontaktpunkt/Melde-Postfach je Brand (Impressum + /melden; Empfehlung:
-# melden@… oder legal@…). Ohne Wert fällt die Anzeige auf CONTACT_EMAIL_*
-# bzw. das Betreiber-Postfach zurück. [EXTERN: echte Adressen eintragen]
+# Haupt-E-Mail für alle rechtlichen Anliegen (Impressum, Datenschutz, AGB,
+# Meldeverfahren, Richtlinien) — auf allen drei Domains identisch.
+# Ohne Wert gilt der Default info@pressekonto.com (config/legal.php).
+LEGAL_CONTACT_EMAIL=
+
+# Optionales separates DSA-Melde-Postfach je Brand (Impressum + /melden).
+# Ohne Wert fällt die Anzeige auf LEGAL_CONTACT_EMAIL zurück.
REPORT_EMAIL_PRESSEKONTO=
REPORT_EMAIL_PRESSEECHO=
REPORT_EMAIL_BUSINESSPORTAL=
diff --git a/config/legal.php b/config/legal.php
index 703853ad..d3c77648 100644
--- a/config/legal.php
+++ b/config/legal.php
@@ -17,4 +17,18 @@ return [
'agb_version' => '0.6',
'agb_effective_from' => '2026-07-03',
+ /*
+ |--------------------------------------------------------------------------
+ | Zentrale Rechts-E-Mail
+ |--------------------------------------------------------------------------
+ |
+ | Haupt-E-Mail für alle rechtlichen Anliegen (Impressum, Datenschutz,
+ | AGB, Meldeverfahren, Richtlinien) — auf allen drei Domains identisch.
+ | Support-/Redaktionskontakt bleibt je Brand konfigurierbar
+ | (config/domains.php, brand.contact_email).
+ |
+ */
+
+ 'contact_email' => env('LEGAL_CONTACT_EMAIL', 'info@pressekonto.com'),
+
];
diff --git a/dev/release/entwicklungsplan-release.md b/dev/release/entwicklungsplan-release.md
index 7b3bb208..cd951f76 100644
--- a/dev/release/entwicklungsplan-release.md
+++ b/dev/release/entwicklungsplan-release.md
@@ -16,9 +16,10 @@ R2.2+R2.3 erledigt: Hub-Landing komplett ueberarbeitet (datengetriebenes Tarif-G
**Naechste Schritte:** R2.4 (Sitemap/robots/meta) ohne User-Input machbar; R3 Inhalte + R1.2 Stripe-Live [EXTERN].
**03.07. abends — Hub-Inhalts-Audit + Rechtstexte (Entscheidung E2: B2B-only!):** Alle Hub-/Web-Inhalte gegen den echten Funktionsstand geprueft und korrigiert (Startseiten-Claims, FAQ, Hilfe, Veroeffentlichen, API-Doku inkl. OpenAPI); kontakt/ueber-uns zurueckgebaut; Rechtstexte aus docs/legal eingebaut (Impressum echt, AGB v0.6, /richtlinien, /melden); Widerrufs-UI raus (E2), Submit-Modal auf Archiv-Hinweis (T2neu); Preise nach Leistungsbeschreibung v0.2. Details in R3.0–R3.2.
**03.07. spaet — Rechtstexte komplett + T1neu + Mail-CI (TAGESABSCHLUSS, Suite: 935 gruen):** Datenschutzerklaerung v0.3 host-aware eingebaut (Hub-/Spoke-Bausteine, Magic-Link 15 Min., Stripe Payments Europe); Cookie-Seite zurueckgebaut (301 -> /datenschutz, Cookies stehen in Abschnitt 4, kein Banner). T1neu umgesetzt: Unternehmer-Pflicht-Checkbox im Buchungs-Modal, protokolliert in `booking_confirmations` (Timestamp/IP/AGB-Version aus `config/legal.php`), CheckoutController erzwingt zeitnahe Bestaetigung serverseitig. System-Mails auf zentrales pressekonto-CI-Layout umgestellt (components/emails/layout, inkl. Framework-Auth-Mails via toMailUsing, EmailBrandingTest).
+**06.07. — Zentrale Rechts-E-Mail (User-Entscheidung):** `info@pressekonto.com` ist die Haupt-E-Mail fuer alle rechtlichen Anliegen; zentral in `config/legal.php` (`LEGAL_CONTACT_EMAIL`), alle fuenf Rechtsseiten (Impressum, AGB, Datenschutz, /melden, /richtlinien) nutzen sie domainuebergreifend. Support-/Redaktionskontakt bleibt je Brand (CONTACT_EMAIL_*), REPORT_EMAIL_* ist nur noch optionales separates DSA-Postfach. Live-Domain bestaetigt .com (Deployment-Checkliste), nicht .de.
**Wiedereinstieg / naechste Schritte:**
1. **Klaerungsliste Rechtstexte abarbeiten** (User-Antworten offen, siehe Chat 03.07.): Umami installieren oder Datenschutz-Abschnitt 5 vorerst raus · Log-Frist 14 Tage + Backups 4 Wochen mit Server-Konfig abgleichen · Stripe-Entitaet im Dashboard verifizieren · Medienprivileg-Zitierung praezisieren, falls anwaltlich bestaetigt · AGB par. 1 (3): eigene /portale-Seite oder Link auf Hub-#familie ok? · O-B Depublikations-Preisdarstellung bestaetigen.
-2. **[EXTERN]:** REPORT_EMAIL_*/CONTACT_EMAIL_*-Postfaecher anlegen (melden@/legal@) · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3.
+2. **[EXTERN]:** Postfach `info@pressekonto.com` anlegen (Haupt-Rechts-Mail, 06.07.); CONTACT_EMAIL_*-Support-Postfaecher je Brand; REPORT_EMAIL_* optional · R1.2 Stripe-Live · R1.4 Preisfreigabe · R5.4 Favicons · anwaltliche Freigabe AGB v0.6/Datenschutz v0.3.
3. **Backlog Rechtstexte-System (R3.1-Rest):** legal_documents-Versionierung + agb_version_id an Buchungen (E3; config/legal.php ist die Uebergangsloesung) · rejection_categories-DB fuer /richtlinien · T10 eigenstaendige DSA-Meldeformulare mit URL-Feld + Vorgangsnummer · T12 Depublikations-Checkout · T13 Melde-Button prominenter an der PM.
4. **Dann:** R6.1 manuelle QA-Checkliste, R6.3 Staging-Rehearsal, R6.4 Go-Live-Kette, R6.5 Git-Hygiene (Branch fix/zeitzone-europe-berlin liegt ~125 Commits vor main — mergen, sobald freigegeben). Offen bleibt ausserdem die User-Entscheidung zu den Legacy-SQL-Dumps in `dev/migration 2026/sql/` (enttracken vor Repo-Sharing).
diff --git a/resources/views/livewire/customer/bookings.blade.php b/resources/views/livewire/customer/bookings.blade.php
index 4a66d58e..36a70484 100644
--- a/resources/views/livewire/customer/bookings.blade.php
+++ b/resources/views/livewire/customer/bookings.blade.php
@@ -637,7 +637,7 @@ new #[Layout('components.layouts.app'), Title('Buchungen & Add-ons')] class exte
- {{ __('Mehr als 60 Pressemitteilungen pro Monat, mehrere Teams oder Sonderkonditionen? Enterprise-Konditionen erhalten Sie auf Anfrage über den Support. Inklusive KI-Prüfung und Veröffentlichung.info@pressekonto.com') }}
+ {{ __('Mehr als 60 Pressemitteilungen pro Monat, mehrere Teams oder Sonderkonditionen? Enterprise-Konditionen erhalten Sie auf Anfrage unter info@pressekonto.com — inklusive Inhaltsprüfung und Veröffentlichung.') }}
diff --git a/resources/views/web/agb.blade.php b/resources/views/web/agb.blade.php
index 4e6b72dc..e4319fbe 100644
--- a/resources/views/web/agb.blade.php
+++ b/resources/views/web/agb.blade.php
@@ -11,7 +11,7 @@
$isHub = str_contains($host, 'pressekonto');
$brandKey = $isHub ? 'pressekonto' : (str_contains($host, 'presseecho') ? 'presseecho' : 'businessportal24');
$brand = config('domains.domains.'.$brandKey.'.brand', []);
- $contactEmail = $brand['contact_email'] ?? 'info@businessportal24.com';
+ $contactEmail = (string) config('legal.contact_email');
$hubUrl = rtrim((string) config('domains.domain_portal_url', config('app.url')), '/');
$hubLabel = str_replace(['https://', 'http://'], '', $hubUrl);
diff --git a/resources/views/web/datenschutz.blade.php b/resources/views/web/datenschutz.blade.php
index c5563f45..2fa5d0e5 100644
--- a/resources/views/web/datenschutz.blade.php
+++ b/resources/views/web/datenschutz.blade.php
@@ -13,7 +13,7 @@
$brandKey = $isHub ? 'pressekonto' : (str_contains($host, 'presseecho') ? 'presseecho' : 'businessportal24');
$brand = config('domains.domains.'.$brandKey.'.brand', []);
$portalName = ($brand['name'] ?? '').($brand['accent'] ?? '');
- $contactEmail = $brand['contact_email'] ?? 'info@businessportal24.com';
+ $contactEmail = (string) config('legal.contact_email');
$reportEmail = $brand['report_email'] ?? $contactEmail;
$hubUrl = rtrim((string) config('domains.domain_portal_url', config('app.url')), '/');
$hubLabel = str_replace(['https://', 'http://'], '', $hubUrl);
diff --git a/resources/views/web/impressum.blade.php b/resources/views/web/impressum.blade.php
index 6bf88916..4610256e 100644
--- a/resources/views/web/impressum.blade.php
+++ b/resources/views/web/impressum.blade.php
@@ -11,7 +11,7 @@
$brandKey = $isHub ? 'pressekonto' : (str_contains($host, 'presseecho') ? 'presseecho' : 'businessportal24');
$brand = config('domains.domains.'.$brandKey.'.brand', []);
$portalName = ($brand['name'] ?? '').($brand['accent'] ?? '');
- $contactEmail = $brand['contact_email'] ?? 'info@businessportal24.com';
+ $contactEmail = (string) config('legal.contact_email');
$reportEmail = $brand['report_email'] ?? $contactEmail;
$hubUrl = rtrim((string) config('domains.domain_portal_url', config('app.url')), '/');
@endphp
@@ -32,7 +32,7 @@
Deutschland
- E-Mail: info@businessportal24.com
+ E-Mail: {{ $contactEmail }}
Telefon: +49 5206 7076721 (kein telefonischer Support)
diff --git a/resources/views/web/melden.blade.php b/resources/views/web/melden.blade.php
index 62570afc..62b28a34 100644
--- a/resources/views/web/melden.blade.php
+++ b/resources/views/web/melden.blade.php
@@ -13,7 +13,7 @@
$brandKey = $isHub ? 'pressekonto' : (str_contains($host, 'presseecho') ? 'presseecho' : 'businessportal24');
$brand = config('domains.domains.'.$brandKey.'.brand', []);
$portalName = ($brand['name'] ?? '').($brand['accent'] ?? '');
- $contactEmail = $brand['contact_email'] ?? 'info@businessportal24.com';
+ $contactEmail = (string) config('legal.contact_email');
$reportEmail = $brand['report_email'] ?? $contactEmail;
@endphp
diff --git a/resources/views/web/richtlinien.blade.php b/resources/views/web/richtlinien.blade.php
index 88f34857..30249536 100644
--- a/resources/views/web/richtlinien.blade.php
+++ b/resources/views/web/richtlinien.blade.php
@@ -10,7 +10,7 @@
$host = request()->getHost();
$isHub = str_contains($host, 'pressekonto');
$brandKey = $isHub ? 'pressekonto' : (str_contains($host, 'presseecho') ? 'presseecho' : 'businessportal24');
- $contactEmail = config('domains.domains.'.$brandKey.'.brand.contact_email') ?? 'info@businessportal24.com';
+ $contactEmail = (string) config('legal.contact_email');
$rejectionCategories = [
['code' => 'K1', 'label' => 'Rechtswidrige Inhalte', 'desc' => 'Inhalte, die gegen geltendes Recht verstoßen — etwa strafbare Inhalte, Verstöße gegen das Wettbewerbs- oder Heilmittelwerberecht, Angebote verbotener Produkte oder Dienstleistungen.'],
diff --git a/tests/Feature/Web/StaticPagesTest.php b/tests/Feature/Web/StaticPagesTest.php
index afdf6a4f..f9415236 100644
--- a/tests/Feature/Web/StaticPagesTest.php
+++ b/tests/Feature/Web/StaticPagesTest.php
@@ -52,6 +52,9 @@ test('the imprint shows the real provider data instead of placeholders', functio
->assertSeeText('Kevin Adametz')
->assertSeeText('33739 Bielefeld')
->assertSeeText('DE298729654')
+ // Zentrale Rechts-E-Mail (config/legal.php) auf allen Domains.
+ ->assertSeeText('info@pressekonto.com')
+ ->assertDontSeeText('info@businessportal24.com')
// DDG statt TMG; keine erfundene GmbH/Musterstraße mehr.
->assertSeeText('§ 5 DDG')
->assertDontSeeText('Business Portal GmbH')
@@ -96,6 +99,7 @@ test('the privacy policy renders the real v03 content with host-specific blocks'
$this->get('https://presseecho.test/de/datenschutz')
->assertSuccessful()
->assertSeeText('adametz.media')
+ ->assertSeeText('info@pressekonto.com')
->assertSeeText('Hetzner Online GmbH')
->assertSeeText('Medienprivileg')
->assertSeeText('Änderungslinks für Pressekontakte')