# US-MGN-004-005-001: Crear Factura de Cliente (Draft) **RF Asociado:** [RF-MGN-004-005](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-005-gestión-de-facturas-de-cliente.md) **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 1. **TC-001:** Crear factura draft exitosamente 2. **TC-002:** Error por partner no cliente 3. **TC-003:** Generar número secuencial 4. **TC-004:** Calcular totales correctamente 5. **TC-005:** Crear con múltiples líneas 6. **TC-006:** Error por fecha futura 7. **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 --- ## Referencias - [RF-MGN-004-005](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-005-gestión-de-facturas-de-cliente.md) - [ET-BACKEND-MGN-004-005](../../02-modelado/especificaciones-tecnicas/backend/mgn-004/ET-BACKEND-MGN-004-005-gestión-de-facturas-de-cliente.md) - [TRACEABILITY-MGN-004.yaml](../../02-modelado/trazabilidad/TRACEABILITY-MGN-004.yaml)