# US-MGN-004-006-002: Validar Factura de Proveedor y Generar Asiento

**RF Asociado:** [RF-MGN-004-006](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-006-gestión-de-facturas-de-proveedor.md)
**Módulo:** MGN-004 - Financiero Básico
**Epic:** Facturas de Proveedor
**Prioridad:** P0 (MVP)
**Story Points:** 5
**Sprint:** Sprint 11
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story

**Como** usuario de compras o contador,
**Quiero** validar facturas de proveedor draft,
**Para** contabilizarlas y generar asiento contable automático.

---

## Descripción Detallada

Al validar factura proveedor:
- State: draft → open
- Asiento contable generado:
  - Débito: Cuentas de Gasto (product.expense_account) por subtotal de cada línea
  - Débito: Impuestos (tax.paid_account) por impuestos
  - Crédito: Cuentas por Pagar (partner.payable_account) por total

---

## Criterios de Aceptación

### Escenario 1: Validar y generar asiento
**Dado que** factura proveedor draft, subtotal=1000, IVA 21%=210, total=1210,
**Cuando** valido,
**Entonces** asiento:
  - Débito: Gastos 1000
  - Débito: IVA a Recuperar 210
  - Crédito: Cuentas por Pagar 1210

### Escenario 2: Calcular due_date
**Dado que** invoice_date + payment_term,
**Cuando** valido,
**Entonces** due_date calculado correctamente.

---

## Reglas de Negocio

- **RN-1:** Solo draft pueden validarse.
- **RN-2:** Asiento débito a gastos, crédito a payables.
- **RN-3:** Facturas open son inmutables.

---

## Tareas Técnicas

### Backend
- [ ] POST /vendor-invoices/:id/validate
- [ ] Service: VendorInvoiceService.validate()
- [ ] Service: VendorInvoiceService.generateJournalEntry()
- [ ] Generar asiento con estructura correcta
- [ ] Unit tests (8 test cases)

### Frontend
- [ ] Botón Validar
- [ ] Modal confirmación
- [ ] E2E test

---

## Estimación: 9 horas = 5 SP

---

## Referencias

- [RF-MGN-004-006](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-006-gestión-de-facturas-de-proveedor.md)
