up
This commit is contained in:
+35
-33
@@ -168,49 +168,51 @@ try {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// ── 12. Tiempo de traslado: desde 'en_camino' hasta 'en_domicilio' ────────
|
// ── 12. Tiempo de traslado: desde 'en_camino' hasta 'en_domicilio' ────────
|
||||||
// Fuente: tabla lab_actividad_admin, accion='en_camino' y accion='en_domicilio'
|
// Fuente: columnas hora_en_camino y hora_llegada de lab_domicilios.
|
||||||
// Se empareja por entidad_id (domicilio_id) y se exige que en_domicilio
|
// hora_en_camino se guarda cuando el enfermero marca 'En camino'.
|
||||||
// ocurra después de en_camino y dentro de un margen de 4 horas.
|
// 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(
|
$traslado = $db->fetch(
|
||||||
"SELECT
|
"SELECT
|
||||||
ROUND(AVG(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)), 1) AS promedio_min,
|
ROUND(AVG(TIMESTAMPDIFF(MINUTE,
|
||||||
MIN(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)) AS min_min,
|
CONCAT(fecha_programada,' ',hora_en_camino),
|
||||||
MAX(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at)) AS max_min,
|
CONCAT(fecha_programada,' ',hora_llegada))), 1) AS promedio_min,
|
||||||
COUNT(*) AS con_datos,
|
MIN(TIMESTAMPDIFF(MINUTE,
|
||||||
SUM(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at) <= 15) AS dentro_15min,
|
CONCAT(fecha_programada,' ',hora_en_camino),
|
||||||
SUM(TIMESTAMPDIFF(MINUTE, tc.created_at, td.created_at) <= 30) AS dentro_30min
|
CONCAT(fecha_programada,' ',hora_llegada))) AS min_min,
|
||||||
FROM lab_actividad_admin tc
|
MAX(TIMESTAMPDIFF(MINUTE,
|
||||||
JOIN lab_actividad_admin td
|
CONCAT(fecha_programada,' ',hora_en_camino),
|
||||||
ON td.entidad_id = tc.entidad_id
|
CONCAT(fecha_programada,' ',hora_llegada))) AS max_min,
|
||||||
AND td.modulo = 'domicilios'
|
COUNT(*) AS con_datos,
|
||||||
AND td.accion = 'en_domicilio'
|
SUM(TIMESTAMPDIFF(MINUTE,
|
||||||
AND td.created_at > tc.created_at
|
CONCAT(fecha_programada,' ',hora_en_camino),
|
||||||
AND td.created_at <= DATE_ADD(tc.created_at, INTERVAL 4 HOUR)
|
CONCAT(fecha_programada,' ',hora_llegada)) <= 15) AS dentro_15min,
|
||||||
JOIN lab_domicilios d ON d.id = tc.entidad_id
|
SUM(TIMESTAMPDIFF(MINUTE,
|
||||||
WHERE tc.modulo = 'domicilios'
|
CONCAT(fecha_programada,' ',hora_en_camino),
|
||||||
AND tc.accion = 'en_camino'
|
CONCAT(fecha_programada,' ',hora_llegada)) <= 30) AS dentro_30min
|
||||||
AND d.fecha_programada BETWEEN ? AND ?",
|
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]
|
[$desde, $hasta]
|
||||||
) ?: [];
|
) ?: [];
|
||||||
|
|
||||||
// ── 13. Tiempo de traslado por enfermera (top 10 más rápidas) ─────────────
|
// ── 13. Tiempo de traslado por enfermera (top 10 más rápidas) ─────────────
|
||||||
$trasladoPorEnfermera = $db->fetchAll(
|
$trasladoPorEnfermera = $db->fetchAll(
|
||||||
"SELECT e.nombre_completo,
|
"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
|
COUNT(*) AS viajes
|
||||||
FROM lab_actividad_admin tc
|
FROM lab_domicilios d
|
||||||
JOIN lab_actividad_admin td
|
JOIN lab_asignaciones a ON a.domicilio_id = d.id
|
||||||
ON td.entidad_id = tc.entidad_id
|
AND a.estado NOT IN ('liberada')
|
||||||
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
|
JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
||||||
WHERE tc.modulo = 'domicilios'
|
WHERE d.fecha_programada BETWEEN ? AND ?
|
||||||
AND tc.accion = 'en_camino'
|
AND d.hora_en_camino IS NOT NULL
|
||||||
AND d.fecha_programada BETWEEN ? AND ?
|
AND d.hora_llegada IS NOT NULL
|
||||||
|
AND d.hora_llegada > d.hora_en_camino
|
||||||
GROUP BY e.id, e.nombre_completo
|
GROUP BY e.id, e.nombre_completo
|
||||||
ORDER BY promedio_min ASC
|
ORDER BY promedio_min ASC
|
||||||
LIMIT 10",
|
LIMIT 10",
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ try {
|
|||||||
if ($estado === 'en_domicilio') {
|
if ($estado === 'en_domicilio') {
|
||||||
$campos['hora_llegada'] = date('H:i:s');
|
$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]);
|
$db->update('lab_domicilios', $campos, 'id = ?', [$domId]);
|
||||||
|
|
||||||
// Actualizar asignación si completado/cancelado
|
// Actualizar asignación si completado/cancelado
|
||||||
|
|||||||
@@ -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`;
|
||||||
Reference in New Issue
Block a user