From 0de3e6e281aad3455d6ba3d9ad79c0f3557b470d Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 11 May 2026 14:55:17 -0500 Subject: [PATCH] up --- api/lab/get_metricas.php | 68 +++++++++++----------- api/lab/update_domicilio_enfermero.php | 3 + migrations/20260511_lab_hora_en_camino.sql | 9 +++ 3 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 migrations/20260511_lab_hora_en_camino.sql diff --git a/api/lab/get_metricas.php b/api/lab/get_metricas.php index c487899..aea1335 100644 --- a/api/lab/get_metricas.php +++ b/api/lab/get_metricas.php @@ -168,49 +168,51 @@ try { ); // ── 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. + // Fuente: columnas hora_en_camino y hora_llegada de lab_domicilios. + // hora_en_camino se guarda cuando el enfermero marca 'En camino'. + // hora_llegada se guarda cuando el enfermero marca 'En domicilio'. + // Se excluyen filas donde la llegada sea anterior a la salida (datos corruptos). $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 ?", + ROUND(AVG(TIMESTAMPDIFF(MINUTE, + CONCAT(fecha_programada,' ',hora_en_camino), + CONCAT(fecha_programada,' ',hora_llegada))), 1) AS promedio_min, + MIN(TIMESTAMPDIFF(MINUTE, + CONCAT(fecha_programada,' ',hora_en_camino), + CONCAT(fecha_programada,' ',hora_llegada))) AS min_min, + MAX(TIMESTAMPDIFF(MINUTE, + CONCAT(fecha_programada,' ',hora_en_camino), + CONCAT(fecha_programada,' ',hora_llegada))) AS max_min, + COUNT(*) AS con_datos, + SUM(TIMESTAMPDIFF(MINUTE, + CONCAT(fecha_programada,' ',hora_en_camino), + CONCAT(fecha_programada,' ',hora_llegada)) <= 15) AS dentro_15min, + SUM(TIMESTAMPDIFF(MINUTE, + CONCAT(fecha_programada,' ',hora_en_camino), + CONCAT(fecha_programada,' ',hora_llegada)) <= 30) AS dentro_30min + FROM lab_domicilios + WHERE fecha_programada BETWEEN ? AND ? + AND hora_en_camino IS NOT NULL + AND hora_llegada IS NOT NULL + AND hora_llegada > hora_en_camino", [$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, + ROUND(AVG(TIMESTAMPDIFF(MINUTE, + CONCAT(d.fecha_programada,' ',d.hora_en_camino), + CONCAT(d.fecha_programada,' ',d.hora_llegada))), 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') + FROM lab_domicilios d + 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 ? + WHERE d.fecha_programada BETWEEN ? AND ? + AND d.hora_en_camino IS NOT NULL + AND d.hora_llegada IS NOT NULL + AND d.hora_llegada > d.hora_en_camino GROUP BY e.id, e.nombre_completo ORDER BY promedio_min ASC LIMIT 10", diff --git a/api/lab/update_domicilio_enfermero.php b/api/lab/update_domicilio_enfermero.php index 0b37a58..29e7693 100644 --- a/api/lab/update_domicilio_enfermero.php +++ b/api/lab/update_domicilio_enfermero.php @@ -78,6 +78,9 @@ try { if ($estado === 'en_domicilio') { $campos['hora_llegada'] = date('H:i:s'); } + if ($estado === 'en_camino') { + $campos['hora_en_camino'] = date('H:i:s'); + } $db->update('lab_domicilios', $campos, 'id = ?', [$domId]); // Actualizar asignación si completado/cancelado diff --git a/migrations/20260511_lab_hora_en_camino.sql b/migrations/20260511_lab_hora_en_camino.sql new file mode 100644 index 0000000..6f36c95 --- /dev/null +++ b/migrations/20260511_lab_hora_en_camino.sql @@ -0,0 +1,9 @@ +-- Migración: agregar hora_en_camino a lab_domicilios +-- Se guarda cuando el enfermero marca el estado "En camino" desde el portal. +-- Junto con hora_llegada (guardada al marcar "En domicilio") permite calcular +-- el tiempo real de traslado por domicilio y por enfermero/a. + +ALTER TABLE `lab_domicilios` + ADD COLUMN `hora_en_camino` TIME DEFAULT NULL + COMMENT 'Hora en que el enfermero marcó En camino (HH:MM:SS, zona horaria del servidor)' + AFTER `hora_programada`;