import json import os import datetime from sqlalchemy.orm import Session from database import SessionLocal import models BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) with open(os.path.join(BASE_DIR, "data", "rutas.json")) as f: RUTAS = json.load(f) COLONIAS = {} with open(os.path.join(BASE_DIR, "data", "colonias-rutas.json")) as f: for item in json.load(f): COLONIAS[item["colonia"].lower()] = item def init_rutas(db: Session): for ruta in RUTAS: existe = db.query(models.EstadoRuta).filter_by(route_id=ruta["routeId"]).first() if not existe: db.add(models.EstadoRuta(route_id=ruta["routeId"], current_position_id=1)) db.commit() def avanzar_rutas(): db = SessionLocal() try: estados = db.query(models.EstadoRuta).all() for estado in estados: if estado.current_position_id < 8: estado.current_position_id += 1 estado.updated_at = datetime.datetime.utcnow() print(f"[SIM] {estado.route_id} → posición {estado.current_position_id}") else: estado.current_position_id = 1 db.commit() finally: db.close() def get_eta(route_id: str, db: Session): estado = db.query(models.EstadoRuta).filter_by(route_id=route_id).first() if not estado: return None ruta = next((r for r in RUTAS if r["routeId"] == route_id), None) if not ruta: return None pos = estado.current_position_id if pos >= 8: return {"mensaje": "El servicio de hoy ha finalizado.", "evento": "ROUTE_COMPLETED", "ventana_inicio": "--", "ventana_fin": "--"} pos_actual = ruta["positions"][pos - 1] pos_siguiente = ruta["positions"][min(pos, 7)] ts = datetime.datetime.fromisoformat(pos_siguiente["timestamp"].replace("Z", "+00:00")) ventana_fin = ts.strftime("%H:%M") ventana_inicio = (ts - datetime.timedelta(minutes=7)).strftime("%H:%M") if pos == 1: evento = "ROUTE_START" mensaje = "El camión está por iniciar su recorrido. Ten listos tus residuos." elif pos == 4: evento = "TRUCK_PROXIMITY" mensaje = f"El camión está a menos de 15 minutos. Saca tus bolsas a la acera." else: evento = "EN_CAMINO" mensaje = f"El camión llegará a tu zona entre las {ventana_inicio} y {ventana_fin}." return {"mensaje": mensaje, "evento": evento, "ventana_inicio": ventana_inicio, "ventana_fin": ventana_fin, "current_position": pos}