Notas de versión — 7 de marzo de 2026
Esta versión ofrece una renovación completa del módulo de Informes y análisis: formatos de exportación a Excel y XML, retención del historial de informes, rediseño de tarjetas de estadísticas, mejoras del diseño de PDF y múltiples correcciones de UX.
Informes y análisis — Actualización principal
Exportación a Excel (PRO+)
Ahora los informes se pueden exportar a Excel (.xlsx) usando un libro de trabajo de dos hojas con formato profesional.
Estructura del libro de trabajo:
- Hoja Resumen — metadatos del informe, métricas clave, contexto de filtros
- Hoja Datos — columnas dinámicas (facturable, ingresos si aplica), tabla con estilo, encabezado fijo, filtro automático, colores de filas alternantes
Disponible desde:
- Página de Informes → Menú de exportación → Descargar Excel
- Informe guardado → Vista previa del informe → Botón Excel
- Informes programados → Selección de formato → Excel
Nivel: PRO+ (los usuarios del nivel FREE ven un chip PRO — Excel no disponible)
Exportación a XML (ENTERPRISE)
Los datos de seguimiento de tiempo ahora se pueden exportar como documentos XML estructurados.
Estructura del documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<report>
<meta>...</meta>
<filters>...</filters>
<metrics>...</metrics>
<dataPoints>
<entry>...</entry>
</dataPoints>
</report>
Nivel: Solo ENTERPRISE (FREE/PRO ven un chip ENTERPRISE)
Exportación a archivo JSON (ENTERPRISE)
Además de la respuesta JSON en línea de la API existente, los informes ahora se pueden descargar como archivo JSON independiente (.json) con Content-Disposition: attachment.
Nivel: Solo ENTERPRISE
Retención del historial de informes
Los informes guardados ahora se filtran según el nivel de suscripción:
| Nivel | Historial visible |
|---|---|
| FREE | Últimos 30 días |
| PRO | Últimos 365 días |
| ENTERPRISE | Ilimitado |
Un banner informativo en la página de Informes notifica a los usuarios FREE y PRO de su ventana de historial, con un aviso de actualización para los usuarios FREE.
Un trabajo de limpieza nocturno (se ejecuta a las 02:00) elimina automáticamente los informes más antiguos que el límite del nivel para mantener la base de datos limpia.
Agrupar por: Usuario (PRO+)
Ahora hay una nueva opción de agrupación "Por usuario" disponible en la página de Informes. Sustituye al antiguo selector reportType (resumen / detallado / exportar), que era redundante.
La opción de agrupación Usuario está desactivada con un chip PRO para los usuarios FREE.
Los 5 idiomas (EN / HU / DE / FR / ES) incluyen la nueva clave de traducción.
Tarjetas de estadísticas y Perspectivas rápidas — Corrección de visibilidad
Las 4 tarjetas de estadísticas (Total de horas, Total de entradas, Proyectos activos, Promedio por día) y la sección de Perspectivas rápidas no aparecían al cargar la página de Informes.
Causa raíz: currentUnit?.id no estaba en el array de dependencias de useEffect. Al montar, currentUnit era null, lo que hacía que la generación del informe se cortara antes de que cargara el espacio de trabajo.
Corregido en: AdvancedReports.tsx y BasicReports.tsx
Vista previa del informe — Diseño renovado
La página de Vista previa del informe ahora coincide con el diseño de la página principal de Informes:
- 4 tarjetas de estadísticas — Total de horas / Total de entradas / Proyectos activos / Promedio por día
- Perspectivas rápidas — Top 3 proyectos · Día más activo · Horas pico · Duración media de entrada
- A continuación: Información del informe → Gráfico → Tabla de datos
Tanto las estadísticas como las perspectivas se calculan con useMemo para mayor rendimiento.
Exportación a PDF — Diseño renovado
La salida PDF ahora coincide con el diseño de informes del frontend:
addMetrics() — reescrito:
- 4 tarjetas de estadísticas con color y barra de acento en el lado izquierdo
- Tamaño compacto:
boxH = 52(antes 72),fontSize = 18(antes 22), espaciado ajustado
addQuickInsights() — nueva sección:
- Top 3 proyectos + Día más activo + Horas pico + Duración media de entrada
- Posicionamiento absoluto X/Y por elemento — elimina errores de desbordamiento de texto
- Truncado de etiqueta a 17 caracteres
Corrección de gráfico:
- Los informes guardados con
chartType = 'table'anteriormente no producían gráfico en el PDF - Ahora recurre a gráfico de
bar; el gráfico se omite solo cuando no hay datos
Guardar como informe — Tipo de gráfico correcto
Al guardar un informe ad hoc como informe personalizado, el campo chartConfig.type ahora refleja correctamente la vista actualmente activa:
- Vista de gráfico activa → guarda como
BAR - Vista de tabla activa → guarda como
TABLE
Anteriormente, siempre se codificaba TABLE independientemente de la vista.
Tarjeta de estadísticas — Diseño compacto
Las tarjetas de estadísticas tanto en la página de Informes como en la Vista previa del informe ahora son más compactas:
| Propiedad | Antes | Después |
|---|---|---|
| Relleno de tarjeta | predeterminado (16 px) | py: 1.5 |
| Caja de icono | 48 × 48 | 40 × 40 |
| Variante de número | h4 | h5 |
| Altura de línea | predeterminado | 1.2 (número + etiquetas) |
Notificación "Ejecutar ahora" — Movida a la esquina superior derecha
La notificación "Informe ejecutado y enviado a N destinatario(s)" aparecía anteriormente en la parte inferior central de la pantalla (inconsistente con el resto de notificaciones).
Ahora usa la utilidad global notification y aparece en la esquina superior derecha, coherente con todas las demás notificaciones en la aplicación.
Seguridad y control de nivel
Informes programados — Control de backend
Los endpoints createReport y updateReport ahora aplican la verificación de nivel para schedule.enabled a nivel de API:
- Los usuarios FREE no pueden activar la programación mediante la API (antes solo estaba bloqueada en la IU)
- Devuelve
403 TIER_RESTRICTIONcontierRequired: 'pro'
Corrección de la capacidad customReports para PRO
customReports estaba incorrectamente establecido en false en la configuración del nivel PRO en stripe.config.ts. Se ha corregido a true (PRO: máximo 5 informes personalizados, ENTERPRISE: ilimitado).
Dependencias
| Paquete | Cambio |
|---|---|
exceljs | Añadido (generación de Excel) |
Archivos modificados
| Archivo | Cambio |
|---|---|
cadensa-backend/src/controllers/report.controller.ts | Endpoints de descarga de Excel / JSON / XML; control de nivel para informes programados; filtro de corte del historial de informes |
cadensa-backend/src/services/report/excel.service.ts | Nuevo — Generación de Excel con exceljs |
cadensa-backend/src/services/report/xml.service.ts | Nuevo — Generación de XML |
cadensa-backend/src/services/report/pdf.service.ts | Reescritura de addMetrics(); nueva sección addQuickInsights(); recurso a gráfico de barras en addChartPlaceholder() |
cadensa-backend/src/services/report/schedule.service.ts | Rama de formato Excel; cron de limpieza nocturna del historial |
cadensa-backend/src/config/stripe.config.ts | Corrección de PRO customReports: false → true |
cadensa-frontend/src/pages/reports/components/AdvancedReports.tsx | Corrección de dependencia currentUnit?.id; banner de historial; groupBy: user; tarjeta compacta; tipo de gráfico basado en viewMode; notification.* para "Ejecutar ahora" |
cadensa-frontend/src/pages/reports/components/BasicReports.tsx | Corrección de dependencia currentUnit?.id |
cadensa-frontend/src/pages/reports/ReportPreview.tsx | Diseño renovado: tarjetas de estadísticas + Perspectivas rápidas; botones PDF/Excel/XML/JSON |
cadensa-frontend/src/services/report.service.ts | downloadReportExcel, downloadReportJSON, downloadAdHocReportJSON, downloadReportXML, downloadAdHocReportXML |
cadensa-frontend/src/locales/{en,hu,de,fr,es}/reports.json | Claves xml, xmlFailed, jsonRequiresEnterprise, xmlRequiresEnterprise, groupBy_user |