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

**RF Asociado:** [RF-MGN-009-001](../../02-modelado/requerimientos-funcionales/mgn-009/RF-MGN-009-001-gestión-de-leads-y-oportunidades.md)
**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
- [RF-MGN-009-001](../../02-modelado/requerimientos-funcionales/mgn-009/RF-MGN-009-001-gestión-de-leads-y-oportunidades.md)
- [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-009.yaml)
