feat: limitar permisos de coordinador en usuarios y habilitar panel de generacion en rotaciones
This commit is contained in:
@@ -29,7 +29,6 @@ write_env "DB_PASS" "${DB_PASS:-password}"
|
|||||||
# Aplicación
|
# Aplicación
|
||||||
write_env "SITE_URL" "${SITE_URL:-http://localhost}"
|
write_env "SITE_URL" "${SITE_URL:-http://localhost}"
|
||||||
write_env "TIMEZONE" "${TIMEZONE:-America/Mexico_City}"
|
write_env "TIMEZONE" "${TIMEZONE:-America/Mexico_City}"
|
||||||
write_env "CAOS_BASE_URL" "${CAOS_BASE_URL}" # Soporte opcional legacy/custom
|
|
||||||
|
|
||||||
# Sesión
|
# Sesión
|
||||||
write_env "SESSION_NAME" "${SESSION_NAME:-ibiza_session}"
|
write_env "SESSION_NAME" "${SESSION_NAME:-ibiza_session}"
|
||||||
|
|||||||
@@ -89,18 +89,26 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para
|
|||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<button onclick='editUser(<?= json_encode($u) ?>)' class="btn btn-sm btn-secondary">Editar</button>
|
<?php
|
||||||
|
$canManage = $_SESSION['role'] === 'admin' || ($_SESSION['role'] === 'coordinador' && $u['role'] !== 'admin');
|
||||||
|
?>
|
||||||
|
|
||||||
<form method="POST" style="display:inline;">
|
<?php if ($canManage): ?>
|
||||||
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>">
|
<button onclick='editUser(<?= json_encode($u) ?>)' class="btn btn-sm btn-secondary">Editar</button>
|
||||||
<input type="hidden" name="action" value="toggle">
|
|
||||||
<input type="hidden" name="id" value="<?= $u['id'] ?>">
|
<form method="POST" style="display:inline;">
|
||||||
<?php if ($u['active']): ?>
|
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>">
|
||||||
<button type="submit" class="btn btn-sm btn-danger">Desactivar</button>
|
<input type="hidden" name="action" value="toggle">
|
||||||
<?php else: ?>
|
<input type="hidden" name="id" value="<?= $u['id'] ?>">
|
||||||
<button type="submit" class="btn btn-sm btn-success">Activar</button>
|
<?php if ($u['active']): ?>
|
||||||
<?php endif; ?>
|
<button type="submit" class="btn btn-sm btn-danger">Desactivar</button>
|
||||||
</form>
|
<?php else: ?>
|
||||||
|
<button type="submit" class="btn btn-sm btn-success">Activar</button>
|
||||||
|
<?php endif; ?>
|
||||||
|
</form>
|
||||||
|
<?php else: ?>
|
||||||
|
<span class="badge badge-secondary">Solo lectura</span>
|
||||||
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -139,7 +147,9 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para
|
|||||||
<select name="role" class="form-control">
|
<select name="role" class="form-control">
|
||||||
<option value="ayudante">Ayudante</option>
|
<option value="ayudante">Ayudante</option>
|
||||||
<option value="coordinador">Coordinador</option>
|
<option value="coordinador">Coordinador</option>
|
||||||
<option value="admin">Administrador</option>
|
<?php if ($_SESSION['role'] === 'admin'): ?>
|
||||||
|
<option value="admin">Administrador</option>
|
||||||
|
<?php endif; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -180,7 +190,9 @@ $users = $controller->index(); // Maneja POST internamente y retorna lista para
|
|||||||
<select name="role" id="edit_role" class="form-control">
|
<select name="role" id="edit_role" class="form-control">
|
||||||
<option value="ayudante">Ayudante</option>
|
<option value="ayudante">Ayudante</option>
|
||||||
<option value="coordinador">Coordinador</option>
|
<option value="coordinador">Coordinador</option>
|
||||||
<option value="admin">Administrador</option>
|
<?php if ($_SESSION['role'] === 'admin'): ?>
|
||||||
|
<option value="admin">Administrador</option>
|
||||||
|
<?php endif; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ $user = $auth->getCurrentUser();
|
|||||||
<a href="<?= siteUrl('rotaciones.php') ?>" class="nav-link">Rotaciones</a>
|
<a href="<?= siteUrl('rotaciones.php') ?>" class="nav-link">Rotaciones</a>
|
||||||
<a href="<?= siteUrl('horarios.php') ?>" class="nav-link">Horarios</a>
|
<a href="<?= siteUrl('horarios.php') ?>" class="nav-link">Horarios</a>
|
||||||
|
|
||||||
<?php if ($auth->isAdmin()): ?>
|
<?php if ($auth->hasRole(['admin', 'coordinador'])): ?>
|
||||||
<a href="<?= siteUrl('admin/usuarios.php') ?>" class="nav-link">Usuarios</a>
|
<a href="<?= siteUrl('admin/usuarios.php') ?>" class="nav-link">Usuarios</a>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php if ($auth->isAdmin()): ?>
|
||||||
<a href="<?= siteUrl('admin/telegram.php') ?>" class="nav-link">Telegram</a>
|
<a href="<?= siteUrl('admin/telegram.php') ?>" class="nav-link">Telegram</a>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ $auth = new AuthService();
|
|||||||
$controller = new AssignmentController();
|
$controller = new AssignmentController();
|
||||||
$assignments = $controller->index();
|
$assignments = $controller->index();
|
||||||
|
|
||||||
// Si se envia formulario de generación (Solo Admin)
|
// Si se envia formulario de generación (Admin o Coordinador)
|
||||||
if (isPost() && $auth->isAdmin()) {
|
if (isPost() && ($auth->isAdmin() || $auth->isCoordinador())) {
|
||||||
$controller->generate();
|
$controller->generate();
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@@ -42,10 +42,10 @@ if (isPost() && $auth->isAdmin()) {
|
|||||||
<div class="alert alert-error"><?= e($msg) ?></div>
|
<div class="alert alert-error"><?= e($msg) ?></div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<!-- Panel de Administración (Solo Admin) -->
|
<!-- Panel de Administración (Admin y Coordinador) -->
|
||||||
<?php if ($auth->isAdmin()): ?>
|
<?php if ($auth->isAdmin() || $auth->isCoordinador()): ?>
|
||||||
<div class="card" style="border: 1px solid #cbd5e1; background: #f8fafc;">
|
<div class="card" style="border: 1px solid #cbd5e1; background: #f8fafc;">
|
||||||
<h3 class="card-title" style="font-size: 1rem; margin-bottom: 1rem;">⚙️ Panel de Generación (Solo Administrador)</h3>
|
<h3 class="card-title" style="font-size: 1rem; margin-bottom: 1rem;">⚙️ Panel de Generación</h3>
|
||||||
<form method="POST" onsubmit="return confirm('¿Estás seguro de generar nuevas rotaciones?')">
|
<form method="POST" onsubmit="return confirm('¿Estás seguro de generar nuevas rotaciones?')">
|
||||||
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>">
|
<input type="hidden" name="csrf_token" value="<?= csrfToken() ?>">
|
||||||
<div style="display: flex; gap: 1rem; align-items: center;">
|
<div style="display: flex; gap: 1rem; align-items: center;">
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ class AssignmentController
|
|||||||
|
|
||||||
public function generate()
|
public function generate()
|
||||||
{
|
{
|
||||||
// Solo Admin
|
// Permitir a Administradores y Coordinadores
|
||||||
RoleMiddleware::admin();
|
RoleMiddleware::coordinador();
|
||||||
|
|
||||||
if (isPost()) {
|
if (isPost()) {
|
||||||
if (!verifyCsrfToken(post('csrf_token'))) {
|
if (!verifyCsrfToken(post('csrf_token'))) {
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ class UserController
|
|||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
// Solo administradores pueden gestionar usuarios
|
// Permitir a administradores y coordinadores
|
||||||
RoleMiddleware::admin();
|
RoleMiddleware::coordinador();
|
||||||
$this->userModel = new User();
|
$this->userModel = new User();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +59,11 @@ class UserController
|
|||||||
'active' => 1
|
'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)) {
|
if ($this->userModel->create($data)) {
|
||||||
flash('success', 'Usuario creado correctamente');
|
flash('success', 'Usuario creado correctamente');
|
||||||
} else {
|
} else {
|
||||||
@@ -93,6 +98,19 @@ class UserController
|
|||||||
$data['password'] = post('password');
|
$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)) {
|
if ($this->userModel->update($id, $data)) {
|
||||||
flash('success', 'Usuario actualizado correctamente');
|
flash('success', 'Usuario actualizado correctamente');
|
||||||
} else {
|
} else {
|
||||||
@@ -111,8 +129,13 @@ class UserController
|
|||||||
if ($id == $_SESSION['user_id']) {
|
if ($id == $_SESSION['user_id']) {
|
||||||
flash('error', 'No puedes desactivar tu propia cuenta');
|
flash('error', 'No puedes desactivar tu propia cuenta');
|
||||||
} else {
|
} else {
|
||||||
$this->userModel->toggleActive($id);
|
$targetUser = $this->userModel->findById($id);
|
||||||
flash('success', 'Estado del usuario actualizado');
|
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'));
|
redirect(siteUrl('admin/usuarios.php'));
|
||||||
@@ -130,10 +153,13 @@ class UserController
|
|||||||
if ($id == $_SESSION['user_id']) {
|
if ($id == $_SESSION['user_id']) {
|
||||||
flash('error', 'No puedes eliminar tu propia cuenta');
|
flash('error', 'No puedes eliminar tu propia cuenta');
|
||||||
} else {
|
} else {
|
||||||
// Nota: User::delete no está implementado en el ejemplo anterior si no se usó BaseModel,
|
$targetUser = $this->userModel->findById($id);
|
||||||
// pero BaseModel tiene delete(). Verificar herencia.
|
if ($_SESSION['role'] === 'coordinador' && $targetUser && $targetUser['role'] === 'admin') {
|
||||||
$this->userModel->delete($id);
|
flash('error', 'No tienes permiso para eliminar administradores');
|
||||||
flash('success', 'Usuario eliminado');
|
} else {
|
||||||
|
$this->userModel->delete($id);
|
||||||
|
flash('success', 'Usuario eliminado');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect(siteUrl('admin/usuarios.php'));
|
redirect(siteUrl('admin/usuarios.php'));
|
||||||
|
|||||||
Reference in New Issue
Block a user