--- id: "US-PFM-014" title: "Generar Reporte PDF" type: "User Story" status: "Ready" priority: "Alta" epic: "OQI-008" project: "trading-platform" story_points: 5 created_date: "2026-01-25" updated_date: "2026-01-25" --- # US-PFM-014: Generar Reporte PDF **Épica:** OQI-008 - Portfolio Manager **Story Points:** 5 | **Prioridad:** P0 --- ## Historia de Usuario **Como** inversor **Quiero** generar reportes PDF de mi portafolio **Para** análisis offline o compartir con asesores financieros --- ## Criterios de Aceptación ```gherkin Scenario: Seleccionar período de reporte Given estoy en la sección de reportes del portafolio And tengo datos de inversión disponibles When selecciono un rango de fechas Then puedo elegir período predeterminado (mensual, trimestral, anual) And puedo ingresar fechas personalizadas And el período es validado contra datos disponibles Scenario: Generar reporte con gráficos Given seleccioné un período válido When solicito generar reporte PDF Then el documento incluye gráficos de: - Evolución del valor del portafolio (línea temporal) - Distribución por activos (pie chart) - Comparativo portafolio vs benchmark - Retorno acumulado vs rentabilidad mensual (barras) Scenario: Incluir métricas de rendimiento Given el reporte está siendo generado When se incluyen métricas de rendimiento Then veo en el documento: - Rentabilidad total (%) - Rentabilidad anualizada - Volatilidad - Ratio de Sharpe - Máxima pérdida acumulada (drawdown) - Ratio ganancia/pérdida Scenario: Detalle de posiciones Given el reporte incluye posiciones When se genera la sección de posiciones Then veo tabla con: - Código/Ticker del activo - Cantidad de unidades - Precio de compra/Precio actual - Valor actual en portafolio - Rendimiento (% y valor absoluto) - Fecha de compra Scenario: Descargar reporte Given el reporte PDF está listo When hago clic en "Descargar" Then el archivo se descarga como: Portfolio_[fecha_inicio]_[fecha_fin]_[timestamp].pdf And el formato PDF es optimizado (tamaño <5MB) Scenario: Enviar reporte por email Given el reporte PDF está listo When hago clic en "Enviar por Email" And ingreso dirección(es) de correo Then el PDF se envía a los destinatarios And recibo confirmación de envío And el destinatario recibe el correo con adjunto Scenario: Reporte multi-cuenta Given tengo múltiples cuentas/portafolios When selecciono la opción "Consolidado" Then el reporte muestra: - Resumen general - Desglose por cada cuenta - Distribución consolidada - Rentabilidades combinadas ``` --- ## API Endpoint ### POST /api/portfolio/reports/pdf **Request:** ```json { "portfolioId": "uuid", "startDate": "2026-01-01", "endDate": "2026-01-25", "includeGraphs": true, "includeMetrics": true, "includePositions": true, "benchmark": "SPX", "downloadFormat": "pdf", "sendEmail": { "enabled": false, "recipients": [] }, "consolidated": false } ``` **Response (200):** ```json { "id": "report_uuid", "status": "generated", "downloadUrl": "/api/reports/download/report_uuid", "emailStatus": "pending|sent|failed", "generatedAt": "2026-01-25T10:30:00Z", "fileName": "Portfolio_2026-01-01_2026-01-25_20260125103000.pdf" } ``` **Response (202 - Async):** ```json { "jobId": "job_uuid", "status": "processing", "estimatedTime": "30s", "checkUrl": "/api/portfolio/reports/pdf/status/job_uuid" } ``` --- ## Dependencias - RF-PFM-007: Cálculo de métricas de rendimiento - RF-PFM-008: Integración con servicio de reportes - RF-PFM-009: Generación de gráficos embebidos en PDF - ET-PFM-007: Entidad ReportPDF - US-PFM-012: Reporte Fiscal (complementario) --- ## Notas Técnicas - Usar librería `pdfkit` o `puppeteer` para generación - Gráficos embebidos con `chart.js` o `lightweight-charts` - Queue asíncrona para reportes grandes (>500MB portafolio) - Implementar retry automático en fallos de email - Almacenar reportes 30 días máximo - Validar tamaño de portafolio antes de generar --- ## Aceptación - [ ] Endpoint POST creado y documentado - [ ] Generación de PDF con gráficos funcional - [ ] Descarga de archivos validada - [ ] Envío por email implementado - [ ] Tests unitarios y de integración - [ ] Documentación en Swagger - [ ] Manual de usuario actualizado --- *Historia de usuario - Sistema NEXUS*