# Módulo de Reportes El frontend expone **tres sistemas de reportes distintos**, con configuración, rutas y componentes propios cada uno. No son variantes del mismo flujo: apuntan a integraciones distintas del lado del backend, y uno de ellos (`informes`) no tiene backend real detrás todavía. | Sistema | Ruta base | Config | Componente runner | Backend real | |---|---|---|---|---| | **Reportes HTML** | `/reportes-html/:module` | `config/htmlReports.ts` → `htmlReportsConfig` | `HtmlReportRunner.tsx` | `mini-backend/routers/reports.py` (Jinja2 + WeasyPrint, datos de HANA) — **sí implementado** | | **Reportes Crystal** | `/reportes-crystal/:module` | `config/crystalReports.ts` → `crystalReportsConfig` | `CrystalReportRunner.tsx` | `mini-backend/routers/apigateway.py` (SAP B1 API Gateway / Crystal Reports Server) — **sí implementado** | | **Informes** | `/informes/:module` | `config/reports.ts` → `reportsConfig` | `ReportRunner.tsx` | Ninguno confirmado — ver nota abajo | ### Nota sobre `informes` (`ReportRunner.tsx` + `reportsConfig`) `reportsConfig` (en `config/reports.ts`) define reportes como "Estado de Cuenta", "Saldos de Clientes", "Ventas por Artículo", "Kardex de Artículos", etc., cada uno con un `endpoint` del tipo `/api/reports/socios/estado-cuenta`, `/api/reports/inventario/kardex`, etc. El único endpoint que `mini-backend/routers/reports.py` expone bajo `/api/reports/` es `POST /api/reports/stickers`. Ninguno de los endpoints que `reportsConfig` referencia existe en el backend actual. Esto sugiere que `ReportRunner.tsx` y `reportsConfig` son un scaffold frontend para reportes planeados a futuro, no un flujo funcional hoy — cualquier reporte del módulo "Informes" fallará al generar hasta que se implemente su endpoint correspondiente en el backend. ## Arquitectura General ```mermaid graph TB subgraph "Listados (elegir reporte)" RHL[HtmlReportsList.tsx] RCL[CrystalReportsList.tsx] MRL[ModuleReportsList.tsx] end subgraph "Runners (parámetros + ejecución)" HRR[HtmlReportRunner.tsx] CRR[CrystalReportRunner.tsx] RR[ReportRunner.tsx] RPF[ReportParameterForm.tsx] RRV[ReportResultsView.tsx] MST[ModalSearchTemplate.tsx
búsqueda F4] end subgraph "Config" CFG_H[htmlReportsConfig] CFG_C[crystalReportsConfig] CFG_R[reportsConfig] end subgraph "Backend FastAPI (mini-backend)" REP[routers/reports.py
POST /api/reports/stickers] APIGW[routers/apigateway.py
GET/POST /api/apigateway/reports/*] HANA[core/hana.py
hana_connection] AGW_CORE[core/api_gateway.py
forward_to_api_gateway] end subgraph "Externo" HANADB[(HANA DB)] SAPGW[SAP B1 API Gateway
rs/v1 Crystal Reports Server] end RHL --> CFG_H --> HRR RCL --> CFG_C --> CRR MRL --> CFG_R --> RR HRR --> RPF CRR --> RPF RR --> RPF RR --> RRV HRR -.f4-modal.-> MST CRR -.f4-modal.-> MST HRR -->|POST /api/reports/:endpoint| REP REP --> HANA --> HANADB CRR -->|POST /api/apigateway/reports/:docCode/export| APIGW RCL -.al listar.-> APIGW APIGW --> AGW_CORE --> SAPGW RR -.->|"endpoint del reportsConfig
(no existe en el backend)"| REP ``` ## Flujo real: Reporte HTML (ejemplo "stickers") ```mermaid sequenceDiagram actor User as Usuario participant List as HtmlReportsList participant Runner as HtmlReportRunner participant Modal as ModalSearchTemplate participant API as api.ts participant Backend as reports.py participant HANA as HANA User->>List: /reportes-html/inventario List->>List: lee htmlReportsConfig["inventario"] List-->>User: tarjeta "Impresión de Etiquetas" User->>Runner: clic → /reportes-html/inventario/stickers Runner->>Runner: busca definition por docCode "stickers" Runner-->>User: formulario (Documento f4-modal, Cantidad, Formato, Papel) User->>Runner: clic en campo "Documento" Runner->>Modal: abre ModalSearchTemplate (endpoint DeliveryNotes) Modal-->>User: tabla de guías de remisión User->>Modal: selecciona guía Modal-->>Runner: DocEntry seleccionado User->>Runner: completa cantidad/formato y clic "Generar Reporte" Runner->>API: POST /api/reports/stickers {doc_entry, cantidad, formato, papel} API->>Backend: fetch con X-Session-Token Backend->>HANA: STICKERS_QUERY (datos de la guía por DocEntry) HANA-->>Backend: fila con cliente, dirección, etc. Backend->>Backend: renderiza templates/reports/stickers.html (Jinja2) alt formato = pdf Backend->>Backend: WeasyPrint HTML → PDF Backend-->>API: StreamingResponse application/pdf else formato = html Backend-->>API: HTMLResponse end API-->>Runner: blob Runner-->>User: