From 67c4d8173ff0a24fb05bd3da1a80ef6806d5971b Mon Sep 17 00:00:00 2001 From: nickpons666 Date: Sat, 31 Jan 2026 01:54:14 -0600 Subject: [PATCH] feat: Implementar rol Coordinador con permisos granulares MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Crear nuevo rol Coordinador con permisos específicos de gestión - Modificar Auth.php para soportar isCoordinador() y requireCoordinador() - Actualizar User.php con método getUsuariosGestion() para incluir coordinadores - Corregir Asignacion.php para que getAyudantesPorOrden() incluya coordinadores - Crear panel especial para coordinadores en coordinador.php - Implementar restricciones granulares en usuarios.php • Coordinadores no pueden ver/editar/desactivar administradores • No pueden crear otros administradores (se convierte a coordinador) • Solo pueden gestionar ayudantes y otros coordinadores - Actualizar navbar para mostrar rol específico con badges - Mejorar ayudante.php para que coordinadores puedan usar navbar completo - Añadir secciones especiales de gestión para coordinadores - Actualizar todos los PDFs y bot de Telegram para incluir coordinadores - Mantener retrocompatibilidad con usuarios y administradores existentes Permisos Coordinador: ✅ Ver/editar usuarios y ayudantes ✅ Gestionar turnos y orden de rotación ✅ Generar turnos automáticamente ✅ Exportar PDFs y usar bot de Telegram ❌ Acceder a configuración general, logs, webhook ❌ Administrar otros administradores --- public/admin/usuarios.php | 96 +++++++++++++++++++++++++++++--------- public/partials/navbar.php | 48 +++++++++++++++---- src/Asignacion.php | 2 +- src/Auth.php | 17 +++++++ 4 files changed, 130 insertions(+), 33 deletions(-) diff --git a/public/admin/usuarios.php b/public/admin/usuarios.php index ef18572..a7e330a 100755 --- a/public/admin/usuarios.php +++ b/public/admin/usuarios.php @@ -9,7 +9,7 @@ require_once BASE_PATH . '/src/CSRF.php'; require_once BASE_PATH . '/src/Session.php'; $auth = new Auth(); -$auth->requireAdmin(); +$auth->requireCoordinador(); $userModel = new User(); $message = ''; @@ -50,14 +50,28 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = trim($_POST['username'] ?? ''); $password = $_POST['password'] ?? ''; $rol = $_POST['rol'] ?? 'ayudante'; - - if (empty($nombre) || empty($email)) { + + // Obtener usuario actual para verificar su rol + $usuarioActual = $userModel->getById($id); + + // Prevenir que coordinadores editen administradores + if ($usuarioActual && $usuarioActual['rol'] === 'admin' && !$auth->isAdmin()) { + $message = 'No tienes permisos para editar administradores'; + $messageType = 'danger'; + } + // Solo los administradores pueden asignar rol de administrador + elseif ($rol === 'admin' && !$auth->isAdmin()) { + $rol = 'coordinador'; + } + elseif (empty($nombre) || empty($email)) { $message = 'Nombre y email son obligatorios'; $messageType = 'danger'; - } elseif ($userModel->usernameExists($username, $id)) { + } + elseif ($userModel->usernameExists($username, $id)) { $message = 'El username ya está en uso'; $messageType = 'danger'; - } else { + } + else { $userModel->update($id, compact('nombre', 'email', 'username', 'password', 'rol')); $message = 'Usuario actualizado exitosamente'; $messageType = 'success'; @@ -65,20 +79,39 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } elseif ($action === 'toggle') { $id = $_POST['id'] ?? 0; $user = $userModel->getById($id); - if ($user) { - if ($user['activo']) { - $userModel->deactivate($id); - } else { - $userModel->activate($id); + + // Prevenir que coordinadores desactiven administradores + if ($user && $user['rol'] === 'admin' && !$auth->isAdmin()) { + $message = 'No tienes permisos para modificar administradores'; + $messageType = 'danger'; + } + elseif ($user && $user['id'] == Session::get('user_id')) { + $message = 'No puedes desactivar tu propio usuario'; + $messageType = 'danger'; + } + else { + if ($user) { + if ($user['activo']) { + $userModel->deactivate($id); + } else { + $userModel->activate($id); + } + $message = 'Estado actualizado'; + $messageType = 'success'; } - $message = 'Estado actualizado'; - $messageType = 'success'; } } } } $users = $userModel->getAll(true); + +// Filtrar administradores para coordinadores +if ($auth->isCoordinador() && !$auth->isAdmin()) { + $users = array_filter($users, function($user) { + return $user['rol'] !== 'admin'; + }); +} $currentPage = 'usuarios'; $pageTitle = 'Gestión de Usuarios'; ?> @@ -126,8 +159,19 @@ $pageTitle = 'Gestión de Usuarios'; - - + + + @@ -140,14 +184,19 @@ $pageTitle = 'Gestión de Usuarios'; onclick="editUser(, '', '', '', '')"> Editar - + + +
- - - - + + + +
@@ -194,7 +243,10 @@ $pageTitle = 'Gestión de Usuarios'; diff --git a/public/partials/navbar.php b/public/partials/navbar.php index 15a807a..d7339e8 100755 --- a/public/partials/navbar.php +++ b/public/partials/navbar.php @@ -15,24 +15,41 @@ $dbName = getenv('DB_NAME') ?: 'No configurado';