clean($_POST['nombre'] ?? ''), 'apellido' => clean($_POST['apellido'] ?? ''), 'email' => clean($_POST['email'] ?? ''), 'username' => clean($_POST['username'] ?? ''), 'password' => $_POST['password'] ?? '', 'rol_id' => (int)($_POST['rol_id'] ?? 3), 'cargo' => clean($_POST['cargo'] ?? ''), 'area' => clean($_POST['area'] ?? ''), 'supervisor_id' => (int)($_POST['supervisor_id'] ?? 0) ?: null, ]; if (empty($datos['nombre']) || empty($datos['email']) || empty($datos['username']) || strlen($datos['password']) < 8) { redirect(APP_URL.'/views/usuarios/lista.php?error='.urlencode('Complete todos los campos requeridos (contraseña mínima 8 chars).')); } try { $model->crear($datos); logAct($userId, 'crear_usuario', 'usuarios', "Usuario {$datos['username']} creado."); redirect(APP_URL.'/views/usuarios/lista.php?success='.urlencode('Usuario creado exitosamente.')); } catch (\PDOException $e) { redirect(APP_URL.'/views/usuarios/lista.php?error='.urlencode('El email o usuario ya existe.')); } case 'actualizar': if ($_SERVER['REQUEST_METHOD'] !== 'POST') redirect(APP_URL.'/views/usuarios/lista.php'); verificarCsrf(); $id = (int)($_POST['id'] ?? 0); $datos = [ 'nombre' => clean($_POST['nombre'] ?? ''), 'apellido' => clean($_POST['apellido'] ?? ''), 'email' => clean($_POST['email'] ?? ''), 'username' => clean($_POST['username'] ?? ''), 'rol_id' => (int)($_POST['rol_id'] ?? 3), 'cargo' => clean($_POST['cargo'] ?? ''), 'area' => clean($_POST['area'] ?? ''), 'supervisor_id' => (int)($_POST['supervisor_id'] ?? 0) ?: null, 'activo' => isset($_POST['activo']) ? 1 : 0, ]; $model->actualizar($id, $datos); if (!empty($_POST['password']) && strlen($_POST['password']) >= 8) { $model->actualizarPassword($id, password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 12])); } logAct($userId, 'editar_usuario', 'usuarios', "Usuario #$id actualizado."); redirect(APP_URL.'/views/usuarios/lista.php?success='.urlencode('Usuario actualizado.')); case 'eliminar': $id = (int)($_GET['id'] ?? 0); if ($id && $id !== $userId) { $model->eliminarLogico($id); logAct($userId, 'eliminar_usuario', 'usuarios', "Usuario #$id desactivado."); } redirect(APP_URL.'/views/usuarios/lista.php?success='.urlencode('Usuario desactivado.')); default: redirect(APP_URL.'/views/usuarios/lista.php'); } function logAct(int $uid, string $accion, string $modulo, string $desc = ''): void { $db = getDB(); $db->prepare("INSERT INTO log_actividad(usuario_id,accion,modulo,descripcion,ip_address) VALUES(?,?,?,?,?)") ->execute([$uid, $accion, $modulo, $desc, $_SERVER['REMOTE_ADDR']??null]); }