feat(lab_pacientes): columna origen + vista mejorada con stats y filtros

- Migration: columna 'origen' (manual|rips|whatsapp) en lab_pacientes
- ingest_paciente.php: guarda origen='rips' en cada paciente importado
- Paciente::listar(): filtro por origen + orden por created_at DESC
- Paciente::stats(): conteo total/importados/con_wa/manuales
- get_pacientes.php: expone ?origen= y ?stats=1
- lab_pacientes.php: cards de stats clicables, badge origen por fila,
  columna ciudad, columna fecha registro, dropdown filtro por origen

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-09 11:16:52 -05:00
co-authored by Claude Sonnet 4.6
parent 32c166360c
commit 828e323eba
5 changed files with 148 additions and 24 deletions
+7 -1
View File
@@ -13,11 +13,17 @@ try {
jsonOk(['data' => [$row]]);
}
if (isset($_GET['stats'])) {
jsonOk(['stats' => $pac->stats()]);
}
$busqueda = trim($_GET['busqueda'] ?? $_GET['search'] ?? '');
$pagina = max(1, (int)($_GET['page'] ?? $_GET['pagina'] ?? 1));
$por = max(1, min(100, (int)($_GET['limit'] ?? $_GET['por_pagina'] ?? 30)));
$origen = in_array($_GET['origen'] ?? '', ['manual', 'rips', 'whatsapp'], true)
? $_GET['origen'] : '';
jsonOk($pac->listar($busqueda, $pagina, $por));
jsonOk($pac->listar($busqueda, $pagina, $por, $origen));
} catch (Exception $e) {
jsonError($e->getMessage(), 500);
}
+3
View File
@@ -121,6 +121,9 @@ if (!empty($data['ciudad'])) {
if (!empty($data['eps'])) {
$campos['eps'] = trim($data['eps']);
}
$origenValidos = ['manual', 'rips', 'whatsapp'];
$campos['origen'] = in_array($data['origen'] ?? '', $origenValidos, true)
? $data['origen'] : 'rips';
// ── Modo: "insertar" (solo nuevos) | "upsert" (crea o actualiza) ─────────────
$modo = trim($data['modo'] ?? 'upsert');