Files
donna/src/Lookups.php
T
Soporte ZH Consultores 072cc0b6e3 fix(admin): bug del activo + simplificar a Nombre Completo + gear en landing
BUG FIX
* admin.html: el filtro <select id="f-activo"> y el modal <input id="f-activo">
  tenían el MISMO id. document.getElementById devolvía el select (primer en
  DOM order) y la lectura .checked siempre era undefined → JSON enviaba el
  valor stale del select. Renombré el filtro a `f-activo-filter`.

REFACTOR: drop apellido, usar Nombre Completo
* Migración 007: copia apellido→name para placeholders, migra
  escrituras_tramites.abogado y tramites_legales.abogado a usar nombre
  completo, DROP COLUMN apellido + índice.
* Lookups: abogadoApellidos() → abogadoNames() filtra socios+abogados
  activos con name no vacío.
* Auth.php: drop método apellido(), agregado userName().
* tramites/api.php: visibilidad usa users.name = t.abogado.
* admin/api.php: drop apellido en create/update payloads.
* admin.html: drop columna y campo Apellido del table y form.
* Bootstrap envía window.DONNA.abogados con nombres completos.

LANDING (index.php)
* Gear icon en dash-header visible solo si Auth::isSocio() (chequeo
  server-side, sin flash de JS).

CLEANUP
* Eliminado logging de debug en admin/api.php que se agregó para
  diagnosticar el bug del activo.

PERMISOS (sin cambios — confirmación)
* Trámites Legales: solo socio/abogado pueden crear (canCreate() ya lo
  enforza desde 2db8f23).
* Escrituras: cualquier rol autenticado puede crear (escrituras/api.php
  nunca tuvo restricción).
2026-06-04 23:42:06 +00:00

60 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/Db.php';
/**
* Lookups — vistas de solo lectura sobre la tabla users para poblar
* dropdowns y resolver visibilidad.
*/
final class Lookups {
/** Nombres completos para el dropdown "Abogado Solicitante" (socios + abogados activos). */
public static function abogadoNames(): array {
$rows = Db::pdo()->query(
"SELECT DISTINCT name FROM users
WHERE activo = 1
AND role IN ('socio','abogado')
AND name != ''
ORDER BY orden ASC, name ASC"
)->fetchAll();
return array_map(fn($r) => $r['name'], $rows);
}
/** Todos los usuarios activos para el picker de Involucrados. */
public static function involucrablesUsers(): array {
$rows = Db::pdo()->query(
"SELECT id, email, name, role
FROM users
WHERE activo = 1
AND email NOT LIKE 'placeholder-%'
ORDER BY name ASC, email ASC"
)->fetchAll();
foreach ($rows as &$r) { $r['id'] = (int)$r['id']; }
return $rows;
}
/** Todos los users (incluye inactivos y placeholders) para el Panel de Control. */
public static function allUsers(): array {
$rows = Db::pdo()->query(
"SELECT id, email, name, role, activo, orden,
first_seen_at, last_login_at
FROM users
ORDER BY role DESC, name ASC, email ASC"
)->fetchAll();
foreach ($rows as &$r) {
$r['id'] = (int)$r['id'];
$r['activo'] = (int)$r['activo'];
$r['orden'] = (int)$r['orden'];
}
return $rows;
}
/** id del usuario por email; null si no existe. */
public static function userIdByEmail(string $email): ?int {
$stmt = Db::pdo()->prepare('SELECT id FROM users WHERE email = :e');
$stmt->execute([':e' => $email]);
$id = $stmt->fetchColumn();
return $id === false ? null : (int)$id;
}
}