# US-MGN-004-004-002: Cálculo Automático de Impuestos en Facturas

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

---

## User Story

**Como** usuario de ventas o compras,
**Quiero** que el sistema calcule automáticamente los impuestos al agregar productos/servicios a facturas,
**Para** no tener que calcular manualmente los montos de impuestos.

---

## Descripción Detallada

Esta US implementa el cálculo automático de impuestos en facturas (customer invoices y vendor invoices). Al agregar una línea de factura con un producto/servicio que tiene impuestos asociados, el sistema:
- Identifica los impuestos configurados para ese producto
- Calcula el monto de impuesto según la tasa
- Actualiza los totales: subtotal, total_tax, total_amount
- Genera líneas de impuesto (tax_lines) vinculadas a la factura

---

## Criterios de Aceptación

### Escenario 1: Calcular IVA 21% en línea de factura
**Dado que** agrego una línea de factura con precio_unit=1000, quantity=1, tax_ids=["IVA 21%"],
**Cuando** el sistema calcula los impuestos,
**Entonces** se crea una tax_line con base=1000, tax_amount=210, tax_id="IVA 21%".

### Escenario 2: Múltiples impuestos en una línea
**Dado que** una línea tiene precio=1000 con impuestos ["IVA 21%", "IIBB 3%"],
**Cuando** calculo impuestos,
**Entonces** se crean 2 tax_lines: IVA=210, IIBB=30, total_tax=240.

### Escenario 3: Actualizar totales de factura
**Dado que** una factura tiene 2 líneas: L1 (base=1000, IVA 21%) y L2 (base=500, IVA 21%),
**Cuando** calculo totales,
**Entonces** subtotal=1500, total_tax=315, total_amount=1815.

### Escenario 4: Recalcular al cambiar cantidad
**Dado que** una línea tiene precio=100, quantity=10, IVA 21%,
**Cuando** cambio quantity=20,
**Entonces** base=2000, tax_amount=420, total_line=2420.

### Escenario 5: Impuestos no aplican si producto sin impuestos
**Dado que** un producto no tiene impuestos asociados,
**Cuando** agrego línea de ese producto,
**Entonces** NO se generan tax_lines, total_tax=0.

---

## Reglas de Negocio

- **RN-1:** Base imponible = precio_unit * quantity * (1 - discount/100).
- **RN-2:** Tax_amount = base * (tax_rate / 100).
- **RN-3:** Total_line = base + sum(tax_amounts).
- **RN-4:** Subtotal factura = sum(líneas.base).
- **RN-5:** Total_tax factura = sum(tax_lines.tax_amount).
- **RN-6:** Total_amount factura = subtotal + total_tax.
- **RN-7:** Redondeo a 2 decimales para montos monetarios.
- **RN-8:** Recalcular totales al agregar/editar/eliminar líneas.

---

## Tareas Técnicas

### Backend
- [ ] Service: `InvoiceService.calculateLineTaxes(lineData)`
- [ ] Service: `InvoiceService.calculateInvoiceTotals(invoiceId)`
- [ ] Service: `TaxService.calculateTaxAmount(base, taxId)`
- [ ] Lógica: Calcular base imponible (precio * cantidad * (1 - descuento))
- [ ] Lógica: Generar tax_lines al guardar invoice_lines
- [ ] Lógica: Sumar tax_lines para total_tax
- [ ] Validar que impuestos pertenecen al tipo correcto (sale/purchase)
- [ ] Unit tests (8 test cases)
- [ ] Integration tests (5 test cases)

### Frontend
- [ ] Lógica: Calcular impuestos en tiempo real al editar línea
- [ ] Componente: `TaxCalculationSummary.tsx` (mostrar desglose impuestos)
- [ ] Mostrar totales: Subtotal, Impuestos, Total
- [ ] Actualizar totales dinámicamente al editar cantidad/precio
- [ ] Component test: Cálculo automático de IVA

### Database
- [ ] Tabla: `financial.invoice_tax_lines` (invoice_id, tax_id, base, tax_amount)
- [ ] Campos: `invoices.subtotal`, `invoices.total_tax`, `invoices.total_amount`
- [ ] Trigger: Recalcular totales al insertar/update invoice_lines

---

## Mockups / Wireframes

**Línea de Factura con Impuestos:**
```
┌────────────────────────────────────────────┐
│ Producto: MacBook Pro                      │
│ Precio: 1000  Cantidad: [2] UoM: Unidad    │
│ Impuestos: ☑ IVA 21%  ☑ IIBB 3%           │
│                                            │
│ Subtotal: 2,000.00                         │
│ IVA 21%:    420.00                         │
│ IIBB 3%:     60.00                         │
│ ──────────────────                         │
│ Total:    2,480.00                         │
└────────────────────────────────────────────┘
```

**Totales de Factura:**
```
┌────────────────────────────┐
│ Subtotal:     2,000.00     │
│ Impuestos:      480.00     │
│ ─────────────────────      │
│ TOTAL:        2,480.00     │
└────────────────────────────┘
```

---

## Casos de Prueba

### Funcionales
1. **TC-001:** Calcular IVA 21% sobre 1000 = 210
2. **TC-002:** Múltiples impuestos (IVA 21% + IIBB 3%)
3. **TC-003:** Actualizar totales de factura
4. **TC-004:** Recalcular al cambiar cantidad
5. **TC-005:** Sin impuestos si producto no los tiene
6. **TC-006:** Descuento aplica antes de impuestos
7. **TC-007:** Redondeo a 2 decimales

### No Funcionales
1. **Performance:** Cálculo instantáneo (<100ms)
2. **Precisión:** Redondeo correcto en montos

---

## Dependencias

- **US bloqueantes:**
  - US-MGN-004-004-001 (CRUD Impuestos)
  - US-MGN-004-005-001 (Crear Factura Cliente - siguiente US)
- **Módulos:** MGN-004

---

## Estimación Detallada

| Tarea | Estimación |
|-------|------------|
| Backend | 2 horas |
| Frontend | 2 horas |
| Testing | 1.5 horas |
| Code Review | 0.5 hora |
| **TOTAL** | **6 horas = 3 SP** |

---

## Definition of Done

- [ ] Código implementado
- [ ] Tests pasando (>80%)
- [ ] Cálculos precisos (redondeo 2 decimales)
- [ ] Recálculo dinámico funciona
- [ ] Code review aprobado
- [ ] Merge a develop
- [ ] QA validado

---

## Referencias

- [RF-MGN-004-004](../../02-modelado/requerimientos-funcionales/mgn-004/RF-MGN-004-004-gestión-de-impuestos.md)
- [TRACEABILITY-MGN-004.yaml](../../02-modelado/trazabilidad/TRACEABILITY-MGN-004.yaml)
- [Financial Schema DDL](../../02-modelado/database-design/schemas/financial-schema-ddl.sql)
