Startseite und Heroes - Hero-Slideshow (11 Motive inkl. Febrü) mit Infokarte, Laufzeit-Linie, größeren Klickflächen, Goldrahmen und mobiler Karte unter dem Bild; Zeile über der Überschrift, neue Vertrauenspunkte - Hero-Stil auf Marken, Über uns und Kontakt übertragen, Breadcrumb entfernt - Gründer-Leiste, Vision-Box auf Ocker, Showroom-Display in Box mit „Größer ansehen“/Vollbild - Akzentfarbe #a8741f, größere Serif-Überschriften in der Interior-Welt - Marken: Bildpause mit Zitat; Vereine aktualisiert und verlinkt Inhalte - Lektorat aller angezeigten Texte, /about-Korrekturen, Rechtstexte (DDG, TDDDG, Hosting Hetzner) - Ablauf Maßanfertigung überall einheitlich, Magazin-Beitrag neu, alte Beiträge offline, deutsches Datum/Lesezeit, FAQ Projektausstattung, Otterpohl - Referenzen-Seite per CMS-Schalter ausblendbar CMS und Technik - Tote Sektionen, Felder, Seiten und Komponenten entfernt und archiviert (dev/2026-08-28/archiv-*) - Entwurf /entwurf, Farb-Schalter und /welcome entfernt; Test-Routen nur noch lokal - Seitenbaum-Beschreibungen geprüft, fehlende CMS-Felder ergänzt, Markenliste aus „Kernmarken“ - Admin-Bildvorschauen repariert, verwendete Bilder in die Mediathek übernommen - Seeder für das Deployment siehe dev/2026-08-28/entwicklungsplan.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
126 lines
9.1 KiB
PHP
126 lines
9.1 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use FluxCms\Core\Models\CmsContent;
|
||
use FluxCms\Core\Services\CmsContentService;
|
||
use Illuminate\Database\Seeder;
|
||
|
||
/**
|
||
* Rechtstexte aktualisieren (06.10.2026, Nachtrag 22).
|
||
*
|
||
* Impressum: § 5 DDG statt TMG, §§ 7–10 DDG, § 18 Abs. 2 MStV statt § 55 RStV, „Amtsgericht“ ausgeschrieben,
|
||
* Überschrift „Verbraucherstreitbeilegung“ (die EU-OS-Plattform ist abgeschaltet). Nutzungsbedingungen:
|
||
* Leistungsbeschreibung nach dem Interior-Relaunch, ohne „(WICHTIG!)“. Datenschutz und Cookie-Richtlinie:
|
||
* TDDDG statt TTDSG, Rechtsgrundlage für technisch notwendige Cookies, GA4 statt „IP-Anonymisierung“,
|
||
* Beispiele für vorvertragliche Anfragen, Abschnitt „Hosting“ (Hetzner, Rechenzentrum Falkenstein) und
|
||
* E-Mail über united-domains, Server-Logs höchstens 14 Tage.
|
||
* Überall info@b2in.eu (das Impressum nannte info@b2in.de). Stand jeweils 06.10.2026.
|
||
*
|
||
* Tauscht nur genau diese Stellen in der Gruppe „legal“; im CMS geänderte Texte bleiben sonst unberührt.
|
||
* Mehrfaches Ausführen ist unbedenklich.
|
||
*
|
||
* php artisan db:seed --class=LegalTextUpdateSeeder
|
||
*/
|
||
class LegalTextUpdateSeeder extends Seeder
|
||
{
|
||
/** @var array<string, string> alte Stelle → neue Stelle */
|
||
public const REPLACEMENTS = [
|
||
'Angaben gemäß § 5 TMG' => 'Angaben gemäß § 5 DDG',
|
||
'Registergericht: Amtsg. Bad Oeynhausen' => 'Registergericht: Amtsgericht Bad Oeynhausen',
|
||
'Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV' => 'Verantwortlich für den Inhalt nach § 18 Abs. 2 MStV',
|
||
'>EU-Streitschlichtung<' => '>Verbraucherstreitbeilegung<',
|
||
'gemäß § 7 Abs. 1 TMG' => 'gemäß § 7 Abs. 1 DDG',
|
||
'Nach §§ 8 bis 10 TMG' => 'Nach §§ 8 bis 10 DDG',
|
||
'info@b2in.de' => 'info@b2in.eu',
|
||
'Industriestr. 25, 91710 Gunzenhausen, betrieben.' => 'Industriestr. 25, 91710 Gunzenhausen, betrieben; der Server steht in deren Rechenzentrum in Falkenstein (Sachsen), Deutschland.',
|
||
'Folgende Informationen werden dabei ohne Ihr Zutun erfasst und bis zur automatisierten Löschung gespeichert:' => 'Folgende Informationen werden dabei ohne Ihr Zutun erfasst, höchstens 14 Tage gespeichert und danach automatisch gelöscht:',
|
||
'Stand: 13.03.2026' => 'Stand: 06.10.2026',
|
||
'B2in ist das Netzwerk, das exklusives Design und internationale Immobilien verbindet („Connecting Design and Property“). Über unsere Website bieten wir unverbindliche Informationen zu unseren Dienstleistungen, Immobilienprojekten (z. B. in Dubai oder Lissabon), Supply-Chain-Management und unserem Einrichtungsnetzwerk an.' => 'Unter B2in Interior bieten wir hochwertige Einrichtung mit ausgewählten Marken, Maßanfertigung und persönlicher Beratung für private Räume und Projekte an; ergänzend informieren wir über ausgewählte internationale Immobilienprojekte. Über unsere Website bieten wir unverbindliche Informationen zu unseren Leistungen, Marken, Einrichtungs- und Ausstattungsprojekten sowie zu Immobilienprojekten (z. B. in Dubai) an.',
|
||
'Unverbindlichkeit von Immobilien- und Investmentinformationen (WICHTIG!)' => 'Unverbindlichkeit von Immobilien- und Investmentinformationen',
|
||
'(z. B. Immobilien-Investment oder Supply-Chain-Management)' => '(z. B. Beratung, Planung und Angebot für Ihre Einrichtung oder Anfragen zu Immobilienprojekten)',
|
||
'(z. B. das Speichern Ihrer Consent-Einstellungen). Die Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO.' => '(z. B. das Speichern Ihrer Consent-Einstellungen). Die Rechtsgrundlage hierfür ist § 25 Abs. 2 Nr. 2 TDDDG sowie Art. 6 Abs. 1 lit. f DSGVO.',
|
||
'(z. B. das Speichern Ihrer Consent-Einstellungen). Sie können nicht deaktiviert werden. Die Rechtsgrundlage hierfür ist Art. 6 Abs. 1 lit. f DSGVO.' => '(z. B. das Speichern Ihrer Consent-Einstellungen). Sie können nicht deaktiviert werden. Die Rechtsgrundlage hierfür ist § 25 Abs. 2 Nr. 2 TDDDG sowie Art. 6 Abs. 1 lit. f DSGVO.',
|
||
'§ 25 Abs. 1 TTDSG/TDDDG' => '§ 25 Abs. 1 TDDDG',
|
||
'<strong>IP-Anonymisierung:</strong> Wir haben auf dieser Website die Funktion IP-Anonymisierung aktiviert. Dadurch wird Ihre IP-Adresse von Google innerhalb von Mitgliedstaaten der Europäischen Union oder in anderen Vertragsstaaten des Abkommens über den Europäischen Wirtschaftsraum vor der Übermittlung in die USA gekürzt.' => '<strong>IP-Adressen:</strong> Wir setzen Google Analytics 4 ein. Dort werden IP-Adressen nicht protokolliert oder gespeichert; Google nutzt sie lediglich, um daraus grobe Standortdaten abzuleiten, und verwirft sie anschließend.',
|
||
];
|
||
|
||
/**
|
||
* Ergänzungen der Datenschutzerklärung: Abschnitt „Hosting“ (Hetzner) mit neuer Nummerierung und
|
||
* E-Mail über united-domains, Server-Logs höchstens 14 Tage. Nur anwenden, solange der Hosting-Abschnitt fehlt – sonst würde der
|
||
* ergänzte Satz bei jedem Lauf erneut angehängt.
|
||
*
|
||
* @var array<string, string>
|
||
*/
|
||
public const PRIVACY_ADDITIONS = [
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">2. Datenerfassung auf unserer Website (Server-Log-Dateien)</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">2. Hosting</h2>
|
||
<p class="text-muted-foreground">
|
||
Unsere Website wird auf einem Cloud-Server der Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, betrieben; der Server steht in deren Rechenzentrum in Falkenstein (Sachsen), Deutschland. Alle beim Aufruf der Website anfallenden Daten – insbesondere die unter Ziffer 3 genannten Server-Log-Daten und die Angaben aus dem Kontaktformular – werden auf diesem Server verarbeitet. Rechtsgrundlage ist unser berechtigtes Interesse an einem sicheren und zuverlässigen Betrieb unserer Website (Art. 6 Abs. 1 lit. f DSGVO). Mit Hetzner besteht ein Vertrag über Auftragsverarbeitung nach Art. 28 DSGVO.
|
||
</p>
|
||
</div>
|
||
|
||
<div>
|
||
<h2 class="text-lg font-semibold text-foreground mb-2">3. Datenerfassung auf unserer Website (Server-Log-Dateien)</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">3. Kontaktformular und E-Mail-Kontakt</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">4. Kontaktformular und E-Mail-Kontakt</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">4. Cookies</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">5. Cookies</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">5. Google Analytics</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">6. Google Analytics</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">6. Externe Links (z. B. Google Maps)</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">7. Externe Links (z. B. Google Maps)</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">7. SSL- bzw. TLS-Verschlüsselung</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">8. SSL- bzw. TLS-Verschlüsselung</h2>',
|
||
'<h2 class="text-lg font-semibold text-foreground mb-2">8. Ihre Rechte als betroffene Person</h2>' => '<h2 class="text-lg font-semibold text-foreground mb-2">9. Ihre Rechte als betroffene Person</h2>',
|
||
'Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.' => 'Diese Daten geben wir nicht ohne Ihre Einwilligung weiter. Unsere Domains und unser E-Mail-Postfach liegen bei der united-domains GmbH, Gautinger Straße 10, 82319 Starnberg; E-Mails, die Sie uns schreiben, und unsere Antworten werden über deren Server übertragen und dort gespeichert. Auch mit united-domains besteht ein Vertrag über Auftragsverarbeitung nach Art. 28 DSGVO.',
|
||
];
|
||
|
||
public function run(): void
|
||
{
|
||
$count = 0;
|
||
|
||
foreach (CmsContent::query()->where('group', 'legal')->get() as $row) {
|
||
$value = $row->getTranslations('value');
|
||
$updated = $this->replaceDeep($value, $count, self::REPLACEMENTS);
|
||
|
||
if (! str_contains(json_encode($updated, JSON_UNESCAPED_UNICODE) ?: '', 'Hetzner Online GmbH')) {
|
||
$updated = $this->replaceDeep($updated, $count, self::PRIVACY_ADDITIONS);
|
||
}
|
||
|
||
if ($updated !== $value) {
|
||
$row->value = $updated;
|
||
$row->save();
|
||
}
|
||
}
|
||
|
||
app(CmsContentService::class)->clearCache('legal');
|
||
|
||
$this->command?->info($count > 0
|
||
? "Rechtstexte: {$count} Feld(er) aktualisiert."
|
||
: 'Rechtstexte: bereits aktuell oder nicht im CMS – nichts geändert.');
|
||
}
|
||
|
||
/**
|
||
* @param array<mixed> $data
|
||
* @param array<string, string> $replacements
|
||
* @return array<mixed>
|
||
*/
|
||
private function replaceDeep(array $data, int &$count, array $replacements): array
|
||
{
|
||
foreach ($data as $key => $item) {
|
||
if (is_array($item)) {
|
||
$data[$key] = $this->replaceDeep($item, $count, $replacements);
|
||
|
||
continue;
|
||
}
|
||
|
||
if (! is_string($item)) {
|
||
continue;
|
||
}
|
||
|
||
$replaced = strtr($item, $replacements);
|
||
|
||
if ($replaced !== $item) {
|
||
$data[$key] = $replaced;
|
||
$count++;
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
}
|