8.2 KiB
US-MGN-007-003-002: Validar Entrega y Actualizar Stock
RF Asociado: RF-MGN-007-004 Módulo: MGN-007 - Ventas Básico Epic: Entregas de Ventas Prioridad: P0 Story Points: 5 Sprint: Sprint 17 Estado: Ready for Development Fecha: 2025-11-24
User Story
Como usuario de almacén, Quiero validar entregas (cambiar draft → done) actualizando cantidades entregadas, Para confirmar el despacho físico y actualizar el stock en tiempo real.
Descripción Detallada
Validar una delivery significa:
- Confirmar las cantidades realmente entregadas (qty_done)
- Cambiar estado draft → done
- Crear movimientos de stock: ubicación_almacén → ubicación_cliente
- Actualizar qty_delivered en sales.order_lines
- Actualizar stock_quants restando del almacén
- Registrar date_done
- Crear mensaje en chatter
Si qty_done < qty_ordered, genera backorder automático para las cantidades pendientes.
Criterios de Aceptación
Escenario 1: Validar delivery completa (Camino Feliz)
Dado que delivery id=1 draft con línea: product_id=1, qty_ordered=50, qty_done=50, Cuando valido delivery, Entonces estado=done, crea stock_moves, actualiza quants (-50 en almacén), actualiza SO.qty_delivered=50.
Escenario 2: Validar stock disponible antes de validar
Dado que línea tiene product_id=1, qty_done=100 pero stock disponible=50, Cuando intento validar, Entonces sistema retorna error 400 "Stock insuficiente en Almacén Principal".
Escenario 3: Delivery parcial con backorder automático
Dado que línea tiene qty_ordered=100, qty_done=60, Cuando valido delivery, Entonces sistema crea backorder DO/2024/0002 con qty_pending=40 en draft.
Escenario 4: Validar todas las líneas tienen qty_done > 0
Dado que línea tiene qty_done=0, Cuando intento validar, Entonces sistema retorna error 400 "Todas las líneas deben tener cantidad entregada > 0".
Escenario 5: Registrar fecha de validación
Dado que valido delivery exitosamente, Cuando se completa validación, Entonces date_done registra timestamp actual.
Escenario 6: Actualizar estado de SO si 100% entregado
Dado que SO tiene qty_total=100, después de validar delivery llega a qty_delivered=100, Cuando se completa validación, Entonces SO.delivery_status cambia a fully_delivered.
Reglas de Negocio
- RN-1: Solo deliveries en draft pueden validarse.
- RN-2: qty_done debe ser <= qty_ordered por línea.
- RN-3: Validación verifica stock disponible en ubicación origen.
- RN-4: Si qty_done < qty_ordered, genera backorder automático con diferencia.
- RN-5: Crea stock_moves (location_from → location_to) por cada línea.
- RN-6: Actualiza sales.order_lines.qty_delivered.
- RN-7: date_done registra timestamp de validación.
- RN-8: Permisos: stock_user.
Tareas Técnicas
Backend
- Endpoint:
POST /api/v1/inventory/deliveries/:id/validate - Service:
DeliveryService.validate(id) - Validar estado draft
- Validar qty_done > 0 en todas las líneas
- Validar qty_done <= qty_ordered
- Validar stock disponible por producto
- Crear stock_moves (origin → destination)
- Actualizar stock_quants
- Actualizar order_lines.qty_delivered
- Actualizar order.delivery_status si 100%
- Generar backorder si qty_done < qty_ordered
- Actualizar state=done, date_done=now()
- Crear mensaje en chatter
- Unit tests (>80%)
- Integration tests
- Swagger docs
Frontend
- Botón: "Validate" en vista de delivery draft
- Inputs: Editar qty_done por línea antes de validar
- Validación: qty_done <= qty_ordered
- Mostrar stock disponible por producto
- Warning si qty_done < qty_ordered (backorder)
- API client:
deliveryApi.validate(id) - Notificación toast de éxito
- Component tests
- E2E test: "should validate delivery and update stock"
Database
- Columna:
inventory.deliveries.date_done(timestamp) - Columna:
inventory.delivery_lines.qty_done(numeric) - Columna:
sales.order_lines.qty_delivered(numeric) - Columna:
sales.orders.delivery_status(enum: pending, partial, fully_delivered) - Trigger: Actualizar SO.delivery_status automáticamente
Mockups / Wireframes
Vista Delivery con validación:
┌─────────────────────────────────────────────┐
│ Delivery DO/2024/0001 [draft] │
├─────────────────────────────────────────────┤
│ Orden: SO/2024/0001 │
│ Origen: Almacén Principal → Cliente ABC │
│ │
│ Líneas: │
│ ┌───────────────────────────────────────┐ │
│ │Producto │Ordenado│Disponible│Entregado│ │
│ ├──────────┼────────┼──────────┼─────────┤ │
│ │Laptop HP │ 50 │ 100 │[50] │ │
│ │Mouse │ 20 │ 15 ⚠ │[15] │ │
│ └───────────────────────────────────────┘ │
│ │
│ ⚠ Mouse: Solo 15 disponibles (ordenadas 20)│
│ Se creará backorder para 5 unidades │
│ │
│ [Validate] [Cancel] │
└─────────────────────────────────────────────┘
Casos de Prueba
Funcionales
- TC-001: Validar delivery completa exitosamente
- TC-002: Error si stock insuficiente
- TC-003: Error si qty_done=0 en alguna línea
- TC-004: Error si qty_done > qty_ordered
- TC-005: Stock_moves creados correctamente
- TC-006: Stock_quants actualizado (resta en origen)
- TC-007: order_lines.qty_delivered actualizado
- TC-008: Backorder generado si entrega parcial
- TC-009: SO.delivery_status=fully_delivered si 100%
- TC-010: date_done registrado correctamente
No Funcionales
- Performance: < 1s para validar delivery con 20 líneas
- Seguridad: JWT + permiso stock_user
Dependencias
- US bloqueantes:
- US-MGN-007-003-001 (Crear Delivery)
- US-MGN-005-003-002 (Validar Movimiento Stock)
- Módulos requeridos: MGN-005 (Inventario)
Notas de Implementación
- Usar transacción para garantizar atomicidad (stock_moves + quants + order_lines)
- Validación de stock:
SELECT SUM(quantity) FROM stock_quants WHERE location_id=X AND product_id=Y - Backorder: Copiar delivery original con qty_remaining
- Frontend: Permitir editar qty_done antes de validar (default=qty_ordered)
Estimación Detallada
| Tarea | Horas |
|---|---|
| Backend | 3 |
| Frontend | 2 |
| Testing | 2 |
| Code Review | 1 |
| TOTAL | 8 horas = 5 SP |
Definition of Done
- Código implementado según ET
- Tests pasando (>80%)
- Code review aprobado
- Validación funciona correctamente
- Stock actualizado correctamente
- order_lines.qty_delivered actualizado
- Backorder generado si aplica
- date_done registrado
- Mensaje en chatter creado
- Swagger docs actualizado
- QA validado
- PO aprobado