erp-core/docs/05-user-stories/mgn-004/US-MGN-004-005-001-crear-factura-cliente-draft.md

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

  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