erp-core/docs/05-user-stories/mgn-007/US-MGN-007-002-002-confirmar-sales-order.md

7.9 KiB

US-MGN-007-002-002: Confirmar Sales Order

RF Asociado: RF-MGN-007-003 Módulo: MGN-007 - Ventas Básico Epic: Órdenes de Venta Prioridad: P0 Story Points: 5 Sprint: Sprint 16 Estado: Ready for Development Fecha: 2025-11-24


User Story

Como vendedor, Quiero confirmar una orden de venta (cambiar de draft → confirmed), Para bloquearla para edición y permitir la creación de entregas y facturas.


Descripción Detallada

Confirmar una SO significa:

  • Cambiar estado de draft → confirmed
  • Registrar fecha de confirmación (date_confirmed)
  • Bloquear edición de líneas y datos principales
  • Permitir procesos downstream: entregas, facturas
  • Reservar stock si apply_reservation=true
  • Notificar al cliente y equipo interno

Una vez confirmada, la SO solo puede cancelarse, no editarse.


Criterios de Aceptación

Escenario 1: Confirmar SO en draft (Camino Feliz)

Dado que SO id=1 está en estado draft con líneas válidas, Cuando ejecuto action "Confirm Order", Entonces sistema cambia estado a confirmed, registra date_confirmed, crea mensaje en chatter.

Escenario 2: Validar que SO está en draft

Dado que SO ya está en estado confirmed, Cuando intento confirmar nuevamente, Entonces sistema retorna error 400 "La orden ya está confirmada".

Escenario 3: Validar que SO tiene líneas

Dado que SO no tiene líneas, Cuando intento confirmar, Entonces sistema retorna error 400 "No se puede confirmar orden sin líneas".

Escenario 4: Validar stock disponible (opcional)

Dado que línea tiene product_id=1, quantity=100 pero stock disponible=50, Cuando intento confirmar con check_stock=true, Entonces sistema retorna warning "Stock insuficiente para Producto X" pero permite confirmar.

Escenario 5: Bloquear edición después de confirmar

Dado que SO está en confirmed, Cuando intento actualizar una línea, Entonces sistema retorna error 400 "No se pueden editar órdenes confirmadas".

Escenario 6: Notificar al cliente

Dado que SO se confirma exitosamente, Cuando se completa confirmación, Entonces sistema envía email al cliente con detalles de la orden confirmada.


Reglas de Negocio

  • RN-1: Solo SO en draft pueden confirmarse.
  • RN-2: SO confirmadas no pueden editarse (solo cancelarse).
  • RN-3: date_confirmed registra timestamp de confirmación.
  • RN-4: Se crea mensaje automático en chatter.
  • RN-5: Se puede enviar email de confirmación al cliente (opcional).
  • RN-6: Validación de stock es warning, no bloqueante.
  • RN-7: Permisos: sales_user puede confirmar sus órdenes, sales_manager puede confirmar cualquiera.

Tareas Técnicas

Backend

  • Endpoint: POST /api/v1/sales/orders/:id/confirm
  • Service: SalesOrderService.confirm(id, confirmDto)
  • Validar estado draft
  • Validar que tiene líneas
  • Validar stock disponible (warning, no error)
  • Actualizar state=confirmed, date_confirmed=now()
  • Crear mensaje en chatter
  • Enviar email de confirmación (opcional)
  • Unit tests (>80%)
  • Integration tests
  • Swagger docs

Frontend

  • Botón: "Confirm Order" en vista de SO draft
  • Modal de confirmación con warnings de stock si aplica
  • Opción: "Send confirmation email to customer"
  • API client: salesOrderApi.confirm(id, options)
  • Deshabilitar edición de SO confirmadas
  • Notificación toast de éxito
  • Component tests
  • E2E test: "should confirm sales order"

Database

  • Columna: sales.orders.date_confirmed (timestamp)
  • Índice: idx_orders_date_confirmed
  • Trigger: audit_log en cambio de estado

Mockups / Wireframes

Vista SO con botón Confirmar:

┌─────────────────────────────────────────────┐
│ Sales Order SO/2024/0001    [draft]         │
├─────────────────────────────────────────────┤
│ Cliente: ABC Corp                           │
│ Total: $5,000.00                            │
│                                             │
│ [Líneas de productos...]                    │
│                                             │
│ ⚠ Advertencia: Producto X tiene solo 50    │
│   unidades disponibles (ordenadas: 100)     │
├─────────────────────────────────────────────┤
│ [Edit] [Confirm Order] [Cancel]             │
└─────────────────────────────────────────────┘

Modal de Confirmación:

┌─────────────────────────────────────────────┐
│ Confirmar Orden de Venta                    │
├─────────────────────────────────────────────┤
│ ¿Confirmar orden SO/2024/0001?              │
│                                             │
│ ☑ Enviar email de confirmación al cliente  │
│                                             │
│ Después de confirmar:                       │
│ • La orden no podrá editarse                │
│ • Se podrán crear entregas y facturas       │
│                                             │
│ [Confirmar] [Cancelar]                      │
└─────────────────────────────────────────────┘

Casos de Prueba

Funcionales

  1. TC-001: Confirmar SO draft exitosamente
  2. TC-002: Error al confirmar SO ya confirmada
  3. TC-003: Error al confirmar SO sin líneas
  4. TC-004: Warning si stock insuficiente pero permite confirmar
  5. TC-005: date_confirmed se registra correctamente
  6. TC-006: Mensaje se crea en chatter
  7. TC-007: Email se envía al cliente si opción activada
  8. TC-008: SO confirmada no permite edición de líneas

No Funcionales

  1. Performance: < 300ms para confirmar orden
  2. Seguridad: JWT + permiso sales_user

Dependencias

  • US bloqueantes:
    • US-MGN-007-002-001 (Crear SO desde Cotización)
  • Módulos requeridos: MGN-005 (Inventario para check stock)

Notas de Implementación

  • Check de stock es informativo, no bloqueante (permite confirmar con stock insuficiente)
  • Email de confirmación usa template configurable
  • Considerar agregar campo confirmed_by_user_id para auditoría
  • Frontend: Deshabilitar botones de edición cuando state=confirmed

Estimación Detallada

Tarea Horas
Backend 2
Frontend 2
Testing 1.5
Code Review 0.5
TOTAL 6 horas = 5 SP

Definition of Done

  • Código implementado según ET
  • Tests pasando (>80%)
  • Code review aprobado
  • Confirmación funciona correctamente
  • Validaciones aplicadas
  • date_confirmed registrada
  • Mensaje en chatter creado
  • Email opcional funciona
  • Edición bloqueada después de confirmar
  • Swagger docs actualizado
  • QA validado
  • PO aprobado

Referencias