- 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>
302 lines
9.0 KiB
PHP
302 lines
9.0 KiB
PHP
<?php
|
|
|
|
|
|
include "functions.php";
|
|
require_once __DIR__ . "/app/ledger.php";
|
|
app_require_csrf();
|
|
include "header.php";
|
|
include "headerline.php";
|
|
include "nav.php";
|
|
|
|
|
|
?>
|
|
|
|
<!-- Banner -->
|
|
<section id="banner">
|
|
<div class="content">
|
|
|
|
|
|
<?php
|
|
|
|
$pdo = app_db_pdo();
|
|
$saasUser = saas_current_user($pdo);
|
|
$tenantId = 0;
|
|
$hasAccess = false;
|
|
|
|
if ($saasUser !== null && saas_user_has_role(['owner', 'admin'], $saasUser)) {
|
|
$tenantId = (int)$saasUser['tenant_id'];
|
|
$hasAccess = true;
|
|
}
|
|
|
|
if (!$hasAccess && $saasUser === null && checkKaffeelisteAdmin($conn, $mailadress)) {
|
|
$tenant = ledger_fetch_default_tenant($pdo);
|
|
if ($tenant !== null) {
|
|
$tenantId = (int)$tenant['id'];
|
|
$hasAccess = true;
|
|
}
|
|
}
|
|
|
|
if($hasAccess){
|
|
|
|
|
|
// Funktion zum Anlegen, Bearbeiten und Deaktivieren von Mitgliedern. Der
|
|
// gespiegelte participants-Datensatz wird in derselben Transaktion
|
|
// nachgezogen, damit Ledger-Ansichten sofort den neuen Stand zeigen.
|
|
function bearbeiteMitglied($aktion, $mitgliedID, $name, $email, $paypalname, $aktiv, $admin, PDO $pdo, int $tenantId) {
|
|
try {
|
|
if ($aktion === 'anlegen') {
|
|
$sql = "INSERT INTO kl_Mitarbeiter (Name, Email, paypalname, aktiv, admin) VALUES (?, ?, ?, ?, ?)";
|
|
$params = array($name, $email, $paypalname, $aktiv, $admin);
|
|
} elseif ($aktion === 'bearbeitenspeichern') {
|
|
$sql = "UPDATE kl_Mitarbeiter SET Name = ?, Email = ?, paypalname = ?, aktiv = ?, admin = ? WHERE MitarbeiterID = ?";
|
|
$params = array($name, $email, $paypalname, $aktiv, $admin, $mitgliedID);
|
|
} elseif ($aktion === 'aktivieren') {
|
|
$sql = "UPDATE kl_Mitarbeiter SET aktiv = 1 WHERE MitarbeiterID = ?";
|
|
$params = array($mitgliedID);
|
|
} elseif ($aktion === 'deaktivieren') {
|
|
$sql = "UPDATE kl_Mitarbeiter SET aktiv = 0 WHERE MitarbeiterID = ?";
|
|
$params = array($mitgliedID);
|
|
} else {
|
|
throw new Exception("Ungültige Aktion.");
|
|
}
|
|
|
|
$pdo->beginTransaction();
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
|
|
$legacyMitarbeiterId = $aktion === 'anlegen' ? (int)$pdo->lastInsertId() : (int)$mitgliedID;
|
|
ledger_mirror_legacy_participant($pdo, $tenantId, $legacyMitarbeiterId);
|
|
|
|
$pdo->commit();
|
|
|
|
return true; // Erfolgreich
|
|
} catch (Throwable $e) {
|
|
if ($pdo->inTransaction()) {
|
|
$pdo->rollBack();
|
|
}
|
|
|
|
return 'Die Aktion konnte nicht gespeichert werden.';
|
|
}
|
|
}?>
|
|
|
|
<!-- Formular für das Bearbeiten von Mitgliedern -->
|
|
<?php
|
|
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["aktion"] === 'bearbeiten') {
|
|
$mitgliedID = (int)$_POST["mitgliedID"];
|
|
|
|
// Informationen des ausgewählten Mitglieds abrufen
|
|
$stmtEinzelmitglied = $pdo->prepare("SELECT * FROM kl_Mitarbeiter WHERE MitarbeiterID = ?");
|
|
$stmtEinzelmitglied->execute([$mitgliedID]);
|
|
$einzelmitglied = $stmtEinzelmitglied->fetch();
|
|
?>
|
|
<h3>Bearbeiten von <?php echo saas_html($einzelmitglied['Name']); ?></h3>
|
|
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
|
|
<input type="hidden" name="aktion" value="bearbeitenspeichern">
|
|
<input type="hidden" name="mitgliedID" value="<?php echo $mitgliedID; ?>">
|
|
<?php echo app_csrf_field(); ?>
|
|
|
|
<label for="name">Name:</label>
|
|
<input type="text" name="name" id="name" value="<?php echo saas_html($einzelmitglied['Name']); ?>" required>
|
|
|
|
<label for="email">E-Mail:</label>
|
|
<input type="email" name="email" id="email" value="<?php echo saas_html($einzelmitglied['Email']); ?>" required>
|
|
|
|
<label for="paypalname">PayPal-Name:</label>
|
|
<input type="text" name="paypalname" id="paypalname" value="<?php echo htmlspecialchars($einzelmitglied['paypalname'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
|
|
<br>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="aktiv" id="aktiv" <?php echo $einzelmitglied['aktiv'] ? 'checked' : ''; ?>>
|
|
<label class="form-check-label" for="aktiv">Aktiv:</label>
|
|
|
|
</div>
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="checkbox" name="admin" id="admin" <?php echo $einzelmitglied['admin'] ? 'checked' : ''; ?>>
|
|
<label class="form-check-label" for="admin">Administrator:</label>
|
|
|
|
</div>
|
|
<button type="submit">Speichern</button>
|
|
</form>
|
|
<?php
|
|
}
|
|
|
|
// Verarbeitung des Formulars, wenn es gesendet wurde
|
|
elseif ($_SERVER["REQUEST_METHOD"] == "POST") {
|
|
$aktion = $_POST["aktion"];
|
|
|
|
if ($aktion === 'anlegen' || $aktion === 'bearbeitenspeichern') {
|
|
$mitgliedID = isset($_POST["mitgliedID"]) ? (int)$_POST["mitgliedID"] : null;
|
|
$name = $_POST["name"];
|
|
$email = $_POST["email"];
|
|
$paypalname = trim($_POST["paypalname"] ?? '');
|
|
$paypalname = $paypalname !== '' ? $paypalname : null;
|
|
$aktiv = isset($_POST["aktiv"]) ? 1 : 0;
|
|
$admin = isset($_POST["admin"]) ? 1 : 0;
|
|
|
|
$ergebnis = bearbeiteMitglied($aktion, $mitgliedID, $name, $email, $paypalname, $aktiv, $admin, $pdo, $tenantId);
|
|
|
|
if ($ergebnis === true) {
|
|
echo "Aktion erfolgreich durchgeführt.";
|
|
} else {
|
|
echo "Fehler: $ergebnis";
|
|
}
|
|
} elseif ($aktion === 'aktivieren') {
|
|
$mitgliedID = (int)$_POST["mitgliedID"];
|
|
|
|
$ergebnis = bearbeiteMitglied('aktivieren', $mitgliedID, null, null, null, null, null, $pdo, $tenantId);
|
|
|
|
if ($ergebnis === true) {
|
|
echo "Mitglied erfolgreich aktiviert.";
|
|
} else {
|
|
echo "Fehler: $ergebnis";
|
|
}
|
|
} elseif ($aktion === 'deaktivieren') {
|
|
$mitgliedID = (int)$_POST["mitgliedID"];
|
|
|
|
$ergebnis = bearbeiteMitglied('deaktivieren', $mitgliedID, null, null, null, null, null, $pdo, $tenantId);
|
|
|
|
if ($ergebnis === true) {
|
|
echo "Mitglied erfolgreich deaktiviert.";
|
|
} else {
|
|
echo "Fehler: $ergebnis";
|
|
}
|
|
}
|
|
}else{
|
|
|
|
|
|
// Mitglieder aus der Datenbank abrufen
|
|
$stmtMitglieder = $pdo->query("SELECT MitarbeiterID, Name, Email, paypalname, aktiv, admin FROM kl_Mitarbeiter ORDER BY Name");
|
|
?>
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Kaffeeliste - Mitglieder verwalten</title>
|
|
</head>
|
|
<body>
|
|
|
|
<h2>Mitglieder verwalten</h2>
|
|
|
|
<!-- Formular für das Anlegen und Bearbeiten von Mitgliedern -->
|
|
<form method="post" action="<?php # echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
|
|
<input type="hidden" name="aktion" id="aktion" value="anlegen">
|
|
<?php echo app_csrf_field(); ?>
|
|
|
|
<label for="name">Name:</label>
|
|
<input type="text" name="name" id="name" required>
|
|
|
|
<label for="email">E-Mail:</label>
|
|
<input type="email" name="email" id="email" required>
|
|
|
|
<label for="paypalname">PayPal-Name:</label>
|
|
<input type="text" name="paypalname" id="paypalname">
|
|
<br>
|
|
<div class="form-check">
|
|
|
|
<input class="form-check-input" type="checkbox" name="aktiv" id="aktiv" checked>
|
|
<label class="form-check-label" for="aktiv">Aktiv</label>
|
|
</div>
|
|
<div class="form-check">
|
|
|
|
<input class="form-check-input" type="checkbox" name="admin" id="admin" >
|
|
<label class="form-check-label" for="admin">Administrator</label>
|
|
</div>
|
|
<button type="submit">Mitglied anlegen</button>
|
|
</form>
|
|
|
|
|
|
<!-- Tabelle zur Anzeige und Bearbeitung von Mitgliedern -->
|
|
<table class="table table-striped">
|
|
<tr>
|
|
<th>Mitglied ID</th>
|
|
<th>Name</th>
|
|
<th>E-Mail</th>
|
|
<th>PayPal-Name</th>
|
|
<th>Aktiv</th>
|
|
<th>Administrator</th>
|
|
<th>Aktionen</th>
|
|
</tr>
|
|
<?php
|
|
|
|
while ($row = $stmtMitglieder->fetch()) {
|
|
$mitgliedIdRow = (int)$row['MitarbeiterID'];
|
|
|
|
echo '<tr >';
|
|
echo "<td>{$mitgliedIdRow}</td>";
|
|
echo "<td>" . saas_html($row['Name']) . "</td>";
|
|
echo "<td>" . saas_html($row['Email']) . "</td>";
|
|
echo "<td>" . saas_html($row['paypalname'] ?? '') . "</td>";
|
|
echo "<td>{$row['aktiv']}</td>";
|
|
echo "<td>{$row['admin']}</td>";
|
|
echo "<td>";
|
|
echo '<ul class="actions">
|
|
<li>';
|
|
|
|
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
|
echo "<input type='hidden' name='aktion' value='bearbeiten'>";
|
|
echo "<input type='hidden' name='mitgliedID' value='{$row['MitarbeiterID']}'>";
|
|
echo app_csrf_field();
|
|
echo "<button type='submit'>Bearbeiten</button>";
|
|
echo "</form></li><li>";
|
|
|
|
|
|
if ($row['aktiv'] == 1) {
|
|
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
|
echo "<input type='hidden' name='aktion' value='deaktivieren'>";
|
|
echo "<input type='hidden' name='mitgliedID' value='{$row['MitarbeiterID']}'>";
|
|
echo app_csrf_field();
|
|
echo "<button type='submit'>Deaktivieren</button>";
|
|
echo "</form>";
|
|
} else {
|
|
echo "<form method='post' action='{$_SERVER["PHP_SELF"]}'>";
|
|
echo "<input type='hidden' name='aktion' value='aktivieren'>";
|
|
echo "<input type='hidden' name='mitgliedID' value='{$row['MitarbeiterID']}'>";
|
|
echo app_csrf_field();
|
|
echo "<button type='submit'>Aktivieren</button>";
|
|
echo "</form>";
|
|
}
|
|
echo "</li></ul></td>";
|
|
echo "</tr>";
|
|
|
|
}
|
|
?>
|
|
</table>
|
|
|
|
|
|
|
|
|
|
<?php
|
|
}
|
|
?>
|
|
|
|
</body>
|
|
</html>
|
|
|
|
|
|
<?php
|
|
|
|
}else{
|
|
echo "<h2>Sie haben keine Zugang zu dieser Webseite</h2>";
|
|
}
|
|
## Auskommentierung
|
|
##<link rel="stylesheet" href="/DataTables/datatables.css" />
|
|
|
|
?>
|
|
|
|
</div>
|
|
</section>
|
|
|
|
|
|
<script src="/DataTables/datatables.js"></script>
|
|
|
|
|
|
<script>
|
|
$(document).ready( function () {
|
|
$('#myTable').DataTable();
|
|
} );
|
|
</script>
|
|
|
|
<?php include "footer.php"; ?>
|