# MODELO DE DOMINIO: CRM

**Módulos:** MGN-009 (CRM Básico)
**Fecha:** 2025-11-24
**Referencia Odoo:** crm
**Referencia Gamilit:** No implementado

---

## Diagrama de Entidades (Texto UML)

```
[Lead]
  - id: UUID (PK)
  - tenant_id: UUID (FK)
  - company_id: UUID (FK)
  - name: String
  - contact_name: String
  - email: String
  - phone: String
  - partner_id: UUID (FK)
  - source: ENUM (website, referral, campaign, cold_call)
  - status: ENUM (new, qualified, converted, lost)
  - stage_id: UUID (FK)
  - assigned_to: UUID (FK user)
  - expected_revenue: Decimal
  - probability: Integer
  - expected_closing: Date
  - lost_reason: String

  1 <----> * [Activity]
  1 <----> * [SaleOrder] (conversión)

[Stage]
  - id: UUID (PK)
  - tenant_id: UUID (FK)
  - team_id: UUID (FK)
  - name: String
  - sequence: Integer
  - probability: Integer
  - is_won: Boolean
  - is_lost: Boolean

[SalesTeam]
  - id: UUID (PK)
  - tenant_id: UUID (FK)
  - company_id: UUID (FK)
  - name: String
  - leader_id: UUID (FK user)
  - target_amount: Decimal

  1 <----> * [User] (members)
  1 <----> * [Stage]

[Activity]
  - id: UUID (PK)
  - tenant_id: UUID (FK)
  - lead_id: UUID (FK)
  - user_id: UUID (FK)
  - activity_type: ENUM (call, meeting, email, task)
  - summary: String
  - description: Text
  - date: Date
  - status: ENUM (pending, completed, overdue)

[LeadTag]
  - id: UUID (PK)
  - tenant_id: UUID (FK)
  - name: String
  - color: String

  * <----> * [Lead] (many-to-many)
```

## Entidades Principales

### 1. Lead (Oportunidad de Venta)
**Descripción:** Contacto interesado o oportunidad de venta.

**Atributos:**
- `id`: UUID
- `name`: Nombre de la oportunidad (ej: "Proyecto Oficinas Centro")
- `contact_name`: Nombre del contacto
- `email`: Email de contacto
- `phone`: Teléfono
- `partner_id`: Partner asociado (si ya existe)
- `source`: website, referral, campaign, cold_call
- `status`: new, qualified, converted, lost
- `stage_id`: Etapa actual en pipeline
- `assigned_to`: Usuario asignado
- `expected_revenue`: Ingreso esperado
- `probability`: Probabilidad de cierre (0-100%)
- `expected_closing`: Fecha esperada de cierre

**Relaciones:**
- 1 Lead → N Activities
- 1 Lead → 1 SaleOrder (conversión)
- N Leads → 1 Partner

**Patrón Odoo:** crm.lead
**Diferencia Lead vs Opportunity:**
- Lead: Contacto no calificado
- Opportunity: Lead calificado con probabilidad de venta

### 2. Stage (Etapa de Pipeline)
**Descripción:** Etapa en el pipeline de ventas.

**Atributos:**
- `id`: UUID
- `team_id`: Equipo de ventas propietario
- `name`: Nombre (ej: "Prospección", "Calificación", "Propuesta")
- `sequence`: Orden de etapa
- `probability`: Probabilidad por defecto (%)
- `is_won`: Marca si es etapa ganada
- `is_lost`: Marca si es etapa perdida

**Relaciones:**
- N Stages → 1 SalesTeam
- 1 Stage → N Leads

**Patrón Odoo:** crm.stage
**Pipeline típico:**
1. Prospección (10%)
2. Calificación (20%)
3. Propuesta (40%)
4. Negociación (60%)
5. Ganado (100%) o Perdido (0%)

### 3. SalesTeam (Equipo de Ventas)
**Descripción:** Equipo de ventas con vendedores asignados.

**Atributos:**
- `id`: UUID
- `company_id`: Empresa
- `name`: Nombre del equipo
- `leader_id`: Líder del equipo
- `target_amount`: Meta de ventas (mensual/anual)

**Relaciones:**
- 1 SalesTeam → N Users (miembros)
- 1 SalesTeam → N Stages
- 1 SalesTeam → N Leads

**Patrón Odoo:** crm.team
**Equipos típicos:**
- Ventas Corporativas
- Ventas Retail
- Ventas Online

### 4. Activity (Actividad)
**Descripción:** Actividad de seguimiento para lead.

**Atributos:**
- `id`: UUID
- `lead_id`: Lead asociado
- `user_id`: Usuario asignado
- `activity_type`: call, meeting, email, task
- `summary`: Resumen
- `description`: Descripción detallada
- `date`: Fecha programada
- `status`: pending, completed, overdue

**Relaciones:**
- N Activities → 1 Lead
- N Activities → 1 User

**Patrón Odoo:** mail.activity (especializado para CRM)
**Tipos:**
- call: Llamada telefónica
- meeting: Reunión presencial/virtual
- email: Envío de email
- task: Tarea general

### 5. LeadTag (Etiqueta de Lead)
**Descripción:** Etiquetas para categorizar leads.

**Atributos:**
- `id`: UUID
- `name`: Nombre (ej: "Hot", "Enterprise", "SMB")
- `color`: Color para UI

**Relaciones:**
- N LeadTags ←→ N Leads

**Patrón Odoo:** crm.tag
**Tags típicos:**
- Hot/Warm/Cold (temperatura)
- Enterprise/SMB (tamaño)
- Industry tags (construcción, manufactura, etc.)

## Reglas de Negocio

### RN-CRM-001: Flujo de Lead
- Lead comienza en stage inicial del team
- Lead avanza/retrocede entre stages (drag & drop)
- Al llegar a stage con is_won=true, marca como 'won'
- Al llegar a stage con is_lost=true, marca como 'lost'

### RN-CRM-002: Calificación de Lead
- Lead nuevo (new) → Lead calificado (qualified)
- Calificación requiere validar: contacto, presupuesto, autoridad, necesidad
- Solo leads calificados pueden convertirse a oportunidad

### RN-CRM-003: Conversión a Cotización
- Opportunity puede generar Quotation (MGN-007)
- Quotation hereda: partner, productos, expected_revenue
- Vínculo bidireccional opportunity ←→ quotation

### RN-CRM-004: Asignación Automática
- Leads pueden asignarse automáticamente por round-robin
- O por carga de trabajo (# leads activos por vendedor)
- O manualmente por líder de equipo

### RN-CRM-005: Scoring de Lead
- Scoring automático basado en criterios:
  - Tamaño de empresa (+20 puntos)
  - Industria target (+15 puntos)
  - Interacción reciente (+10 puntos)
  - Email abierto (+5 puntos)
- Score > 70: Hot lead

### RN-CRM-006: Actividades Vencidas
- Sistema marca activities como 'overdue' si date < HOY
- Notificaciones automáticas de actividades vencidas
- Dashboard muestra actividades overdue por usuario

## Casos de Uso Principales

1. **UC-CRM-001:** Usuario crea nuevo lead desde formulario web
2. **UC-CRM-002:** Usuario califica lead (new → qualified)
3. **UC-CRM-003:** Usuario mueve oportunidad entre stages
4. **UC-CRM-004:** Usuario programa llamada de seguimiento
5. **UC-CRM-005:** Usuario convierte oportunidad a cotización
6. **UC-CRM-006:** Usuario marca oportunidad como ganada/perdida
7. **UC-CRM-007:** Gerente consulta embudo de ventas (funnel)
8. **UC-CRM-008:** Sistema asigna lead automáticamente a vendedor

## Validaciones y Constraints

```sql
-- Probability entre 0 y 100
CHECK (probability >= 0 AND probability <= 100)

-- Expected revenue >= 0
CHECK (expected_revenue >= 0)

-- Stage sequence > 0
CHECK (sequence > 0)

-- Stage no puede ser won y lost simultáneamente
CHECK (NOT (is_won AND is_lost))

-- Activity date debe ser presente o futuro
CHECK (date >= CURRENT_DATE)

-- Email format válido
CHECK (email ~ '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$')
```

## Índices Requeridos

```sql
CREATE INDEX idx_leads_stage_id ON crm.leads(stage_id);
CREATE INDEX idx_leads_assigned_to ON crm.leads(assigned_to);
CREATE INDEX idx_leads_status ON crm.leads(status);
CREATE INDEX idx_leads_expected_closing ON crm.leads(expected_closing);
CREATE INDEX idx_leads_partner_id ON crm.leads(partner_id);
CREATE INDEX idx_activities_lead_id ON crm.activities(lead_id);
CREATE INDEX idx_activities_user_id ON crm.activities(user_id);
CREATE INDEX idx_activities_status ON crm.activities(status);
CREATE INDEX idx_activities_date ON crm.activities(date);
```

## Integración con Otros Módulos

### Con MGN-003 (Catálogos)
- Lead puede crear Partner al calificarse
- Lead se vincula a Partner existente

### Con MGN-007 (Ventas)
- Opportunity → Quotation
- Quotation ganada → marca Opportunity como 'won'

### Con MGN-014 (Mensajería)
- Actividades son especializaciones de mail.activity
- Leads tienen chatter para comentarios

### Con MGN-012 (Reportes)
- Dashboard de CRM:
  - Embudo de ventas
  - Conversión rate
  - Revenue por stage
  - Actividades por usuario

## Referencias
- [ALCANCE-POR-MODULO.md - MGN-009](../../01-definicion-modulos/ALCANCE-POR-MODULO.md#mgn-009)
- [ADR-007: Database Design](../../adr/ADR-007-database-design.md)
- [odoo-crm-analysis.md](../../00-analisis-referencias/odoo/odoo-crm-analysis.md)
