feat: eliminar filtro de tiempo de distancia en las rutas

This commit is contained in:
2026-09-03 13:48:17 -04:00
parent 7d696e6f16
commit 540bc46fc2
5 changed files with 83 additions and 35 deletions
@@ -11,6 +11,14 @@ import { RouteAssignedResponse, RouteNoAssignedResponse } from '../../../core/mo
import { colorForUsuario } from '../../../shared/utils/palette.utils';
import { DailyRouteSummary, haversineKm, sequenceRoutes, summarizeDailyRoutes } from '../../../shared/utils/route-sequencing.utils';
interface DailyRouteGroup {
day: string;
routes: DailyRouteSummary[];
totalStops: number;
totalDistance: number;
totalTravelHours: number;
}
interface MapRoute {
data: RouteAssignedResponse;
color: string;
@@ -53,6 +61,7 @@ export class RouteOverviewMapComponent implements OnInit, OnDestroy, AfterViewIn
dias: string[] = [];
selectedUsuarioId: string = 'Todos';
selectedDia: string = 'Todos';
expandedDailyRouteDay: string | null = null;
selectedRouteDetail: RouteAssignedResponse | null = null;
filteredRoutes: RouteAssignedResponse[] = [];
@@ -81,16 +90,41 @@ export class RouteOverviewMapComponent implements OnInit, OnDestroy, AfterViewIn
reassignError: string | null = null;
// Summary stats
get uniqueFilteredRoutes(): RouteAssignedResponse[] {
const unique = new Map<string, RouteAssignedResponse>();
for (const route of this.filteredRoutes) {
const pdvId = String(route.json.pdv_id);
if (!unique.has(pdvId)) unique.set(pdvId, route);
}
return Array.from(unique.values());
}
get totalDistancia(): string {
const uniqueIds = new Set(this.uniqueFilteredRoutes.map(route => String(route.json.pdv_id)));
const sum = this.mapRoutes.length
? this.mapRoutes.reduce((acc, route) => acc + (route.segmentDistanceKm ?? haversineKm(route.origin, route.destination)), 0)
: this.filteredRoutes.reduce((acc, route) => acc + Number(route.json.distancia), 0);
? this.mapRoutes
.filter(route => uniqueIds.has(String(route.data.json.pdv_id)))
.reduce((acc, route) => {
const firstSegment = this.mapRoutes.find(candidate => String(candidate.data.json.pdv_id) === String(route.data.json.pdv_id));
return firstSegment === route
? acc + (route.segmentDistanceKm ?? haversineKm(route.origin, route.destination))
: acc;
}, 0)
: this.uniqueFilteredRoutes.reduce((acc, route) => acc + Number(route.json.distancia), 0);
return sum.toFixed(2);
}
get totalDuracionMin(): string {
const uniqueIds = new Set(this.uniqueFilteredRoutes.map(route => String(route.json.pdv_id)));
const sum = this.mapRoutes.length
? this.mapRoutes.reduce((acc, route) => acc + (route.segmentDurationHours ?? Number(route.data.json.horas_desplazamiento)) * 60, 0)
: this.filteredRoutes.reduce((acc, route) => acc + Number(route.json.horas_desplazamiento) * 60, 0);
? this.mapRoutes
.filter(route => uniqueIds.has(String(route.data.json.pdv_id)))
.reduce((acc, route) => {
const firstSegment = this.mapRoutes.find(candidate => String(candidate.data.json.pdv_id) === String(route.data.json.pdv_id));
return firstSegment === route
? acc + (route.segmentDurationHours ?? Number(route.data.json.horas_desplazamiento)) * 60
: acc;
}, 0)
: this.uniqueFilteredRoutes.reduce((acc, route) => acc + Number(route.json.horas_desplazamiento) * 60, 0);
return sum.toFixed(0);
}
@@ -98,6 +132,31 @@ export class RouteOverviewMapComponent implements OnInit, OnDestroy, AfterViewIn
return summarizeDailyRoutes(this.filteredRoutes);
}
get dailyGroups(): DailyRouteGroup[] {
const order = ['Lunes', 'Martes', 'Miércoles', 'Miercoles', 'Jueves', 'Viernes'];
const groups = new Map<string, DailyRouteSummary[]>();
for (const summary of this.dailySummaries) {
const routes = groups.get(summary.day) ?? [];
routes.push(summary);
groups.set(summary.day, routes);
}
return Array.from(groups, ([day, routes]) => ({
day,
routes,
totalStops: routes.reduce((sum, route) => sum + route.routes.length, 0),
totalDistance: routes.reduce((sum, route) => sum + route.distanceKm, 0),
totalTravelHours: routes.reduce((sum, route) => sum + route.travelHours, 0)
})).sort((a, b) => order.indexOf(a.day) - order.indexOf(b.day));
}
toggleDailyRouteDay(day: string): void {
this.expandedDailyRouteDay = this.expandedDailyRouteDay === day ? null : day;
}
isDailyRouteDayExpanded(day: string): boolean {
return this.expandedDailyRouteDay === day;
}
constructor(
private routeState: RouteState,
private orsService: OrsService,