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:
@@ -122,6 +122,24 @@ if($hasAccess){
|
||||
} else {
|
||||
$fehler = implode(' ', $ergebnis['errors']);
|
||||
}
|
||||
} elseif ($aktion === 'anonymisieren') {
|
||||
$participantId = (int)$_POST["mitgliedID"];
|
||||
$mitgliedRolle = null;
|
||||
foreach (ledger_fetch_participants_for_admin($pdo, $tenantId) as $m) {
|
||||
if ($m['participant_id'] === $participantId) {
|
||||
$mitgliedRolle = $m['role'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ($mitgliedRolle === 'owner') {
|
||||
$fehler = 'Der Inhaber kann nicht anonymisiert werden.';
|
||||
} elseif (ledger_anonymize_participant($pdo, $tenantId, $participantId)) {
|
||||
app_audit_log($pdo, $tenantId, $actorUserId, 'participant.anonymized', 'participant', $participantId);
|
||||
$meldung = 'Mitglied wurde anonymisiert. Name und E-Mail sind entfernt, Buchungen bleiben für die Kassenführung erhalten.';
|
||||
} else {
|
||||
$fehler = 'Das Mitglied konnte nicht anonymisiert werden.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,6 +310,16 @@ if($hasAccess){
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
<?php if ($mitglied['role'] !== 'owner'): ?>
|
||||
<li>
|
||||
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" onsubmit="return confirm('Name und E-Mail dieses Mitglieds unwiderruflich entfernen? Buchungen bleiben erhalten.');">
|
||||
<input type="hidden" name="aktion" value="anonymisieren">
|
||||
<input type="hidden" name="mitgliedID" value="<?php echo $mitglied['participant_id']; ?>">
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<button type="submit">Anonymisieren</button>
|
||||
</form>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user