feat(legal): Claims-Korrektur, zentrale Legal-Config & öffentliche Rechtsseiten (v1.7.0)

Teil 1 des Compliance-Updates (nach vollständiger Repo-Analyse):

- src/config/legal.ts: zentrale, typisierte Betreiber-/Rechtskonfiguration mit sichtbaren
  Platzhaltern, ENV-Overrides (LEGAL_*), Build-Warnung bei offenen Pflichtangaben, echte
  Subprozessorenliste (aus dem Code abgeleitet)
- Claims-Korrektur (20 Aussagen): 24/7, 100% Swiss Hosted, DSG/DSGVO-konform, 100% der Spende,
  Kein Unternehmen, "bleibt kostenlos", "sicher via Stripe", "keine Weitergabe/keine
  Übermittlung ins Ausland", "verschlüsselt"→"gehasht" — in page.tsx, spenden, impressum,
  datenschutz (Neuaufbau), settings-tab
- Neue Legal-Seiten (druckbar, responsiv, versioniert, als Entwurf gekennzeichnet):
  /nutzungsbedingungen, /verantwortungsvolle-nutzung, /sicherheit, /unterstuetzen,
  /organisationen/datenschutzvereinbarung + wiederverwendbare LegalPage-Shell
- Datenschutz komplett neu aufgebaut: Subprozessoren-Tabelle (#dienstleister), Auslandbekanntgabe,
  gehashte Passwörter, Backups/Löschung, Zahlung (Stripe), Karten/Geodienste, Rechte/EDÖB
- Footer um alle Pflicht-Rechtslinks erweitert; sitemap.ts ergänzt
- docs/legal/website-claims-audit.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pepe Ziberi
2026-07-23 11:57:39 +02:00
parent 6aa70e1504
commit 872b8927cc
15 changed files with 1069 additions and 207 deletions

View File

@@ -1,187 +1,207 @@
'use client'
import Link from 'next/link'
import { ArrowLeft, Shield, Server, Trash2, Mail } from 'lucide-react'
import { LegalPage } from '@/components/legal/legal-page'
import { legal, isPlaceholder } from '@/config/legal'
function Val({ value }: { value: string }) {
if (isPlaceholder(value)) {
return <span className="text-amber-600 dark:text-amber-400 font-medium">{value}</span>
}
return <span className="text-foreground font-medium">{value}</span>
}
export default function DatenschutzPage() {
const d = legal.documents.privacy
return (
<div className="min-h-screen bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900 px-4 py-12">
<div className="max-w-3xl mx-auto">
<Link href="/" className="text-sm text-gray-400 hover:text-gray-300 inline-flex items-center gap-1 mb-8">
<ArrowLeft className="w-3.5 h-3.5" />
Zurück zur Startseite
</Link>
<LegalPage
title="Datenschutzerklärung"
version={d.version}
publishedAt={d.publishedAt}
intro={`Diese Erklärung informiert transparent darüber, welche Personendaten ${legal.projectName} bearbeitet, zu welchem Zweck und wer daran beteiligt ist. Sie orientiert sich am Schweizer Datenschutzgesetz (DSG).`}
>
<section>
<h2>1. Verantwortlicher</h2>
<p>
Verantwortlich für die Datenbearbeitung ist der Betreiber der Plattform{' '}
<Val value={legal.operatorName} /> (<Val value={legal.operatorLegalForm} />),{' '}
<Val value={legal.postalAddress} />.
</p>
<p><strong>Datenschutzkontakt:</strong> <Val value={legal.privacyContactEmail} /></p>
</section>
<div className="bg-card rounded-xl shadow-2xl p-8 md:p-12 border border-border">
<div className="flex items-center gap-3 mb-6">
<div className="w-10 h-10 bg-red-600 rounded-full flex items-center justify-center">
<Shield className="w-5 h-5 text-white" />
</div>
<h1 className="text-3xl font-bold text-foreground">Datenschutzerklärung</h1>
</div>
<section>
<h2>2. Welche Daten werden bearbeitet?</h2>
<ul>
<li><strong>Registrierungs-/Kontodaten:</strong> Name, E-Mail-Adresse, Organisationsname, Rolle. Das Passwort wird mit einem geeigneten Einwegverfahren (bcrypt) gehasht und nie im Klartext gespeichert.</li>
<li><strong>Einsatz-/Inhaltsdaten:</strong> Lagepläne, Journaleinträge, Zeichnungen, Koordinaten, Symbole, hochgeladene Dateien (Logos, Planbilder, Symbole) sowie zugehörige Projekt- und Organisationsdaten.</li>
<li><strong>Protokoll-/Sicherheitsdaten:</strong> technische Zugriffs- und Fehlerprotokolle (z.B. Zeitpunkt, ungefähre technische Angaben) zur Gewährleistung von Betrieb und Sicherheit.</li>
<li><strong>Zustimmungsnachweise:</strong> welche Version der Nutzungsbedingungen/Datenschutzerklärung/Organisationsbestätigung wann akzeptiert wurde.</li>
<li><strong>Unterstützungsbeiträge (optional):</strong> bei freiwilligen Beiträgen der Betrag sowie freiwillig angegebener Name/Nachricht (Zahlungsabwicklung siehe Ziffer 9).</li>
</ul>
</section>
<p className="text-muted-foreground mb-8">
Gültig ab 1. Januar 2026 Lageplan.ch, betrieben in der Schweiz.
</p>
<section>
<h2>3. Zwecke</h2>
<ul>
<li>Bereitstellung und Betrieb der Applikation, Authentifizierung und Benutzer-/Organisationsverwaltung</li>
<li>Echtzeit-Synchronisierung von Einsatzdaten zwischen berechtigten Teammitgliedern</li>
<li>Erstellung von Rapporten und PDF-/PNG-Exporten</li>
<li>Gewährleistung von Sicherheit, Stabilität und Missbrauchsprävention</li>
<li>Technischer Support und Fehlerbehebung</li>
<li>Erfüllung rechtlicher Pflichten (soweit anwendbar)</li>
</ul>
</section>
{/* 1. Verantwortlicher */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">01</span>
Verantwortlicher
</h2>
<p className="text-muted-foreground text-sm leading-relaxed">
Verantwortlich für die Datenverarbeitung auf lageplan.ch ist der Betreiber der Plattform.
Bei Fragen zum Datenschutz wenden Sie sich bitte an die im Impressum angegebene Kontaktadresse
oder per E-Mail an <span className="text-foreground font-medium">datenschutz@lageplan.ch</span>.
</p>
</section>
<section>
<h2>4. Grundlagen der Bearbeitung</h2>
<p>
Die Bearbeitung erfolgt insbesondere zur Erfüllung des Nutzungsverhältnisses (Vertrag), aufgrund
berechtigter Interessen am sicheren und stabilen Betrieb sowie wo erforderlich gestützt auf Ihre
Einwilligung. Zwingende gesetzliche Bestimmungen bleiben vorbehalten.
</p>
</section>
{/* 2. Welche Daten */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">02</span>
Welche Daten werden erhoben?
</h2>
<div className="space-y-3 text-sm text-muted-foreground leading-relaxed">
<p><strong className="text-foreground">Registrierungsdaten:</strong> Name, E-Mail-Adresse, Organisationsname, Passwort (verschlüsselt gespeichert).</p>
<p><strong className="text-foreground">Einsatzdaten:</strong> Lagepläne, Journal-Einträge, Zeichnungen, Koordinaten, Symbole und zugehörige Projektdaten, die Sie in der Applikation erstellen.</p>
<p><strong className="text-foreground">Technische Daten:</strong> IP-Adresse, Browser-Typ, Zugriffszeitpunkt ausschliesslich für den Betrieb und die Sicherheit der Plattform.</p>
<p><strong className="text-foreground">Hochgeladene Dateien:</strong> Logos, Planbilder und Symbole, die Sie über die Applikation hochladen.</p>
</div>
</section>
{/* 3. Zweck */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">03</span>
Zweck der Datenverarbeitung
</h2>
<div className="space-y-2 text-sm text-muted-foreground leading-relaxed">
<p>Ihre Daten werden ausschliesslich für folgende Zwecke verwendet:</p>
<ul className="list-disc pl-5 space-y-1">
<li>Bereitstellung und Betrieb der Lageplan-Applikation</li>
<li>Authentifizierung und Benutzerverwaltung</li>
<li>Echtzeit-Synchronisierung von Einsatzdaten zwischen Teammitgliedern</li>
<li>Erstellung von Einsatzrapports und PDF-Exporten</li>
<li>Technischer Support und Fehlerbehebung</li>
</ul>
</div>
</section>
{/* 4. Betrieb und Wartung */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">04</span>
Betrieb, Wartung und Support
</h2>
<div className="space-y-3 text-sm text-muted-foreground leading-relaxed">
<p>
Für den sicheren und zuverlässigen Betrieb der Plattform können autorisierte Mitarbeitende
des Betreibers im Rahmen ihrer Aufgaben auf Systemdaten zugreifen. Dies geschieht ausschliesslich zu folgenden Zwecken:
</p>
<ul className="list-disc pl-5 space-y-1">
<li>Sicherstellung der Systemverfügbarkeit und -stabilität</li>
<li>Fehlerbehebung und technischer Support auf Anfrage</li>
<li>Durchführung von Wartungs- und Aktualisierungsarbeiten</li>
<li>Gewährleistung der Datensicherheit und Missbrauchsprävention</li>
</ul>
<p>
Der Zugriff erfolgt unter Einhaltung strikter Vertraulichkeitspflichten und wird auf das
betrieblich notwendige Minimum beschränkt. Personenbezogene Daten werden nicht an Dritte weitergegeben
und ausschliesslich im Rahmen der oben genannten Zwecke verarbeitet.
</p>
</div>
</section>
{/* 5. Hosting & Speicherung */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<Server className="w-4 h-4 text-red-500" />
<span><span className="text-red-500 font-mono text-sm mr-2">05</span>Hosting und Speicherung</span>
</h2>
<div className="space-y-2 text-sm text-muted-foreground leading-relaxed">
<p>
Alle Daten werden auf Servern in der <strong className="text-foreground">Schweiz</strong> gespeichert.
Es findet keine Übermittlung von Daten ins Ausland statt.
</p>
<p>
Die Daten werden in einer PostgreSQL-Datenbank gespeichert. Dateien (Logos, Bilder) werden in einem
S3-kompatiblen Objektspeicher (MinIO) abgelegt. Die Übertragung erfolgt verschlüsselt via HTTPS/TLS.
</p>
</div>
</section>
{/* 6. Datenlöschung */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<Trash2 className="w-4 h-4 text-red-500" />
<span><span className="text-red-500 font-mono text-sm mr-2">06</span>Datenlöschung und Konto-Auflösung</span>
</h2>
<div className="space-y-2 text-sm text-muted-foreground leading-relaxed">
<p>
Sie haben jederzeit das Recht, Ihr Konto und Ihre Organisation inklusive aller zugehörigen Daten
vollständig zu löschen. Dies können Sie selbstständig über die Applikation durchführen
(Einstellungen Organisation löschen).
</p>
<p>
Bei der Löschung werden sämtliche Daten unwiderruflich entfernt: Benutzerkonten, Projekte,
Lagepläne, Journal-Einträge, Rapports, hochgeladene Dateien und alle zugehörigen Metadaten.
</p>
<p>
Alternativ können Sie die Löschung per E-Mail an <span className="text-foreground font-medium">datenschutz@lageplan.ch</span> beantragen.
</p>
</div>
</section>
{/* 7. Rechte */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">07</span>
Ihre Rechte
</h2>
<div className="space-y-2 text-sm text-muted-foreground leading-relaxed">
<p>Gemäss dem Schweizer Datenschutzgesetz (DSG) und der DSGVO haben Sie folgende Rechte:</p>
<ul className="list-disc pl-5 space-y-1">
<li><strong className="text-foreground">Auskunftsrecht:</strong> Sie können Auskunft über Ihre gespeicherten Daten verlangen.</li>
<li><strong className="text-foreground">Berichtigungsrecht:</strong> Sie können die Korrektur unrichtiger Daten verlangen.</li>
<li><strong className="text-foreground">Löschungsrecht:</strong> Sie können die Löschung Ihrer Daten verlangen.</li>
<li><strong className="text-foreground">Datenportabilität:</strong> Sie können Ihre Daten in einem gängigen Format anfordern.</li>
<li><strong className="text-foreground">Widerspruchsrecht:</strong> Sie können der Verarbeitung Ihrer Daten widersprechen.</li>
</ul>
</div>
</section>
{/* 8. Cookies */}
<section className="mb-8">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<span className="text-red-500 font-mono text-sm">08</span>
Cookies
</h2>
<p className="text-sm text-muted-foreground leading-relaxed">
Die Applikation verwendet ausschliesslich <strong className="text-foreground">technisch notwendige Cookies</strong> für
die Authentifizierung (Session-Token). Es werden keine Tracking-, Analyse- oder Werbe-Cookies eingesetzt.
Es werden keine Daten an Dritte weitergegeben.
</p>
</section>
{/* 9. Kontakt */}
<section className="mb-4">
<h2 className="text-xl font-semibold text-foreground mb-3 flex items-center gap-2">
<Mail className="w-4 h-4 text-red-500" />
<span><span className="text-red-500 font-mono text-sm mr-2">09</span>Kontakt</span>
</h2>
<p className="text-sm text-muted-foreground leading-relaxed">
Bei Fragen oder Anliegen zum Datenschutz kontaktieren Sie uns unter:{' '}
<span className="text-foreground font-medium">datenschutz@lageplan.ch</span>
</p>
</section>
<section id="dienstleister" className="scroll-mt-20">
<h2>5. Empfänger und Dienstleister (Subprozessoren)</h2>
<p>
Für den technischen Betrieb können sorgfältig ausgewählte Dienstleister eingesetzt werden. Nachfolgend
die tatsächlich eingesetzten bzw. optional konfigurierbaren Dienste. Einige Karten-, Geocoding- und
Wetterdienste werden direkt aus Ihrem Browser aufgerufen; dabei kann die aufgerufene Kachel-/Standort-
Anfrage (und damit Ihre IP-Adresse) an den jeweiligen Anbieter übermittelt werden.
</p>
<div className="overflow-x-auto">
<table className="w-full text-xs border-collapse mt-2">
<thead>
<tr className="text-left text-foreground border-b border-border">
<th className="py-1.5 pr-3">Dienst</th>
<th className="py-1.5 pr-3">Zweck</th>
<th className="py-1.5 pr-3">Daten</th>
<th className="py-1.5">Region</th>
</tr>
</thead>
<tbody>
{legal.processors.map(p => (
<tr key={p.name} className="border-b border-border/50 align-top">
<td className="py-1.5 pr-3 text-foreground font-medium">{p.name}{p.optional ? ' *' : ''}</td>
<td className="py-1.5 pr-3">{p.purpose}</td>
<td className="py-1.5 pr-3">{p.data}</td>
<td className="py-1.5">{isPlaceholder(p.region) ? <span className="text-amber-600 dark:text-amber-400">{p.region}</span> : p.region}</td>
</tr>
))}
</tbody>
</table>
</div>
<p className="text-xs">* nur aktiv, sofern konfiguriert/genutzt (z.B. Zahlungsabwicklung, E-Mail-Versand).</p>
<p>Personendaten werden nicht zu Werbezwecken an Dritte verkauft.</p>
</section>
<div className="text-center mt-6 text-xs text-gray-500">
© {new Date().getFullYear()} Lageplan.ch Alle Rechte vorbehalten.
</div>
</div>
</div>
<section>
<h2>6. Bekanntgabe ins Ausland</h2>
<p>
Je nach eingesetztem Dienstleister (z.B. Zahlungsanbieter, konfigurierter E-Mail-Anbieter, globale
Kartendienste) kann eine Bearbeitung ausserhalb der Schweiz erfolgen. Der Betreiber wählt Dienstleister
sorgfältig aus. Eine ausschliessliche Speicherung in der Schweiz wird nicht pauschal zugesichert; die
konkreten Verarbeitungsregionen sind soweit bekannt in der Tabelle unter Ziffer 5 bzw. in{' '}
<code>docs/legal/subprocessors.md</code> aufgeführt. Offene Punkte sind mit Platzhaltern gekennzeichnet.
</p>
</section>
<section>
<h2>7. Sicherheit</h2>
<p>
Es werden angemessene technische und organisatorische Massnahmen eingesetzt (u.a. Rollen- und
Mandantentrennung, Passwort-Hashing, verschlüsselte Übertragung via HTTPS/TLS, Zugriffskontrollen,
Rate-Limiting). Ein vollständiger Schutz vor allen Risiken kann jedoch nicht garantiert werden.
</p>
</section>
<section>
<h2>8. Aufbewahrung und Löschung</h2>
<p>
Personendaten werden so lange aufbewahrt, wie es für die genannten Zwecke oder gesetzliche Pflichten
erforderlich ist. Produktivdaten werden nach Abschluss des Löschvorgangs entfernt. Daten in
Sicherungskopien (Backups) können bis zum Ablauf des regulären Backup-Zyklus fortbestehen
(Aufbewahrungsfrist der Backups: <Val value={legal.backupRetention} />). Die detaillierten Fristen sind in{' '}
<code>docs/legal/retention-and-deletion.md</code> dokumentiert.
</p>
</section>
<section>
<h2>9. Zahlungsabwicklung (freiwillige Beiträge)</h2>
<p>
Freiwillige Unterstützungsbeiträge werden über <strong>Stripe</strong> abgewickelt. Zahlungsdaten
(z.B. Kreditkarte, Twint) werden direkt bei Stripe erfasst und nicht in der Applikation gespeichert.
An Stripe werden der Betrag sowie ein freiwillig angegebener Name/Nachricht übermittelt. Es werden keine
wiederkehrenden Zahlungen eingerichtet. Details siehe{' '}
<a href="/unterstuetzen">Unterstützungsseite</a>.
</p>
</section>
<section>
<h2>10. Karten- und Geodienste</h2>
<p>
Für Karten, Adresssuche und Wetter-/Höhendaten werden Dienste von OpenStreetMap (Tiles/Nominatim),
Esri (Satellitenbilder), swisstopo (Landeskarte) sowie Open-Meteo/Open-Elevation genutzt. Diese Aufrufe
erfolgen aus Ihrem Browser; dabei kann Ihre IP-Adresse an die jeweiligen Anbieter übermittelt werden.
Karten-, Adress- und Geodaten können unvollständig, ungenau oder veraltet sein.
</p>
</section>
<section>
<h2>11. Cookies und lokale Speichertechnologien</h2>
<p>
Es wird ein einziges, technisch notwendiges Cookie gesetzt: <code>auth-token</code> (Session/Anmeldung,
httpOnly). Es werden keine Tracking-, Analyse- oder Werbe-Cookies eingesetzt.
</p>
<p>
Im lokalen Speicher (localStorage) Ihres Geräts werden zur Funktion technisch notwendige Angaben
abgelegt, u.a.: zwischengespeicherte Zeichnungen/Offline-Warteschlange, Cache-Zeitstempel für
Offline-Karten, Theme-Einstellung, zuletzt geöffnetes Projekt, Onboarding-Status und der Zustand des
Cookie-Hinweises. Diese Daten verbleiben auf Ihrem Gerät.
</p>
</section>
<section>
<h2>12. Protokolldaten</h2>
<p>
Zum Betrieb und zur Sicherheit können technische Protokolle anfallen. Diese werden auf das notwendige
Mass beschränkt; sensible Inhalte werden nach Möglichkeit von Protokollen ferngehalten.
</p>
</section>
<section>
<h2>13. Ihre Rechte</h2>
<p>Im Rahmen des anwendbaren Rechts stehen Ihnen insbesondere folgende Rechte zu:</p>
<ul>
<li><strong>Auskunft</strong> über die bearbeiteten Daten</li>
<li><strong>Berichtigung</strong> unrichtiger Daten</li>
<li><strong>Löschung</strong> (im Rahmen gesetzlicher Pflichten)</li>
<li><strong>Datenherausgabe/-export</strong> in einem gängigen Format</li>
<li><strong>Widerspruch</strong> gegen bestimmte Bearbeitungen</li>
<li><strong>Beschwerde</strong> bei der zuständigen Datenschutzbehörde (in der Schweiz: EDÖB)</li>
</ul>
<p>
Angemeldete Nutzer können Zustimmungen, Datenexport und Kontolöschung unter{' '}
<a href="/konto/datenschutz">Konto &amp; Datenschutz</a> einsehen bzw. anfordern. Anfragen richten Sie an{' '}
<Val value={legal.privacyContactEmail} />; der Eingang wird bestätigt.
</p>
</section>
<section>
<h2>14. Sicherheitsvorfälle</h2>
<p>
Bei einem Sicherheitsvorfall mit Risiko für betroffene Personen prüft der Betreiber die erforderlichen
Massnahmen und Informationspflichten nach einem definierten internen Prozess.
</p>
</section>
<section>
<h2>15. Änderungen dieser Datenschutzerklärung</h2>
<p>
Diese Datenschutzerklärung kann angepasst werden. Massgebend ist die jeweils veröffentlichte Version
(siehe Kopf dieser Seite). Bei wesentlichen Änderungen wird angemessen informiert.
</p>
</section>
</LegalPage>
)
}