erp-core/docs/05-user-stories/mgn-007/US-MGN-007-003-001-crear-entrega-desde-sales-order.md

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:

  1. SO confirmada genera botón "Create Delivery"
  2. Sistema crea delivery en draft con líneas pendientes
  3. Ubicación origen: almacén configurado en SO
  4. Ubicación destino: ubicación del cliente
  5. Referencia: SO/2024/NNNN
  6. 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

  1. TC-001: Crear delivery desde SO confirmed exitosamente
  2. TC-002: Error si SO no está confirmed
  3. TC-003: Error si no hay cantidades pendientes
  4. TC-004: Delivery se crea solo con líneas pendientes
  5. TC-005: Número secuencial generado correctamente
  6. TC-006: delivery.order_id vinculado correctamente
  7. TC-007: Mensaje creado en chatter
  8. TC-008: Ubicaciones origen/destino correctas

No Funcionales

  1. Performance: < 500ms para crear delivery con 20 líneas
  2. 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

Referencias