Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7580443
chore: añadir CONTRIBUTING y CODE_OF_CONDUCT
juandmg020407 May 26, 2026
c77c1b3
chore: extender .gitignore con reglas para Node, Next.js y SQLite
juandmg020407 May 26, 2026
196de43
feat(web): scaffold Next.js 14 con TypeScript, Tailwind y shadcn/ui
juandmg020407 May 26, 2026
803dde0
feat(web): añadir esquema Prisma con SQLite y seed de 47 pedidos en A…
juandmg020407 May 26, 2026
176719f
feat(web): autenticación JWT en cookie httpOnly y pantalla de login
juandmg020407 May 26, 2026
4ae1b07
feat(web): clientes OSRM y Nominatim con caché + helpers de formato
juandmg020407 May 26, 2026
62037c3
feat(web): API routes de pedidos, vehículos, usuarios e incidencias
juandmg020407 May 26, 2026
069c966
feat(web): pantalla de pedidos con tabla, filtros y creación con geoc…
juandmg020407 May 26, 2026
475608f
feat(web): optimizador VRP con 3 opciones por sector y reschedule por…
juandmg020407 May 26, 2026
d6d3c6d
feat(web): cliente Ollama, sistema de tools del chatbot y runner
juandmg020407 May 26, 2026
4144543
feat(web): UI del chatbot con sugerencias, burbujas y cards de tools
juandmg020407 May 26, 2026
8afdb66
feat(web): pantalla de mapa Leaflet con polyline real y panel de paradas
juandmg020407 May 26, 2026
1912780
docs: ARCHITECTURE, ROADMAP y README ampliado con frontend web/
juandmg020407 May 26, 2026
2b49667
docs: corregir errata en LICENSE
juandmg020407 May 26, 2026
91a5ca9
fix(web): limpiar imports sin usar y envolver useSearchParams en Susp…
juandmg020407 May 26, 2026
98626e4
ci: añadir workflow GitHub Actions con lint, type-check y build del f…
juandmg020407 May 26, 2026
54502b0
fix(web): fondo sólido en Dialog y Select para evitar transparencia c…
juandmg020407 May 26, 2026
6fd88dc
fix(web): coercer argumentos numéricos del chatbot y reforzar prompt
juandmg020407 May 26, 2026
747ee26
fix(web): sidebar fija con scroll independiente en el contenido princ…
juandmg020407 May 26, 2026
c713ab6
style(web): rediseñar pantalla de login con split layout profesional
juandmg020407 May 26, 2026
bf82c3d
docs: actualizar contacto en README
juandmg020407 May 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/workflows/web-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Web CI

# Valida el frontend Next.js en cada PR que toque web/ o el propio workflow,
# y en cada push directo a main que afecte a web/. El backend Python se valida
# en su propio workflow (ver py-ci.yml cuando exista).

on:
pull_request:
paths:
- "web/**"
- ".github/workflows/web-ci.yml"
push:
branches: [main]
paths:
- "web/**"
- ".github/workflows/web-ci.yml"

jobs:
lint-typecheck-build:
name: Lint, type-check y build
runs-on: ubuntu-latest

defaults:
run:
working-directory: ./web

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js 20
uses: actions/setup-node@v4
with:
node-version: "20"
cache: "npm"
cache-dependency-path: web/package-lock.json

- name: Instalar dependencias
run: npm ci

- name: Generar Prisma Client
run: npx prisma generate

- name: Lint con ESLint
run: npm run lint

- name: Type-check con TypeScript
run: npx tsc --noEmit

- name: Build de producción Next.js
run: npm run build
env:
# Valores dummy solo para que el build no falle por falta de envs.
# En producción se inyectan via secrets / variables del despliegue.
DATABASE_URL: "file:./ci.db"
JWT_SECRET: "ci-only-dummy-secret-not-used-in-prod"
OLLAMA_BASE_URL: "http://localhost:11434"
OLLAMA_MODEL: "llama3.1:8b"
OSRM_BASE_URL: "https://router.project-osrm.org"
NOMINATIM_BASE_URL: "https://nominatim.openstreetmap.org"
DEPOT_LAT: "38.3460"
DEPOT_LNG: "-0.4907"
86 changes: 73 additions & 13 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,22 @@ __pycache__/
*.so

# Distribution / packaging
# Nota: usamos rutas absolutas (/) para que las reglas Python solo apliquen
# al root del repo y no a subdirectorios como web/src/lib/.
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
/build/
/develop-eggs/
/dist/
/downloads/
/eggs/
/.eggs/
/lib/
/lib64/
/parts/
/sdist/
/var/
/wheels/
/share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
Expand Down Expand Up @@ -216,3 +218,61 @@ __marimo__/

# Streamlit
.streamlit/secrets.toml

# ────────────────────────────────────────────────────────────
# Frontend Next.js (web/)
# ────────────────────────────────────────────────────────────

# Node dependencies
node_modules/
.pnp
.pnp.js
.yarn/install-state.gz

# Next.js build output
.next/
out/
build/

# Env y secretos del frontend (NUNCA subir)
web/.env
web/.env.local
web/.env.*.local
web/.env.development
web/.env.production

# Bases de datos locales (cada uno hace su seed)
*.db
*.db-journal
*.sqlite
*.sqlite3

# Test artifacts y archivos temporales
.cookies.tmp
*.tmp

# TypeScript / Prisma generados
*.tsbuildinfo
next-env.d.ts
web/src/generated/

# Coverage / testing JS
coverage/
.nyc_output/

# IDE
.vscode/
.idea/
*.swp
*.swo

# OS
.DS_Store
Thumbs.db
desktop.ini

# Vercel
.vercel/

# Claude Code workspace
.claude/
43 changes: 43 additions & 0 deletions CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Contributor Covenant Code of Conduct

## Nuestro compromiso

Como miembros, contribuyentes y responsables de este proyecto, nos comprometemos a hacer de la participación en nuestra comunidad una experiencia libre de acoso para todas las personas, independientemente de la edad, complexión, discapacidad visible o invisible, etnia, características sexuales, identidad y expresión de género, nivel de experiencia, educación, estatus socioeconómico, nacionalidad, apariencia, raza, casta, color, religión, identidad u orientación sexual.

Nos comprometemos a actuar e interactuar de maneras que contribuyan a una comunidad abierta, acogedora, diversa, inclusiva y saludable.

## Nuestros estándares

Ejemplos de comportamiento que contribuyen a un entorno positivo:

* Demostrar empatía y amabilidad hacia otras personas.
* Respetar opiniones, puntos de vista y experiencias diferentes a las propias.
* Dar y aceptar adecuadamente retroalimentación constructiva.
* Aceptar la responsabilidad y pedir disculpas a quienes se vean afectados por nuestros errores, aprendiendo de la experiencia.
* Centrarse en lo que es mejor no solo para nosotros como individuos, sino para la comunidad en general.

Ejemplos de comportamiento inaceptable:

* Uso de lenguaje o imágenes sexualizadas, y aproximaciones o atenciones sexuales de cualquier tipo.
* Comentarios despectivos (*trolling*), insultantes y/o ataques personales o políticos.
* Acoso público o privado.
* Publicar información privada de otras personas, como direcciones físicas o electrónicas, sin su permiso explícito.
* Otras conductas que puedan ser razonablemente consideradas como inapropiadas en un entorno profesional.

## Aplicación de las responsabilidades

Los líderes de la comunidad son responsables de aclarar y hacer cumplir nuestros estándares de comportamiento aceptable y tomarán acciones correctivas apropiadas y justas en respuesta a cualquier comportamiento que consideren inapropiado, amenazante, ofensivo o dañino.

## Alcance

Este Código de Conducta aplica en todos los espacios del proyecto, e igualmente aplica cuando una persona representa al proyecto o a su comunidad en espacios públicos. Ejemplos de representación de nuestra comunidad incluyen el uso de una dirección de correo electrónico oficial, publicaciones en redes sociales con cuentas oficiales o actuar como representante designado en un evento.

## Aplicación

Los casos de comportamiento abusivo, acosador o de cualquier otro tipo inaceptable pueden ser denunciados a los líderes de la comunidad responsables del cumplimiento a través de los canales indicados en el README del proyecto. Todas las quejas serán revisadas e investigadas de manera oportuna y justa.

Todos los líderes de la comunidad están obligados a respetar la privacidad y la seguridad de quienes reporten incidentes.

## Atribución

Este Código de Conducta es una adaptación del [Contributor Covenant](https://www.contributor-covenant.org/), versión 2.1, disponible en https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
117 changes: 117 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# Contribuir a OpenRoute

¡Gracias por interesarte en OpenRoute! Este proyecto es la candidatura del equipo al [Hackathon "IA Responsable y Abierta en Industria" Mayo'26](https://digital.gob.es) (SEDIA + AESIA + EDIH Aragón) y se publica bajo licencia [Apache 2.0](LICENSE) para que cualquiera pueda usarlo, extenderlo y mejorarlo.

## Código de conducta

Este proyecto sigue el [Contributor Covenant](CODE_OF_CONDUCT.md). Al participar, te comprometes a mantener un entorno respetuoso e inclusivo.

## Estructura del proyecto

OpenRoute tiene **dos componentes complementarios**:

- **Backend de optimización (raíz del repo)** — Python + Streamlit + Google OR-Tools. Resuelve el VRP con restricciones de tiempo y capacidad, genera explicaciones XAI sobre las decisiones de ruta.
- **Frontend conversacional (`web/`)** — Next.js 14 + Ollama (LLM local) + Leaflet. Un chatbot en español que actúa como centro de comandos: consulta pedidos, sugiere rutas optimizadas, asigna furgonetas y reorganiza ante averías.

Ambos componentes pueden ejecutarse de forma independiente o integrarse (el frontend puede llamar al optimizador Python como microservicio para casos VRP con time windows estrictas).

Detalle técnico: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).

## Cómo contribuir

### Reportar bugs o sugerir mejoras

1. Busca primero en los [issues abiertos](../../issues) si tu problema ya está reportado.
2. Si no, abre un nuevo issue con:
- **Título claro**: qué pasa y dónde (especifica si afecta al backend Python o al frontend `web/`).
- **Pasos para reproducir** (si es un bug).
- **Comportamiento esperado vs. real**.
- **Entorno**: SO, versión de Python / Node, versión de Ollama si aplica, navegador.
- Capturas o logs si aplica.

Etiquetas útiles:
- `bug` — algo no funciona
- `enhancement` — propuesta de mejora
- `area:backend` — afecta a la parte Python
- `area:web` — afecta al frontend Next.js
- `good first issue` — buena para empezar
- `help wanted` — necesitamos ayuda
- `question` — duda de uso o arquitectura

### Enviar un Pull Request

1. Haz fork del repositorio.
2. Crea una rama descriptiva: `git checkout -b feat/mi-mejora` o `fix/bug-xyz`.
3. Asegúrate de que los componentes que tocas siguen funcionando:
- **Backend Python**: `pytest` (cuando los tests estén disponibles), `python optimizar_rutas.py` ejecuta sin errores.
- **Frontend web**: `cd web && npm run lint && npm run build`.
4. Haz commits pequeños y descriptivos siguiendo [Conventional Commits](https://www.conventionalcommits.org/):
- `feat(web): añadir tool de listado de incidencias al chatbot`
- `fix(optimizer): corregir capacidad por vehículo en restricción VRP`
- `docs: ampliar guía de arranque del frontend`
- `refactor(web): extraer cliente OSRM a su propio módulo`
- `chore: actualizar dependencias`
- `test(optimizer): añadir suite de pruebas unitarias para data_processor`
5. Abre un PR contra `main` describiendo:
- Qué problema resuelve.
- Cómo lo has resuelto.
- Qué componente afecta (backend / web / ambos).
- Cómo lo has probado.
- Capturas si afecta a la UI.

### Estilo de código

**Backend Python**:
- PEP 8 / `ruff` para linting.
- Type hints en funciones públicas.
- Docstrings en módulos y funciones complejas.

**Frontend Next.js (`web/`)**:
- TypeScript estricto. Evita `any`; usa tipos concretos o `unknown` + narrowing.
- Comentarios solo donde aporten contexto que el código no transmite por sí solo.
- No introduzcas abstracciones especulativas. Si dudas, escribe la forma directa.
- Validación de inputs con `zod` en los endpoints de API.

**Común**:
- La UI y los prompts del chatbot están en **español**. Mantén ese idioma para textos visibles.
- Los comentarios y commits pueden ser en español o inglés.

### Áreas donde nos vendría bien ayuda

- 🧪 **Tests**: cobertura para `optimizar_rutas.py` y para el `lib/chat/` del frontend.
- 🐳 **Docker**: un `docker-compose.yml` que levante backend Python + frontend Next.js + Ollama + OSRM self-hosted.
- 🔗 **Integración backend↔frontend**: añadir un tool al chatbot que llame al optimizador Python para casos con muchas paradas o restricciones complejas.
- 🌍 **Internacionalización**: extraer strings a un sistema i18n.
- ♿ **Accesibilidad**: auditoría WCAG de los componentes principales.
- 🔐 **Auth de producción**: integración con OAuth (Google, Microsoft) además del JWT local.
- 📊 **Ficha técnica del conductor**: KPIs históricos (rutas, tiempos, tasa de entrega).

## Setup de desarrollo

Ver [README.md](README.md) para los pasos de instalación de cada componente.

Resumen rápido:

```bash
# Backend Python (Streamlit + OR-Tools)
pip install -r requirements.txt
streamlit run app/main.py

# Frontend Next.js + Ollama (en otra terminal)
ollama pull llama3.1:8b
cd web
cp .env.example .env
npm install
npx prisma migrate dev
npm run db:seed
npm run dev
```

## Licencia

Al enviar un PR, aceptas que tu contribución se publique bajo la misma licencia [Apache 2.0](LICENSE) del proyecto.

## Contacto

- Issues y discusiones técnicas → [GitHub Issues](../../issues)
- Hackathon → [comunidad.ia.os@digital.gob.es](mailto:comunidad.ia.os@digital.gob.es)
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ Apache License

END OF TERMS AND CONDITIONS

Copyright 2026 Equipo IlicitIA (Juan David Morales, Samuel Parrra, Giulian Peterlecean)
Copyright 2026 Equipo IlicitIA (Juan David Morales, Samuel Parra, Giulian Peterlecean)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
Expand Down
Loading
Loading