# Modelo de Datos: CRM **Modulo:** crm **Total Modelos:** 7+ **Modelos Documentados:** 5 (principales) --- ## 1. Indice de Modelos Principales | Modelo | Descripcion | Campos | Archivo | |--------|-------------|--------|---------| | crm.lead | Leads/Opportunities | 80+ | crm_lead.py | | crm.stage | Etapas pipeline | 10+ | crm_stage.py | | crm.team | Equipos venta | 15+ | crm_team.py | | crm.team.member | Miembros | 8+ | crm_team_member.py | | crm.lost.reason | Razones perdida | 3 | crm_lost_reason.py | --- ## 2. Detalle por Modelo ### 2.1 crm.lead (Lead/Opportunity) **Archivo:** `models/crm_lead.py` **Descripcion:** Lead **Hereda de:** mail.thread.cc, mail.thread.blacklist, mail.thread.phone, mail.activity.mixin, utm.mixin, format.address.mixin #### Campos de Pipeline | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre oportunidad | | type | Selection | Si | lead/opportunity | | stage_id | Many2one | No | Etapa actual | | priority | Selection | No | Prioridad (0-3) | | won_status | Selection | No | won/lost/pending (computed) | | active | Boolean | No | Activa (default=True) | #### Campos de Probabilidad | Campo | Tipo | Descripcion | |-------|------|-------------| | probability | Float | Probabilidad manual (0-100) | | automated_probability | Float | Probabilidad PLS | | is_automated_probability | Boolean | probability == automated | #### Campos de Ingresos | Campo | Tipo | Descripcion | |-------|------|-------------| | expected_revenue | Monetary | Ingreso esperado | | prorated_revenue | Monetary | revenue * probability/100 | | recurring_revenue | Monetary | Ingresos recurrentes | | recurring_plan | Many2one | Plan de recurrencia | | recurring_revenue_monthly | Monetary | MRR mensual | #### Campos de Fechas | Campo | Tipo | Descripcion | |-------|------|-------------| | date_closed | Datetime | Fecha cierre | | date_open | Datetime | Fecha asignacion | | date_conversion | Datetime | Fecha conversion | | date_deadline | Date | Cierre esperado | | date_last_stage_update | Datetime | Ultima actualizacion etapa | | day_open | Float | Dias para asignar | | day_close | Float | Dias para cerrar | #### Campos de Contacto | Campo | Tipo | Descripcion | |-------|------|-------------| | partner_id | Many2one | Cliente vinculado | | commercial_partner_id | Many2one | Empresa cliente | | partner_name | Char | Nombre empresa | | contact_name | Char | Nombre contacto | | email_from | Char | Email | | phone | Char | Telefono | | website | Char | Sitio web | | function | Char | Cargo | #### Campos de Organizacion | Campo | Tipo | Descripcion | |-------|------|-------------| | user_id | Many2one | Vendedor | | team_id | Many2one | Equipo de ventas | | company_id | Many2one | Empresa | | tag_ids | Many2many | Etiquetas | | lost_reason_id | Many2one | Razon de perdida | #### Campos UTM | Campo | Tipo | Descripcion | |-------|------|-------------| | campaign_id | Many2one | Campana UTM | | medium_id | Many2one | Medio UTM | | source_id | Many2one | Fuente UTM | #### Restricciones ``` CHECK(probability >= 0 and probability <= 100) ``` --- ### 2.2 crm.stage (Etapas) **Archivo:** `models/crm_stage.py` **Descripcion:** CRM Stages | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Nombre etapa | | sequence | Integer | No | Orden (default=1) | | is_won | Boolean | No | Etapa ganadora | | fold | Boolean | No | Plegada en kanban | | team_ids | Many2many | No | Equipos asociados | | rotting_threshold_days | Integer | No | Dias antes de "podrido" | | requirements | Text | No | Requisitos internos | | color | Integer | No | Color UI | | team_count | Integer | No | Cantidad equipos | --- ### 2.3 crm.team (Equipos de Venta) **Archivo:** `models/crm_team.py` **Descripcion:** Sales Team (extension) **Hereda de:** crm.team (sales_team) | Campo | Tipo | Descripcion | |-------|------|-------------| | use_leads | Boolean | Habilita leads | | use_opportunities | Boolean | Habilita opportunities | | alias_id | Many2one | Email alias | | assignment_enabled | Boolean | Asignacion automatica | | assignment_max | Integer | Capacidad mensual | | assignment_domain | Char | Dominio asignacion | | lead_unassigned_count | Integer | Leads sin asignar | | lead_properties_definition | PropertiesDefinition | Propiedades custom | | crm_team_member_ids | One2many | Miembros | --- ### 2.4 crm.team.member (Miembros) **Archivo:** `models/crm_team_member.py` **Descripcion:** Sales Team Member | Campo | Tipo | Descripcion | |-------|------|-------------| | assignment_enabled | Boolean | Asignacion habilitada | | assignment_domain | Char | Dominio asignacion | | assignment_domain_preferred | Char | Dominio preferido | | assignment_optout | Boolean | Pausar asignacion | | assignment_max | Integer | Capacidad mensual (default=30) | | lead_day_count | Integer | Leads ultimas 24h | | lead_month_count | Integer | Leads ultimos 30 dias | --- ### 2.5 crm.lost.reason (Razones de Perdida) **Archivo:** `models/crm_lost_reason.py` **Descripcion:** Opportunity Lost Reason | Campo | Tipo | Req | Descripcion | |-------|------|-----|-------------| | name | Char | Si | Descripcion razon | | active | Boolean | No | Activo | | leads_count | Integer | No | Cantidad leads | --- ## 3. Diagrama Entidad-Relacion ``` ┌───────────────────────┐ stage_id ┌───────────────────────┐ │ crm.lead │─────────────────────►│ crm.stage │ │ │ │ │ │ - type │ team_ids │ - is_won │ │ - probability │◄─────────────────────│ - fold │ │ - won_status │ │ - sequence │ │ - expected_revenue │ └───────────────────────┘ └───────────┬───────────┘ │ │ user_id, team_id ▼ ┌───────────────────────┐ member_ids ┌───────────────────────┐ │ crm.team │─────────────────────►│ crm.team.member │ │ │ │ │ │ - use_leads │ │ - assignment_max │ │ - use_opportunities │ │ - lead_month_count │ │ - assignment_enabled │ └───────────────────────┘ └───────────────────────┘ ┌───────────────────────┐ lost_reason_id ┌───────────────────────┐ │ crm.lead │─────────────────────►│ crm.lost.reason │ │ │ │ │ │ (perdida) │ │ - leads_count │ └───────────────────────┘ └───────────────────────┘ ``` --- ## 4. Constantes del Modulo ```python # Prioridades disponibles AVAILABLE_PRIORITIES = [ ('0', 'Low'), ('1', 'Medium'), ('2', 'High'), ('3', 'Very High'), ] # Tipos de registro type = Selection([ ('lead', 'Lead'), ('opportunity', 'Opportunity') ]) # Estados won/lost won_status = Selection([ ('won', 'Won'), ('lost', 'Lost'), ('pending', 'Pending'), ]) ``` --- ## 5. Modelo de Scoring ### crm.lead.scoring.frequency | Campo | Tipo | Descripcion | |-------|------|-------------| | variable | Char | Campo analizado | | value | Char | Valor especifico | | won_count | Float | Conteo ganadas + 0.1 | | lost_count | Float | Conteo perdidas + 0.1 | | team_id | Many2one | Equipo (NULL = global) | --- **Referencias:** - Carpeta models: `addons/crm/models/` - Constantes: `addons/crm/models/crm_stage.py`