7.4 KiB
US-MGN-007-003-001: Crear Entrega desde Sales Order
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 crear entregas (delivery orders) desde órdenes de venta confirmadas, Para preparar el picking y despacho de productos al cliente.
Descripción Detallada
Una Entrega (Delivery / Picking) es el documento que autoriza la salida física de productos. Se crea desde una SO confirmada copiando las líneas pendientes de entregar.
Flujo:
- SO confirmada genera botón "Create Delivery"
- Sistema crea delivery en draft con líneas pendientes
- Ubicación origen: almacén configurado en SO
- Ubicación destino: ubicación del cliente
- Referencia: SO/2024/NNNN
- Estado inicial: draft (editable)
Delivery tiene estados: draft, assigned (reservado), done (validado), cancelled.
Criterios de Aceptación
Escenario 1: Crear delivery desde SO confirmada (Camino Feliz)
Dado que SO id=1 está confirmed con 3 líneas, Cuando ejecuto action "Create Delivery", Entonces sistema crea delivery en draft con las 3 líneas, número DO/2024/0001, origen=Almacén Principal.
Escenario 2: Validar que SO está confirmada
Dado que SO está en draft, Cuando intento crear delivery, Entonces sistema retorna error 400 "Solo pueden crearse entregas de órdenes confirmadas".
Escenario 3: Crear delivery parcial si hay entregas previas
Dado que SO tiene qty_total=100, qty_delivered=60, Cuando creo delivery, Entonces sistema crea delivery solo con qty_pending=40.
Escenario 4: No crear delivery si ya está todo entregado
Dado que SO tiene qty_delivered = qty_total (100%), Cuando intento crear delivery, Entonces sistema retorna error 400 "No hay productos pendientes de entregar".
Escenario 5: Vincular delivery a SO
Dado que se crea delivery desde SO id=1, Cuando se completa creación, Entonces delivery.order_id=1 y SO muestra delivery en lista de entregas.
Escenario 6: Generar número secuencial de delivery
Dado que última delivery fue DO/2024/0005, Cuando creo nueva delivery, Entonces sistema genera número DO/2024/0006.
Reglas de Negocio
- RN-1: Solo SO en estado confirmed o superior pueden generar deliveries.
- RN-2: Delivery se crea con líneas pendientes (qty_to_deliver = qty_ordered - qty_delivered).
- RN-3: Número secuencial: DO/{year}/{seq:04d}.
- RN-4: Estado inicial: draft.
- RN-5: Ubicación origen: almacén de la SO (warehouse_id).
- RN-6: Ubicación destino: ubicación del cliente (partner location).
- RN-7: Se puede crear delivery parcial si hay cantidades pendientes.
- RN-8: Permisos: stock_user.
Tareas Técnicas
Backend
- Endpoint:
POST /api/v1/sales/orders/:id/create-delivery - Service:
SalesOrderService.createDelivery(orderId) - Service:
DeliveryService.createFromOrder(order, lines) - Validar SO está confirmed
- Calcular qty_pending por línea (ordered - delivered)
- Validar que hay cantidades pendientes
- Copiar líneas con qty_pending > 0
- Generar número secuencial DO
- Vincular delivery.order_id
- Crear mensaje en chatter
- Unit tests (>80%)
- Integration tests
- Swagger docs
Frontend
- Botón: "Create Delivery" en vista de SO confirmed
- Badge: Mostrar qty delivered / qty total en SO
- Tabla: Lista de deliveries asociadas a SO
- API client:
salesOrderApi.createDelivery(id) - Navegación automática a delivery creada
- Notificación toast de éxito
- Component tests
- E2E test: "should create delivery from sales order"
Database
- Tabla:
inventory.deliveries(id, order_id, number, state, date, location_from_id, location_to_id) - Tabla:
inventory.delivery_lines(id, delivery_id, product_id, qty_ordered, qty_done) - FK:
inventory.deliveries.order_id → sales.orders.id - Índices: idx_deliveries_order_id, idx_deliveries_state
- RLS policy: company_isolation_deliveries
Mockups / Wireframes
Vista SO con botón Create Delivery:
┌─────────────────────────────────────────────┐
│ Sales Order SO/2024/0001 [confirmed] │
├─────────────────────────────────────────────┤
│ Cliente: ABC Corp │
│ Entregado: 60 / 100 unidades (60%) │
│ │
│ Líneas: │
│ • Producto A: 50/50 entregado ✓ │
│ • Producto B: 10/50 entregado ⚠ │
│ │
│ Entregas: │
│ • DO/2024/0001 [done] - 60 unidades │
│ │
│ [Create Delivery] [Create Invoice] │
└─────────────────────────────────────────────┘
Casos de Prueba
Funcionales
- TC-001: Crear delivery desde SO confirmed exitosamente
- TC-002: Error si SO no está confirmed
- TC-003: Error si no hay cantidades pendientes
- TC-004: Delivery se crea solo con líneas pendientes
- TC-005: Número secuencial generado correctamente
- TC-006: delivery.order_id vinculado correctamente
- TC-007: Mensaje creado en chatter
- TC-008: Ubicaciones origen/destino correctas
No Funcionales
- Performance: < 500ms para crear delivery con 20 líneas
- Seguridad: JWT + permiso stock_user
Dependencias
- US bloqueantes:
- US-MGN-007-002-002 (Confirmar SO)
- US-MGN-005-002-001 (Gestionar Ubicaciones)
- Módulos requeridos: MGN-005 (Inventario)
Notas de Implementación
- Calcular qty_pending por línea:
qty_ordered - SUM(deliveries.qty_done) - Frontend: Mostrar progress bar de entregas en SO
- Considerar permitir creación automática de delivery al confirmar SO
- Validar que warehouse_id esté configurado en SO
Estimación Detallada
| Tarea | Horas |
|---|---|
| Backend | 2.5 |
| Frontend | 2 |
| Testing | 2 |
| Code Review | 0.5 |
| TOTAL | 7 horas = 5 SP |
Definition of Done
- Código implementado según ET
- Tests pasando (>80%)
- Code review aprobado
- Delivery se crea correctamente
- Solo líneas pendientes incluidas
- Número secuencial generado
- Vinculación a SO correcta
- Mensaje en chatter creado
- Swagger docs actualizado
- QA validado
- PO aprobado