Damm Smart Truck - InterHack BCN 2026
MVP desarrollado para INTERHACK BCN 2026. El proyecto convierte datos operativos de reparto en una experiencia web para planificar rutas, explicar decisiones logísticas y validar la distribución de carga de un camión Damm.
Repositorio: https://github.com/Francois0405/LosCaptcha_InterHack
Equipo
- Carlos Morales Artés
- François Liraud Mathieu
- Ghazal Khitou Khitou
- Silvia Monfort Moya
- Erik Andres Villca Tunari
Problema
La operativa de reparto combina datos de pedidos, clientes, horarios, direcciones, productos y capacidad del camión. Si la ruta y la carga se planifican por separado, aparecen fricciones operativas:
- Paradas fuera de secuencia o mal agrupadas.
- Descarga lenta porque los productos no están en la zona adecuada del camión.
- Retornables sin espacio reservado.
- Poca trazabilidad para explicar por qué una ruta o una carga es mejor que otra.
Solución
La aplicación propone una ruta optimizada y una distribución de carga coordinada con esa ruta.
Incluye:
- Dashboard operativo con KPIs de clientes, paradas, ocupación y retornables.
- Mapa Leaflet con ruta por carretera, paradas numeradas, salida y regreso al almacén.
- Optimización de secuencia con OR-Tools, usando fallback heurístico si no está disponible.
- Cálculo de tiempos/distancias con OSRM y fallback por distancia Haversine.
- Pantalla de carga del camión con zonas P1-P6, validación visual y drag & drop.
- Chat operativo con Gemini para explicar ruta, carga, riesgos y retornables.
Tecnologías
- Python 3
- Django 5
- django-mongodb-backend
- MongoDB
- PyMongo
- OR-Tools
- Pandas
- Bootstrap
- Leaflet
- OpenStreetMap / OSRM
- Gemini API
Estructura
txt LosCaptcha_InterHack/ ├── config/ # Configuración Django ├── damm/ │ ├── mapa.py # Modelo de ruta, OR-Tools, OSRM y formato frontend │ ├── views.py # Vistas, APIs y contexto de pantallas │ ├── urls.py # Rutas de la app │ └── models.py # Modelos base Django ├── mongo_migrations/ # Migraciones para backend MongoDB ├── scripts/ │ └── csv_to_json.py # Conversión de CSV a JSON ├── static/ │ ├── assets/ # JSON de datos operativos │ ├── csv/ # CSV originales │ ├── css/styles.css # Estilos de la aplicación │ ├── img/ # Imágenes y logos │ ├── js/main.js # Interacción frontend, mapa, carga y chat │ └── vendor/bootstrap/ # Bootstrap local ├── templates/ │ ├── dashboard.html # Panel principal │ ├── mapa.html # Ruta optimizada │ ├── distribucion.html # Carga del camión │ └── index.html ├── manage.py ├── requirements.txt └── README.md
Configuración
Crear un archivo .env en LosCaptcha_InterHack/:
env SECRET_KEY=dev-secret-key DEBUG=True MONGODB_URI=mongodb+srv://usuario:password@cluster/db MONGODB_NAME=BD_DAMM GEMINI_API_KEY=tu_api_key_opcional GEMINI_MODEL=gemini-2.5-flash ROUTE_DEMO_LIMIT=5
Notas:
- MONGODB_URI y MONGODB_NAME son necesarios para Django.
- GEMINI_API_KEY solo es necesario para que el chat responda con Gemini.
- ROUTE_DEMO_LIMIT limita el número de clientes usados en la demo de ruta.
Instalación
Desde la raíz del repositorio:
bash cd LosCaptcha_InterHack python -m venv .venv source .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r requirements.txt
Si pip no interpreta correctamente requirements.txt, conviértelo a UTF-8 o instala las dependencias principales:
bash python -m pip install Django django-mongodb-backend pymongo dnspython python-dotenv ortools pandas
Datos
La aplicación espera colecciones MongoDB con los nombres usados por el backend:
- horarios_entrega.json
- cabecera_transporte.json
- detalle_entrega.json
- direcciones.json
- materiales_zubic.json
- zm040.json
- zonas.json
Los JSON de referencia están en static/assets/. Si partes de los CSV, usa:
bash python scripts/csv_to_json.py
Después importa los JSON en MongoDB manteniendo el mismo nombre de colección. Ejemplo:
bash mongoimport --uri "$MONGODB_URI" --db "$MONGODB_NAME" --collection direcciones.json --file static/assets/direcciones.json --jsonArray
Ejecución
bash python manage.py runserver
Abrir:
APIs
- GET /api/dashboard/: KPIs y resumen operativo.
- GET /api/route/: datos de ruta, paradas, almacén y regreso.
- GET /api/load-plan/: distribución de carga por zonas del camión.
- POST /api/gemini-chat/: preguntas al asistente operativo.
Payload básico para Gemini:
json { "question": "Explícame por qué esta ruta es mejor", "context": {} }
Funcionamiento de la ruta
El flujo principal está en damm/mapa.py:
- Lee pedidos, direcciones y horarios desde MongoDB.
- Geocodifica o usa coordenadas disponibles.
- Construye una matriz de tiempos con OSRM.
- Resuelve la secuencia con OR-Tools.
- Si OR-Tools u OSRM fallan, usa fallback heurístico.
- Devuelve un JSON preparado para templates/mapa.html y static/js/main.js.
El mapa pinta:
- Almacén de salida.
- Paradas numeradas.
- Línea de ruta por carretera.
- Regreso al almacén para descarga de retornables.
Distribución de carga
La pantalla /distribucion divide el camión en zonas:
- P1 / P2: primeras paradas y productos prioritarios.
- P3: ruta media.
- P4: referencias agrupadas.
- P5: reserva de retornables.
- P6: últimas paradas.
El usuario puede mover paquetes entre zonas. La interfaz recalcula avisos y score operativo según accesibilidad, equilibrio, ocupación y retornables.
Limitaciones del MVP
- La geocodificación externa depende de Nominatim.
- OSRM público puede limitar o rechazar peticiones.
- El algoritmo usa un límite de clientes para demo mediante ROUTE_DEMO_LIMIT.
- Las métricas de impacto están orientadas a demostración y explicabilidad.
- DEBUG=True está pensado solo para desarrollo.
Log in or sign up for Devpost to join the conversation.