Zwei Mehrmandanten-Bugs vor Go-Live behoben

footer.php: Einzahlung/Striche/Mitglieder/Hinweise/Jahresabschluss
waren nur fuer den alten Default-Mandanten-Admin verlinkt, nicht fuer
SaaS-Mandanten-Owner/Admin/Kassenwart - die Seiten selbst erlaubten
Zugriff laengst, waren aber ueber die Navigation nicht erreichbar.

namenanpassen.php: nie auf das neue Mandantenmodell portiert, nutzte
ausschliesslich die globale kl_Mitarbeiter-Tabelle direkt per SQL und
haette fuer jeden Mandanten ausser dem Standard-Mandanten leer
funktioniert. Jetzt ueber participants/saas-Rollen: normale Mitglieder
koennen nur sich selbst umbenennen, Owner/Admin jedes Mitglied des
eigenen Mandanten. Live getestet inkl. Tenant-Isolation (Mitglied kann
nicht den Owner umbenennen).
This commit is contained in:
2026-07-17 11:48:45 +02:00
parent 0416504d6a
commit e40955fffe
2 changed files with 102 additions and 101 deletions
+96 -99
View File
@@ -1,124 +1,121 @@
<?php
include "functions.php";
require_once __DIR__ . "/functions.php";
require_once __DIR__ . "/app/ledger.php";
require_once __DIR__ . "/app/audit.php";
app_require_csrf();
include "header.php";
include "headerline.php";
include "nav.php";
$pdo = app_db_pdo();
$tenantId = 0;
$hasAccess = false;
$isAdmin = false;
$emailNorm = '';
$actorUserId = $saasUser['user_id'] ?? null;
if ($saasUser !== null) {
$tenantId = (int)$saasUser['tenant_id'];
$emailNorm = strtolower(trim((string)$saasUser['email_norm']));
$hasAccess = true;
$isAdmin = saas_user_has_role(['owner', 'admin'], $saasUser);
} elseif (checkKaffeelisteAccess($conn, $mailadress)) {
$tenant = ledger_fetch_default_tenant($pdo);
if ($tenant !== null) {
$tenantId = (int)$tenant['id'];
$hasAccess = true;
$emailNorm = strtolower(trim($mailadress));
$isAdmin = checkKaffeelisteAdmin($conn, $mailadress);
}
}
$meldung = null;
$fehler = null;
?>
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
<br>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Anzeigenamen aktualisieren</title>
</head>
<body>
<h2>Anzeigenamen aktualisieren</h2>
<?php
if(checkKaffeelisteAccess($conn, $mailadress)){
if(checkKaffeelisteAdmin($conn, $mailadress)){
// SQL-Abfrage für alle Mitarbeiter
$sqlMitarbeiter = "SELECT MitarbeiterID, Name FROM kl_Mitarbeiter ORDER BY Name";
$stmtMitarbeiter = sqlsrv_query($conn, $sqlMitarbeiter);
}else{
echo "Hallo " . getUserName($conn,$mailadress) . "!<br><br>Hier kannst du deinen Anzeigenamen anpassen.<br>Dieser wird auf der Kaffeeliste und E-Mail genutzt.<br>";
// SQL-Abfrage für alle Mitarbeiter
$sqlMitarbeiter = "SELECT MitarbeiterID, Name FROM kl_Mitarbeiter WHERE Email ='" . $mailadress . "'";
$stmtMitarbeiter = sqlsrv_query($conn, $sqlMitarbeiter);
<?php if ($hasAccess): ?>
<?php
$mitglieder = ledger_fetch_participants_for_admin($pdo, $tenantId);
$eigenesMitglied = null;
foreach ($mitglieder as $m) {
if ($m['email_norm'] !== null && $m['email_norm'] === $emailNorm) {
$eigenesMitglied = $m;
break;
}
}
// Funktion zum Aktualisieren des Anzeigenamens
function aktualisiereAnzeigenamen($mitarbeiterID, $neuerName, $conn) {
try {
$sql = "UPDATE kl_Mitarbeiter SET Name = ? WHERE MitarbeiterID = ?";
$params = array($neuerName, $mitarbeiterID);
$auswahl = $isAdmin ? $mitglieder : ($eigenesMitglied !== null ? [$eigenesMitglied] : []);
$stmt = sqlsrv_query($conn, $sql, $params);
if ($_SERVER["REQUEST_METHOD"] === "POST" && ($_POST["aktion"] ?? '') === "aktualisieren") {
$participantId = (int)($_POST["mitarbeiterID"] ?? 0);
$neuerName = trim((string)($_POST["neuerName"] ?? ''));
if ($stmt === false) {
throw new Exception(print_r(sqlsrv_errors(), true));
}
$ziel = null;
foreach ($auswahl as $m) {
if ($m['participant_id'] === $participantId) {
$ziel = $m;
break;
}
}
return true; // Erfolgreich aktualisiert
} catch (Exception $e) {
return $e->getMessage(); // Fehlermeldung zurückgeben
}
}
if ($ziel === null) {
$fehler = 'Dieses Mitglied konnte nicht gefunden werden.';
} elseif ($neuerName === '' || strlen($neuerName) > 60) {
$fehler = 'Bitte einen Namen mit maximal 20 Zeichen angeben.';
} elseif (ledger_update_participant($pdo, $tenantId, $participantId, $neuerName, (string)($ziel['email'] ?? ''), $ziel['paypal_name'], $ziel['active'])) {
app_audit_log($pdo, $tenantId, $actorUserId, 'participant.renamed', 'participant', $participantId, ['name' => $neuerName]);
$meldung = 'Anzeigename wurde aktualisiert.';
$mitglieder = ledger_fetch_participants_for_admin($pdo, $tenantId);
$auswahl = $isAdmin ? $mitglieder : array_values(array_filter($mitglieder, fn(array $m): bool => $m['participant_id'] === $participantId));
} else {
$fehler = 'Der Anzeigename konnte nicht aktualisiert werden.';
}
}
?>
// Überprüfen, ob das Formular abgesendet wurde
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["aktion"] == "aktualisieren") {
$mitarbeiterID = $_POST["mitarbeiterID"];
$neuerName = $_POST["neuerName"];
<?php if (!$isAdmin): ?>
<p>Hier kannst du deinen Anzeigenamen anpassen. Dieser wird auf der Kaffeeliste und in E-Mails genutzt.</p>
<?php endif; ?>
$ergebnis = aktualisiereAnzeigenamen($mitarbeiterID, $neuerName, $conn);
<?php if ($meldung !== null): ?>
<div class="hint-box success"><p><?php echo saas_html($meldung); ?></p></div>
<?php endif; ?>
<?php if ($fehler !== null): ?>
<div class="hint-box error"><p><?php echo saas_html($fehler); ?></p></div>
<?php endif; ?>
if ($ergebnis === true) {
echo "Anzeigename erfolgreich aktualisiert.";
} else {
echo "Fehler: $ergebnis";
}
}
<?php if ($auswahl === []): ?>
<p>Für dein Konto wurde kein Mitglied gefunden.</p>
<?php else: ?>
<form method="post" action="namenanpassen.php">
<?php echo app_csrf_field(); ?>
<?php if ($isAdmin): ?>
<label for="mitarbeiterID">Mitglied auswählen:</label><br>
<select name="mitarbeiterID" id="mitarbeiterID">
<?php foreach ($auswahl as $m): ?>
<option value="<?php echo (int)$m['participant_id']; ?>"><?php echo saas_html($m['display_name']); ?></option>
<?php endforeach; ?>
</select>
<?php else: ?>
<input type="hidden" name="mitarbeiterID" value="<?php echo (int)$auswahl[0]['participant_id']; ?>">
<?php endif; ?>
<br>
<label for="neuerName">Neuer Anzeigename: (maximal 20 Zeichen)</label><br>
<input type="text" name="neuerName" id="neuerName" maxlength="20" required>
<br><br>
?>
<input type="hidden" name="aktion" value="aktualisieren">
<button type="submit">Anzeigename aktualisieren</button>
</form>
<?php endif; ?>
<?php else: ?>
<p>Sie haben keinen Zugang zu dieser Webseite.</p>
<?php endif; ?>
<form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
<?php echo app_csrf_field(); ?>
<label for="mitarbeiterID">Mitarbeiter auswählen:</label><br>
<select name="mitarbeiterID" id="mitarbeiterID">
<?php
while ($row = sqlsrv_fetch_array($stmtMitarbeiter, SQLSRV_FETCH_ASSOC)) {
$mitarbeiterID = $row['MitarbeiterID'];
$name = $row['Name'];
echo "<option value='{$mitarbeiterID}'>{$name}</option>";
}
?>
</select>
<br>
<label for="neuerName">Neuer Anzeigename: (maximal 20 Zeichen)</label><br>
<input type="text" name="neuerName" id="neuerName" maxlength="20" required>
<br><br>
<input type="hidden" name="aktion" value="aktualisieren">
<button type="submit">Anzeigename aktualisieren</button>
</form>
</body>
</html>
<?php
}
?>
</div>
</main>
</div>
</div>
</div>
<?php include "footer.php"; ?>