5.8 KiB
US-MGN-004-005-001: Crear Factura de Cliente (Draft)
RF Asociado: RF-MGN-004-005 Módulo: MGN-004 - Financiero Básico Epic: Facturas de Cliente Prioridad: P0 (MVP) Story Points: 5 Sprint: Sprint 10 Estado: Ready for Development Fecha: 2025-11-24
User Story
Como usuario de ventas, Quiero crear facturas de cliente en estado borrador con líneas y calcular impuestos automáticamente, Para facturar ventas a mis clientes antes de validar y contabilizar.
Descripción Detallada
Factura de cliente es un documento que registra una venta. Estados: draft (borrador), open (abierta/contabilizada), paid (pagada), cancelled (cancelada). En estado draft se puede editar libremente. Al validar se genera asiento contable automático.
Criterios de Aceptación
Escenario 1: Crear factura draft exitosamente
Dado que soy usuario ventas, Cuando creo factura con partner_id, invoice_date="2024-01-15", líneas con productos e impuestos, Entonces sistema crea factura state='draft', calcula totals (subtotal, taxes, total), retorna id y número.
Escenario 2: Validar partner es cliente
Dado que partner_id no es tipo "customer", Cuando creo factura, Entonces error 400 "Partner debe ser tipo cliente".
Escenario 3: Generar número de factura
Dado que journal "Ventas" tiene secuencia "INV/{year}/{seq}", Cuando creo factura, Entonces número generado automáticamente "INV/2024/0001".
Escenario 4: Calcular totales automáticamente
Dado que líneas: L1 (1000, IVA 21%), L2 (500, IVA 21%), Cuando guardo factura, Entonces subtotal=1500, total_tax=315, total_amount=1815.
Escenario 5: Permitir múltiples líneas
Dado que agrego 5 líneas de productos, Cuando todas tienen impuestos configurados, Entonces factura se crea con 5 invoice_lines y sus tax_lines correspondientes.
Reglas de Negocio
- RN-1: type='out_invoice' para facturas de cliente.
- RN-2: Estado inicial es 'draft'.
- RN-3: Partner debe ser tipo customer o both.
- RN-4: Fecha de factura no puede ser futura.
- RN-5: Al menos 1 línea requerida.
- RN-6: Impuestos se calculan automáticamente por línea.
- RN-7: Número se genera automáticamente al guardar.
- RN-8: RLS filtra por company_id.
Tareas Técnicas
Backend
- POST /api/v1/financial/customer-invoices
- Service: CustomerInvoiceService.create()
- DTO: CreateCustomerInvoiceDto (partner_id, date, lines, payment_term_id)
- DTO: InvoiceLineDto (product_id, quantity, price_unit, tax_ids, discount)
- Validar partner es customer
- Generar número secuencial
- Calcular totales (subtotal, taxes, total)
- Crear invoice_lines y tax_lines
- Unit tests (10 test cases)
- Integration tests (8 test cases)
Frontend
- Página: CreateCustomerInvoicePage.tsx
- Componente: CreateCustomerInvoiceForm.tsx
- Componente: InvoiceLineItems.tsx (tabla editable)
- Componente: InvoiceTotalsSummary.tsx
- API client: customerInvoiceApi.create()
- Store: useCustomerInvoiceStore.ts
- Component tests (6 test cases)
- E2E test: "should create customer invoice"
Database
- Tabla: financial.invoices (type='out_invoice')
- Tabla: financial.invoice_lines
- Tabla: financial.invoice_tax_lines
- Índices: idx_invoices_partner_id, idx_invoices_date, idx_invoices_state
- RLS policy: company_isolation_invoices
Mockups / Wireframes
Formulario Crear Factura:
┌─────────────────────────────────────┐
│ Cliente: [Select Partner] ▼ │
│ Fecha: [2024-01-15] (date picker) │
│ Condiciones Pago: [30 días] ▼ │
│ Referencia: [SO001] (opcional) │
├─────────────────────────────────────┤
│ Líneas: │
│ [Producto][Cantidad][Precio][Imp.] │
│ [MacBook] [2] [1000] [IVA 21%] │
│ [+ Agregar Línea] │
├─────────────────────────────────────┤
│ Subtotal: 2,000.00 │
│ Impuestos: 420.00 │
│ TOTAL: 2,420.00 │
├─────────────────────────────────────┤
│ [Guardar Borrador] [Cancelar] │
└─────────────────────────────────────┘
Casos de Prueba
- TC-001: Crear factura draft exitosamente
- TC-002: Error por partner no cliente
- TC-003: Generar número secuencial
- TC-004: Calcular totales correctamente
- TC-005: Crear con múltiples líneas
- TC-006: Error por fecha futura
- TC-007: RLS filtra por empresa
Dependencias
- US bloqueantes:
- US-MGN-003-001-001 (CRUD Partners)
- US-MGN-004-002-001 (CRUD Journals)
- US-MGN-004-004-002 (Cálculo Impuestos)
- Módulos: MGN-003, MGN-004
Estimación: 9 horas = 5 SP
Definition of Done
- Código implementado
- Tests pasando (>80%)
- Totales calculan correctamente
- Número generado automáticamente
- Code review aprobado
- Merge a develop
- QA validado