From 00232b351380e7dbeb76101927dd52a2d3067c9b Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 11 May 2026 13:45:36 -0500 Subject: [PATCH] up --- api/lab/get_metricas.php | 74 +++++++++++++++++++++++---- lab_reportes.php | 108 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 171 insertions(+), 11 deletions(-) diff --git a/api/lab/get_metricas.php b/api/lab/get_metricas.php index 83f7e19..c487899 100644 --- a/api/lab/get_metricas.php +++ b/api/lab/get_metricas.php @@ -167,18 +167,70 @@ try { [$desde, $hasta] ); + // ── 12. Tiempo de traslado: desde 'en_camino' hasta 'en_domicilio' ──────── + // Fuente: tabla lab_actividad_admin, accion='en_camino' y accion='en_domicilio' + // Se empareja por entidad_id (domicilio_id) y se exige que en_domicilio + // ocurra después de en_camino y dentro de un margen de 4 horas. + $traslado = $db->fetch( + "SELECT + ROUND(AVG(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)), 1) AS promedio_min, + MIN(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)) AS min_min, + MAX(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)) AS max_min, + COUNT(*) AS con_datos, + SUM(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at) <= 15) AS dentro_15min, + SUM(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at) <= 30) AS dentro_30min + FROM lab_actividad_admin tc + JOIN lab_actividad_admin td + ON td.entidad_id = tc.entidad_id + AND td.modulo = 'domicilios' + AND td.accion = 'en_domicilio' + AND td.created_at > tc.created_at + AND td.created_at <= DATE_ADD(tc.created_at, INTERVAL 4 HOUR) + JOIN lab_domicilios d ON d.id = tc.entidad_id + WHERE tc.modulo = 'domicilios' + AND tc.accion = 'en_camino' + AND d.fecha_programada BETWEEN ? AND ?", + [$desde, $hasta] + ) ?: []; + + // ── 13. Tiempo de traslado por enfermera (top 10 más rápidas) ───────────── + $trasladoPorEnfermera = $db->fetchAll( + "SELECT e.nombre_completo, + ROUND(AVG(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)), 1) AS promedio_min, + COUNT(*) AS viajes + FROM lab_actividad_admin tc + JOIN lab_actividad_admin td + ON td.entidad_id = tc.entidad_id + AND td.modulo = 'domicilios' + AND td.accion = 'en_domicilio' + AND td.created_at > tc.created_at + AND td.created_at <= DATE_ADD(tc.created_at, INTERVAL 4 HOUR) + JOIN lab_domicilios d ON d.id = tc.entidad_id + JOIN lab_asignaciones a ON a.domicilio_id = d.id AND a.estado NOT IN ('liberada') + JOIN lab_enfermeras e ON e.id = a.enfermera_id + WHERE tc.modulo = 'domicilios' + AND tc.accion = 'en_camino' + AND d.fecha_programada BETWEEN ? AND ? + GROUP BY e.id, e.nombre_completo + ORDER BY promedio_min ASC + LIMIT 10", + [$desde, $hasta] + ); + jsonOk([ - 'por_dia' => $porDia, - 'kpi' => $kpi, - 'tiempos' => $tiempos, - 'tiempo_agendamiento' => $tiempoAgen, - 'ranking_enfermeras' => $rankingEnf, - 'financiero' => $financiero, - 'por_modo_pago' => $porModoPago, - 'top_zonas' => $topZonas, - 'por_tipo_cliente' => $porTipoCliente, - 'top_examenes' => $topExamenes, - 'por_hora' => $porHora, + 'por_dia' => $porDia, + 'kpi' => $kpi, + 'tiempos' => $tiempos, + 'tiempo_agendamiento' => $tiempoAgen, + 'ranking_enfermeras' => $rankingEnf, + 'financiero' => $financiero, + 'por_modo_pago' => $porModoPago, + 'top_zonas' => $topZonas, + 'por_tipo_cliente' => $porTipoCliente, + 'top_examenes' => $topExamenes, + 'por_hora' => $porHora, + 'traslado' => $traslado, + 'traslado_por_enfermera' => $trasladoPorEnfermera, ]); } catch (Exception $e) { diff --git a/lab_reportes.php b/lab_reportes.php index 2d7c4df..df87106 100644 --- a/lab_reportes.php +++ b/lab_reportes.php @@ -400,6 +400,34 @@ require_once __DIR__ . '/shared/components/sidebar.php'; + + + +
lab_actividad_admin)
+ | Enfermero/a | +Prom. traslado | +Viajes | ++ |
|---|---|---|---|
| ${esc(e.nombre_completo)} | +${fmtMin(p)} | +${e.viajes} | +
+
+ |
+
Sin desglose por enfermero/a
'} +