feat: CRUD de ciudades + select en modal de paciente
- Tabla lab_ciudades creada y poblada con 86 ciudades existentes - Módulo lab_ciudades: listado, crear, editar, activar/desactivar, eliminar - API /api/lab/ciudades.php: GET list, POST save/toggle/delete - Modal paciente: campo ciudad cambiado a select, cargado junto con EPS en un solo Promise.all al iniciar; Cúcuta preseleccionada por defecto Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
da2bfde38f
commit
4cb1a135b3
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* /api/lab/ciudades.php
|
||||
* GET ?action=list [solo_activas=1] → lista ciudades
|
||||
* POST {action:save, id?, nombre} → crear / renombrar
|
||||
* POST {action:toggle, id} → activar / desactivar
|
||||
* POST {action:delete, id} → eliminar (solo si no hay pacientes)
|
||||
*/
|
||||
require_once __DIR__ . '/_helpers.php';
|
||||
|
||||
$pdo = db();
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
|
||||
$soloActivas = isset($_GET['solo_activas']) && $_GET['solo_activas'] == '1';
|
||||
$sql = 'SELECT id, nombre, activa, orden FROM lab_ciudades' . ($soloActivas ? ' WHERE activa = 1' : '') . ' ORDER BY nombre';
|
||||
$rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
|
||||
jsonOk(['ciudades' => $rows]);
|
||||
}
|
||||
|
||||
requireMethod('POST');
|
||||
requireAdmin();
|
||||
|
||||
$body = inputJson();
|
||||
$action = trim($body['action'] ?? '');
|
||||
|
||||
if ($action === 'save') {
|
||||
$nombre = trim($body['nombre'] ?? '');
|
||||
$id = (int)($body['id'] ?? 0);
|
||||
if (!$nombre) jsonError('nombre requerido.');
|
||||
if (strlen($nombre) > 100) jsonError('nombre demasiado largo (máx 100).');
|
||||
|
||||
if ($id) {
|
||||
$pdo->prepare('UPDATE lab_ciudades SET nombre = ? WHERE id = ?')->execute([$nombre, $id]);
|
||||
jsonOk(['id' => $id], 'Ciudad actualizada.');
|
||||
} else {
|
||||
$st = $pdo->prepare('INSERT INTO lab_ciudades (nombre) VALUES (?)');
|
||||
try {
|
||||
$st->execute([$nombre]);
|
||||
} catch (\PDOException $e) {
|
||||
if ($e->getCode() == 23000) jsonError('Ya existe una ciudad con ese nombre.');
|
||||
throw $e;
|
||||
}
|
||||
jsonOk(['id' => (int)$pdo->lastInsertId()], 'Ciudad creada.');
|
||||
}
|
||||
}
|
||||
|
||||
if ($action === 'toggle') {
|
||||
$id = (int)($body['id'] ?? 0);
|
||||
if (!$id) jsonError('id requerido.');
|
||||
$pdo->prepare('UPDATE lab_ciudades SET activa = NOT activa WHERE id = ?')->execute([$id]);
|
||||
jsonOk([], 'Estado actualizado.');
|
||||
}
|
||||
|
||||
if ($action === 'delete') {
|
||||
$id = (int)($body['id'] ?? 0);
|
||||
if (!$id) jsonError('id requerido.');
|
||||
$uso = $pdo->prepare('SELECT COUNT(*) FROM lab_pacientes WHERE ciudad = (SELECT nombre FROM lab_ciudades WHERE id = ?)');
|
||||
$uso->execute([$id]);
|
||||
if ((int)$uso->fetchColumn() > 0) jsonError('No se puede eliminar: hay pacientes con esta ciudad. Desactívela en su lugar.');
|
||||
$pdo->prepare('DELETE FROM lab_ciudades WHERE id = ?')->execute([$id]);
|
||||
jsonOk([], 'Ciudad eliminada.');
|
||||
}
|
||||
|
||||
jsonError('action inválida.');
|
||||
Reference in New Issue
Block a user