feat(legal): Rechtstexte auf finale Fassung (v1.7.5)

Auf Wunsch produktiv statt Entwurf:
- Entwurfs-Kennzeichnung/Warnbanner entfernt; dezenter Standard-Hinweis im Footer der Rechtsseiten
  ("nach bestem Wissen und Gewissen erstellt und laufend gepflegt") — keine Behauptung juristischer Prüfung
- Dokumentversionen 1.0.0-draft -> 1.0.0 (Config + Migration-Seeding)
- AVV: Entwurfs-Sprache entfernt, als zwischen den Parteien wirksame Vereinbarung formuliert
- operatorName Default auf "Pepe Ziberi" (aus Repo bekannt); übrige Betreiberangaben bleiben
  bis zur Bestätigung Platzhalter (Adresse/Rechtsform/Serverstandort etc.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pepe Ziberi
2026-07-23 12:28:27 +02:00
parent 9eafe984e1
commit a14753c994
5 changed files with 21 additions and 22 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "lageplan", "name": "lageplan",
"version": "1.7.4", "version": "1.7.5",
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation", "description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
"private": true, "private": true,
"scripts": { "scripts": {

View File

@@ -194,11 +194,11 @@ async function migrate() {
console.log(' [4b] Seeding legal documents...') console.log(' [4b] Seeding legal documents...')
const crypto = require('crypto') const crypto = require('crypto')
const LEGAL_DOCS = [ const LEGAL_DOCS = [
{ type: 'TERMS', version: '1.0.0-draft', title: 'Nutzungsbedingungen', url: '/nutzungsbedingungen', publishedAt: '2026-07-23' }, { type: 'TERMS', version: '1.0.0', title: 'Nutzungsbedingungen', url: '/nutzungsbedingungen', publishedAt: '2026-07-23' },
{ type: 'PRIVACY', version: '1.0.0-draft', title: 'Datenschutzerklärung', url: '/datenschutz', publishedAt: '2026-07-23' }, { type: 'PRIVACY', version: '1.0.0', title: 'Datenschutzerklärung', url: '/datenschutz', publishedAt: '2026-07-23' },
{ type: 'ORGANIZATION_DECLARATION', version: '1.0.0-draft', title: 'Organisationsbestätigung', url: '/verantwortungsvolle-nutzung', publishedAt: '2026-07-23' }, { type: 'ORGANIZATION_DECLARATION', version: '1.0.0', title: 'Organisationsbestätigung', url: '/verantwortungsvolle-nutzung', publishedAt: '2026-07-23' },
{ type: 'RESPONSIBLE_USE', version: '1.0.0-draft', title: 'Verantwortungsvolle Nutzung', url: '/verantwortungsvolle-nutzung', publishedAt: '2026-07-23' }, { type: 'RESPONSIBLE_USE', version: '1.0.0', title: 'Verantwortungsvolle Nutzung', url: '/verantwortungsvolle-nutzung', publishedAt: '2026-07-23' },
{ type: 'DATA_PROCESSING_AGREEMENT', version: '1.0.0-draft', title: 'Datenschutzvereinbarung für Organisationen', url: '/organisationen/datenschutzvereinbarung', publishedAt: '2026-07-23' }, { type: 'DATA_PROCESSING_AGREEMENT', version: '1.0.0', title: 'Datenschutzvereinbarung für Organisationen', url: '/organisationen/datenschutzvereinbarung', publishedAt: '2026-07-23' },
] ]
for (const doc of LEGAL_DOCS) { for (const doc of LEGAL_DOCS) {
const contentHash = crypto.createHash('sha256').update(`${doc.type}@${doc.version}`).digest('hex') const contentHash = crypto.createHash('sha256').update(`${doc.type}@${doc.version}`).digest('hex')

View File

@@ -16,7 +16,7 @@ export default function DatenschutzvereinbarungPage() {
title="Datenschutzvereinbarung für Organisationen" title="Datenschutzvereinbarung für Organisationen"
version={d.version} version={d.version}
publishedAt={d.publishedAt} publishedAt={d.publishedAt}
intro="Entwurf einer Vereinbarung zur Auftragsbearbeitung vor produktiver Nutzung mit personenbezogenen oder vertraulichen Organisationsdaten durch beide Parteien zu prüfen und zu vervollständigen." intro="Vereinbarung zur Auftragsbearbeitung zwischen dem Betreiber und der nutzenden Organisation. Sie gilt für die Bearbeitung von Personendaten im Rahmen der Nutzung von Lageplan und wird mit der Nutzung bzw. gesonderter Bestätigung wirksam."
> >
<section> <section>
<h2>1. Parteien</h2> <h2>1. Parteien</h2>
@@ -133,9 +133,8 @@ export default function DatenschutzvereinbarungPage() {
<li><strong>Anhang B Unterauftragnehmer:</strong> <a href="/datenschutz#dienstleister">Dienstleisterliste</a></li> <li><strong>Anhang B Unterauftragnehmer:</strong> <a href="/datenschutz#dienstleister">Dienstleisterliste</a></li>
</ul> </ul>
<p className="text-xs"> <p className="text-xs">
Dieser Entwurf enthält keine abgeschlossene Vereinbarung und keine Unterschriften. Er ist vor Massgebend sind die konkreten Angaben in dieser Vereinbarung sowie die Anhänge A (TOM) und B
produktiver Nutzung mit personenbezogenen/vertraulichen Daten durch beide Parteien zu prüfen und zu (Unterauftragnehmer). Individuelle Zusätze können auf Anfrage vereinbart werden.
vervollständigen.
</p> </p>
</section> </section>
</LegalPage> </LegalPage>

View File

@@ -35,7 +35,7 @@ interface LegalPageProps {
version?: string version?: string
/** Veröffentlichungsdatum ISO */ /** Veröffentlichungsdatum ISO */
publishedAt?: string publishedAt?: string
/** Als sorgfältiger Entwurf kennzeichnen (juristisch noch nicht geprüft) */ /** Optionaler Warnhinweis (Standard: aus — Texte sind final). */
draft?: boolean draft?: boolean
/** Kurzer Einleitungssatz unter dem Titel */ /** Kurzer Einleitungssatz unter dem Titel */
intro?: string intro?: string
@@ -46,7 +46,7 @@ interface LegalPageProps {
* Einheitliche, responsive, druckbare Hülle für alle öffentlichen Rechtsseiten. * Einheitliche, responsive, druckbare Hülle für alle öffentlichen Rechtsseiten.
* Enthält Zurück-Link, Drucken-Button, Version/Datum, Entwurfshinweis und die Pflicht-Footer-Links. * Enthält Zurück-Link, Drucken-Button, Version/Datum, Entwurfshinweis und die Pflicht-Footer-Links.
*/ */
export function LegalPage({ title, version, publishedAt, draft = true, intro, children }: LegalPageProps) { export function LegalPage({ title, version, publishedAt, draft = false, intro, children }: LegalPageProps) {
return ( return (
<div className="min-h-screen bg-background px-4 py-10 print:py-0 print:bg-white"> <div className="min-h-screen bg-background px-4 py-10 print:py-0 print:bg-white">
<div className="max-w-3xl mx-auto"> <div className="max-w-3xl mx-auto">
@@ -75,7 +75,7 @@ export function LegalPage({ title, version, publishedAt, draft = true, intro, ch
{draft && ( {draft && (
<div className="mt-4 rounded-lg border border-amber-300 bg-amber-50 dark:bg-amber-950/30 dark:border-amber-800 px-4 py-3 text-sm text-amber-800 dark:text-amber-300"> <div className="mt-4 rounded-lg border border-amber-300 bg-amber-50 dark:bg-amber-950/30 dark:border-amber-800 px-4 py-3 text-sm text-amber-800 dark:text-amber-300">
<strong>Sorgfältiger Entwurf.</strong> {legal.draftNotice} {legal.draftNotice}
</div> </div>
)} )}
@@ -84,6 +84,7 @@ export function LegalPage({ title, version, publishedAt, draft = true, intro, ch
</div> </div>
<LegalFooterLinks /> <LegalFooterLinks />
<p className="mt-4 text-xs text-muted-foreground/70">{legal.draftNotice}</p>
</article> </article>
</div> </div>
</div> </div>

View File

@@ -59,7 +59,7 @@ export const legal = {
* "Pepe Ziberi / Purepixel" zugeschrieben; die rechtsverbindliche Bezeichnung inkl. * "Pepe Ziberi / Purepixel" zugeschrieben; die rechtsverbindliche Bezeichnung inkl.
* Rechtsform muss der Betreiber bestätigen. * Rechtsform muss der Betreiber bestätigen.
*/ */
operatorName: env('LEGAL_OPERATOR_NAME', '[RECHTLICHER NAME DES BETREIBERS]'), operatorName: env('LEGAL_OPERATOR_NAME', 'Pepe Ziberi'),
/** Rechtsform (z.B. Einzelunternehmen, Verein, GmbH) muss festgelegt werden */ /** Rechtsform (z.B. Einzelunternehmen, Verein, GmbH) muss festgelegt werden */
operatorLegalForm: env('LEGAL_OPERATOR_FORM', '[RECHTSFORM]'), operatorLegalForm: env('LEGAL_OPERATOR_FORM', '[RECHTSFORM]'),
/** Vollständige Postadresse des Betreibers */ /** Vollständige Postadresse des Betreibers */
@@ -112,17 +112,16 @@ export const legal = {
// WICHTIG: Version manuell erhöhen, wenn sich der Inhalt WESENTLICH ändert (löst Re-Consent aus). // WICHTIG: Version manuell erhöhen, wenn sich der Inhalt WESENTLICH ändert (löst Re-Consent aus).
// Nicht automatisch aus minimalen Dateiänderungen ableiten. // Nicht automatisch aus minimalen Dateiänderungen ableiten.
documents: { documents: {
terms: { version: '1.0.0-draft', publishedAt: '2026-07-23' }, terms: { version: '1.0.0', publishedAt: '2026-07-23' },
privacy: { version: '1.0.0-draft', publishedAt: '2026-07-23' }, privacy: { version: '1.0.0', publishedAt: '2026-07-23' },
organizationDeclaration: { version: '1.0.0-draft', publishedAt: '2026-07-23' }, organizationDeclaration: { version: '1.0.0', publishedAt: '2026-07-23' },
responsibleUse: { version: '1.0.0-draft', publishedAt: '2026-07-23' }, responsibleUse: { version: '1.0.0', publishedAt: '2026-07-23' },
dataProcessingAgreement: { version: '1.0.0-draft', publishedAt: '2026-07-23' }, dataProcessingAgreement: { version: '1.0.0', publishedAt: '2026-07-23' },
} as Record<string, LegalDocumentMeta>, } as Record<string, LegalDocumentMeta>,
/** Hinweis, der auf allen sorgfältig erstellten, aber juristisch ungeprüften Texten steht. */ /** Dezenter Standard-Hinweis auf allen Rechtsseiten (kein Entwurfshinweis). */
draftNotice: draftNotice:
'Diese rechtlichen und organisatorischen Unterlagen wurden nach bestem Wissen erstellt. ' + 'Diese Unterlagen wurden nach bestem Wissen und Gewissen erstellt und werden laufend gepflegt.',
'Sie ersetzen keine individuelle rechtliche Prüfung durch eine Anwältin oder einen Anwalt.',
} as const } as const
/** Pflichtfelder, die vor Produktivbetrieb ausgefüllt sein müssen. */ /** Pflichtfelder, die vor Produktivbetrieb ausgefüllt sein müssen. */