# US-MGN-005-005-002: Validar Ajuste de Inventario

**RF Asociado:** [RF-MGN-005-007](../../02-modelado/requerimientos-funcionales/mgn-005/RF-MGN-005-007-inventario-físico-y-ajustes.md)
**Módulo:** MGN-005 - Inventario Básico
**Epic:** Ajustes de Inventario
**Prioridad:** P0
**Story Points:** 4
**Sprint:** Sprint 11
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** usuario de inventario,
**Quiero** validar ajustes de inventario,
**Para** aplicar las correcciones al stock y generar movimientos automáticos.

---

## Descripción Detallada
Validar un ajuste:
1. Cambia estado draft → done
2. Genera movimientos de stock por cada línea:
   - Diferencia positiva: movimiento de ubicación virtual → ubicación física (incremento)
   - Diferencia negativa: movimiento de ubicación física → ubicación virtual (decremento)
3. Actualiza stock_quants
4. Genera asiento contable de valoración (opcional, según configuración)

---

## Criterios de Aceptación

### Escenario 1: Validar ajuste con diferencias (Camino Feliz)
**Dado que** ajuste tiene línea: Producto A en Zona A (diff=+2),
**Cuando** valido el ajuste,
**Entonces** el sistema genera movimiento de stock: Virtual Location → Zona A, qty=2, actualiza stock.

### Escenario 2: Validar ajuste con diferencia negativa
**Dado que** ajuste tiene línea: Producto B en Zona A (diff=-3),
**Cuando** valido,
**Entonces** el sistema genera movimiento: Zona A → Virtual Location, qty=3.

### Escenario 3: Error al validar ajuste ya validado
**Dado que** ajuste está en state=done,
**Cuando** intento validar nuevamente,
**Entonces** el sistema retorna error 400 "Ajuste ya fue validado".

---

## Reglas de Negocio
- **RN-1:** Solo ajustes en draft pueden validarse.
- **RN-2:** Validar genera movimientos de stock automáticamente.
- **RN-3:** Diferencias positivas: entrada desde ubicación virtual.
- **RN-4:** Diferencias negativas: salida hacia ubicación virtual.
- **RN-5:** Movimientos generados actualizan stock_quants.

---

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST /api/v1/inventory/adjustments/:id/validate
- [ ] Service: InventoryAdjustmentService.validate(id)
- [ ] Service: generateStockMoves(adjustment)
- [ ] Transaction para atomicidad
- [ ] Unit tests (>80%)
- [ ] Integration tests
- [ ] Swagger docs

### Frontend
- [ ] Botón Validar con confirmación
- [ ] Modal mostrando movimientos a generar
- [ ] API client: adjustmentApi.validate(id)
- [ ] Component tests
- [ ] E2E test

### Database
- [ ] Transaction isolation: READ COMMITTED
- [ ] Lock: SELECT FOR UPDATE

---

## Estimación Detallada
| Tarea | Horas |
|-------|-------|
| Backend | 2.5 |
| Frontend | 2 |
| Testing | 1.5 |
| Code Review | 0.5 |
| **TOTAL** | **6.5 horas = 4 SP** |

---

## Definition of Done
- [ ] Código implementado según ET
- [ ] Tests pasando (>80%)
- [ ] Code review aprobado
- [ ] Transaction implementada
- [ ] QA validado
- [ ] PO aprobado

---

## Referencias
- [RF-MGN-005-007](../../02-modelado/requerimientos-funcionales/mgn-005/RF-MGN-005-007-inventario-físico-y-ajustes.md)
- [ET Backend](../../02-modelado/especificaciones-tecnicas/backend/mgn-005/ET-BACKEND-MGN-005-007-inventario-físico-y-ajustes.md)
- [ET Frontend](../../02-modelado/especificaciones-tecnicas/frontend/mgn-005/ET-FRONTEND-MGN-005-007-inventario-físico-y-ajustes.md)
- [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-005.yaml)
- [Schema](../../02-modelado/database-design/schemas/inventory-schema-ddl.sql)
