--- id: "US-PAY-007" title: "Ver y Descargar Facturas" type: "User Story" status: "Done" priority: "Media" epic: "OQI-005" project: "trading-platform" story_points: 3 created_date: "2025-12-05" updated_date: "2026-01-04" --- # US-PAY-007: Ver y Descargar Facturas **Version:** 1.0.0 **Fecha:** 2025-12-05 **Estado:** πŸ“‹ Planificado **Story Points:** 3 **Prioridad:** P1 (Alta) **Γ‰pica:** [OQI-005](../_MAP.md) --- ## Historia de Usuario **Como** usuario de Trading Platform que ha realizado pagos **Quiero** ver y descargar mis facturas **Para** tener comprobantes de mis transacciones y poder deducir impuestos --- ## Criterios de AceptaciΓ³n ### AC-001: Acceder a Facturas **Dado** que soy usuario logueado con historial de pagos **Cuando** navego a "ConfiguraciΓ³n β†’ Facturas" **Entonces** deberΓ­a ver: - Lista de todas mis facturas ordenadas por fecha (mΓ‘s reciente primero) - Para cada factura: - NΓΊmero de factura (ej: INV-2025-000042) - Fecha de emisiΓ³n - DescripciΓ³n (SuscripciΓ³n Pro, Curso Trading BΓ‘sico, etc.) - Monto total - Estado (Pagada, Pendiente, Reembolsada) - BotΓ³n "Descargar PDF" - BotΓ³n "Ver Detalles" - Filtros: Por aΓ±o, por tipo (suscripciΓ³n/curso), por estado - PaginaciΓ³n si tengo > 20 facturas ### AC-002: Ver Sin Facturas **Dado** que soy usuario nuevo sin pagos realizados **Cuando** navego a la secciΓ³n de facturas **Entonces** deberΓ­a ver: - Mensaje: "No tienes facturas todavΓ­a" - IlustraciΓ³n o Γ­cono de facturas vacΓ­as - BotΓ³n "Ver Planes" para incentivar compra ### AC-003: Descargar Factura PDF **Dado** que tengo una factura pagada **Cuando** hago click en "Descargar PDF" **Entonces** deberΓ­a: - Descargar archivo PDF inmediatamente - Nombre del archivo: `Trading Platform_Factura_INV-2025-000042.pdf` - PDF contiene: - Logo de Trading Platform - Datos fiscales de empresa - Mis datos (nombre, email, paΓ­s) - NΓΊmero de factura y fecha - Detalle de productos/servicios - Subtotal, impuestos (si aplica), total - MΓ©todo de pago (ΓΊltimos 4 dΓ­gitos) - Footer: "Powered by Stripe" ### AC-004: Ver Detalles de Factura **Dado** que quiero ver mΓ‘s informaciΓ³n de una factura **Cuando** hago click en "Ver Detalles" **Entonces** deberΓ­a ver modal/pΓ‘gina con: - Todos los datos de la factura - Desglose de impuestos si aplica - ID de transacciΓ³n de Stripe - MΓ©todo de pago usado - BotΓ³n "Descargar PDF" - BotΓ³n "Enviar por Email" ### AC-005: Enviar Factura por Email **Dado** que estoy viendo detalles de una factura **Cuando** hago click en "Enviar por Email" **Entonces** deberΓ­a: - Ver confirmaciΓ³n: "Factura enviada a juan@example.com" - Recibir email con: - Asunto: "Tu factura de Trading Platform - #INV-2025-000042" - PDF adjunto - Link de descarga (vΓ‘lido 24h) ### AC-006: Filtrar Facturas **Dado** que tengo mΓΊltiples facturas **Cuando** aplico filtros **Entonces** deberΓ­a poder filtrar por: - **AΓ±o:** 2025, 2024, 2023, etc. - **Tipo:** SuscripciΓ³n, Curso, Recarga de Wallet - **Estado:** Pagada, Reembolsada - Resultados se actualizan inmediatamente ### AC-007: Buscar Factura **Dado** que estoy en la pΓ‘gina de facturas **Cuando** ingreso nΓΊmero de factura en bΓΊsqueda (ej: "INV-2025-042") **Entonces** deberΓ­a: - Ver solo facturas que coincidan con el criterio - Resaltar nΓΊmero coincidente - Mensaje "No se encontraron facturas" si no hay resultados ### AC-008: Factura de SuscripciΓ³n Mensual **Dado** que tengo suscripciΓ³n activa **Cuando** veo mis facturas **Entonces** deberΓ­a ver: - Una factura por cada cobro mensual - NΓΊmero secuencial: SUB-2025-000001, SUB-2025-000002, etc. - DescripciΓ³n: "SuscripciΓ³n Pro - Enero 2025" - PerΓ­odo cubierto: "01/01/2025 - 31/01/2025" ### AC-009: Nota de CrΓ©dito (Reembolso) **Dado** que recibΓ­ un reembolso **Cuando** veo mis facturas **Entonces** deberΓ­a ver: - Nota de crΓ©dito con nΓΊmero CN-2025-000001 - Estado: "Reembolsada" - Referencia a factura original - Monto negativo (-$29.00) - Ambas facturas (original + nota de crΓ©dito) listadas ### AC-010: Actualizar Datos Fiscales **Dado** que quiero facturas con datos fiscales correctos **Cuando** navego a "Datos Fiscales" en configuraciΓ³n **Entonces** deberΓ­a poder agregar/editar: - Nombre fiscal (si difiere de nombre de usuario) - RFC/Tax ID - DirecciΓ³n fiscal completa - RΓ©gimen fiscal (si aplica) - Nota: "Estos datos se aplicarΓ‘n a facturas futuras" --- ## Mockup ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Facturas β”‚ β”‚ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ Filtros: [2025 β–Ό] [Todos β–Ό] [Buscar: INV-2025-...] β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ INV-2025-000042 05/12/2025 Pagada β”‚ β”‚ β”‚ β”‚ SuscripciΓ³n Pro - Diciembre 2025 β”‚ β”‚ β”‚ β”‚ $49.00 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [Descargar PDF] [Ver Detalles] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ INV-2025-000038 28/11/2025 Pagada β”‚ β”‚ β”‚ β”‚ Curso: Trading BΓ‘sico 101 β”‚ β”‚ β”‚ β”‚ $29.00 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [Descargar PDF] [Ver Detalles] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ SUB-2025-000015 05/11/2025 Pagada β”‚ β”‚ β”‚ β”‚ SuscripciΓ³n Pro - Noviembre 2025 β”‚ β”‚ β”‚ β”‚ $49.00 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [Descargar PDF] [Ver Detalles] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ CN-2025-000003 15/10/2025 Reembolsadaβ”‚ β”‚ β”‚ β”‚ Nota de CrΓ©dito: Curso Trading Avanzado β”‚ β”‚ β”‚ β”‚ (Ref: INV-2025-000025) -$49.00 β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ [Descargar PDF] [Ver Detalles] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Mostrando 1-10 de 24 facturas β”‚ β”‚ [← Anterior] [1] [2] [3] [Siguiente β†’] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ───────────── Modal: Detalles de Factura ───────────── β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ [X] β”‚ β”‚ Factura #INV-2025-000042 β”‚ β”‚ β”‚ β”‚ Fecha de emisiΓ³n: 05/12/2025 β”‚ β”‚ Estado: Pagada β”‚ β”‚ β”‚ β”‚ ─────────────────────────────────────────────────── β”‚ β”‚ β”‚ β”‚ FACTURADO A: β”‚ β”‚ Juan PΓ©rez β”‚ β”‚ juan.perez@example.com β”‚ β”‚ MΓ©xico β”‚ β”‚ β”‚ β”‚ ─────────────────────────────────────────────────── β”‚ β”‚ β”‚ β”‚ DESCRIPCIΓ“N PRECIO β”‚ β”‚ SuscripciΓ³n Pro β”‚ β”‚ PerΓ­odo: 01/12/2025 - 31/12/2025 $49.00 β”‚ β”‚ β”‚ β”‚ SUBTOTAL: $49.00 β”‚ β”‚ IVA (16%): $7.84 β”‚ β”‚ ───────────────── β”‚ β”‚ TOTAL: $56.84 β”‚ β”‚ β”‚ β”‚ ─────────────────────────────────────────────────── β”‚ β”‚ β”‚ β”‚ MΓ‰TODO DE PAGO: β”‚ β”‚ Visa β€’β€’β€’β€’ 4242 β”‚ β”‚ β”‚ β”‚ ID de transacciΓ³n: pi_3Abc123... β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Descargar PDF β”‚ β”‚ Enviar por Emailβ”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## Flujo de Usuario (Gherkin) ```gherkin Feature: Ver y Descargar Facturas Scenario: Ver lista de facturas Given que soy usuario logueado "juan@example.com" And he realizado 3 compras en el ΓΊltimo mes When navego a "ConfiguraciΓ³n β†’ Facturas" Then deberΓ­a ver 3 facturas listadas And deberΓ­an estar ordenadas por fecha descendente And cada una deberΓ­a tener botΓ³n "Descargar PDF" Scenario: Descargar factura PDF Given que estoy viendo mi lista de facturas When hago click en "Descargar PDF" en factura "INV-2025-000042" Then deberΓ­a descargar archivo "Trading Platform_Factura_INV-2025-000042.pdf" And el PDF deberΓ­a contener mis datos fiscales And el PDF deberΓ­a tener logo de Trading Platform And el PDF deberΓ­a mostrar total de $56.84 (incluido IVA) Scenario: Ver detalles de factura Given que estoy viendo mi lista de facturas When hago click en "Ver Detalles" en una factura Then deberΓ­a ver modal con informaciΓ³n detallada And deberΓ­a ver desglose de impuestos And deberΓ­a ver mΓ©todo de pago usado And deberΓ­a ver ID de transacciΓ³n de Stripe Scenario: Enviar factura por email Given que estoy viendo detalles de factura "INV-2025-000042" When hago click en "Enviar por Email" Then deberΓ­a ver "Factura enviada a juan@example.com" And deberΓ­a recibir email con PDF adjunto And email deberΓ­a incluir link de descarga vΓ‘lido 24h Scenario: Filtrar facturas por aΓ±o Given que tengo facturas de 2024 y 2025 When selecciono filtro "2025" Then deberΓ­a ver solo facturas de 2025 And no deberΓ­a ver facturas de 2024 Scenario: Usuario sin facturas Given que soy usuario nuevo sin pagos When navego a "ConfiguraciΓ³n β†’ Facturas" Then deberΓ­a ver "No tienes facturas todavΓ­a" And deberΓ­a ver botΓ³n "Ver Planes" ``` --- ## Notas TΓ©cnicas ### Frontend - Componente: `apps/frontend/src/pages/Settings/Invoices.tsx` - Modal: `InvoiceDetailsModal.tsx` - Fetch facturas: `GET /api/v1/payments/invoices` - Descargar PDF: `GET /api/v1/payments/invoices/:id/pdf` ### Backend **Endpoints:** 1. `GET /api/v1/payments/invoices` - Query params: `?year=2025&type=subscription&status=paid` - Response: ```json { "invoices": [ { "id": "uuid", "invoiceNumber": "INV-2025-000042", "type": "subscription", "status": "paid", "amount": 49.00, "taxAmount": 7.84, "total": 56.84, "currency": "USD", "description": "SuscripciΓ³n Pro - Diciembre 2025", "issuedAt": "2025-12-05T00:00:00Z", "pdfUrl": "https://s3.../invoices/2025/12/uuid.pdf" } ], "total": 24, "page": 1, "perPage": 10 } ``` 2. `GET /api/v1/payments/invoices/:id` - Detalles completos de factura 3. `GET /api/v1/payments/invoices/:id/pdf` - Generar URL firmada de S3 (expiraciΓ³n 24h) - Redirect a URL firmada 4. `POST /api/v1/payments/invoices/:id/email` - Reenviar factura por email ### Database - Query desde tabla `billing.invoices` - JOIN con `billing.payments` para mΓ©todo de pago - Filtrar por `userId` del token ### PDF Storage - S3 Bucket: `trading-invoices` - Path: `invoices/{year}/{month}/{invoiceId}.pdf` - Generar URL firmada con expiraciΓ³n: ```typescript const url = s3.getSignedUrl('getObject', { Bucket: 'trading-invoices', Key: `invoices/2025/12/${invoiceId}.pdf`, Expires: 86400, // 24 horas }); ``` ### Email Template **Subject:** Tu factura de Trading Platform - #INV-2025-000042 ``` Hola Juan, Adjuntamos tu factura de Trading Platform. NΓΊmero de factura: INV-2025-000042 Fecha: 05/12/2025 Total: $56.84 USD TambiΓ©n puedes descargarla desde: [Descargar Factura] (vΓ‘lido por 24 horas) ΒΏNecesitas ayuda? EscrΓ­benos a billing@trading.com Saludos, El equipo de Trading Platform ``` --- ## Dependencias - [RF-PAY-004: Sistema de FacturaciΓ³n](../requerimientos/RF-PAY-004-facturacion.md) - Sistema de generaciΓ³n de PDF - AWS S3 para almacenamiento --- ## Requerimientos Relacionados - [RF-PAY-004: Sistema de FacturaciΓ³n AutomΓ‘tica](../requerimientos/RF-PAY-004-facturacion.md) --- ## Tareas TΓ©cnicas ### Frontend - [ ] PΓ‘gina `Invoices.tsx` con lista - [ ] Modal `InvoiceDetailsModal.tsx` - [ ] Filtros (aΓ±o, tipo, estado) - [ ] BΓΊsqueda por nΓΊmero de factura - [ ] PaginaciΓ³n - [ ] Descargar PDF con loading state - [ ] Reenviar email con confirmaciΓ³n ### Backend - [ ] Endpoint `GET /invoices` con filtros - [ ] Endpoint `GET /invoices/:id` - [ ] Endpoint `GET /invoices/:id/pdf` (URL firmada) - [ ] Endpoint `POST /invoices/:id/email` - [ ] Validar que usuario sea dueΓ±o de factura - [ ] Generar URLs firmadas de S3 ### Testing - [ ] Test: Usuario ve sus facturas correctamente - [ ] Test: Filtros funcionan - [ ] Test: Descargar PDF genera URL firmada - [ ] Test: No puede ver facturas de otros usuarios - [ ] Test: ReenvΓ­o de email funciona - [ ] Test: Usuario sin facturas ve mensaje apropiado