diff --git a/README.md b/README.md index 23d16a9..1621803 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,11 @@ Frontend (React Native / Expo) ↓ JWT + HTTPS + WebSocket API Gateway + Auth (FastAPI) ↓ RBAC por domicilio -┌──────────────────────────────────────┐ -│ ETA Service │ Simulator │ WS │ -│ (cálculo) │ (cron job) │ Server│ -└──────────────────────────────────────┘ +┌──────────────────────────────────────────┐ +│ ETA Service │ Simulator │ WS Server │ +│ (cálculo) │ (cron job) │ (tiempo │ +│ + Haversine │ 15 rutas │ real) │ +└──────────────────────────────────────────┘ ↓ PostgreSQL — Usuario → Domicilio → Zona → Ruta ## 🔒 Privacidad por Diseño @@ -32,12 +33,14 @@ PostgreSQL — Usuario → Domicilio → Zona → Ruta - [x] Registro e inicio de sesión con JWT (email o teléfono) - [x] Múltiples domicilios por usuario (casa y trabajo) -- [x] Alta de domicilio con combobox de colonias y código postal +- [x] Alta de domicilio con 220 colonias reales de Celaya por código postal +- [x] Geolocalización GPS para autocompletar dirección y CP +- [x] Validación geoespacial con algoritmo Haversine - [x] ETA con ventana de llegada (±7 min) - [x] Simulador de rutas — cron job cada 2 min avanza 15 rutas - [x] WebSockets para ETA en tiempo real (fallback a polling cada 2 min) - [x] 3 eventos de notificación: ROUTE_START, TRUCK_PROXIMITY, ROUTE_COMPLETED -- [x] Notificaciones configurables por tipo +- [x] Notificaciones configurables por tipo (activar/desactivar) - [x] Alertas operativas — retrasos y fallas mecánicas en tiempo real - [x] Guía de separación de residuos (funciona offline) - [x] RBAC — cada usuario solo consulta su ruta @@ -56,6 +59,9 @@ PostgreSQL — Usuario → Domicilio → Zona → Ruta | Auth | JWT (python-jose + passlib) | | Base de datos | PostgreSQL + SQLAlchemy | | Simulador | APScheduler (cron job cada 2 min) | +| Geoespacial | Haversine + Nominatim (OpenStreetMap) | +| Colonias | zippopotam.us + Nominatim (298 CPs, 220 colonias) | +| Geolocalización | expo-location + reverseGeocodeAsync | | Build nativo | EAS Build (Expo) | | Control de versiones | Gitea (git.onlinces.net) | @@ -83,8 +89,10 @@ Disponible en `http://localhost:8000/docs` (Swagger UI) ## 📊 Datasets utilizados - `data/rutas.json` — 15 rutas con 8 posiciones GPS cada una -- `data/colonias-rutas.json` — mapeo colonia → ruta + horario estimado -- `data/notificaciones.json` — 3 eventos de notificación push +- `data/colonias-rutas.json` — 7 colonias oficiales del dataset +- `data/colonias_celaya.json` — 298 colonias reales obtenidas via zippopotam.us +- `data/colonias_celaya_coords.json` — 220 colonias con coordenadas reales via Nominatim +- `data/colonias-rutas-completo.json` — 220 colonias mapeadas a 15 rutas con Haversine ## 🔌 Endpoints principales @@ -97,7 +105,10 @@ Disponible en `http://localhost:8000/docs` (Swagger UI) | GET | `/eta/{domicilio_id}` | Ventana de llegada ETA | | POST | `/reportes` | Buzón de retroalimentación | | POST | `/alertas/operativa` | Crear alerta de retraso/falla | +| DELETE | `/alertas/operativa/{route_id}` | Eliminar alerta operativa | | GET | `/alertas/operativa/activa` | Consultar alerta activa | +| GET | `/colonias-por-cp` | Colonias reales por código postal | +| GET | `/domicilios/ruta-por-coordenadas` | Mapeo GPS a ruta por Haversine | | WS | `/ws/eta/{domicilio_id}` | ETA en tiempo real vía WebSocket | ## 👤 Equipo diff --git a/backend/__pycache__/simulator.cpython-312.pyc b/backend/__pycache__/simulator.cpython-312.pyc index d7cfef8..66c8f06 100644 Binary files a/backend/__pycache__/simulator.cpython-312.pyc and b/backend/__pycache__/simulator.cpython-312.pyc differ diff --git a/backend/simulator.py b/backend/simulator.py index 305571a..6039a2d 100644 --- a/backend/simulator.py +++ b/backend/simulator.py @@ -56,7 +56,7 @@ def get_eta(route_id: str, db: Session): pos = estado.current_position_id if pos >= 8: return {"mensaje": "El servicio de hoy ha finalizado.", "evento": "ROUTE_COMPLETED", - "ventana_inicio": "--", "ventana_fin": "--"} + "ventana_inicio": "--", "ventana_fin": "--", "current_position": 8} pos_actual = ruta["positions"][pos - 1] pos_siguiente = ruta["positions"][min(pos, 7)] ts = datetime.datetime.fromisoformat(pos_siguiente["timestamp"].replace("Z", "+00:00"))