# Guion de presentación — Frontend (doli-front) > Tiempo estimado de esta parte: ~15 min dentro de los 50 min totales del equipo. --- ## 1. Introducción al frontend (2 min) - Qué es `doli-front`: SPA que consume el BFF para mostrar y gestionar los datos de Dolibarr. - Decisión técnica: **Vanilla JS** sin frameworks → sin dependencias de React/Vue, control total del DOM. - Herramienta de build: **Vite 7** — HMR instantáneo en desarrollo, build optimizado con ES Modules. --- ## 2. Arquitectura interna (3 min) Mostrar la estructura de carpetas en el IDE: ``` src/ ├── main.js ← punto de entrada, monta layout ├── router.js ← escucha hash, carga la página correcta ├── pages/ ← cada página es una función que devuelve un HTMLElement ├── services/ ← apiClient.js centraliza el fetch + JWT └── components/ ← sidebar, modales reutilizables ``` **Puntos clave a explicar:** - El router es hash-based (`#/facturas`, `#/clientes`…) → no necesita servidor con rutas configuradas. - `apiClient.js`: adjunta el token JWT automáticamente en cada petición, redirige al login en 401. - Cada página encapsula su propio estado, listeners y cleanup (sin estado global compartido). --- ## 3. Demo en vivo — recorrido por las páginas (8 min) Abrir la app en el navegador y mostrar: ### Dashboard - Gráficas de facturas con **Chart.js**. - Métricas en tarjetas (total clientes, facturas pendientes…). ### Facturas de proveedores ← parte más completa - Listar facturas con búsqueda en tiempo real. - Abrir detalle: ver líneas, importes, estado. - Cambiar estado: Borrador → Validada → Pagada (botones contextuales). - Añadir línea a una factura en borrador. - Registrar un pago (seleccionar tipo, importe, fecha). - Eliminar factura en borrador con confirmación. ### Contactos - Búsqueda en tiempo real sobre la tabla. - Ver detalle / editar inline. - Crear nuevo contacto con selector de empresa. ### Configuración - Toggle tema claro/oscuro (persiste en localStorage). - Temporizador de expiración del JWT en tiempo real. - Configurar URL de webhook (Teams/Slack). - Registro de certificado VeriFactu: selector de archivo `.p12` → se convierte a base64 → se envía al BFF. --- ## 4. Decisiones técnicas destacables (2 min) - **Sin framework**: cada página es una función `render*()` → fácil de leer, sin magia. - **FileReader API**: el certificado `.p12` se lee en el navegador y se convierte a base64 antes de enviarlo, sin exponer rutas del servidor. - **Asistente de voz**: Whisper ejecutándose en local en el navegador con `@huggingface/transformers` (sin APIs externas de voz). - **Toast notifications**: sistema propio ligero sin librerías externas. - **Cleanup de páginas**: cada página registra un método `cleanup()` que el router llama al navegar, evitando memory leaks de intervals/listeners. --- ## Capturas recomendadas para incluir en slides - Captura del dashboard con las gráficas. - Captura del modal de detalle de factura de proveedor (con líneas y pagos). - Captura de la sección VeriFactu en ajustes. - Diagrama simple del flujo: `Página → apiClient → BFF`. --- ## Posibles preguntas del profesor **¿Por qué Vanilla JS y no React?** → Para demostrar conocimiento de las APIs del navegador sin abstracciones. El proyecto es de tamaño manejable y no requería el overhead de un framework. **¿Cómo gestionas el estado?** → Cada página tiene su propio estado local (variables en el closure). No hay estado global; el router destruye la página anterior antes de montar la nueva. **¿Cómo funciona el JWT?** → El BFF devuelve un token al hacer login. El frontend lo guarda en `localStorage` y `apiClient.js` lo adjunta en el header `Authorization: Bearer` de cada petición. **¿Cómo se integra con VeriFactu?** → La página de ajustes lee el `.p12` como base64 con `FileReader`, lo envía al BFF, y el BFF lo reenvía al servicio Go que valida y almacena el certificado.