feat(admin): botón Borrar usuario + fix modal cierra al clic fondo

* admin/api.php: nuevo endpoint DELETE ?action=delete_user con salvaguardas:
  - No te puedes eliminar a ti mismo
  - No puedes eliminar a otro Socio (cambiar su rol primero)
  - CASCADE de tramites_involucrados limpia vínculos N:M automáticamente
  - Strings históricos (creado_por, abogado, autor_email) permanecen como
    referencia muerta para preservar trazabilidad de trámites antiguos
* admin.html: botón rojo "Borrar usuario" en el footer del modal, visible
  solo en modo edición (no en crear). Confirmación contextual según si es
  placeholder o usuario real. Pista en el hint del email sobre usar Borrar
  cuando hay conflicto.
* Fix: removido onclick del modal-overlay que cerraba el modal al hacer
  clic en el padding del backdrop. Ahora solo cierra con ✕, Cancelar,
  Esc, o Guardar exitoso. Más predecible.
This commit is contained in:
Soporte ZH Consultores
2026-06-05 00:01:02 +00:00
parent 072cc0b6e3
commit 684c83f2c9
2 changed files with 69 additions and 6 deletions
+21
View File
@@ -119,6 +119,27 @@ try {
ok($row);
}
if ($method === 'DELETE' && $action === 'delete_user') {
$id = (int)($_GET['id'] ?? 0);
if (!$id) err('id requerido');
if ($id === $me) err('No puedes eliminarte a ti mismo', 400);
$sel = $pdo->prepare('SELECT id, email, role FROM users WHERE id = :id');
$sel->execute([':id' => $id]);
$u = $sel->fetch();
if (!$u) err('Usuario no encontrado', 404);
if ($u['role'] === 'socio') {
err('No puedes eliminar a otro Socio. Cambia su rol a Abogado o Usuario primero.', 400);
}
// CASCADE de tramites_involucrados limpia los vínculos automáticamente.
// Los strings históricos (tramite.creado_por, tramite.abogado, obs.autor_email,
// hours.autor_email) permanecen como referencia muerta — eso es lo deseado para
// preservar la trazabilidad de trámites antiguos.
$pdo->prepare('DELETE FROM users WHERE id = :id')->execute([':id' => $id]);
ok(['deleted' => $id, 'email' => $u['email']]);
}
err('Acción no reconocida', 404);
} catch (PDOException $e) {