This commit is contained in:
Lizandro Guarnizo
2026-05-11 13:45:36 -05:00
parent f197118acb
commit 00232b3513
2 changed files with 171 additions and 11 deletions
+63 -11
View File
@@ -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) {