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:
+6
-2
@@ -21,7 +21,7 @@ $saasCanUseLedgerNav = $saasNavUser !== null
|
||||
&& saas_user_has_role(['owner', 'admin', 'treasurer'], $saasNavUser);
|
||||
$legacyCanUseAdminNav = checkKaffeelisteAdmin($conn, $mailadress);
|
||||
|
||||
if($legacyCanUseAdminNav){
|
||||
if($saasCanUseLedgerNav || $legacyCanUseAdminNav){
|
||||
?>
|
||||
|
||||
<li><a href="einzahlung.php">Einzahlung eintragen</a></li>
|
||||
@@ -34,11 +34,15 @@ if($saasCanUseLedgerNav || $legacyCanUseAdminNav){
|
||||
?>
|
||||
<li><a href="kaffeeliste.php">Kaffeeliste anzeigen</a></li>
|
||||
<li><a href="ledger-preview.php">Ledger Preview</a></li>
|
||||
<li><a href="jahresauswertung.php">Jahresabschluss</a></li>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
if($legacyCanUseAdminNav){
|
||||
$saasCanManageMembersNav = $saasNavUser !== null
|
||||
&& function_exists('saas_user_has_role')
|
||||
&& saas_user_has_role(['owner', 'admin'], $saasNavUser);
|
||||
if($saasCanManageMembersNav || $legacyCanUseAdminNav){
|
||||
?>
|
||||
<li><a href="mitarbeiterverwalten.php">Mitglieder verwalten</a></li>
|
||||
<li><a href="hinweise.php">Hinweise verwalten</a></li>
|
||||
|
||||
+95
-98
@@ -1,101 +1,109 @@
|
||||
<?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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Funktion zum Aktualisieren des Anzeigenamens
|
||||
function aktualisiereAnzeigenamen($mitarbeiterID, $neuerName, $conn) {
|
||||
try {
|
||||
$sql = "UPDATE kl_Mitarbeiter SET Name = ? WHERE MitarbeiterID = ?";
|
||||
$params = array($neuerName, $mitarbeiterID);
|
||||
|
||||
$stmt = sqlsrv_query($conn, $sql, $params);
|
||||
|
||||
if ($stmt === false) {
|
||||
throw new Exception(print_r(sqlsrv_errors(), true));
|
||||
}
|
||||
|
||||
return true; // Erfolgreich aktualisiert
|
||||
} catch (Exception $e) {
|
||||
return $e->getMessage(); // Fehlermeldung zurückgeben
|
||||
}
|
||||
}
|
||||
|
||||
// Überprüfen, ob das Formular abgesendet wurde
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["aktion"] == "aktualisieren") {
|
||||
$mitarbeiterID = $_POST["mitarbeiterID"];
|
||||
$neuerName = $_POST["neuerName"];
|
||||
|
||||
$ergebnis = aktualisiereAnzeigenamen($mitarbeiterID, $neuerName, $conn);
|
||||
|
||||
if ($ergebnis === true) {
|
||||
echo "Anzeigename erfolgreich aktualisiert.";
|
||||
} else {
|
||||
echo "Fehler: $ergebnis";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<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 if ($hasAccess): ?>
|
||||
<?php
|
||||
while ($row = sqlsrv_fetch_array($stmtMitarbeiter, SQLSRV_FETCH_ASSOC)) {
|
||||
$mitarbeiterID = $row['MitarbeiterID'];
|
||||
$name = $row['Name'];
|
||||
echo "<option value='{$mitarbeiterID}'>{$name}</option>";
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
$auswahl = $isAdmin ? $mitglieder : ($eigenesMitglied !== null ? [$eigenesMitglied] : []);
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] === "POST" && ($_POST["aktion"] ?? '') === "aktualisieren") {
|
||||
$participantId = (int)($_POST["mitarbeiterID"] ?? 0);
|
||||
$neuerName = trim((string)($_POST["neuerName"] ?? ''));
|
||||
|
||||
$ziel = null;
|
||||
foreach ($auswahl as $m) {
|
||||
if ($m['participant_id'] === $participantId) {
|
||||
$ziel = $m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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.';
|
||||
}
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if (!$isAdmin): ?>
|
||||
<p>Hier kannst du deinen Anzeigenamen anpassen. Dieser wird auf der Kaffeeliste und in E-Mails genutzt.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
<?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; ?>
|
||||
|
||||
<?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>
|
||||
@@ -104,21 +112,10 @@ if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["aktion"]) && $_POST["a
|
||||
|
||||
<input type="hidden" name="aktion" value="aktualisieren">
|
||||
<button type="submit">Anzeigename aktualisieren</button>
|
||||
</form>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
<?php else: ?>
|
||||
<p>Sie haben keinen Zugang zu dieser Webseite.</p>
|
||||
<?php endif; ?>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
|
||||
}
|
||||
?>
|
||||
|
||||
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php include "footer.php"; ?>
|
||||
|
||||
Reference in New Issue
Block a user