11 KiB
Reporting — Roadmap de tareas
Este documento divide la implementación en tickets pequeños y verificables. F-142 solo entrega discovery/arquitectura; no implementa dashboards. Las referencias RPT-* son identificadores de trabajo del plan y se han abierto en backlog como:
| Plan | Ticket backlog | Título |
|---|---|---|
| RPT-001 | F-143 | Contracts, filters and RBAC |
| RPT-002 | F-144 | Historical store and financial snapshots |
| RPT-003 | F-145 | Payment lines and POS cash-safe capture |
| RPT-004 | F-146 | ReportingService, summary and sales API |
| RPT-005 | F-147 | Admin reporting shell and global filters |
| RPT-006 | F-148 | Sales dashboard and channel views |
| RPT-007 | F-149 | Product, category and brand reports |
| RPT-008 | F-150 | CSV export |
RPT-009 en adelante se abrirá como backlog cuando sus dependencias P0 estén aprobadas.
Dependencias y orden recomendado
RPT-001 contratos/filtros/RBAC
├── RPT-002 datos históricos mínimos (store, tax/cost snapshots)
├── RPT-003 líneas de pago POS/ecommerce
└── RPT-004 ReportingService + summary/sales
├── RPT-005 Admin shell + filtros URL
├── RPT-006 Sales dashboard / channel / store / terminal
├── RPT-007 Product/category/brand reports
└── RPT-008 CSV export
RPT-003 ──> RPT-011 Payments report
RPT-002 ──> RPT-012 Tax report / RPT-013 margin
POS cash implementation ──> RPT-014 cash report
Refund model ──> RPT-015 refunds report
Regla: ningún ticket debe inventar datos ausentes; si una métrica no tiene fuente, se incorpora como unavailable o se crea primero el ticket de modelo correspondiente.
P0 — Base útil y primera entrega
RPT-001 — Reporting contracts, filters and permissions
Objetivo: crear ReportingFilters, parser común, rangos relativos, comparación y permisos backend/frontend.
Incluye:
- intervalos
[from,to)en UTC + zonaEurope/Madridpara agrupaciones; - presets hoy/ayer/7/30 días/mes/año/período anterior;
channel, tiendas, terminales, cajeros, producto, categoría, marca, cliente, estado;- paginación, orden y límite máximo;
- respuesta común con
range,comparison,dataAvailability,updatedAt; - permisos
REPORTING_*, incluyendoREPORTING_FINANCIALyREPORTING_EXPORT; - tests de fechas invertidas, zona, cero y filtros combinados.
No incluye: SQL de reportes ni UI final.
RPT-002 — Reporting data snapshots and store scope
Objetivo: hacer reportables de forma fiable las dimensiones históricas obligatorias.
Evaluar/implementar en migraciones:
orders_orders.store_idNOT NULL, FK, backfill y escritura desde ecommerce/POS/admin;- snapshot
vat_rateycost_at_sale_centsnullable enorders_items; - snapshot de marca/categoría solo si el negocio necesita histórico estable, no copiar el catálogo sin justificación;
- separación de
shipping_centsde los totales; - índices medidos para fecha/tienda/canal.
Aceptación: migración reversible/documentada, ventas antiguas conservan valores, margen/IVA siguen unavailable si faltan snapshots.
RPT-003 — Payment lines and cash-safe payment capture
Objetivo: poder informar efectivo/tarjeta/otros y pagos mixtos sin guardar datos de tarjeta.
Incluye:
- tabla inmutable
order_payment_lineso equivalente, con order, método, tienda, terminal, sesión, importe, currency, provider ref, estado y timestamps; - integración de venta ecommerce y POS con la línea real;
- idempotencia por evento/provider;
- no PAN/CVV;
- relación con reembolsos preparada.
Aceptación: una venta con uno o varios métodos se puede sumar exactamente una vez; pruebas de duplicado y cross-store.
RPT-004 — ReportingService, summary and sales API
Objetivo: primera API real de reporting a partir de pedidos/líneas.
Endpoints: GET /reporting/summary y GET /reporting/sales.
Métricas P0: ventas totales registradas, pedidos/tickets, unidades, ticket medio, descuentos e impuestos registrados; tendencia y comparación cuando haya período anterior.
Agrupaciones: día, semana, mes, canal, tienda y terminal cuando existan.
Aceptación: SQL parametrizado, sin N+1, estados documentados, respuesta de disponibilidad, tests unitarios de fórmulas e integración con ecommerce/POS.
RPT-005 — Admin Reporting shell and global filters
Objetivo: añadir Reporting al menú Admin y una pantalla /reporting reutilizando Auth/API/layout existentes.
Componentes: ReportingLayout, ReportingFilters, DateRangePicker, ComparisonSelector, KpiCard, ComparisonKpi, loading/error/empty/no-data states.
Aceptación: filtros se reflejan en URL, sobreviven navegación válida, tablet usable, no se cargan listas masivas en frontend, backend autoriza cada petición.
RPT-006 — Sales dashboard and channel/store views
Objetivo: presentar summary/sales real sin recalcular en React.
Incluye: KPIs, tendencia, ecommerce vs TPV, tiendas, terminales y tabla paginada con drill-down a pedidos.
Aceptación: filtros globales, comparación equivalente, importes EUR en céntimos convertidos solo para presentación, unavailable cuando no hay store/terminal histórico.
RPT-007 — Product, category and brand reports
Objetivo: ranking de productos y desglose de categorías/marcas usando catálogo real.
Incluye: top 10/25/50, unidades, ventas de mercancía, precio medio, descuento, devoluciones si existen; filtros y orden server-side.
Nota: marcar que categoría/marca es clasificación actual mientras no exista snapshot histórico.
RPT-008 — CSV export
Objetivo: exportar summary/sales/products respetando exactamente filtros, rango, orden y columnas.
Aceptación: stream/paginación server-side, BOM/encoding adecuado para Excel, cabecera con fecha/zona/filtros, permission REPORTING_EXPORT, límites y auditoría.
RPT-009 — Reporting frontend API client and table primitives
Objetivo: adaptar api-client.ts con tipos de respuesta y tabla reutilizable sin duplicar fetch/serialización.
Incluye: abort/cancel de consultas, estados de error, columnas configurables y enlaces drill-down.
RPT-010 — P0 integration and regression suite
Objetivo: fixtures transaccionales y pruebas end-to-end.
Casos: venta ecommerce, venta POS COMPLETED, pedido cancelado, descuento, stock confirmado, comparación de período, filtro tienda no autorizada y export con filtros.
P1 — Informes operativos y comerciales
RPT-011 — Payments report
Depende de RPT-003. Importe, operaciones, porcentaje, medio y devoluciones por método; admite pago mixto y filtra método/tienda/terminal.
RPT-012 — Fiscal/IVA report
Depende del snapshot fiscal de RPT-002. Base imponible, tipo de IVA, cuota y total usando datos de la venta, nunca configuración actual.
RPT-013 — Customers report
Clientes únicos, nuevos, recurrentes, pedidos, ventas, ticket y última compra. Ocultar PII según permiso y separar walk-ins.
RPT-014 — Inventory report
Stock actual por tienda, vendido, stock bajo/sin stock, rotación aproximada y días de stock solo con denominador suficiente. Usa inventory_stock, movimientos y pedidos sin duplicar ventas.
RPT-015 — Products without movement
Configurable 30/60/90 días: stock positivo + última venta anterior al umbral. Indicar “sin historial” distinto de “sin movimiento”.
RPT-016 — Categories and brands detail
Tablas con ventas/unidades/pedidos/% y navegación a producto; clasificación histórica documentada.
RPT-017 — Discounts report
Depende de snapshot de promoción. Total, porcentaje, media, código/tipo, producto/categoría/tienda/terminal/cajero y descuentos manuales identificables.
RPT-018 — Refund model and report
Crear primero order_refunds/líneas y luego importe, cantidad, motivo, producto, canal, tienda, terminal, usuario y porcentaje sobre ventas. No inferir importe desde estado.
RPT-019 — Cash sessions report
Depende de movimientos de caja/pagos POS. Apertura, ventas efectivo, esperado, contado, diferencia, cajero, terminal, tienda y filtro “solo diferencias”. Proteger con REPORTING_CASH/REPORTING_FINANCIAL.
RPT-020 — Drill-down navigation
Ventas → canal → tienda → terminal → producto → pedido/ticket, conservando filtros compatibles y evitando IDs sensibles en URLs no autorizadas.
RPT-021 — Period comparison UX
Presets y período equivalente; mostrar valor actual, anterior y porcentaje/null. Tests para períodos con cero y distinta duración.
RPT-022 — Server-side reporting tables
Paginación, búsqueda, sorting, selección de columnas y límites. Nunca cargar decenas de miles de filas en React.
P2 — Análisis avanzado condicionado a datos
RPT-023 — Historical cost and gross margin
Solo tras cost_at_sale_cents: revenue, COGS, gross profit y margen por producto/categoría/marca/tienda/canal. No usar el coste actual.
RPT-024 — Sales by hour and weekday
Agrupación en zona local, line/bar chart y tabla de horas punta/valle. Validar volumen mínimo para evitar conclusiones engañosas.
RPT-025 — Sales heatmap
Heatmap día de semana/hora por ventas o tickets, con selector de métrica y accesibilidad alternativa en tabla.
RPT-026 — Advanced stock analytics
Rotación, velocidad de venta, días de stock y productos sin movimiento con ventanas configurables y advertencia de aproximación.
RPT-027 — XLSX export
Exportación server-side con columnas/formato/filtros y límites; conservar auditoría y evitar bloqueo del request.
RPT-028 — PDF export
Solo para informes donde el formato aporte valor (resumen/caja/fiscal); no convertir tablas grandes a PDF sin paginación.
P3 — Evolución futura, no implementar ahora
- RPT-029 — Forecast de ventas.
- RPT-030 — Forecast y alertas de stock.
- RPT-031 — Alertas de negocio.
- RPT-032 — Informes programados/email.
- RPT-033 — ABC de productos, cohortes y RFM.
- RPT-034 — Integración con BI/API externa.
- RPT-035 — Materialized views/agregaciones cuando volumen y EXPLAIN lo justifiquen.
Definition of Done común
- Contrato/API/documentación actualizados.
- Backend calcula métricas; frontend no duplica reglas financieras.
- Query parametrizada y plan revisado para consultas críticas.
- Permiso backend + prueba negativa cross-store.
- Estados loading/empty/error/no-data/unavailable.
- Unit tests de cálculos y integration tests de datos reales.
- CSV/XLSX respeta filtros si aplica.
npm run build,npm test,./scripts/verify.shy gates reviewer/security/qa verdes.