$name, 'email' => $email]); $meldung = 'Mitglied wurde angelegt.'; } catch (Throwable $e) { $fehler = 'Das Mitglied konnte nicht angelegt werden (E-Mail eventuell schon vergeben).'; } } } elseif ($aktion === 'bearbeitenspeichern') { $participantId = (int)$_POST["mitgliedID"]; $name = trim((string)($_POST["name"] ?? '')); $email = trim((string)($_POST["email"] ?? '')); $paypalname = trim((string)($_POST["paypalname"] ?? '')); $aktiv = isset($_POST["aktiv"]); $warAktiv = false; foreach (ledger_fetch_participants_for_admin($pdo, $tenantId) as $m) { if ($m['participant_id'] === $participantId) { $warAktiv = (bool)$m['active']; break; } } if ($name === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) { $fehler = 'Bitte einen Namen und eine gültige E-Mail-Adresse angeben.'; } elseif ($aktiv && !$warAktiv && !billing_has_capacity_for($pdo, $tenantId)) { $fehler = billing_capacity_error_message($pdo, $tenantId); } elseif (ledger_update_participant($pdo, $tenantId, $participantId, $name, $email, $paypalname, $aktiv)) { app_audit_log($pdo, $tenantId, $actorUserId, 'participant.updated', 'participant', $participantId, ['name' => $name, 'email' => $email]); $meldung = 'Mitglied wurde gespeichert.'; } else { $fehler = 'Das Mitglied konnte nicht gespeichert werden.'; } } elseif ($aktion === 'aktivieren' || $aktion === 'deaktivieren') { $participantId = (int)$_POST["mitgliedID"]; if ($aktion === 'aktivieren' && !billing_has_capacity_for($pdo, $tenantId)) { $fehler = billing_capacity_error_message($pdo, $tenantId); } elseif (ledger_set_participant_active($pdo, $tenantId, $participantId, $aktion === 'aktivieren')) { app_audit_log($pdo, $tenantId, $actorUserId, $aktion === 'aktivieren' ? 'participant.activated' : 'participant.deactivated', 'participant', $participantId); $meldung = $aktion === 'aktivieren' ? 'Mitglied wurde aktiviert.' : 'Mitglied wurde deaktiviert.'; } else { $fehler = 'Der Status konnte nicht geändert werden.'; } } elseif ($aktion === 'zugang_gewaehren') { $participantId = (int)$_POST["mitgliedID"]; $rolle = (string)($_POST["rolle"] ?? ''); $ergebnis = saas_grant_participant_access($pdo, $tenantId, $participantId, $rolle); if ($ergebnis['ok']) { $einladendeTenantSettings = saas_fetch_tenant_settings($pdo, $tenantId); $mailErgebnis = saas_send_invite_mail( $ergebnis['user_email'], $einladendeTenantSettings['name'] ?? 'Kaffeeliste', $rolle, $ergebnis['token'] ); app_audit_log($pdo, $tenantId, $actorUserId, 'participant.access_granted', 'participant', $participantId, ['role' => $rolle]); $meldung = 'Zugang wurde gewährt, Einladung wurde verschickt.'; if (saas_should_show_auth_links()) { $einladungslink = saas_app_url('passwort-zuruecksetzen.php?token=' . urlencode($ergebnis['token'])); } } else { $fehler = implode(' ', $ergebnis['errors']); } } elseif ($aktion === 'zugang_entziehen') { $participantId = (int)$_POST["mitgliedID"]; $ergebnis = saas_revoke_participant_access($pdo, $tenantId, $participantId); if ($ergebnis['ok']) { app_audit_log($pdo, $tenantId, $actorUserId, 'participant.access_revoked', 'participant', $participantId); $meldung = 'Zugang wurde entzogen.'; } 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.'; } } elseif ($aktion === 'csv_import') { $file = $_FILES['mitglieder_csv'] ?? null; if ($file === null || ($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) { $fehler = 'Bitte eine CSV-Datei auswählen.'; } elseif (($file['size'] ?? 0) <= 0 || $file['size'] > 2 * 1024 * 1024) { $fehler = 'Die CSV-Datei ist leer oder größer als 2 MB.'; } elseif (strtolower(pathinfo((string)$file['name'], PATHINFO_EXTENSION)) !== 'csv') { $fehler = 'Es sind nur CSV-Dateien erlaubt.'; } elseif (!is_uploaded_file((string)$file['tmp_name'])) { $fehler = 'Die hochgeladene Datei konnte nicht verifiziert werden.'; } else { try { $zeilen = imports_parse_member_csv((string)$file['tmp_name']); $angelegt = 0; $uebersprungen = 0; $inaktivWegenKapazitaet = 0; $fehlerhaft = 0; foreach ($zeilen as $z) { if ($z['name'] === '' || !filter_var($z['email'], FILTER_VALIDATE_EMAIL)) { $fehlerhaft++; continue; } $aktiv = $z['active']; if ($aktiv && !billing_has_capacity_for($pdo, $tenantId)) { $aktiv = false; $inaktivWegenKapazitaet++; } try { $neueId = ledger_create_participant($pdo, $tenantId, $z['name'], $z['email'], $z['paypal_name'] !== '' ? $z['paypal_name'] : null, $aktiv); app_audit_log($pdo, $tenantId, $actorUserId, 'participant.created', 'participant', $neueId, ['name' => $z['name'], 'email' => $z['email'], 'quelle' => 'csv_import']); $angelegt++; } catch (Throwable $e) { $uebersprungen++; } } $teile = ["{$angelegt} angelegt"]; if ($uebersprungen > 0) { $teile[] = "{$uebersprungen} übersprungen (bereits vorhanden)"; } if ($inaktivWegenKapazitaet > 0) { $teile[] = "{$inaktivWegenKapazitaet} als inaktiv angelegt (Tarif-Kapazität erschöpft)"; } if ($fehlerhaft > 0) { $teile[] = "{$fehlerhaft} fehlerhaft (Name/E-Mail ungültig)"; } $meldung = 'CSV-Import: ' . implode(', ', $teile) . '.'; } catch (Throwable $e) { $fehler = 'Die CSV-Datei konnte nicht verarbeitet werden.'; } } } } $mitglieder = ledger_fetch_participants_for_admin($pdo, $tenantId); $billingInfo = billing_fetch_or_init($pdo, $tenantId); $billingPlan = billing_plans()[$billingInfo['plan_code']] ?? null; $aktiveMitgliederAnzahl = billing_count_active_participants($pdo, $tenantId); $rollenLabels = ['owner' => 'Inhaber', 'admin' => 'Administrator', 'treasurer' => 'Kassenwart', 'member' => 'Mitglied', 'viewer' => 'Betrachter']; $bearbeitenMitglied = null; if ($bearbeitenId !== null) { foreach ($mitglieder as $m) { if ($m['participant_id'] === $bearbeitenId) { $bearbeitenMitglied = $m; break; } } } ?> Kaffeeliste - Mitglieder verwalten

Mitglieder verwalten

Dev-Link zur Einladung:

Aktive Mitglieder: . = $billingPlan['max_participants']): ?> Limit erreicht – für weitere aktive Mitglieder ist ein Upgrade nötig.

Bearbeiten von

">
>

Neues Mitglied anlegen

">

Mitglieder per CSV importieren

Lade zunächst die Vorlage herunter, trage eure Mitglieder ein (Name, E-Mail, optional PayPal-Name und „ja/nein" für aktiv) und lade die Datei anschließend wieder hoch. Bereits vorhandene E-Mail-Adressen werden übersprungen.

Vorlage herunterladen

" enctype="multipart/form-data">

Name und E-Mail dienen der Kaffeeliste und Benachrichtigungen. Ein Login-Zugang ist davon unabhängig und wird separat je Mitglied gewährt oder entzogen.

Name E-Mail PayPal-Name Aktiv Zugang Aktionen
Inhaber
" style="display:inline">
" style="display:inline">
" style="display:inline">
  • ">
  • ">
    ">
  • " onsubmit="return confirm('Name und E-Mail dieses Mitglieds unwiderruflich entfernen? Buchungen bleiben erhalten.');">
Sie haben keinen Zugang zu dieser Webseite"; } ?>