diff --git a/modules/turnero/api/get_bandeja.php b/modules/turnero/api/get_bandeja.php new file mode 100644 index 0000000..5d11a62 --- /dev/null +++ b/modules/turnero/api/get_bandeja.php @@ -0,0 +1,129 @@ +query( + "SELECT id FROM turnero_sesiones ORDER BY id DESC LIMIT 1" +)->fetchColumn() ?: 0); + +// ── DETALLE ─────────────────────────────────────────────────── +if (isset($_GET['turno_id'])) { + $tid = (int)$_GET['turno_id']; + + $turno = $pdo->prepare(" + SELECT t.id, t.codigo, t.estado, t.paciente_nombre, t.inicio_lugar_at, t.fin_lugar_at, + ts.id AS sol_id, ts.numero_orden, + p.tipo_documento, p.numero_documento, p.fecha_nacimiento, p.telefono, + l.nombre AS lugar_nombre + FROM turnero_turnos t + JOIN turnero_solicitudes ts ON ts.turno_id = t.id + LEFT JOIN lab_pacientes p ON p.id = ts.paciente_id + LEFT JOIN turnero_lugares l ON l.id = t.lugar_destino_id + WHERE t.id = ? LIMIT 1 + "); + $turno->execute([$tid]); + $data = $turno->fetch(PDO::FETCH_ASSOC); + if (!$data) jsonError('Turno no encontrado', 404); + + $solId = (int)$data['sol_id']; + + // Exámenes agrupados por categoría + $stmtEx = $pdo->prepare(" + SELECT et.codigo, et.nombre, COALESCE(NULLIF(et.categoria,''),'Otros') AS categoria + FROM turnero_examen_items tei + JOIN exam_tipos et ON et.id = tei.exam_tipo_id + WHERE tei.solicitud_id = ? + ORDER BY categoria, et.nombre + "); + $stmtEx->execute([$solId]); + $examenesPorCat = []; + foreach ($stmtEx->fetchAll(PDO::FETCH_ASSOC) as $e) { + $examenesPorCat[$e['categoria']][] = $e['codigo']; + } + + // Muestras + $stmtM = $pdo->prepare(" + SELECT tm.id, tm.tipo_muestra, tm.estado, tm.motivo_rechazo, tm.recibida_at + FROM turnero_muestras tm + WHERE tm.solicitud_id = ? + ORDER BY tm.id + "); + $stmtM->execute([$solId]); + $muestras = $stmtM->fetchAll(PDO::FETCH_ASSOC); + + // Consentimientos + $stmtC = $pdo->prepare(" + SELECT tc.id, tc.estado, tc.token, tc.firmado_at, + lf.nombre AS formulario_nombre + FROM turnero_consentimientos tc + JOIN lab_formularios lf ON lf.id = tc.formulario_id + WHERE tc.turno_id = ? + ORDER BY tc.id + "); + $stmtC->execute([$tid]); + $consentimientos = $stmtC->fetchAll(PDO::FETCH_ASSOC); + + // Comentarios (todos los tipos) + $stmtCom = $pdo->prepare(" + SELECT tipo, usuario_nombre, comentario, creado_at + FROM turnero_comentarios + WHERE turno_id = ? + ORDER BY creado_at ASC + "); + $stmtCom->execute([$tid]); + $comentarios = $stmtCom->fetchAll(PDO::FETCH_ASSOC); + + jsonOk([ + 'turno' => $data, + 'examenes_por_cat'=> $examenesPorCat, + 'muestras' => $muestras, + 'consentimientos' => $consentimientos, + 'comentarios' => $comentarios, + ]); +} + +// ── LISTA ───────────────────────────────────────────────────── +$stmt = $pdo->prepare(" + SELECT t.id, t.codigo, t.paciente_nombre, t.estado, + t.inicio_lugar_at, t.fin_lugar_at, + ts.numero_orden, + l.nombre AS lugar_nombre + FROM turnero_turnos t + JOIN turnero_solicitudes ts ON ts.turno_id = t.id + JOIN turnero_lugares l ON l.id = t.lugar_destino_id + WHERE t.sesion_id = ? AND t.inicio_lugar_at IS NOT NULL + ORDER BY ts.numero_orden ASC +"); +$stmt->execute([$sesionId]); +$todos = $stmt->fetchAll(PDO::FETCH_ASSOC); + +$cerradosEstados = ['finalizado', 'ausente', 'cancelado']; +$activos = array_values(array_filter($todos, fn($t) => !in_array($t['estado'], $cerradosEstados))); +$cerrados = array_values(array_filter($todos, fn($t) => in_array($t['estado'], $cerradosEstados))); + +$stmtMp = $pdo->prepare(" + SELECT COUNT(*) FROM turnero_muestras tm + JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id + JOIN turnero_turnos t ON t.id = ts.turno_id + WHERE t.sesion_id = ? AND tm.estado = 'pendiente' +"); +$stmtMp->execute([$sesionId]); +$muestrasPendientes = (int)$stmtMp->fetchColumn(); + +jsonOk([ + 'activos' => $activos, + 'cerrados' => $cerrados, + 'stats' => [ + 'total' => count($todos), + 'activos' => count($activos), + 'cerrados' => count($cerrados), + 'muestras_pendientes' => $muestrasPendientes, + ], +]); diff --git a/modules/turnero/module.php b/modules/turnero/module.php index 81e1053..159bfd3 100644 --- a/modules/turnero/module.php +++ b/modules/turnero/module.php @@ -105,6 +105,8 @@ if ($_trIsRecep) { } } catch (\Throwable $_) {} + $_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja']; + if ($_trIpLugar) { // IP registrada: solo ese lugar en el sidebar foreach ($_trMuestras as $_m) { @@ -133,6 +135,7 @@ if ($_trIsRecep) { } else { $_trLinks[] = ['name' => 'Dashboard', 'icon' => 'fas fa-tachometer-alt', 'route' => '/erp.php?m=turnero&v=dashboard']; $_trLinks[] = ['name' => 'Historial', 'icon' => 'fas fa-history', 'route' => '/erp.php?m=turnero&v=historial']; + $_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja']; $_trLinks[] = ['name' => 'Chat Turnero', 'icon' => 'fab fa-whatsapp', 'route' => '/erp.php?m=turnero&v=chat']; $_trLinks[] = ['name' => 'Verificar Paciente', 'icon' => 'fas fa-id-card', 'route' => '/erp.php?m=turnero&v=verificar_paciente']; $_trLinks[] = ['name' => 'Configuración', 'icon' => 'fas fa-sliders-h', 'route' => '/erp.php?m=turnero&v=configuracion']; diff --git a/modules/turnero/views/bandeja.php b/modules/turnero/views/bandeja.php new file mode 100644 index 0000000..0f4874c --- /dev/null +++ b/modules/turnero/views/bandeja.php @@ -0,0 +1,645 @@ + + + +
+ +
+ Bandeja del día + + Activos: — + Cerrados: — + Muestras pend.: — + +
+ +
+ +
+
Cargando...
+
+ + +
+
+ +

Selecciona un paciente para ver el detalle

+
+
+
+
+ +
+ + + +