trading-platform/docs/02-definicion-modulos/OQI-008-portfolio-manager/historias-usuario/US-PFM-014-generar-pdf.md
Adrian Flores Cortes cdec253b02 [TASK-2026-01-25-FRONTEND-ANALYSIS] docs: Add frontend specifications and user stories
- Add 5 frontend specification documents (ET-*-frontend.md):
  - ET-AUTH-006: Authentication module frontend spec
  - ET-ML-008: ML Signals module frontend spec
  - ET-LLM-007: LLM Agent module frontend spec
  - ET-PFM-008: Portfolio Manager frontend spec (design)
  - ET-MKT-003: Marketplace frontend spec (design)

- Add 8 new user stories:
  - US-AUTH-013: Global logout
  - US-AUTH-014: Device management
  - US-ML-008: Ensemble signal view
  - US-ML-009: ICT analysis view
  - US-ML-010: Multi-symbol scan
  - US-LLM-011: Execute trade from chat
  - US-PFM-013: Rebalance alerts
  - US-PFM-014: PDF report generation

- Update task index with completed analysis

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-25 01:47:27 -06:00

4.4 KiB

id title type status priority epic project story_points created_date updated_date
US-PFM-014 Generar Reporte PDF User Story Ready Alta OQI-008 trading-platform 5 2026-01-25 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

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:

{
  "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):

{
  "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):

{
  "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