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 {