# 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)