46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
"""
|
|
Caso de Uso: ObtenerETA
|
|
Orquesta la lógica: valida que la zona pertenece al usuario,
|
|
busca la ruta asignada y devuelve solo el ETA.
|
|
"""
|
|
from dataclasses import dataclass
|
|
from typing import Optional
|
|
|
|
from app.domain.interfaces.i_ruta_repository import IRutaRepository
|
|
|
|
|
|
@dataclass
|
|
class ETAResponse:
|
|
zona_id: str
|
|
estado: str
|
|
eta_minutos: Optional[int]
|
|
mensaje: str
|
|
ruta_nombre: str
|
|
|
|
|
|
class ObtenerETAUseCase:
|
|
def __init__(self, repo: IRutaRepository):
|
|
self.repo = repo
|
|
|
|
def ejecutar(self, zona_id: str) -> Optional[ETAResponse]:
|
|
ruta = self.repo.obtener_ruta_por_zona(zona_id)
|
|
if not ruta:
|
|
return None
|
|
|
|
estado = self.repo.obtener_estado(ruta.id)
|
|
if not estado:
|
|
return ETAResponse(
|
|
zona_id=zona_id,
|
|
estado="sin_iniciar",
|
|
eta_minutos=None,
|
|
mensaje="El camión aún no ha iniciado su ruta para hoy.",
|
|
ruta_nombre=ruta.nombre,
|
|
)
|
|
|
|
return ETAResponse(
|
|
zona_id=zona_id,
|
|
estado=estado.estado.value,
|
|
eta_minutos=estado.eta_minutos,
|
|
mensaje=estado.mensaje,
|
|
ruta_nombre=ruta.nombre,
|
|
) |