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
- TC-001: Confirmar SO draft exitosamente
- TC-002: Error al confirmar SO ya confirmada
- TC-003: Error al confirmar SO sin líneas
- TC-004: Warning si stock insuficiente pero permite confirmar
- TC-005: date_confirmed se registra correctamente
- TC-006: Mensaje se crea en chatter
- TC-007: Email se envía al cliente si opción activada
- TC-008: SO confirmada no permite edición de líneas
No Funcionales
- Performance: < 300ms para confirmar orden
- 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_idpara 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