# Datenschutz-Subdomain — Design-Spec

**Datum:** 2026-06-28
**Branch:** feat/wissen-subdomain (laufend)
**Status:** Freigegeben (User), Bau gestartet

## Ziel

Eine eigene Datenschutz-Subdomain `datenschutz.kotsch.tech` (EN: `privacy.kotsch.tech`),
die — analog zu `wissen.kotsch.tech` — als Hub/Menü alle Bereiche, Apps, Tools und
Windows-Programme auflistet und für jeden eine **bereichsspezifische Datenschutzseite**
bereitstellt. Zusätzlich bleibt die **allgemeine Datenschutzerklärung** (gilt für die
gesamte Plattform) bestehen.

Erreichbar über **zwei Wege** (wie alle Subdomains, via `SubdomainDispatcher`):
- `datenschutz.kotsch.tech/de`  (Subdomain-Host)
- `kotsch.tech/datenschutz`     (Apex-Pfad — identische Route)

## Architektur (Muster: Wissen-Subdomain)

Registry-getrieben + datei-/config-basiert. Neues Programm/Bereich = **1 Config-Eintrag**,
kein neues Blade-File.

### Komponenten

| Komponente | Datei | Zweck |
|---|---|---|
| Subdomain-Registry-Eintrag | `config/subdomains.php` | Host, EN-Host, Label, Akzent, footer_only |
| Datenschutz-Daten | `config/datenschutz.php` | Bereiche, Apps, Windows-Programme + Datenflüsse |
| Controller | `app/Http/Controllers/DatenschutzController.php` | index / general / area / app / windows |
| Hub-Template | `resources/views/datenschutz/index.blade.php` | Menü: alle Bereiche + Apps |
| Detail-Template | `resources/views/datenschutz/show.blade.php` | einheitliche Bereichs-/App-Seite |
| Allgemein-Template | `resources/views/datenschutz/allgemein.blade.php` | volle Datenschutzerklärung (migriert) |
| Routen | `routes/web.php` | `/datenschutz/...` Gruppe |

### Routen (Apex-Basis `/datenschutz`)

```
/datenschutz                    → index()    Hub-Menü (Allgemein prominent + alle Bereiche/Apps)
/datenschutz/allgemein          → general()  volle allgemeine Datenschutzerklärung
/datenschutz/apps/{slug}        → app()       iOS-/Mac-App
/datenschutz/windows/{slug}     → windows()   Windows-Programm
/datenschutz/{area}             → area()      Bereich (webtools, karc, shop, umfrage, …)
```

Reihenfolge wichtig: `allgemein`, `apps/{slug}`, `windows/{slug}` VOR dem `{area}`-Catch.
`{area}` per `where('area','[a-z0-9\-]+')` + Controller-404 bei unbekanntem Bereich.
Die Gruppe steht VOR der globalen `/{locale}/{path?}`-Catch-all-Route.

### Subdomain ↔ Apex (zwei Wege)

`datenschutz.kotsch.tech/de` → Dispatcher stellt Basis `/datenschutz` voran → dispatcht
`/de/datenschutz` → **dieselbe** Route wie Apex `kotsch.tech/datenschutz`. Keine Sonderlogik
nötig — das ist exakt das bestehende Subdomain-Muster.

EN-Host `privacy.kotsch.tech` → `forceLocale='en'` (via `host_en` in der Registry).

## Datenmodell `config/datenschutz.php`

Zweisprachig: jedes Textfeld ist String ODER `[DE, EN]` (Helper `localized()` wie in WissenController).

```php
return [
  // Bereiche: voll spezifiziert (eigene Datenflüsse je Bereich)
  'areas' => [
    'shop' => [
      'label'   => 'Shop',
      'icon'    => 'fa-bag-shopping',
      'accent'  => '#0F8A4F',
      'intro'   => [DE, EN],
      'data'    => [ ['label'=>…, 'detail'=>…], … ],   // erhobene Daten
      'purpose' => [DE, EN],
      'legal_basis' => 'Art. 6 …',
      'retention'   => [DE, EN],
      'third_parties' => ['PayPal', 'Zoho Mail'],
      'cookies' => true|false,
    ],
    'umfrage' => [ … komplex: Survey, Altersgruppe, E-Mail-Consent, Empfehlungs-Score … ],
    'webtools' => [ … browser-lokal, PDF-Teilen-Verweis … ],
    'karc' => [ … Live-Demo Bildkompression … ],
    'tester' => [ … Bewerbung: Name, E-Mail, Plattform, Gerät … ],
    'wissen' => [ … PDF-/Site-Zugriffslogs … ],
    'news' => [ … Artikel, AdSense-Verweis … ],
    'it-hilfe' => [ … Support-Anfragen … ],
    'webdesign' => [ … Projektanfragen … ],
  ],

  // Apps: kurze Einträge, erben Standard-Datenfluss aus dem `type`
  'apps' => [
    'ios' => [
      'de-companion' => ['name'=>'DE-Companion', 'platforms'=>['iPhone','Watch','CarPlay'], 'summary'=>[DE,EN], 'data_note'=>[DE,EN]|null],
      'convertly'    => ['name'=>'Convertly+', …],
      … alle 11 …
    ],
    'windows' => [
      'cleaner' => ['name'=>'Kotsch.Cleaner', 'summary'=>[DE,EN], 'data_note'=>null],
      … alle 9 …
    ],
  ],

  // Standard-Datenflüsse je App-Typ (DRY — die meisten Apps sind identisch)
  'profiles' => [
    'ios'     => [ 'intro'=>[DE,EN], 'data'=>[…], 'legal_basis'=>…, 'third_parties'=>['Apple App Store'] ],
    'mac'     => [ … ],
    'windows' => [ 'intro'=>[DE,EN] /* läuft lokal, keine Telemetrie */, 'data'=>[Download-Logs], … ],
  ],
];
```

App-Seite = Profil (nach Typ) + per-App-Overrides (`name`, `summary`, optional `data_note`).
So ist eine neue App eine **einzeilige** Ergänzung.

## Inhalt — pro Bereich (aus Code-Analyse)

- **Shop:** Name, E-Mail, Adresse, Telefon, Zahlungsart, Warenkorb; PayPal-API; 10 J. Aufbewahrung (§147 AO/§257 HGB); Art. 6 b/c.
- **Umfrage (ProblemRadar):** Survey-Session (Response-Code), optional Name/Altersgruppe, Problembeschreibung/Häufigkeit/Schweregrad, Survey-Antworten, Empfehlungs-Scores, E-Mail-Consent (Hash, Opt-in, Abmelde-Token); Honeypot; Art. 6 f + a.
- **Tester:** Name, E-Mail, Plattformen, Gerätemodell, Notizen; Art. 6 f.
- **Webtools:** überwiegend browser-lokal (keine Übertragung); PDF-Teilen serverseitig (Datei, Passwort-Hash, Auto-Löschung 1h–30d); Art. 6 f.
- **KARC:** Live-Demo komprimiert Bilder serverseitig zur Berechnung, keine dauerhafte Speicherung.
- **Wissen:** PDF-/Lernsite-Zugriff = nur Hosting-Logs.
- **News:** Artikel-Anzeige + AdSense (Verweis auf Allgemein).
- **IT-Hilfe / Webdesign:** Anfragedaten (Name, E-Mail, Beschreibung) via Formular/Mail.
- **Apps (iOS/Mac):** Verarbeitung lokal/über Apple; wir erheben nichts außer Support-Mails. Spezialfälle: MedTimer (Erinnerungen lokal), Kotsch Orders (Sync mit Shop-Konto).
- **Windows:** laufen lokal, keine Telemetrie; nur Download-Zugriffslogs.

## Allgemeine Datenschutzerklärung

Bestehender Inhalt aus `resources/views/legal/datenschutz.blade.php` wird nach
`resources/views/datenschutz/allgemein.blade.php` migriert (gleiches `legal-*` CSS, gleiches Layout).
Ergänzt um die bisher fehlenden Abschnitte: **Umfrage/ProblemRadar** und **Beta-Tester**.
Die alte Route `Route::view('/datenschutz', 'legal.datenschutz')` wird durch die Controller-Gruppe ersetzt.

## Footer / Verlinkung

- Footer-Link „Datenschutz" zeigt weiterhin auf die **volle Erklärung** (`/datenschutz/allgemein`) —
  rechtlich erwartet der DE-Footer die direkte Datenschutzerklärung.
- Hub (`/datenschutz`) führt die Allgemeine prominent als erste große Kachel + verlinkt alle Bereiche/Apps.
- Subdomain im Footer-Bereich „Alle Bereiche" & Sitemap: `footer_only`-Flag (wie Wissen) — erscheint
  NICHT im Hub-Header/Startseite, ABER in Footer + Sitemap (`noindex=false`).

## SEO

- Canonical je Seite auf `datenschutz.kotsch.tech` (bzw. `/de`-Prefix wie Projektkonvention).
- Sitemap: Hub + `allgemein` + alle Bereiche + alle Apps + alle Windows-Programme ergänzen (`routes/web.php` Sitemap-Closure).
- Hreflang DE/EN via bestehendem Mechanismus.

## Sicherheit / Konventionen

- `isSafeSlug()`-Prüfung (Muster WissenController) für alle Slug-Parameter.
- Locale-Erkennung im View nur über `request()->segment(1)` (Projektkonvention; `Route::dispatch` biegt `request()` nicht um).
- Nach Config-Änderung: `php artisan config:cache` (Pflicht laut Projekt-Memory).

## Tests

- Smoke-Test (curl mit Browser-UA, Port 85): Hub, allgemein, je 1 Bereich, je 1 App (iOS/Win), DE+EN, 404 für unbekannten Slug.
- Bestehende Test-Suite (`composer test`) muss grün bleiben (besonders i18n/Subdomain-Tests).

## Out of Scope (YAGNI)

- Keine dynamische DB-gestützte Verwaltung — reine Config/Datei-Quelle.
- Keine Cookie-Consent-Änderungen (AdSense-Banner bleibt).
- Keine automatische App-Synchronisation aus dem App Store für die Datenschutz-Texte.
```
