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:
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/functions.php';
|
||||
require_once __DIR__ . '/app/ledger.php';
|
||||
|
||||
$pdo = app_db_pdo();
|
||||
$user = saas_require_login();
|
||||
|
||||
if (!saas_user_has_role('owner', $user)) {
|
||||
http_response_code(403);
|
||||
exit('Nur der Inhaber kann den Mandanten löschen.');
|
||||
}
|
||||
|
||||
$tenantId = (int)$user['tenant_id'];
|
||||
$isDefaultTenant = ledger_is_default_tenant($pdo, $tenantId);
|
||||
$errors = [];
|
||||
$confirmInput = '';
|
||||
|
||||
if (!$isDefaultTenant && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
app_require_csrf();
|
||||
$confirmInput = trim((string)($_POST['confirm_slug'] ?? ''));
|
||||
|
||||
if ($confirmInput !== $user['tenant_slug']) {
|
||||
$errors[] = 'Bitte das Kundenkürzel exakt eingeben, um die Löschung zu bestätigen.';
|
||||
} else {
|
||||
// Loeschen der tenants-Zeile kaskadiert per FK auf alles
|
||||
// tenant-scoped (participants, ledger_entries, notices,
|
||||
// tenant_memberships, audit_log, outbound_emails,
|
||||
// payment_import_batches/rows, tenant_settings). users bleiben
|
||||
// erhalten, da ein Login-Konto zu mehreren Mandanten gehoeren kann.
|
||||
$pdo->prepare('DELETE FROM tenants WHERE id = ?')->execute([$tenantId]);
|
||||
saas_logout();
|
||||
header('Location: landing.php?tenant_deleted=1');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
include 'header.php';
|
||||
include 'headerline.php';
|
||||
include 'nav.php';
|
||||
?>
|
||||
|
||||
<section id="banner">
|
||||
<div class="content">
|
||||
<h2>Mandant löschen</h2>
|
||||
|
||||
<?php if ($isDefaultTenant): ?>
|
||||
<div class="hint-box error">
|
||||
<p>Dieser Mandant ist der migrierte Bestandsmandant und kann hier nicht
|
||||
selbstständig gelöscht werden. Bitte wende dich für diesen Fall an den
|
||||
Betreiber.</p>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="hint-box error">
|
||||
<p><b>Diese Aktion kann nicht rückgängig gemacht werden.</b> Alle Daten von
|
||||
„<?php echo saas_html($user['tenant_name']); ?>" werden unwiderruflich gelöscht:
|
||||
Mitglieder, alle Buchungen, Hinweise, Importe, Mail-Log und das
|
||||
Admin-Protokoll. Ziehe vorher gegebenenfalls einen
|
||||
<a href="datenexport.php">Datenexport</a>.</p>
|
||||
</div>
|
||||
|
||||
<?php if ($errors !== []): ?>
|
||||
<div class="hint-box error">
|
||||
<?php foreach ($errors as $error): ?>
|
||||
<p><?php echo saas_html($error); ?></p>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form method="post" action="mandant-loeschen.php">
|
||||
<?php echo app_csrf_field(); ?>
|
||||
<label for="confirm_slug">Zum Bestätigen das Kundenkürzel eingeben: <b><?php echo saas_html($user['tenant_slug']); ?></b></label>
|
||||
<input type="text" name="confirm_slug" id="confirm_slug" value="<?php echo saas_html($confirmInput); ?>" required>
|
||||
<ul class="actions">
|
||||
<li><button type="submit">Mandant endgültig löschen</button></li>
|
||||
<li><a href="konto.php" class="button alt">Abbrechen</a></li>
|
||||
</ul>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<?php include 'footer.php'; ?>
|
||||
Reference in New Issue
Block a user