M8: Loesch-/Anonymisierungsprozess fuer Teilnehmer und Mandanten

Zwei getrennte Flows:

- Teilnehmer anonymisieren statt loeschen (ledger_anonymize_participant):
  Name/E-Mail/PayPal-Name werden durch einen Platzhalter ersetzt, das
  Mitglied deaktiviert und vom Login-Konto getrennt. Buchungshistorie
  bleibt fuer die Kassenfuehrung erhalten, konsistent mit dem
  Storno-statt-Delete-Prinzip. Default-Mandant spiegelt die
  Anonymisierung in kl_Mitarbeiter (Email dort NOT NULL UNIQUE, bekommt
  Platzhalter statt NULL). Inhaber kann nicht anonymisiert werden.
- Mandant vollstaendig loeschen (mandant-loeschen.php, nur Inhaber):
  erfordert exakte Eingabe des Kundenkuerzels, loescht die tenants-Zeile;
  alle tenant-scoped Tabellen kaskadieren per Fremdschluessel. users
  bleiben bestehen (koennen zu mehreren Mandanten gehoeren). Der
  migrierte Default-Mandant ist ausgenommen, da seine kl_Mitarbeiter-
  Historie sonst verwaisen wuerde.

Live getestet: Mitglied mit Buchungshistorie anonymisiert (Historie
blieb erhalten), Mandantenloeschung mit falscher/richtiger Bestaetigung
geprueft, vollstaendiger Cascade-Delete ueber alle tenant-scoped Tabellen
verifiziert, globale users-Zeile bleibt korrekt erhalten.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-15 20:17:57 +02:00
co-authored by Claude Sonnet 5
parent f3045dbab9
commit f60c0bb85e
7 changed files with 218 additions and 3 deletions
+6 -1
View File
@@ -652,7 +652,12 @@ Schritte:
des eigenen Mandanten (Stammdaten, Teilnehmer, Mitglieder/Rollen,
Buchungen, Hinweise, Importe, Mail-Log, Admin-Protokoll) ohne
Passwörter, protokolliert im Audit-Log.
- Lösch-/Anonymisierungsprozess für Teilnehmer und Kunden.
- Lösch-/Anonymisierungsprozess für Teilnehmer und Kunden: erledigt.
Teilnehmer werden anonymisiert statt gelöscht (Buchungshistorie bleibt
für die Kassenführung erhalten), Mandanten können sich über
`mandant-loeschen.php` mit Bestätigungseingabe vollständig selbst
löschen (Cascade über Fremdschlüssel); der migrierte Default-Mandant
ist davon ausgenommen.
- Rate-Limits und Security Headers: erledigt. Globale Security-Headers
über `app/bootstrap.php` (ohne CSP, siehe `docs/m8-haertung.md`),
DB-gestützte Rate-Limits für Login, Registrierung und Passwort-Reset.