180 lines
7.8 KiB
PHP

<?php
/**
* lista.php — Gestión de usuarios (admin)
*/
require_once __DIR__ . '/../../config/config.php';
require_once __DIR__ . '/../../controllers/AuthController.php';
require_once __DIR__ . '/../../models/Usuario.php';
AuthController::requerirAdmin();
$model = new UsuarioModel();
$usuarios = $model->todos();
$pageTitle = 'Gestión de Usuarios';
$activeNav = 'usuarios';
include __DIR__ . '/../../views/layout/header.php';
include __DIR__ . '/../../views/layout/sidebar.php';
include __DIR__ . '/../../views/layout/topbar.php';
?>
<div class="page-content">
<div class="breadcrumb">
<a href="<?= APP_URL ?>/dashboard.php"><i class="fa-solid fa-house"></i></a>
<i class="fa-solid fa-chevron-right sep"></i>
<span>Usuarios</span>
</div>
<?php $success = $_GET['success'] ?? ''; $error = $_GET['error'] ?? ''; ?>
<?php if ($success): ?><div class="alert alert-success"><i class="fa-solid fa-circle-check"></i> <?= htmlspecialchars($success) ?></div><?php endif; ?>
<?php if ($error): ?><div class="alert alert-danger"><i class="fa-solid fa-circle-exclamation"></i> <?= htmlspecialchars($error) ?></div><?php endif; ?>
<div class="page-header">
<div class="page-header-content">
<h1>Gestión de Usuarios</h1>
<p><?= count($usuarios) ?> usuario(s) registrado(s)</p>
</div>
<button class="btn btn-primary" data-modal="modalCrearUsuario">
<i class="fa-solid fa-user-plus"></i> Nuevo Usuario
</button>
</div>
<div class="card">
<div class="card-body" style="padding:0">
<div class="table-responsive">
<table class="table" id="tablaUsuarios">
<thead>
<tr><th>Nombre</th><th>Usuario</th><th>Email</th><th>Área</th><th>Rol</th><th>Último acceso</th><th>Estado</th><th>Acciones</th></tr>
</thead>
<tbody>
<?php foreach ($usuarios as $u): ?>
<tr>
<td>
<div class="d-flex align-items-center gap-2">
<div style="width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--primary),var(--secondary));display:grid;place-items:center;color:#fff;font-weight:700;font-size:.75rem;flex-shrink:0">
<?= strtoupper(substr($u['nombre'],0,1).substr($u['apellido'],0,1)) ?>
</div>
<div>
<div class="fw-600"><?= htmlspecialchars($u['nombre'].' '.$u['apellido']) ?></div>
<?php if ($u['cargo']): ?>
<div class="fs-sm text-muted"><?= htmlspecialchars($u['cargo']) ?></div>
<?php endif; ?>
</div>
</div>
</td>
<td><code style="background:var(--bg);padding:.15rem .4rem;border-radius:4px;font-size:.8rem"><?= htmlspecialchars($u['username']) ?></code></td>
<td><?= htmlspecialchars($u['email']) ?></td>
<td><?= htmlspecialchars($u['area'] ?? '—') ?></td>
<td>
<span class="badge badge-<?= ['administrador'=>'danger','supervisor'=>'warning','estandar'=>'primary'][$u['rol_nombre']]??'secondary' ?>">
<?= ucfirst($u['rol_nombre']) ?>
</span>
</td>
<td class="fs-sm">
<?= $u['ultimo_login'] ? date('d/m/Y H:i', strtotime($u['ultimo_login'])) : '<span class="text-muted">Nunca</span>' ?>
</td>
<td>
<span class="badge <?= $u['activo'] ? 'badge-success' : 'badge-danger' ?>">
<?= $u['activo'] ? 'Activo' : 'Inactivo' ?>
</span>
</td>
<td>
<div class="d-flex gap-1">
<a href="<?= APP_URL ?>/views/usuarios/editar.php?id=<?= $u['id'] ?>" class="btn btn-sm btn-warning" title="Editar">
<i class="fa-solid fa-pen"></i>
</a>
<?php if ($u['id'] != $_SESSION['usuario_id']): ?>
<a href="<?= APP_URL ?>/controllers/UsuarioController.php?action=eliminar&id=<?= $u['id'] ?>"
class="btn btn-sm btn-danger" title="Eliminar"
data-confirm="¿Desactivar al usuario <?= htmlspecialchars($u['nombre']) ?>?">
<i class="fa-solid fa-user-slash"></i>
</a>
<?php endif; ?>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Modal Crear Usuario -->
<div class="modal-overlay" id="modalCrearUsuario">
<div class="modal-box" style="width:min(620px,95vw)">
<div class="modal-header">
<i class="fa-solid fa-user-plus text-primary"></i>
<span class="modal-title">Crear Nuevo Usuario</span>
<button class="btn-icon" data-modal-close><i class="fa-solid fa-xmark"></i></button>
</div>
<form method="POST" action="<?= APP_URL ?>/controllers/UsuarioController.php?action=crear">
<?= csrfField() ?>
<div class="modal-body">
<div class="form-row">
<div class="form-group">
<label class="form-label">Nombre <span class="required">*</span></label>
<input type="text" class="form-control" name="nombre" required>
</div>
<div class="form-group">
<label class="form-label">Apellido <span class="required">*</span></label>
<input type="text" class="form-control" name="apellido" required>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label class="form-label">Usuario <span class="required">*</span></label>
<input type="text" class="form-control" name="username" required autocomplete="off">
</div>
<div class="form-group">
<label class="form-label">Email <span class="required">*</span></label>
<input type="email" class="form-control" name="email" required>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label class="form-label">Contraseña <span class="required">*</span></label>
<input type="password" class="form-control" name="password" minlength="8" required autocomplete="new-password">
</div>
<div class="form-group">
<label class="form-label">Rol <span class="required">*</span></label>
<select class="form-control" name="rol_id" required>
<?php foreach ($model->roles() as $r): ?>
<option value="<?= $r['id'] ?>"><?= ucfirst($r['nombre']) ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label class="form-label">Cargo</label>
<input type="text" class="form-control" name="cargo">
</div>
<div class="form-group">
<label class="form-label">Área</label>
<input type="text" class="form-control" name="area">
</div>
</div>
<div class="form-group">
<label class="form-label">Supervisor</label>
<select class="form-control" name="supervisor_id">
<option value="">— Sin supervisor —</option>
<?php foreach ($model->usuariosParaSelector() as $u): ?>
<option value="<?= $u['id'] ?>"><?= htmlspecialchars($u['nombre_completo']) ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-modal-close>Cancelar</button>
<button type="submit" class="btn btn-primary"><i class="fa-solid fa-user-plus"></i> Crear Usuario</button>
</div>
</form>
</div>
</div>
<script>$(document).ready(()=>initDataTable('#tablaUsuarios'))</script>
<?php include __DIR__ . '/../../views/layout/footer.php'; ?>