299 lines
8.0 KiB
Markdown
299 lines
8.0 KiB
Markdown
# 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)
|