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

3.6 KiB

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

RF Asociado: RF-MGN-009-001 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