From 072cc0b6e31a5af794535bec975e9748716f1a42 Mon Sep 17 00:00:00 2001 From: Soporte ZH Consultores Date: Thu, 4 Jun 2026 23:42:06 +0000 Subject: [PATCH] fix(admin): bug del activo + simplificar a Nombre Completo + gear en landing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BUG FIX * admin.html: el filtro 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). --- public/admin/api.php | 28 +++++++++++++--------------- public/index.php | 22 ++++++++++++++++------ public/tramites/api.php | 8 ++++---- sql/007_drop_apellido.sql | 26 ++++++++++++++++++++++++++ src/Auth.php | 6 +++--- src/Bootstrap.php | 2 +- src/Lookups.php | 20 ++++++++++---------- views/admin.html | 29 ++++++++++------------------- 8 files changed, 83 insertions(+), 58 deletions(-) create mode 100644 sql/007_drop_apellido.sql diff --git a/public/admin/api.php b/public/admin/api.php index 2331e23..61d363b 100644 --- a/public/admin/api.php +++ b/public/admin/api.php @@ -41,27 +41,26 @@ try { if ($email === '') err('email requerido'); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) err('email inválido'); - $name = trim((string)($b['name'] ?? '')); - $role = in_array(($b['role'] ?? ''), ROLES, true) ? $b['role'] : 'usuario'; - $apellido = trim((string)($b['apellido'] ?? '')); - $activo = (int)($b['activo'] ?? 1) === 1 ? 1 : 0; - $orden = (int)($b['orden'] ?? 0); + $name = trim((string)($b['name'] ?? '')); + $role = in_array(($b['role'] ?? ''), ROLES, true) ? $b['role'] : 'usuario'; + $activo = (int)($b['activo'] ?? 1) === 1 ? 1 : 0; + $orden = (int)($b['orden'] ?? 0); $exists = $pdo->prepare('SELECT id FROM users WHERE email = :e'); $exists->execute([':e' => $email]); if ($exists->fetch()) err('Ya existe un usuario con ese email', 409); $ins = $pdo->prepare( - 'INSERT INTO users (email, name, role, apellido, activo, orden, first_seen_at, last_login_at) - VALUES (:email, :name, :role, :apellido, :activo, :orden, NULL, NULL)' + 'INSERT INTO users (email, name, role, activo, orden, first_seen_at, last_login_at) + VALUES (:email, :name, :role, :activo, :orden, NULL, NULL)' ); $ins->execute([ ':email' => $email, ':name' => $name, ':role' => $role, - ':apellido' => $apellido, ':activo' => $activo, ':orden' => $orden, + ':activo' => $activo, ':orden' => $orden, ]); $id = (int)$pdo->lastInsertId(); - $sel = $pdo->prepare('SELECT id, email, name, role, apellido, activo, orden, first_seen_at, last_login_at FROM users WHERE id = :id'); + $sel = $pdo->prepare('SELECT id, email, name, role, activo, orden, first_seen_at, last_login_at FROM users WHERE id = :id'); $sel->execute([':id' => $id]); $row = $sel->fetch(); $row['id'] = (int)$row['id']; @@ -97,22 +96,21 @@ try { if ($chk->fetch()) err('Otro usuario ya tiene ese email', 409); } - $name = trim((string)($b['name'] ?? '')); - $apellido = trim((string)($b['apellido'] ?? '')); - $orden = (int)($b['orden'] ?? 0); + $name = trim((string)($b['name'] ?? '')); + $orden = (int)($b['orden'] ?? 0); $upd = $pdo->prepare( 'UPDATE users SET email = :email, name = :name, role = :role, - apellido = :apellido, activo = :activo, orden = :orden + activo = :activo, orden = :orden WHERE id = :id' ); $upd->execute([ ':email' => $newEmail, ':name' => $name, ':role' => $newRole, - ':apellido' => $apellido, ':activo' => $newActivo, ':orden' => $orden, + ':activo' => $newActivo, ':orden' => $orden, ':id' => $id, ]); - $sel = $pdo->prepare('SELECT id, email, name, role, apellido, activo, orden, first_seen_at, last_login_at FROM users WHERE id = :id'); + $sel = $pdo->prepare('SELECT id, email, name, role, activo, orden, first_seen_at, last_login_at FROM users WHERE id = :id'); $sel->execute([':id' => $id]); $row = $sel->fetch(); $row['id'] = (int)$row['id']; diff --git a/public/index.php b/public/index.php index 9865e77..89b3848 100644 --- a/public/index.php +++ b/public/index.php @@ -106,6 +106,9 @@ a{color:inherit;text-decoration:none;} .user-email{font-size:10.5px;color:rgba(255,255,255,0.55);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} .btn-logout{font-size:11px;padding:6px 12px;border:1px solid rgba(255,255,255,0.18);border-radius:18px;background:transparent;color:rgba(255,255,255,0.7);cursor:pointer;font-family:'DM Sans',sans-serif;transition:all .15s;} .btn-logout:hover{background:rgba(255,255,255,0.12);color:#fff;border-color:rgba(255,255,255,0.3);} +.btn-gear{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid rgba(255,255,255,0.18);border-radius:8px;color:rgba(255,255,255,0.85);transition:all .15s;text-decoration:none;font-family:'DM Sans',sans-serif;margin-right:8px;} +.btn-gear:hover{background:var(--gold);border-color:var(--gold);color:var(--navy);} +.btn-gear svg{width:16px;height:16px;} .dash-main{max-width:1180px;margin:0 auto;padding:48px 32px 80px;} .dash-hero{margin-bottom:40px;} @@ -199,13 +202,20 @@ a{color:inherit;text-decoration:none;} Portal interno -
-
-