From 027cb80aec00fcf1c255c30b4441e6b74e842573 Mon Sep 17 00:00:00 2001
From: Hanzo_dev <2002samudiojohan@gmail.com>
Date: Sun, 8 Mar 2026 09:39:55 -0500
Subject: [PATCH] fix: mejorar el calculo de ETA usando duracion estimada de la
BD y corregir etiquetas de tiempo en la interfaz
---
frontend/src/components/map/ETACard.vue | 2 +-
frontend/src/composables/useETA.ts | 29 +++++++++++++++++++------
2 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/frontend/src/components/map/ETACard.vue b/frontend/src/components/map/ETACard.vue
index 42efe80..846d9a2 100644
--- a/frontend/src/components/map/ETACard.vue
+++ b/frontend/src/components/map/ETACard.vue
@@ -90,7 +90,7 @@
schedule
- {{ bus.estado === 'pasó' ? 'Salió a las' : 'Sale a las' }} {{ bus.hora_salida }}
+ {{ (bus.estado === 'en_camino' || bus.estado === 'pasó') ? 'Salió a las' : 'Sale a las' }} {{ bus.hora_salida }}
Pasó por tu parada a las
diff --git a/frontend/src/composables/useETA.ts b/frontend/src/composables/useETA.ts
index c125c77..e2e8018 100644
--- a/frontend/src/composables/useETA.ts
+++ b/frontend/src/composables/useETA.ts
@@ -78,7 +78,7 @@ export function useETA() {
const [routeRes, stopsRes] = await Promise.all([
supabase
.from('routes')
- .select('distance_km, average_speed_kmh')
+ .select('distance_km, average_speed_kmh, estimated_duration_minutes')
.eq('id', ruta_id)
.single(),
supabase
@@ -107,10 +107,18 @@ export function useETA() {
}
distanciaAcumuladaKm *= 1.2;
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
- const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
- const numeroParadas = targetStopIndex;
- const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
- minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos;
+
+ // Si la ruta tiene una duración estimada en BD, la usamos como base para el trayecto total
+ // y calculamos la proporción según la parada.
+ if (routeData.estimated_duration_minutes && routeData.distance_km) {
+ const proporcionDistancia = distanciaAcumuladaKm / (routeData.distance_km * 1.2);
+ minutosHastaParada = routeData.estimated_duration_minutes * proporcionDistancia;
+ } else {
+ const tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
+ const numeroParadas = targetStopIndex;
+ const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
+ minutosHastaParada = tiempoViajeMinutos + tiempoParadasMinutos;
+ }
}
}
}
@@ -135,16 +143,23 @@ export function useETA() {
// Si ya salió, el trayecto restante es base - transcurrido. Si no ha salido, es el base completo.
const minutosTransitoRestante = Math.max(0, minutosTransitoBase - minutosTranscurridosDesdeSalida);
-
const etaMinutos = minutosEsperaSalida + minutosTransitoRestante;
+
const minutosLlegadaEstablecidos = minutosSalida + minutosTransitoBase;
+ // Logging para depuración (solo en desarrollo)
+ if (import.meta.env.DEV) {
+ console.log(`SIBU | Bus ${salida}: Ahora=${minutosAhora}, Salida=${minutosSalida}, Espera=${minutosEsperaSalida}, TransitoRest=${Math.round(minutosTransitoRestante)}, ETA=${Math.round(etaMinutos)}`);
+ }
+
const horaLlegada = format12h(minutosLlegadaEstablecidos);
const horaSalidaFormato = format12h(minutosSalida);
let estado: BusETA['estado'];
+ const busYaSalio = minutosAhora >= minutosSalida;
+
if (etaMinutos > 5) {
- estado = (minutosAhora >= minutosSalida) ? 'en_camino' : 'próximo';
+ estado = busYaSalio ? 'en_camino' : 'próximo';
} else if (etaMinutos >= -2) {
estado = 'en_camino';
} else {