# US-MGN-009-001-001: CRUD Leads

**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:** Leads
**Prioridad:** P0
**Story Points:** 4
**Sprint:** Sprint 20
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story
**Como** vendedor, **Quiero** crear y gestionar leads (contactos potenciales), **Para** dar seguimiento a prospectos antes de convertirlos en oportunidades.

## Descripción Detallada
Lead es un contacto potencial que aún no es cliente. Incluye:
- Información de contacto (nombre, email, teléfono, empresa)
- Fuente (web, referido, evento, cold call)
- Estado (new, contacted, qualified, unqualified, converted)
- Vendedor asignado
- Tags

## Criterios de Aceptación

### Escenario 1: Crear lead
**Dado que** soy vendedor,
**Cuando** creo lead: name="Juan Pérez", email="juan@example.com", company="ABC Corp", source="website",
**Entonces** sistema crea lead con state=new, assigned_to=current_user.

### Escenario 2: Email único (opcional)
**Dado que** ya existe lead con email="juan@example.com",
**Cuando** intento crear otro con mismo email,
**Entonces** sistema muestra warning "Lead con este email ya existe" pero permite crear.

### Escenario 3: Actualizar lead
**Dado que** lead existe,
**Cuando** actualizo state=contacted, notes="Llamada realizada",
**Entonces** sistema actualiza y registra en audit_log.

### Escenario 4: Asignar lead a vendedor
**Dado que** soy sales_manager,
**Cuando** asigno lead a vendedor Juan,
**Entonces** lead.assigned_to=Juan, sistema notifica a Juan.

### Escenario 5: Filtrar leads por estado
**Dado que** hay 50 leads: 20 new, 15 contacted, 15 qualified,
**Cuando** filtro state=new,
**Entonces** veo solo los 20 leads new.

## Reglas de Negocio
- **RN-1:** Lead se crea en state=new.
- **RN-2:** Email no es único (puede haber duplicados).
- **RN-3:** Vendedor asignado por defecto: creador del lead.
- **RN-4:** RLS filtra por empresa.
- **RN-5:** Permisos: sales_user (propios), sales_manager (todos).

## Tareas Técnicas

### Backend
- [ ] Endpoint: POST/GET/PUT/DELETE `/api/v1/crm/leads`
- [ ] Service: `LeadService` (CRUD methods)
- [ ] DTO: `CreateLeadDto`, `UpdateLeadDto`
- [ ] Enum: lead_state, lead_source
- [ ] Notificar al asignar lead
- [ ] Unit tests (>80%)
- [ ] Integration tests
- [ ] Swagger docs

### Frontend
- [ ] Página: `LeadsPage.tsx` (/crm/leads)
- [ ] Componente: `LeadForm.tsx`
- [ ] Componente: `LeadList.tsx` (tabla con filtros)
- [ ] Componente: `LeadCard.tsx` (vista detalle)
- [ ] Filtros: Estado, Fuente, Vendedor, Fecha
- [ ] Badges: Estado con colores
- [ ] API client: `leadApi`
- [ ] Component tests
- [ ] E2E test

### Database
- [ ] Tabla: `crm.leads` (id, company_id, name, email, phone, company_name, source, state, assigned_to, created_by)
- [ ] Enum: lead_state, lead_source
- [ ] Índices: idx_leads_state, idx_leads_assigned_to, idx_leads_email
- [ ] RLS policy: company_isolation

---

## Estimación Detallada
| Tarea | Horas |
|-------|-------|
| Backend | 2 |
| Frontend | 2.5 |
| Testing | 1.5 |
| Code Review | 0.5 |
| **TOTAL** | **6.5 horas = 4 SP** |

---

## Definition of Done
- [ ] CRUD completo funcional
- [ ] Tests pasando (>80%)
- [ ] Filtros funcionan
- [ ] Asignación de vendedor funciona
- [ ] Notificaciones enviadas
- [ ] RLS aplicado
- [ ] 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)
