| name | plandemovilidad-patterns |
| description | Patrones de proyecto PLANDEMOVILIDAD v3.0 — generador de Planes de Movilidad Sostenible (PMST/PTST). Arquitectura, módulos, helpers, convenciones, archivos sagrados, clases CSS. |
PLANDEMOVILIDAD — Patrones de Proyecto
Identidad
- Proyecto: PLANDEMOVILIDAD v3.0 — Generador de Planes de Movilidad Sostenible al Trabajo (PMST/PTST)
- Usuario/Dueño: David Antizar (Ntizar)
- Stack: Vanilla JS + IndexedDB + Leaflet + Chart.js + WeasyPrint (servidor para PDF)
- Propósito: Generar informes profesionales de 60-80 páginas que cumplen la Ley 8/2021 de movilidad sostenible
Estructura del Proyecto
PLANDEMOVILIDAD/
├── index.html ← Entry point, importa todos los módulos como type="module"
├── style.css ← SAGRADO — diseño general
├── deploy.sh ← Despliegue
├── js/
│ ├── config.js ← SAGRADO — config global, constantes
│ ├── utils.js ← SAGRADO — utilidades
│ ├── graficas.js ← SAGRADO — gráficas Chart.js
│ ├── export.js ← SAGRADO — export a PDF/DOCX/ZIP
│ ├── informe.js ← Orquestador del informe
│ ├── ia-generativa.js ← IA generativa (qwen3.6 vía api.nan.builders)
│ ├── report.js ← SHIM — re-exporta desde js/report/index.js
│ ├── report-maps.js ← Mapas Leaflet para el informe HTML
│ └── report/ ← Módulos del generador de informe
│ ├── helpers.js ← CONSTANTES + helpers (fmt, pct, safe, getCO2e...)
│ ├── css.js ← CSS embebido para el informe HTML
│ ├── index.js ← Orquestador: generarInformeCompleto(app)
│ ├── 00-portada.js ← 22 capítulos (00-21)
│ └── ...
Archivos SAGRADOS (NO MODIFICAR sin permiso)
style.css, index.html, config.js, utils.js, graficas.js, export.js
Arquitectura del Generador de Informe
Flujo de datos
export.js → generarInformeCompleto(app) (importado de ./report.js)
report.js re-exporta desde ./report/index.js
index.js importa 22 capítulos + helpers, ensambla HTML completo
- Cada capítulo importa helpers desde
./helpers.js
- HTML completo → blob → WeasyPrint → PDF ~70 páginas
Convenciones de código
- Cada capítulo < 200 líneas. Si supera, extraer sub-funciones internas.
- Los capítulos NO se llaman entre sí. Solo importan helpers.
- helpers.js NO importa nada. Nivel más bajo de dependencia.
- css.js NO importa nada.
- index.js es el único que importa capítulos directamente.
export function generarInformeCompleto(app) = interfaz pública.
Helpers principales
fmt(num, decimales=1)
pct(num)
fechaLarga()
fechaCorta()
safe(obj, path, default)
safeNum(obj, path, default)
safeArr(obj, path)
getEmpleados(app)
getModalSplit(app)
getCO2e(app)
getResumen(app)
getCSS()
Factores de emisión CO2e (kg/km)
Coche particular: 0.192 | Compartido: 0.115 | Bus urbano: 0.089 | Bus interurbano: 0.045
Metro: 0.035 | Cercanías: 0.033 | Tranvía: 0.029 | Bici: 0.000 | Bici eléctrica: 0.006
A pie: 0.000 | VMP: 0.015 | Teletrabajo: 0.010
Regla crítica
N/D > dato inventado — Si API no devuelve datos, mostrar "Sin datos" o "N/D". NUNCA inventar.
Clases CSS del informe
.chapter / .chapter-title / .section-title / .subsection-title
.highlight-box (.warning, .success, .danger)
.kpi-grid / .kpi-card (.accent, .green)
.dafo-grid / .dafo-box (.fortalezas, .debilidades, .oportunidades, .amenazas)
.cronograma-row / .cronograma-bar / .cronograma-header
.badge (.alta, .media, .baja)
.firma-grid / .firma-box
.portada / .indice / .indice-item
.informe-footer
- Utilidades:
.page-break, .no-break, .text-center, .text-sm, .font-bold, .text-blue, .text-orange
Navegación
- Sin backend. Todo frontend estático + APIs externas.
- IA:
api.nan.builders/v1 con key de localStorage.
- PDF: HTML → WeasyPrint (servidor).
- Mapas: Leaflet + OSM + GBFS + POIs + isocronas.
- Canvas/Leaflet NO renderizan en PDF.