diff --git a/api/lab/get_formularios.php b/api/lab/get_formularios.php index 4921304..de1ec52 100644 --- a/api/lab/get_formularios.php +++ b/api/lab/get_formularios.php @@ -19,6 +19,7 @@ try { if (!empty($_GET['fecha_desde'])) $filtros['fecha_desde'] = $_GET['fecha_desde']; if (!empty($_GET['fecha_hasta'])) $filtros['fecha_hasta'] = $_GET['fecha_hasta']; if (!empty($_GET['paciente'])) $filtros['paciente'] = trim($_GET['paciente']); + if (!empty($_GET['origen'])) $filtros['origen'] = $_GET['origen']; // Enfermero solo ve los suyos if (userRole() === 'enfermero') { $filtros['enviado_por'] = adminId(); diff --git a/classes/lab/Formulario.php b/classes/lab/Formulario.php index 2d4f533..43c064e 100644 --- a/classes/lab/Formulario.php +++ b/classes/lab/Formulario.php @@ -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, diff --git a/lab_formularios.php b/lab_formularios.php index 77b9f08..1f9ac75 100644 --- a/lab_formularios.php +++ b/lab_formularios.php @@ -121,6 +121,14 @@ require_once __DIR__ . '/shared/components/sidebar.php'; +