up
This commit is contained in:
+73
-29
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user