'Tickets beantworten', 'close_ticket' => 'Tickets schließen/lösen', 'delete_ticket' => 'Tickets löschen', 'transfer_ticket' => 'Tickets übertragen (Abteilung ändern)', 'post_note' => 'Interne Notizen schreiben', 'assign_ticket' => 'Tickets zuweisen (Mitarbeiter/Team)', 'manage_canned' => 'Textbausteine verwalten', 'view_reports' => 'Berichte einsehen', 'manage_kb' => 'Wissensdatenbank verwalten', 'create_ticket' => 'Tickets im Namen von Kunden erstellen', ]; // Feinkörnige Adminportal-Rechte ("Co-Admin") – siehe admin_section_permissions() in functions.php. // manage_kb steckt bewusst nur oben bei den Ticket-Rechten, nicht doppelt hier. $adminPermLabels = admin_section_permissions(); unset($adminPermLabels['manage_kb']); $permLabels = array_merge($ticketPermLabels, $adminPermLabels); $errors = []; if ($_SERVER['REQUEST_METHOD'] === 'POST') { verify_csrf(); $action = $_POST['action'] ?? ''; if ($action === 'create' || $action === 'update') { $id = (int) ($_POST['id'] ?? 0); $name = trim($_POST['name'] ?? ''); $isActive = ($_POST['status'] ?? 'active') === 'active' ? 1 : 0; $notes = trim($_POST['notes'] ?? ''); if ($name === '') $errors[] = 'Bitte einen Namen angeben.'; $dup = $pdo->prepare('SELECT COUNT(*) FROM roles WHERE LOWER(name) = LOWER(?) AND id <> ?'); $dup->execute([$name, $id]); if ($dup->fetchColumn() > 0) $errors[] = 'Eine Rolle mit diesem Namen existiert bereits.'; if (!$errors) { $perms = []; foreach (array_keys($permLabels) as $p) { $perms[$p] = !empty($_POST['perm_' . $p]); } $json = json_encode($perms); if ($action === 'create') { $pdo->prepare('INSERT INTO roles (name, permissions, is_active, notes, created_at, updated_at) VALUES (?,?,?,?,?,?)') ->execute([$name, $json, $isActive, $notes ?: null, db_now(), db_now()]); audit_log($staff['id'], "Rolle erstellt: {$name}"); flash('success', 'Rolle erstellt.'); } else { $pdo->prepare('UPDATE roles SET name=?, permissions=?, is_active=?, notes=?, updated_at=? WHERE id=?') ->execute([$name, $json, $isActive, $notes ?: null, db_now(), $id]); audit_log($staff['id'], "Rolle aktualisiert: {$name}"); flash('success', 'Änderungen gespeichert.'); } redirect('/staff/roles.php'); } } if ($action === 'delete') { $id = (int) $_POST['id']; // Mitarbeiter und Abteilungszugriffe auf die Hauptrolle zurücksetzen $pdo->prepare('UPDATE staff SET role_id = NULL WHERE role_id = ?')->execute([$id]); $pdo->prepare('UPDATE staff_department SET role_id = NULL WHERE role_id = ?')->execute([$id]); $pdo->prepare('DELETE FROM roles WHERE id = ?')->execute([$id]); audit_log($staff['id'], "Rolle gelöscht: #{$id}"); flash('success', 'Rolle gelöscht.'); redirect('/staff/roles.php'); } } $isNew = isset($_GET['new']); $editId = (int) ($_GET['edit'] ?? 0); $showForm = $isNew || $editId || ($errors && in_array($_POST['action'] ?? '', ['create', 'update'], true)); $roles = $pdo->query( 'SELECT r.*, (SELECT COUNT(*) FROM staff s WHERE s.role_id = r.id) + (SELECT COUNT(*) FROM staff_department sd WHERE sd.role_id = r.id) AS staff_count FROM roles r ORDER BY r.name' )->fetchAll(); $editRole = null; $editPerms = array_fill_keys(array_keys($permLabels), false); if ($editId) { $es = $pdo->prepare('SELECT * FROM roles WHERE id = ?'); $es->execute([$editId]); $editRole = $es->fetch() ?: null; if ($editRole) $editPerms = array_merge($editPerms, json_decode($editRole['permissions'] ?? '{}', true) ?? []); } if ($_POST && $errors) foreach (array_keys($permLabels) as $p) $editPerms[$p] = !empty($_POST['perm_' . $p]); $pageTitle = 'Rollen'; $activePage = 'roles'; require __DIR__ . '/_header.php'; ?>
Benutzerdefinierte Berechtigungssets für Mitarbeiter. Ohne Rolle gelten die Standard-Mitarbeiterrechte.
| Rollenname | Status | Zugewiesen | Erstellt | Zuletzt aktualisiert | |
|---|---|---|---|---|---|
| = e($r['name']) ?> | = ($r['is_active'] ?? 1) ? 'Aktiv' : 'Deaktiviert' ?> | = (int) $r['staff_count'] ?> | = e(ui_date($r['created_at'] ?? null)) ?> | = e(ui_date($r['updated_at'] ?? null)) ?> | Bearbeiten · |
| Noch keine benutzerdefinierten Rollen angelegt. | |||||