diff --git a/backend/src/data/mocks/notification-types.mock.ts b/backend/src/data/mocks/notification-types.mock.ts index 3d752ce..fb9e19e 100644 --- a/backend/src/data/mocks/notification-types.mock.ts +++ b/backend/src/data/mocks/notification-types.mock.ts @@ -3,6 +3,7 @@ export const NotificationType = { ROUTE_START: "ROUTE_START", TRUCK_PROXIMITY: "TRUCK_PROXIMITY", + TRUCK_ARRIVED: "TRUCK_ARRIVED", ROUTE_COMPLETED: "ROUTE_COMPLETED", DELAY: "DELAY", MECHANICAL_FAILURE: "MECHANICAL_FAILURE", @@ -25,6 +26,10 @@ export const notificationPayloads: Record title: "Camión Cercano", body: "El camión está a menos de 15 minutos de tu domicilio. Es momento de sacar tus bolsas a la acera.", }, + TRUCK_ARRIVED: { + title: "¡El camión ya está aquí!", + body: "El camión recolector llegó a tu zona. Saca tus residuos a la acera ahora.", + }, ROUTE_COMPLETED: { title: "Servicio Finalizado", body: "El camión de tu sector ha concluido su jornada de recolección diaria.", @@ -43,5 +48,6 @@ export const notificationPayloads: Record export const positionTriggers: Record = { 2: NotificationType.ROUTE_START, 4: NotificationType.TRUCK_PROXIMITY, + 5: NotificationType.TRUCK_ARRIVED, 8: NotificationType.ROUTE_COMPLETED, -}; \ No newline at end of file +}; diff --git a/backend/src/domain/use-cases/notifications/calculate-eta.use-case.ts b/backend/src/domain/use-cases/notifications/calculate-eta.use-case.ts index 31083da..090afc5 100644 --- a/backend/src/domain/use-cases/notifications/calculate-eta.use-case.ts +++ b/backend/src/domain/use-cases/notifications/calculate-eta.use-case.ts @@ -8,7 +8,9 @@ export interface EtaResult { message: string; } -const PROXIMITY_POSITION_ID = 4; +// El destino real (cuando el camión está en tu colonia) es positionId=5, +// donde speed=0. positionId=4 es el "punto de alerta de proximidad" (~12 min antes). +const ARRIVAL_POSITION_ID = 5; const WINDOW_MARGIN_MIN = 5; export class CalculateEtaUseCase { @@ -28,11 +30,11 @@ export class CalculateEtaUseCase { } const target = route.positions.find( - (p) => p.positionId === PROXIMITY_POSITION_ID, + (p) => p.positionId === ARRIVAL_POSITION_ID, ); if (!target) { throw CustomError.internalServer( - `Route ${route.routeId} has no proximity position`, + `Route ${route.routeId} has no arrival position`, ); } @@ -50,6 +52,8 @@ export class CalculateEtaUseCase { let message: string; if (etaMinutes < 0) { message = `El camión ya pasó por tu zona (aprox. ${arrivalWindow.from} - ${arrivalWindow.to}).`; + } else if (etaMinutes === 0) { + message = "El camión ya está en tu zona. Saca tus residuos ahora."; } else if (etaMinutes <= 15) { message = `Llega en aproximadamente ${etaMinutes} minutos.`; } else {