diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index 5b62671..e6afebe 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -29,7 +29,6 @@ write_env "DB_PASS" "${DB_PASS:-password}" # Aplicación write_env "SITE_URL" "${SITE_URL:-http://localhost}" write_env "TIMEZONE" "${TIMEZONE:-America/Mexico_City}" -write_env "CAOS_BASE_URL" "${CAOS_BASE_URL}" # Soporte opcional legacy/custom # Sesión write_env "SESSION_NAME" "${SESSION_NAME:-ibiza_session}" diff --git a/public/admin/usuarios.php b/public/admin/usuarios.php index ff20431..4ef6a22 100644 --- a/public/admin/usuarios.php +++ b/public/admin/usuarios.php @@ -89,18 +89,26 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para
- + -
- - - - - - - - -
+ + + +
+ + + + + + + + +
+ + Solo lectura +
@@ -139,7 +147,9 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para @@ -180,7 +190,9 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para diff --git a/public/partials/navbar.php b/public/partials/navbar.php index a46e92d..2fae504 100644 --- a/public/partials/navbar.php +++ b/public/partials/navbar.php @@ -17,8 +17,10 @@ $user = $auth->getCurrentUser(); Rotaciones Horarios - isAdmin()): ?> + hasRole(['admin', 'coordinador'])): ?> Usuarios + + isAdmin()): ?> Telegram diff --git a/public/rotaciones.php b/public/rotaciones.php index e487fe0..2a5e8fc 100644 --- a/public/rotaciones.php +++ b/public/rotaciones.php @@ -12,8 +12,8 @@ $auth = new AuthService(); $controller = new AssignmentController(); $assignments = $controller->index(); -// Si se envia formulario de generación (Solo Admin) -if (isPost() && $auth->isAdmin()) { +// Si se envia formulario de generación (Admin o Coordinador) +if (isPost() && ($auth->isAdmin() || $auth->isCoordinador())) { $controller->generate(); } ?> @@ -42,10 +42,10 @@ if (isPost() && $auth->isAdmin()) {
- - isAdmin()): ?> + + isAdmin() || $auth->isCoordinador()): ?>
-

⚙️ Panel de Generación (Solo Administrador)

+

⚙️ Panel de Generación

diff --git a/src/Controllers/AssignmentController.php b/src/Controllers/AssignmentController.php index 02d2ce9..71f1d5c 100644 --- a/src/Controllers/AssignmentController.php +++ b/src/Controllers/AssignmentController.php @@ -34,8 +34,8 @@ class AssignmentController public function generate() { - // Solo Admin - RoleMiddleware::admin(); + // Permitir a Administradores y Coordinadores + RoleMiddleware::coordinador(); if (isPost()) { if (!verifyCsrfToken(post('csrf_token'))) { diff --git a/src/Controllers/UserController.php b/src/Controllers/UserController.php index 6b559c0..f117064 100644 --- a/src/Controllers/UserController.php +++ b/src/Controllers/UserController.php @@ -11,8 +11,8 @@ class UserController public function __construct() { - // Solo administradores pueden gestionar usuarios - RoleMiddleware::admin(); + // Permitir a administradores y coordinadores + RoleMiddleware::coordinador(); $this->userModel = new User(); } @@ -59,6 +59,11 @@ class UserController 'active' => 1 ]; + if ($_SESSION['role'] === 'coordinador' && post('role') === 'admin') { + flash('error', 'No tienes permiso para crear administradores'); + redirect(siteUrl('admin/usuarios.php')); + } + if ($this->userModel->create($data)) { flash('success', 'Usuario creado correctamente'); } else { @@ -93,6 +98,19 @@ class UserController $data['password'] = post('password'); } + $targetUser = $this->userModel->findById($id); + if (!$targetUser) { + flash('error', 'Usuario no encontrado'); + redirect(siteUrl('admin/usuarios.php')); + } + + if ($_SESSION['role'] === 'coordinador') { + if ($targetUser['role'] === 'admin' || post('role') === 'admin') { + flash('error', 'No tienes permiso para modificar administradores'); + redirect(siteUrl('admin/usuarios.php')); + } + } + if ($this->userModel->update($id, $data)) { flash('success', 'Usuario actualizado correctamente'); } else { @@ -111,8 +129,13 @@ class UserController if ($id == $_SESSION['user_id']) { flash('error', 'No puedes desactivar tu propia cuenta'); } else { - $this->userModel->toggleActive($id); - flash('success', 'Estado del usuario actualizado'); + $targetUser = $this->userModel->findById($id); + if ($_SESSION['role'] === 'coordinador' && $targetUser && $targetUser['role'] === 'admin') { + flash('error', 'No tienes permiso para desactivar administradores'); + } else { + $this->userModel->toggleActive($id); + flash('success', 'Estado del usuario actualizado'); + } } redirect(siteUrl('admin/usuarios.php')); @@ -130,10 +153,13 @@ class UserController if ($id == $_SESSION['user_id']) { flash('error', 'No puedes eliminar tu propia cuenta'); } else { - // Nota: User::delete no está implementado en el ejemplo anterior si no se usó BaseModel, - // pero BaseModel tiene delete(). Verificar herencia. - $this->userModel->delete($id); - flash('success', 'Usuario eliminado'); + $targetUser = $this->userModel->findById($id); + if ($_SESSION['role'] === 'coordinador' && $targetUser && $targetUser['role'] === 'admin') { + flash('error', 'No tienes permiso para eliminar administradores'); + } else { + $this->userModel->delete($id); + flash('success', 'Usuario eliminado'); + } } redirect(siteUrl('admin/usuarios.php'));