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:
co-authored by
Claude Sonnet 4.6
parent
32c166360c
commit
828e323eba
+30
-12
@@ -27,20 +27,25 @@ class Paciente {
|
||||
public function listar(
|
||||
string $busqueda = '',
|
||||
int $pagina = 1,
|
||||
int $porPagina = 30
|
||||
int $porPagina = 30,
|
||||
string $origen = ''
|
||||
): array {
|
||||
$offset = ($pagina - 1) * $porPagina;
|
||||
$like = "%$busqueda%";
|
||||
$params = $busqueda
|
||||
? [$like, $like, $like, $like]
|
||||
: [];
|
||||
|
||||
$where = $busqueda
|
||||
? "WHERE p.nombre_completo LIKE ?
|
||||
OR p.numero_documento LIKE ?
|
||||
OR p.telefono LIKE ?
|
||||
OR p.email LIKE ?"
|
||||
: '';
|
||||
$conditions = [];
|
||||
$params = [];
|
||||
|
||||
if ($busqueda) {
|
||||
$conditions[] = "(p.nombre_completo LIKE ? OR p.numero_documento LIKE ? OR p.telefono LIKE ? OR p.email LIKE ?)";
|
||||
$params = [$like, $like, $like, $like];
|
||||
}
|
||||
if ($origen) {
|
||||
$conditions[] = "p.origen = ?";
|
||||
$params[] = $origen;
|
||||
}
|
||||
|
||||
$where = $conditions ? 'WHERE ' . implode(' AND ', $conditions) : '';
|
||||
|
||||
$total = $this->db->fetch(
|
||||
"SELECT COUNT(*) AS n FROM lab_pacientes p $where",
|
||||
@@ -56,7 +61,7 @@ class Paciente {
|
||||
FROM lab_pacientes p
|
||||
LEFT JOIN users u ON u.id = p.user_id
|
||||
$where
|
||||
ORDER BY p.nombre_completo ASC
|
||||
ORDER BY p.created_at DESC, p.nombre_completo ASC
|
||||
LIMIT ? OFFSET ?
|
||||
", array_merge($params, [$porPagina, $offset]));
|
||||
|
||||
@@ -69,6 +74,19 @@ class Paciente {
|
||||
];
|
||||
}
|
||||
|
||||
public function stats(): array {
|
||||
return $this->db->fetch("
|
||||
SELECT
|
||||
COUNT(*) AS total,
|
||||
SUM(origen = 'rips') AS importados,
|
||||
SUM(origen = 'manual') AS manuales,
|
||||
SUM(origen = 'whatsapp') AS whatsapp,
|
||||
SUM(user_id IS NOT NULL) AS con_wa
|
||||
FROM lab_pacientes
|
||||
WHERE is_active = 1
|
||||
") ?: ['total' => 0, 'importados' => 0, 'manuales' => 0, 'whatsapp' => 0, 'con_wa' => 0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Un paciente por ID (con datos del usuario WhatsApp).
|
||||
*/
|
||||
@@ -238,7 +256,7 @@ class Paciente {
|
||||
'user_id', 'numero_documento', 'tipo_documento',
|
||||
'nombre_completo', 'telefono', 'email',
|
||||
'fecha_nacimiento', 'genero', 'direccion',
|
||||
'ciudad', 'barrio', 'eps', 'notas_admin', 'is_active',
|
||||
'ciudad', 'barrio', 'eps', 'notas_admin', 'is_active', 'origen',
|
||||
];
|
||||
$campos = array_intersect_key($datos, array_flip($permitidos));
|
||||
if (!empty($campos['telefono'])) {
|
||||
|
||||
Reference in New Issue
Block a user