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).
This commit is contained in:
+3
-3
@@ -47,7 +47,7 @@ final class Auth {
|
||||
if (!$email) return self::$userRowCache = self::defaultRow();
|
||||
try {
|
||||
$stmt = Db::pdo()->prepare(
|
||||
'SELECT id, email, name, role, apellido, activo
|
||||
'SELECT id, email, name, role, activo
|
||||
FROM users WHERE email = :e LIMIT 1'
|
||||
);
|
||||
$stmt->execute([':e' => $email]);
|
||||
@@ -61,12 +61,12 @@ final class Auth {
|
||||
}
|
||||
|
||||
private static function defaultRow(): array {
|
||||
return ['id' => 0, 'email' => '', 'name' => '', 'role' => 'usuario', 'apellido' => '', 'activo' => 1];
|
||||
return ['id' => 0, 'email' => '', 'name' => '', 'role' => 'usuario', 'activo' => 1];
|
||||
}
|
||||
|
||||
public static function userId(): int { return (int)(self::userRow()['id'] ?? 0); }
|
||||
public static function role(): string { return (string)(self::userRow()['role'] ?? 'usuario'); }
|
||||
public static function apellido(): string { return (string)(self::userRow()['apellido'] ?? ''); }
|
||||
public static function userName(): string { return (string)(self::userRow()['name'] ?? ''); }
|
||||
|
||||
public static function isSocio(): bool { return self::role() === 'socio'; }
|
||||
public static function isAbogado(): bool { return in_array(self::role(), ['socio','abogado'], true); }
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ final class Bootstrap {
|
||||
'isAbogado' => Auth::isAbogado(),
|
||||
'canCreate' => Auth::canCreate(),
|
||||
'canDelete' => Auth::canDelete(),
|
||||
'abogados' => Lookups::abogadoApellidos(),
|
||||
'abogados' => Lookups::abogadoNames(),
|
||||
'users' => Lookups::involucrablesUsers(),
|
||||
];
|
||||
$json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP);
|
||||
|
||||
+10
-10
@@ -5,25 +5,25 @@ require_once __DIR__ . '/Db.php';
|
||||
|
||||
/**
|
||||
* Lookups — vistas de solo lectura sobre la tabla users para poblar
|
||||
* dropdowns y resolver mapeo email ↔ apellido.
|
||||
* dropdowns y resolver visibilidad.
|
||||
*/
|
||||
final class Lookups {
|
||||
/** Apellidos para el dropdown "Abogado Solicitante" (socios + abogados activos). */
|
||||
public static function abogadoApellidos(): array {
|
||||
/** Nombres completos para el dropdown "Abogado Solicitante" (socios + abogados activos). */
|
||||
public static function abogadoNames(): array {
|
||||
$rows = Db::pdo()->query(
|
||||
"SELECT DISTINCT apellido FROM users
|
||||
"SELECT DISTINCT name FROM users
|
||||
WHERE activo = 1
|
||||
AND role IN ('socio','abogado')
|
||||
AND apellido != ''
|
||||
ORDER BY orden ASC, apellido ASC"
|
||||
AND name != ''
|
||||
ORDER BY orden ASC, name ASC"
|
||||
)->fetchAll();
|
||||
return array_map(fn($r) => $r['apellido'], $rows);
|
||||
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, apellido
|
||||
"SELECT id, email, name, role
|
||||
FROM users
|
||||
WHERE activo = 1
|
||||
AND email NOT LIKE 'placeholder-%'
|
||||
@@ -36,10 +36,10 @@ final class Lookups {
|
||||
/** 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, apellido, activo, orden,
|
||||
"SELECT id, email, name, role, activo, orden,
|
||||
first_seen_at, last_login_at
|
||||
FROM users
|
||||
ORDER BY role DESC, apellido ASC, name ASC, email ASC"
|
||||
ORDER BY role DESC, name ASC, email ASC"
|
||||
)->fetchAll();
|
||||
foreach ($rows as &$r) {
|
||||
$r['id'] = (int)$r['id'];
|
||||
|
||||
Reference in New Issue
Block a user