erp-core/docs/05-user-stories/mgn-009/US-MGN-009-002-001-crud-oportunidades.md

3.1 KiB
Raw Blame History

US-MGN-009-002-001: CRUD Oportunidades

RF Asociado: RF-MGN-009-001 Módulo: MGN-009 - CRM Básico Epic: Oportunidades Prioridad: P0 Story Points: 5 Sprint: Sprint 20 Estado: Ready for Development Fecha: 2025-11-24


User Story

Como vendedor, Quiero gestionar oportunidades de venta calificadas, Para trackear el pipeline hasta el cierre.

Descripción Detallada

Oportunidad es un lead calificado con potencial de venta:

  • Cliente/Contacto
  • Monto estimado
  • Probabilidad de cierre (%)
  • Fecha estimada de cierre
  • Etapa (prospecting, qualification, proposal, negotiation, won, lost)
  • Productos/servicios de interés

Criterios de Aceptación

Escenario 1: Crear oportunidad

Dado que soy vendedor, Cuando creo oportunidad: name="Venta 500 laptops ABC Corp", customer_id=1, amount=50000, probability=60%, stage=proposal, expected_close_date="2024-03-30", Entonces sistema crea oportunidad exitosamente.

Escenario 2: Mover oportunidad por etapas

Dado que oportunidad está en stage=qualification, Cuando actualizo stage=proposal, probability=70%, Entonces sistema actualiza y registra cambio en histórico.

Escenario 3: Marcar como ganada (Won)

Dado que oportunidad está en negotiation con amount=50000, Cuando cambio stage=won, Entonces sistema marca como ganada, registra fecha de cierre, actualiza KPIs de ventas.

Escenario 4: Marcar como perdida (Lost)

Dado que oportunidad está activa, Cuando cambio stage=lost, lost_reason="Precio muy alto", Entonces sistema marca como perdida, requiere motivo obligatorio.

Reglas de Negocio

  • RN-1: Oportunidad requiere customer_id válido.
  • RN-2: amount > 0.
  • RN-3: stage=won requiere fecha de cierre.
  • RN-4: stage=lost requiere lost_reason.
  • RN-5: expected_revenue = amount × (probability/100).

Tareas Técnicas

Backend

  • Endpoint: POST/GET/PUT/DELETE /api/v1/crm/opportunities
  • Service: OpportunityService (CRUD, markAsWon, markAsLost)
  • Calcular expected_revenue automáticamente
  • Validar lost_reason si stage=lost
  • Unit tests

Frontend

  • Página: OpportunitiesPage.tsx
  • Formulario: OpportunityForm.tsx
  • Kanban view por etapas
  • Drag & drop entre etapas
  • Component tests

Database

  • Tabla: crm.opportunities (customer_id, name, amount, probability, stage, expected_close_date, actual_close_date, lost_reason)
  • Enum: opportunity_stage
  • Índices: idx_opportunities_stage, idx_opportunities_customer_id

Estimación Detallada

Tarea Horas
Backend 2.5
Frontend 2.5
Testing 2
TOTAL 7 horas = 5 SP

Definition of Done

  • CRUD completo
  • Workflow de etapas funciona
  • Won/Lost con validaciones
  • Tests >80%
  • QA/PO aprobado

Referencias