docs: README final con 220 colonias, Haversine, GPS y stack completo
This commit is contained in:
27
README.md
27
README.md
@@ -15,10 +15,11 @@ Frontend (React Native / Expo)
|
|||||||
↓ JWT + HTTPS + WebSocket
|
↓ JWT + HTTPS + WebSocket
|
||||||
API Gateway + Auth (FastAPI)
|
API Gateway + Auth (FastAPI)
|
||||||
↓ RBAC por domicilio
|
↓ RBAC por domicilio
|
||||||
┌──────────────────────────────────────┐
|
┌──────────────────────────────────────────┐
|
||||||
│ ETA Service │ Simulator │ WS │
|
│ ETA Service │ Simulator │ WS Server │
|
||||||
│ (cálculo) │ (cron job) │ Server│
|
│ (cálculo) │ (cron job) │ (tiempo │
|
||||||
└──────────────────────────────────────┘
|
│ + Haversine │ 15 rutas │ real) │
|
||||||
|
└──────────────────────────────────────────┘
|
||||||
↓
|
↓
|
||||||
PostgreSQL — Usuario → Domicilio → Zona → Ruta
|
PostgreSQL — Usuario → Domicilio → Zona → Ruta
|
||||||
## 🔒 Privacidad por Diseño
|
## 🔒 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] Registro e inicio de sesión con JWT (email o teléfono)
|
||||||
- [x] Múltiples domicilios por usuario (casa y trabajo)
|
- [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] ETA con ventana de llegada (±7 min)
|
||||||
- [x] Simulador de rutas — cron job cada 2 min avanza 15 rutas
|
- [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] 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] 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] Alertas operativas — retrasos y fallas mecánicas en tiempo real
|
||||||
- [x] Guía de separación de residuos (funciona offline)
|
- [x] Guía de separación de residuos (funciona offline)
|
||||||
- [x] RBAC — cada usuario solo consulta su ruta
|
- [x] RBAC — cada usuario solo consulta su ruta
|
||||||
@@ -56,6 +59,9 @@ PostgreSQL — Usuario → Domicilio → Zona → Ruta
|
|||||||
| Auth | JWT (python-jose + passlib) |
|
| Auth | JWT (python-jose + passlib) |
|
||||||
| Base de datos | PostgreSQL + SQLAlchemy |
|
| Base de datos | PostgreSQL + SQLAlchemy |
|
||||||
| Simulador | APScheduler (cron job cada 2 min) |
|
| 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) |
|
| Build nativo | EAS Build (Expo) |
|
||||||
| Control de versiones | Gitea (git.onlinces.net) |
|
| Control de versiones | Gitea (git.onlinces.net) |
|
||||||
|
|
||||||
@@ -83,8 +89,10 @@ Disponible en `http://localhost:8000/docs` (Swagger UI)
|
|||||||
## 📊 Datasets utilizados
|
## 📊 Datasets utilizados
|
||||||
|
|
||||||
- `data/rutas.json` — 15 rutas con 8 posiciones GPS cada una
|
- `data/rutas.json` — 15 rutas con 8 posiciones GPS cada una
|
||||||
- `data/colonias-rutas.json` — mapeo colonia → ruta + horario estimado
|
- `data/colonias-rutas.json` — 7 colonias oficiales del dataset
|
||||||
- `data/notificaciones.json` — 3 eventos de notificación push
|
- `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
|
## 🔌 Endpoints principales
|
||||||
|
|
||||||
@@ -97,7 +105,10 @@ Disponible en `http://localhost:8000/docs` (Swagger UI)
|
|||||||
| GET | `/eta/{domicilio_id}` | Ventana de llegada ETA |
|
| GET | `/eta/{domicilio_id}` | Ventana de llegada ETA |
|
||||||
| POST | `/reportes` | Buzón de retroalimentación |
|
| POST | `/reportes` | Buzón de retroalimentación |
|
||||||
| POST | `/alertas/operativa` | Crear alerta de retraso/falla |
|
| POST | `/alertas/operativa` | Crear alerta de retraso/falla |
|
||||||
|
| DELETE | `/alertas/operativa/{route_id}` | Eliminar alerta operativa |
|
||||||
| GET | `/alertas/operativa/activa` | Consultar alerta activa |
|
| 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 |
|
| WS | `/ws/eta/{domicilio_id}` | ETA en tiempo real vía WebSocket |
|
||||||
|
|
||||||
## 👤 Equipo
|
## 👤 Equipo
|
||||||
|
|||||||
Binary file not shown.
@@ -56,7 +56,7 @@ def get_eta(route_id: str, db: Session):
|
|||||||
pos = estado.current_position_id
|
pos = estado.current_position_id
|
||||||
if pos >= 8:
|
if pos >= 8:
|
||||||
return {"mensaje": "El servicio de hoy ha finalizado.", "evento": "ROUTE_COMPLETED",
|
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_actual = ruta["positions"][pos - 1]
|
||||||
pos_siguiente = ruta["positions"][min(pos, 7)]
|
pos_siguiente = ruta["positions"][min(pos, 7)]
|
||||||
ts = datetime.datetime.fromisoformat(pos_siguiente["timestamp"].replace("Z", "+00:00"))
|
ts = datetime.datetime.fromisoformat(pos_siguiente["timestamp"].replace("Z", "+00:00"))
|
||||||
|
|||||||
Reference in New Issue
Block a user