This commit is contained in:
Lizandro Guarnizo
2026-06-16 12:06:26 -05:00
parent 275170f9d5
commit 415ea3ef56
9 changed files with 348 additions and 47 deletions
+73 -29
View File
@@ -174,40 +174,84 @@ class Formulario {
* Listar envíos (admin/enfermero).
*/
public function listarEnvios(array $filtros = [], int $pagina = 1, int $porPagina = 20): array {
$where = ['1=1'];
$params = [];
if (!empty($filtros['formulario_id'])) { $where[] = 'e.formulario_id = ?'; $params[] = $filtros['formulario_id']; }
if (!empty($filtros['paciente_id'])) { $where[] = 'e.paciente_id = ?'; $params[] = $filtros['paciente_id']; }
if (!empty($filtros['enviado_por'])) { $where[] = 'e.enviado_por = ?'; $params[] = $filtros['enviado_por']; }
if (!empty($filtros['estado'])) { $where[] = 'e.estado = ?'; $params[] = $filtros['estado']; }
if (!empty($filtros['fecha_desde'])) { $where[] = 'DATE(e.created_at) >= ?'; $params[] = $filtros['fecha_desde']; }
if (!empty($filtros['fecha_hasta'])) { $where[] = 'DATE(e.created_at) <= ?'; $params[] = $filtros['fecha_hasta']; }
if (!empty($filtros['paciente'])) { $where[] = 'p.nombre_completo LIKE ?'; $params[] = '%' . $filtros['paciente'] . '%'; }
$w = implode(' AND ', $where);
$origen = $filtros['origen'] ?? ''; // 'turnero' | 'otros' | '' (todos)
$offset = ($pagina - 1) * $porPagina;
// ── Rama 1: envíos normales (domicilios, envío manual, etc.) ──────────
$whereA = ['1=1'];
$paramsA = [];
if (!empty($filtros['formulario_id'])) { $whereA[] = 'e.formulario_id = ?'; $paramsA[] = $filtros['formulario_id']; }
if (!empty($filtros['paciente_id'])) { $whereA[] = 'e.paciente_id = ?'; $paramsA[] = $filtros['paciente_id']; }
if (!empty($filtros['enviado_por'])) { $whereA[] = 'e.enviado_por = ?'; $paramsA[] = $filtros['enviado_por']; }
if (!empty($filtros['estado'])) { $whereA[] = 'e.estado = ?'; $paramsA[] = $filtros['estado']; }
if (!empty($filtros['fecha_desde'])) { $whereA[] = 'DATE(e.created_at) >= ?'; $paramsA[] = $filtros['fecha_desde']; }
if (!empty($filtros['fecha_hasta'])) { $whereA[] = 'DATE(e.created_at) <= ?'; $paramsA[] = $filtros['fecha_hasta']; }
if (!empty($filtros['paciente'])) { $whereA[] = 'p.nombre_completo LIKE ?'; $paramsA[] = '%' . $filtros['paciente'] . '%'; }
$wA = implode(' AND ', $whereA);
$sqlA = "SELECT e.id, e.formulario_id, e.estado, e.created_at AS fecha,
f.nombre AS form_nombre, f.categoria,
p.nombre_completo AS paciente_nombre,
u.full_name AS enviado_por_nombre,
'otros' AS origen, e.token, NULL AS turno_codigo
FROM lab_form_envios e
JOIN lab_formularios f ON f.id = e.formulario_id
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
LEFT JOIN admin_users u ON u.id = e.enviado_por
WHERE $wA";
// ── Rama 2: consentimientos del turnero ───────────────────────────────
$whereB = ['1=1'];
$paramsB = [];
if (!empty($filtros['formulario_id'])) { $whereB[] = 'tc.formulario_id = ?'; $paramsB[] = $filtros['formulario_id']; }
if (!empty($filtros['estado'])) {
// Mapear estados: firmado=firmado, pendiente=pendiente/enviado/visto
if ($filtros['estado'] === 'firmado') {
$whereB[] = "tc.estado = 'firmado'";
} elseif ($filtros['estado'] === 'pendiente') {
$whereB[] = "tc.estado IN ('pendiente','enviado','visto')";
} else {
$whereB[] = '1=0'; // estados como 'completado'/'expirado' no aplican al turnero
}
}
if (!empty($filtros['fecha_desde'])) { $whereB[] = 'DATE(tc.enviado_at) >= ?'; $paramsB[] = $filtros['fecha_desde']; }
if (!empty($filtros['fecha_hasta'])) { $whereB[] = 'DATE(tc.enviado_at) <= ?'; $paramsB[] = $filtros['fecha_hasta']; }
if (!empty($filtros['paciente'])) { $whereB[] = 'p.nombre_completo LIKE ?'; $paramsB[] = '%' . $filtros['paciente'] . '%'; }
if (!empty($filtros['enviado_por'])) { $whereB[] = '1=0'; } // turnero no tiene enviado_por
$wB = implode(' AND ', $whereB);
$sqlB = "SELECT tc.id, tc.formulario_id, tc.estado, COALESCE(tc.enviado_at, tc.firmado_at) AS fecha,
f.nombre AS form_nombre, f.categoria,
p.nombre_completo AS paciente_nombre,
'Turnero' AS enviado_por_nombre,
'turnero' AS origen, tc.token, t.codigo AS turno_codigo
FROM turnero_consentimientos tc
JOIN lab_formularios f ON f.id = tc.formulario_id
JOIN turnero_turnos t ON t.id = tc.turno_id
LEFT JOIN turnero_solicitudes ts ON ts.turno_id = tc.turno_id
LEFT JOIN lab_pacientes p ON p.id = ts.paciente_id
WHERE $wB";
// ── Combinar según filtro origen ──────────────────────────────────────
if ($origen === 'turnero') {
$sql = $sqlB;
$params = $paramsB;
} elseif ($origen === 'otros') {
$sql = $sqlA;
$params = $paramsA;
} else {
$sql = "($sqlA) UNION ALL ($sqlB)";
$params = array_merge($paramsA, $paramsB);
}
$total = $this->db->fetch(
"SELECT COUNT(*) AS n
FROM lab_form_envios e
JOIN lab_formularios f ON f.id = e.formulario_id
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
LEFT JOIN admin_users u ON u.id = e.enviado_por
WHERE $w",
$params
"SELECT COUNT(*) AS n FROM ($sql) AS _u", $params
)['n'] ?? 0;
$rows = $this->db->fetchAll("
SELECT e.*, f.nombre AS form_nombre, f.categoria, f.esquema,
p.nombre_completo AS paciente_nombre,
u.full_name AS enviado_por_nombre
FROM lab_form_envios e
JOIN lab_formularios f ON f.id = e.formulario_id
LEFT JOIN lab_pacientes p ON p.id = e.paciente_id
LEFT JOIN admin_users u ON u.id = e.enviado_por
WHERE $w
ORDER BY e.created_at DESC
LIMIT ? OFFSET ?
", array_merge($params, [$porPagina, $offset]));
$rows = $this->db->fetchAll(
"SELECT * FROM ($sql) AS _u ORDER BY fecha DESC LIMIT ? OFFSET ?",
array_merge($params, [$porPagina, $offset])
);
return [
'data' => $rows,