fix: mejorar el calculo de ETA usando duracion estimada de la BD y corregir etiquetas de tiempo en la interfaz

This commit is contained in:
2026-03-08 09:39:55 -05:00
parent 999cd75c11
commit 027cb80aec
2 changed files with 23 additions and 8 deletions

View File

@ -90,7 +90,7 @@
<div class="flex flex-col mt-0.5 gap-0.5"> <div class="flex flex-col mt-0.5 gap-0.5">
<span class="text-xs font-semibold text-gray-500 dark:text-gray-400 flex items-center gap-1"> <span class="text-xs font-semibold text-gray-500 dark:text-gray-400 flex items-center gap-1">
<span class="material-icons" style="font-size: 14px">schedule</span> <span class="material-icons" style="font-size: 14px">schedule</span>
{{ 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 }}
</span> </span>
<span class="text-[11px] font-medium text-gray-500 dark:text-gray-400 pl-4"> <span class="text-[11px] font-medium text-gray-500 dark:text-gray-400 pl-4">
<span v-if="bus.estado === 'pasó'">Pasó por tu parada a las</span> <span v-if="bus.estado === 'pasó'">Pasó por tu parada a las</span>

View File

@ -78,7 +78,7 @@ export function useETA() {
const [routeRes, stopsRes] = await Promise.all([ const [routeRes, stopsRes] = await Promise.all([
supabase supabase
.from('routes') .from('routes')
.select('distance_km, average_speed_kmh') .select('distance_km, average_speed_kmh, estimated_duration_minutes')
.eq('id', ruta_id) .eq('id', ruta_id)
.single(), .single(),
supabase supabase
@ -107,6 +107,13 @@ export function useETA() {
} }
distanciaAcumuladaKm *= 1.2; distanciaAcumuladaKm *= 1.2;
const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH; const velocidad = routeData.average_speed_kmh || VELOCIDAD_PROMEDIO_KMH;
// 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 tiempoViajeMinutos = (distanciaAcumuladaKm / velocidad) * 60;
const numeroParadas = targetStopIndex; const numeroParadas = targetStopIndex;
const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60; const tiempoParadasMinutos = (numeroParadas * TIEMPO_PARADA_SEGUNDOS) / 60;
@ -114,6 +121,7 @@ export function useETA() {
} }
} }
} }
}
// PASO 3: Calcular ETA para cada salida // PASO 3: Calcular ETA para cada salida
const ahora = new Date(); const ahora = new Date();
@ -135,16 +143,23 @@ export function useETA() {
// Si ya salió, el trayecto restante es base - transcurrido. Si no ha salido, es el base completo. // 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 minutosTransitoRestante = Math.max(0, minutosTransitoBase - minutosTranscurridosDesdeSalida);
const etaMinutos = minutosEsperaSalida + minutosTransitoRestante; const etaMinutos = minutosEsperaSalida + minutosTransitoRestante;
const minutosLlegadaEstablecidos = minutosSalida + minutosTransitoBase; 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 horaLlegada = format12h(minutosLlegadaEstablecidos);
const horaSalidaFormato = format12h(minutosSalida); const horaSalidaFormato = format12h(minutosSalida);
let estado: BusETA['estado']; let estado: BusETA['estado'];
const busYaSalio = minutosAhora >= minutosSalida;
if (etaMinutos > 5) { if (etaMinutos > 5) {
estado = (minutosAhora >= minutosSalida) ? 'en_camino' : 'próximo'; estado = busYaSalio ? 'en_camino' : 'próximo';
} else if (etaMinutos >= -2) { } else if (etaMinutos >= -2) {
estado = 'en_camino'; estado = 'en_camino';
} else { } else {