M5: Mitgliederverwaltung tenant- und rollenbasiert umstellen

- mitarbeiterverwalten.php war rein ueber Legacy-Admin gesperrt und haette
  neue SaaS-Mandanten ausgeschlossen; jetzt Rollen-/Legacy-Fallback wie in
  kaffeeliste.php (owner/admin).
- Anlegen/Bearbeiten/Aktivieren/Deaktivieren spiegeln transaktional nach
  participants (ledger_mirror_legacy_participant neu ergaenzt), damit
  Ledger-Ansichten sofort den aktuellen Mitgliederstand zeigen.
- Gespeicherte XSS-Luecke behoben: Name/E-Mail waren in Formular und Liste
  ungeschuetzt ausgegeben, jetzt ueber saas_html().
- Admin-Rollenvergabe bleibt bewusst Legacy-only (kein automatischer
  Login-Account ohne Einladungsflow); dokumentiert als offener Punkt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 23:49:33 +02:00
co-authored by Claude Sonnet 5
parent 968a55f442
commit de3dcee7ec
3 changed files with 138 additions and 41 deletions
+30
View File
@@ -319,6 +319,36 @@ function ledger_mirror_legacy_consumption(PDO $pdo, int $tenantId, int $legacyCo
}
}
/**
* Mirrors a single kl_Mitarbeiter row into participants, so member changes
* made through the legacy admin UI are immediately visible to ledger-backed
* reads instead of waiting for the next scripts/backfill-default-tenant.php run.
*/
function ledger_mirror_legacy_participant(PDO $pdo, int $tenantId, int $legacyMitarbeiterId): void
{
$stmt = $pdo->prepare(
"INSERT INTO participants
(tenant_id, display_name, email, email_norm, paypal_name, active, legacy_mitarbeiter_id)
SELECT
?,
NULLIF(TRIM(m.Name), ''),
NULLIF(TRIM(m.Email), ''),
NULLIF(LOWER(TRIM(m.Email)), ''),
NULLIF(TRIM(m.paypalname), ''),
m.aktiv,
m.MitarbeiterID
FROM kl_Mitarbeiter m
WHERE m.MitarbeiterID = ?
ON DUPLICATE KEY UPDATE
display_name = COALESCE(VALUES(display_name), participants.display_name),
email = VALUES(email),
email_norm = VALUES(email_norm),
paypal_name = VALUES(paypal_name),
active = VALUES(active)"
);
$stmt->execute([$tenantId, $legacyMitarbeiterId]);
}
function ledger_mirror_legacy_payment(PDO $pdo, int $tenantId, int $legacyPaymentId): void
{
$stmt = $pdo->prepare(