-- Active: 1755472439040@@dev.wappcom.com@3306@nucleo_base
-- ============================================
-- CRM Module Database Structure - VERSIÓN MEJORADA
-- Sistema de Gestión de Relaciones con Clientes
-- ============================================

-- ============================================================
-- Tabla: mod_contacts
-- Descripción: Tabla principal de contactos del sistema
-- Propósito: Almacena todos los contactos (leads, prospectos, 
--            clientes, partners, empleados, proveedores)
-- Reemplaza: mod_persons (tabla antigua)
-- ============================================================

DROP TABLE IF EXISTS `mod_contacts`;
CREATE TABLE `mod_contacts` (
  `mod_con_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del contacto',
  `mod_con_type` enum('lead','prospect','customer','partner','employee','supplier','other') DEFAULT 'lead' COMMENT 'Tipo de contacto: lead=prospecto nuevo, prospect=prospecto calificado, customer=cliente, partner=socio, employee=empleado, supplier=proveedor',
  `mod_con_name` varchar(255) NOT NULL COMMENT 'Nombre del contacto',
  `mod_con_lastname_father` varchar(255) DEFAULT NULL COMMENT 'Apellido paterno',
  `mod_con_lastname_mother` varchar(255) DEFAULT NULL COMMENT 'Apellido materno',
  `mod_con_email_primary` varchar(255) DEFAULT NULL COMMENT 'Correo electrónico principal',
  `mod_con_email_secondary` varchar(255) DEFAULT NULL COMMENT 'Correo electrónico secundario',
  `mod_con_dial_code_phone_primary` varchar(5) DEFAULT NULL COMMENT 'Código de país para teléfono principal',
  `mod_con_phone_primary` varchar(20) DEFAULT NULL COMMENT 'Teléfono principal',
  `mod_con_dial_code_phone_secondary` varchar(5) DEFAULT NULL COMMENT 'Código de país para teléfono secundario',
  `mod_con_phone_secondary` varchar(20) DEFAULT NULL COMMENT 'Teléfono secundario',
  `mod_con_company` varchar(255) DEFAULT NULL COMMENT 'Nombre de la empresa donde trabaja el contacto',
  `mod_con_position` varchar(100) DEFAULT NULL COMMENT 'Cargo o posición que ocupa en la empresa',
  `mod_con_avatar_id` int DEFAULT NULL COMMENT 'ID del avatar del contacto',
  -- ALTER TABLE `mod_customers` ADD CONSTRAINT `unique_customer` UNIQUE (`email`, `phone`);
  `mod_con_website` varchar(255) DEFAULT NULL COMMENT 'Sitio web personal o de la empresa',
  `mod_con_linkedin_url` varchar(255) DEFAULT NULL COMMENT 'URL del perfil de LinkedIn del contacto',
  `mod_con_address` text COMMENT 'Dirección física completa',
  `mod_con_city` varchar(100) DEFAULT NULL COMMENT 'Ciudad de residencia',
  `mod_con_country` char(2) DEFAULT 'BO' COMMENT 'Código de país ISO 3166-1 alpha-2 (BO=Bolivia)',
  `mod_con_postal_code` varchar(20) DEFAULT NULL COMMENT 'Código postal',
  `mod_con_source` enum('web','phone','email','referral','social','event','other') DEFAULT NULL COMMENT 'Fuente de origen del contacto: web=sitio web, phone=llamada telefónica, email=correo, referral=referido, social=redes sociales, event=evento',
  `mod_con_referred_by` varchar(255) DEFAULT NULL COMMENT 'Nombre de la persona que refirió al contacto (solo si source=referral)',
  `mod_con_status` enum('new','contacted','qualified','converted','lost','active','inactive') DEFAULT 'new' COMMENT 'Estado del contacto en el CRM: new=nuevo, contacted=contactado, qualified=calificado, converted=convertido a cliente, lost=perdido, active=activo, inactive=inactivo',
  `mod_con_score` tinyint UNSIGNED DEFAULT 0 COMMENT 'Puntuación del lead (0-100) para priorización de seguimiento',
  `mod_con_notes` text COMMENT 'Notas y comentarios adicionales sobre el contacto',
  `mod_con_assigned_user_id` int DEFAULT NULL COMMENT 'ID del usuario asignado para dar seguimiento (FK a users)',
  `mod_con_cpe_id` int DEFAULT NULL COMMENT 'ID de cliente persona si fue convertido (FK a mod_customers_persons)',
  `mod_con_cen_id` int DEFAULT NULL COMMENT 'ID de cliente empresa si fue convertido (FK a mod_customers_enterprises)',
  `mod_con_metadata` json COMMENT 'Datos adicionales en formato JSON para campos personalizados',
  `mod_con_last_contact_date` datetime DEFAULT NULL COMMENT 'Fecha de último contacto con el prospecto',
  `mod_con_conversion_date` datetime DEFAULT NULL COMMENT 'Fecha en que el contacto se convirtió en cliente',
  `mod_con_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa a la que pertenece este contacto',
  `mod_con_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=inactivo, 1=activo, 2=eliminado',
  `mod_con_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación del registro',
  `mod_con_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_con_deleted_by` int DEFAULT NULL COMMENT 'ID del usuario que eliminó el contacto',
  `mod_con_deleted_at` timestamp NULL DEFAULT NULL COMMENT 'Fecha y hora de eliminación del contacto',
  `mod_con_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_con_id`),
  KEY `idx_type_status` (`mod_con_type`, `mod_con_status`),
  UNIQUE KEY `uniq_contact_primary_email` (`mod_con_email_primary`),
  KEY `idx_email_secondary` (`mod_con_email_secondary`),
  KEY `idx_phone_secondary` (`mod_con_phone_secondary`),
  KEY `idx_assigned_entity` (`mod_con_assigned_user_id`, `mod_con_ent_id`),
  KEY `idx_entity_state` (`mod_con_ent_id`, `mod_con_state`),
  KEY `idx_customer_person` (`mod_con_cpe_id`),
  KEY `idx_customer_enterprise` (`mod_con_cen_id`),
  KEY `idx_source` (`mod_con_source`),
  KEY `idx_last_contact` (`mod_con_last_contact_date`),
  KEY `idx_deleted` (`mod_con_deleted_at`),
  FULLTEXT KEY `ft_contacts_search` (`mod_con_name`, `mod_con_lastname_father`, `mod_con_email_primary`, `mod_con_company`),
  CONSTRAINT `chk_con_score` CHECK (`mod_con_score` BETWEEN 0 AND 100)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_pipelines
-- Descripción: Pipelines o embudos de ventas
-- Propósito: Define los diferentes procesos de venta que puede
--            tener la empresa (ej: ventas directas, ventas B2B)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_pipelines`;
CREATE TABLE `mod_crm_pipelines` (
  `mod_crm_pip_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del pipeline',
  `mod_crm_pip_name` varchar(100) NOT NULL COMMENT 'Nombre del pipeline (ej: Pipeline de Ventas B2B)',
  `mod_crm_pip_description` text COMMENT 'Descripción detallada del propósito del pipeline',
  `mod_crm_pip_is_default` boolean DEFAULT FALSE COMMENT 'Indica si es el pipeline por defecto',
  `mod_crm_pip_order` smallint UNSIGNED DEFAULT 0 COMMENT 'Orden de visualización del pipeline',
  `mod_crm_pip_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_pip_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_pip_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_pip_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_crm_pip_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_pip_id`),
  KEY `idx_entity_state` (`mod_crm_pip_ent_id`, `mod_crm_pip_state`),
  KEY `idx_default` (`mod_crm_pip_is_default`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_pipeline_stages
-- Descripción: Etapas o fases dentro de cada pipeline
-- Propósito: Define las etapas del proceso de venta
--            (ej: Prospección, Calificación, Propuesta, Cierre)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_pipeline_stages`;
CREATE TABLE `mod_crm_pipeline_stages` (
  `mod_crm_pst_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la etapa',
  `mod_crm_pst_pip_id` int NOT NULL COMMENT 'ID del pipeline al que pertenece',
  `mod_crm_pst_name` varchar(100) NOT NULL COMMENT 'Nombre de la etapa (ej: Prospección, Negociación)',
  `mod_crm_pst_probability` tinyint UNSIGNED DEFAULT 0 COMMENT 'Probabilidad de cierre (0-100%)',
  `mod_crm_pst_order` smallint UNSIGNED DEFAULT 0 COMMENT 'Orden de la etapa en el pipeline',
  `mod_crm_pst_color` char(7) DEFAULT '#3369e7' COMMENT 'Color hexadecimal (#RRGGBB)',
  `mod_crm_pst_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_pst_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_pst_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_pst_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_crm_pst_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_pst_id`),
  KEY `idx_pipeline_order` (`mod_crm_pst_pip_id`, `mod_crm_pst_order`),
  KEY `idx_entity_state` (`mod_crm_pst_ent_id`, `mod_crm_pst_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_opportunities
-- Descripción: Oportunidades de negocio/venta
-- Propósito: Registra cada oportunidad de venta con un contacto,
--            su valor estimado, etapa actual y probabilidad de cierre
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_opportunities`;
CREATE TABLE `mod_crm_opportunities` (
  `mod_crm_opp_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la oportunidad',
  `mod_crm_opp_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Nombre descriptivo de la oportunidad',
  `mod_crm_opp_con_id` int NOT NULL COMMENT 'ID del contacto relacionado',
  `mod_crm_opp_pip_id` int NOT NULL COMMENT 'ID del pipeline',
  `mod_crm_opp_pst_id` int NOT NULL COMMENT 'ID de la etapa actual',
  `mod_crm_opp_amount` decimal(15, 2) UNSIGNED DEFAULT 0.00 COMMENT 'Valor estimado',
  `mod_crm_opp_currency` char(3) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'BOB' COMMENT 'Moneda (BOB, USD)',
  `mod_crm_opp_probability` tinyint UNSIGNED DEFAULT 0 COMMENT 'Probabilidad (0-100%)',
  `mod_crm_opp_expected_close_date` date DEFAULT NULL COMMENT 'Fecha estimada de cierre',
  `mod_crm_opp_actual_close_date` date DEFAULT NULL COMMENT 'Fecha real de cierre',
  `mod_crm_opp_status` enum('open','won','lost','abandoned') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'open' COMMENT 'Estado',
  `mod_crm_opp_loss_reason` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Razón de pérdida',
  `mod_crm_opp_description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT 'Descripción',
  `mod_crm_opp_assigned_user_id` int DEFAULT NULL COMMENT 'ID de usuario asignado',
  `mod_crm_opp_weighted_amount` decimal(15, 2) UNSIGNED GENERATED ALWAYS AS ((`mod_crm_opp_amount` * `mod_crm_opp_probability`) / 100) STORED COMMENT 'Monto ponderado',
  `mod_crm_opp_ent_id` int NOT NULL COMMENT 'ID de entidad',
  `mod_crm_opp_state` tinyint DEFAULT 0 COMMENT 'Estado del registro',
  `mod_crm_opp_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación',
  `mod_crm_opp_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Última actualización',
  `mod_crm_opp_create_user_id` int DEFAULT NULL COMMENT 'ID de usuario creador',
  PRIMARY KEY (`mod_crm_opp_id`) USING BTREE,
  INDEX `idx_contact`(`mod_crm_opp_con_id`) USING BTREE,
  INDEX `idx_stage`(`mod_crm_opp_pst_id`) USING BTREE,
  INDEX `idx_status_assigned`(`mod_crm_opp_status`, `mod_crm_opp_assigned_user_id`) USING BTREE,
  INDEX `idx_entity_state`(`mod_crm_opp_ent_id`, `mod_crm_opp_state`) USING BTREE,
  INDEX `idx_expected_close`(`mod_crm_opp_expected_close_date`) USING BTREE,
  INDEX `idx_pipeline_stage`(`mod_crm_opp_pip_id`, `mod_crm_opp_pst_id`) USING BTREE,
  FULLTEXT INDEX `ft_opportunities_search`(`mod_crm_opp_name`, `mod_crm_opp_description`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_activities
-- Descripción: Actividades y tareas del CRM
-- Propósito: Registra todas las actividades programadas o realizadas
--            (llamadas, reuniones, tareas, emails, notas)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_activities`;
CREATE TABLE `mod_crm_activities` (
  `mod_crm_act_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la actividad',
  `mod_crm_act_type` enum('call','email','meeting','task','note','deadline') NOT NULL COMMENT 'Tipo: call=llamada, email=correo, meeting=reunión, task=tarea, note=nota, deadline=fecha límite',
  `mod_crm_act_subject` varchar(255) NOT NULL COMMENT 'Asunto o título de la actividad',
  `mod_crm_act_description` text COMMENT 'Descripción detallada de la actividad',
  `mod_crm_act_status` enum('pending','completed','cancelled','overdue') DEFAULT 'pending' COMMENT 'Estado: pending=pendiente, completed=completada, cancelled=cancelada, overdue=vencida',
  `mod_crm_act_priority` enum('low','medium','high','urgent') DEFAULT 'medium' COMMENT 'Prioridad: low=baja, medium=media, high=alta, urgent=urgente',
  `mod_crm_act_due_date` datetime DEFAULT NULL COMMENT 'Fecha y hora de vencimiento de la actividad',
  `mod_crm_act_completed_date` datetime DEFAULT NULL COMMENT 'Fecha y hora en que se completó la actividad',
  `mod_crm_act_duration` smallint UNSIGNED DEFAULT NULL COMMENT 'Duración estimada o real en minutos',
  `mod_crm_act_related_type` enum('contact','opportunity','customer') DEFAULT NULL COMMENT 'Tipo de entidad relacionada: contact, opportunity o customer',
  `mod_crm_act_related_id` int DEFAULT NULL COMMENT 'ID de la entidad relacionada según el tipo',
  `mod_crm_act_assigned_user_id` int DEFAULT NULL COMMENT 'ID del usuario asignado a la actividad (FK a users)',
  `mod_crm_act_reminder` datetime DEFAULT NULL COMMENT 'Fecha y hora para enviar recordatorio',
  `mod_crm_act_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_act_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_act_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_act_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_crm_act_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_act_id`),
  KEY `idx_type_status` (`mod_crm_act_type`, `mod_crm_act_status`),
  KEY `idx_assigned_due` (`mod_crm_act_assigned_user_id`, `mod_crm_act_due_date`),
  KEY `idx_due_date_status` (`mod_crm_act_due_date`, `mod_crm_act_status`),
  KEY `idx_entity_state` (`mod_crm_act_ent_id`, `mod_crm_act_state`),
  KEY `idx_related` (`mod_crm_act_related_type`, `mod_crm_act_related_id`),
  KEY `idx_reminder` (`mod_crm_act_reminder`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_interactions
-- Descripción: Historial de interacciones con contactos
-- Propósito: Registra todas las comunicaciones realizadas con
--            contactos (llamadas, emails, reuniones, chats)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_interactions`;
CREATE TABLE `mod_crm_interactions` (
  `mod_crm_int_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la interacción',
  `mod_crm_int_type` enum('call','email','meeting','chat','social','other') NOT NULL COMMENT 'Tipo: call=llamada, email=correo, meeting=reunión, chat=chat, social=red social, other=otro',
  `mod_crm_int_direction` enum('inbound','outbound') DEFAULT 'outbound' COMMENT 'Dirección: inbound=entrante (cliente nos contactó), outbound=saliente (nosotros contactamos)',
  `mod_crm_int_subject` varchar(255) DEFAULT NULL COMMENT 'Asunto o tema de la interacción',
  `mod_crm_int_content` text COMMENT 'Contenido o resumen de la interacción',
  `mod_crm_int_duration` smallint UNSIGNED DEFAULT NULL COMMENT 'Duración de la interacción en minutos',
  `mod_crm_int_outcome` enum('successful','unsuccessful','no_answer','follow_up') DEFAULT NULL COMMENT 'Resultado: successful=exitosa, unsuccessful=no exitosa, no_answer=sin respuesta, follow_up=requiere seguimiento',
  `mod_crm_int_con_id` int DEFAULT NULL COMMENT 'ID del contacto con quien se interactúó (FK a mod_contacts)',
  `mod_crm_int_opp_id` int DEFAULT NULL COMMENT 'ID de la oportunidad relacionada si aplica (FK a mod_crm_opportunities)',
  `mod_crm_int_user_id` int NOT NULL COMMENT 'ID del usuario que realizó la interacción (FK a users)',
  `mod_crm_int_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_int_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_int_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de la interacción',
  `mod_crm_int_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_int_id`),
  KEY `idx_contact_created` (`mod_crm_int_con_id`, `mod_crm_int_created_at`),
  KEY `idx_opportunity` (`mod_crm_int_opp_id`),
  KEY `idx_type_direction` (`mod_crm_int_type`, `mod_crm_int_direction`),
  KEY `idx_entity_state` (`mod_crm_int_ent_id`, `mod_crm_int_state`),
  KEY `idx_user_created` (`mod_crm_int_user_id`, `mod_crm_int_created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_tags
-- Descripción: Etiquetas para categorizar y filtrar contactos
-- Propósito: Permite crear etiquetas personalizadas para organizar
--            contactos (ej: VIP, Potencial Alto, Frío, Referido)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_tags`;
CREATE TABLE `mod_crm_tags` (
  `mod_crm_tag_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la etiqueta',
  `mod_crm_tag_name` varchar(50) NOT NULL COMMENT 'Nombre de la etiqueta (ej: VIP, Potencial Alto)',
  `mod_crm_tag_color` char(7) DEFAULT '#3369e7' COMMENT 'Color hexadecimal para visualización (#RRGGBB)',
  `mod_crm_tag_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_tag_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_tag_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_tag_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_tag_id`),
  UNIQUE KEY `uk_tag_entity` (`mod_crm_tag_name`, `mod_crm_tag_ent_id`, `mod_crm_tag_state`),
  KEY `idx_entity_state` (`mod_crm_tag_ent_id`, `mod_crm_tag_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_contact_tags
-- Descripción: Tabla de relación muchos-a-muchos
-- Propósito: Vincula contactos con etiquetas (un contacto puede
--            tener múltiples etiquetas y viceversa)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_contact_tags`;
CREATE TABLE `mod_crm_contact_tags` (
  `mod_crm_cta_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la relación',
  `mod_crm_cta_con_id` int NOT NULL COMMENT 'ID del contacto (FK a mod_contacts)',
  `mod_crm_cta_tag_id` int NOT NULL COMMENT 'ID de la etiqueta (FK a mod_crm_tags)',
  `mod_crm_cta_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora en que se asignó la etiqueta',
  `mod_crm_cta_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que asignó la etiqueta',
  PRIMARY KEY (`mod_crm_cta_id`),
  UNIQUE KEY `uk_contact_tag` (`mod_crm_cta_con_id`, `mod_crm_cta_tag_id`),
  KEY `idx_tag_contact` (`mod_crm_cta_tag_id`, `mod_crm_cta_con_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_custom_fields
-- Descripción: Definición de campos personalizados
-- Propósito: Permite crear campos adicionales dinámicos para
--            contactos, oportunidades o actividades
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_custom_fields`;
CREATE TABLE `mod_crm_custom_fields` (
  `mod_crm_cfi_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del campo personalizado',
  `mod_crm_cfi_entity_type` enum('contact','opportunity','activity') NOT NULL COMMENT 'Tipo de entidad: contact, opportunity o activity',
  `mod_crm_cfi_name` varchar(100) NOT NULL COMMENT 'Nombre interno del campo (sin espacios, snake_case)',
  `mod_crm_cfi_label` varchar(100) NOT NULL COMMENT 'Etiqueta visible del campo para el usuario',
  `mod_crm_cfi_type` enum('text','number','date','select','multiselect','checkbox','textarea','email','url','phone') NOT NULL COMMENT 'Tipo de campo',
  `mod_crm_cfi_options` json DEFAULT NULL COMMENT 'Opciones disponibles para campos tipo select/multiselect en formato JSON',
  `mod_crm_cfi_required` boolean DEFAULT FALSE COMMENT 'Indica si el campo es obligatorio',
  `mod_crm_cfi_order` smallint UNSIGNED DEFAULT 0 COMMENT 'Orden de visualización del campo en formularios',
  `mod_crm_cfi_validation_rules` json DEFAULT NULL COMMENT 'Reglas de validación adicionales en formato JSON',
  `mod_crm_cfi_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_cfi_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_cfi_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_cfi_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_cfi_id`),
  UNIQUE KEY `uk_field_entity` (`mod_crm_cfi_entity_type`, `mod_crm_cfi_name`, `mod_crm_cfi_ent_id`),
  KEY `idx_entity_type_order` (`mod_crm_cfi_entity_type`, `mod_crm_cfi_order`),
  KEY `idx_entity_state` (`mod_crm_cfi_ent_id`, `mod_crm_cfi_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_custom_field_values
-- Descripción: Valores de campos personalizados
-- Propósito: Almacena los valores ingresados en los campos
--            personalizados para cada entidad (contacto, oportunidad, etc)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_custom_field_values`;
CREATE TABLE `mod_crm_custom_field_values` (
  `mod_crm_cfv_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del valor',
  `mod_crm_cfv_cfi_id` int NOT NULL COMMENT 'ID del campo personalizado (FK a mod_crm_custom_fields)',
  `mod_crm_cfv_entity_id` int NOT NULL COMMENT 'ID de la entidad (contacto, oportunidad o actividad según el tipo de campo)',
  `mod_crm_cfv_value` text COMMENT 'Valor almacenado del campo personalizado',
  `mod_crm_cfv_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_cfv_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  PRIMARY KEY (`mod_crm_cfv_id`),
  UNIQUE KEY `uk_field_entity` (`mod_crm_cfv_cfi_id`, `mod_crm_cfv_entity_id`),
  KEY `idx_entity_field` (`mod_crm_cfv_entity_id`, `mod_crm_cfv_cfi_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_workflows
-- Descripción: Automatizaciones y flujos de trabajo
-- Propósito: Define reglas automáticas que se ejecutan cuando
--            ocurren ciertos eventos (ej: enviar email al crear contacto)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_workflows`;
CREATE TABLE `mod_crm_workflows` (
  `mod_crm_wfl_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del workflow',
  `mod_crm_wfl_name` varchar(100) NOT NULL COMMENT 'Nombre descriptivo del workflow',
  `mod_crm_wfl_description` text COMMENT 'Descripción detallada del propósito del workflow',
  `mod_crm_wfl_trigger_type` enum('contact_created','contact_updated','stage_changed','field_updated','time_based','opportunity_won','opportunity_lost') NOT NULL COMMENT 'Tipo de disparador',
  `mod_crm_wfl_trigger_config` json DEFAULT NULL COMMENT 'Configuración del disparador en formato JSON (condiciones, campos, valores)',
  `mod_crm_wfl_actions` json DEFAULT NULL COMMENT 'Array de acciones a ejecutar en formato JSON (enviar email, crear tarea, actualizar campo, etc)',
  `mod_crm_wfl_is_active` boolean DEFAULT TRUE COMMENT 'Indica si el workflow está activo',
  `mod_crm_wfl_execution_count` int UNSIGNED DEFAULT 0 COMMENT 'Contador de ejecuciones del workflow',
  `mod_crm_wfl_last_execution` datetime DEFAULT NULL COMMENT 'Fecha y hora de última ejecución',
  `mod_crm_wfl_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_wfl_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_wfl_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_wfl_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_crm_wfl_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_wfl_id`),
  KEY `idx_entity_state_active` (`mod_crm_wfl_ent_id`, `mod_crm_wfl_state`, `mod_crm_wfl_is_active`),
  KEY `idx_trigger_type` (`mod_crm_wfl_trigger_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_workflow_logs
-- Descripción: Registro de ejecuciones de workflows
-- Propósito: Auditoría y debugging de automatizaciones
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_workflow_logs`;
CREATE TABLE `mod_crm_workflow_logs` (
  `mod_crm_wfl_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID único del log',
  `mod_crm_wfl_log_wfl_id` int NOT NULL COMMENT 'ID del workflow ejecutado (FK a mod_crm_workflows)',
  `mod_crm_wfl_log_entity_type` varchar(50) DEFAULT NULL COMMENT 'Tipo de entidad que disparó el workflow',
  `mod_crm_wfl_log_entity_id` int DEFAULT NULL COMMENT 'ID de la entidad que disparó el workflow',
  `mod_crm_wfl_log_status` enum('success','failed','partial') NOT NULL COMMENT 'Resultado de la ejecución',
  `mod_crm_wfl_log_message` text COMMENT 'Mensaje de resultado o error',
  `mod_crm_wfl_log_executed_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de ejecución',
  PRIMARY KEY (`mod_crm_wfl_log_id`),
  KEY `idx_workflow_executed` (`mod_crm_wfl_log_wfl_id`, `mod_crm_wfl_log_executed_at`),
  KEY `idx_status` (`mod_crm_wfl_log_status`),
  KEY `idx_entity` (`mod_crm_wfl_log_entity_type`, `mod_crm_wfl_log_entity_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_reports
-- Descripción: Reportes y dashboards personalizados
-- Propósito: Permite a los usuarios crear y guardar reportes
--            personalizados con filtros y configuraciones específicas
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_reports`;
CREATE TABLE `mod_crm_reports` (
  `mod_crm_rep_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único del reporte',
  `mod_crm_rep_name` varchar(100) NOT NULL COMMENT 'Nombre del reporte',
  `mod_crm_rep_type` enum('sales','activities','conversion','pipeline','forecast','performance') NOT NULL COMMENT 'Tipo: sales=ventas, activities=actividades, conversion=conversión, pipeline=embudo, forecast=pronóstico, performance=rendimiento',
  `mod_crm_rep_config` json DEFAULT NULL COMMENT 'Configuración del reporte en JSON (filtros, columnas, agrupaciones, gráficos)',
  `mod_crm_rep_is_shared` boolean DEFAULT FALSE COMMENT 'Indica si el reporte es compartido con otros usuarios',
  `mod_crm_rep_user_id` int NOT NULL COMMENT 'ID del usuario propietario del reporte (FK a users)',
  `mod_crm_rep_last_run` datetime DEFAULT NULL COMMENT 'Fecha y hora de última ejecución del reporte',
  `mod_crm_rep_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_rep_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_rep_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_rep_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_rep_id`),
  KEY `idx_user_type` (`mod_crm_rep_user_id`, `mod_crm_rep_type`),
  KEY `idx_entity_state` (`mod_crm_rep_ent_id`, `mod_crm_rep_state`),
  KEY `idx_shared` (`mod_crm_rep_is_shared`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_email_templates
-- Descripción: Plantillas de correo electrónico
-- Propósito: Almacena plantillas reutilizables de emails con
--            variables dinámicas para comunicación con contactos
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_email_templates`;
CREATE TABLE `mod_crm_email_templates` (
  `mod_crm_emt_id` int NOT NULL AUTO_INCREMENT COMMENT 'ID único de la plantilla',
  `mod_crm_emt_name` varchar(100) NOT NULL COMMENT 'Nombre identificador de la plantilla',
  `mod_crm_emt_subject` varchar(255) NOT NULL COMMENT 'Asunto del email (puede incluir variables como {{first_name}})',
  `mod_crm_emt_body` text NOT NULL COMMENT 'Cuerpo del email en HTML (puede incluir variables)',
  `mod_crm_emt_variables` json DEFAULT NULL COMMENT 'Lista de variables disponibles en formato JSON (ej: {"first_name": "Nombre del contacto"})',
  `mod_crm_emt_category` varchar(50) DEFAULT NULL COMMENT 'Categoría de la plantilla (ej: leads, seguimiento, propuestas)',
  `mod_crm_emt_usage_count` int UNSIGNED DEFAULT 0 COMMENT 'Contador de veces que se ha usado la plantilla',
  `mod_crm_emt_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_emt_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_emt_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_emt_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  `mod_crm_emt_create_user_id` int DEFAULT NULL COMMENT 'ID del usuario que creó el registro',
  PRIMARY KEY (`mod_crm_emt_id`),
  KEY `idx_entity_category` (`mod_crm_emt_ent_id`, `mod_crm_emt_category`),
  KEY `idx_entity_state` (`mod_crm_emt_ent_id`, `mod_crm_emt_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_notes
-- Descripción: Notas rápidas asociadas a entidades
-- Propósito: Permite agregar notas informales y rápidas a contactos,
--            oportunidades o actividades
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_notes`;
CREATE TABLE `mod_crm_notes` (
  `mod_crm_note_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID único de la nota',
  `mod_crm_note_content` text NOT NULL COMMENT 'Contenido de la nota',
  `mod_crm_note_related_type` enum('contact','opportunity','activity') NOT NULL COMMENT 'Tipo de entidad relacionada',
  `mod_crm_note_related_id` int NOT NULL COMMENT 'ID de la entidad relacionada',
  `mod_crm_note_is_pinned` boolean DEFAULT FALSE COMMENT 'Indica si la nota está fijada para destacarla',
  `mod_crm_note_user_id` int NOT NULL COMMENT 'ID del usuario que creó la nota (FK a users)',
  `mod_crm_note_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_note_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_note_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  `mod_crm_note_updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha y hora de última actualización',
  PRIMARY KEY (`mod_crm_note_id`),
  KEY `idx_related_created` (`mod_crm_note_related_type`, `mod_crm_note_related_id`, `mod_crm_note_created_at`),
  KEY `idx_user` (`mod_crm_note_user_id`),
  KEY `idx_pinned` (`mod_crm_note_is_pinned`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- Tabla: mod_crm_documents
-- Descripción: Documentos adjuntos a entidades del CRM
-- Propósito: Gestiona archivos relacionados con contactos,
--            oportunidades o actividades (propuestas, contratos, etc)
-- ============================================================

DROP TABLE IF EXISTS `mod_crm_documents`;
CREATE TABLE `mod_crm_documents` (
  `mod_crm_doc_id` bigint NOT NULL AUTO_INCREMENT COMMENT 'ID único del documento',
  `mod_crm_doc_name` varchar(255) NOT NULL COMMENT 'Nombre del archivo',
  `mod_crm_doc_file_path` varchar(500) NOT NULL COMMENT 'Ruta del archivo en el sistema',
  `mod_crm_doc_file_size` bigint UNSIGNED DEFAULT NULL COMMENT 'Tamaño del archivo en bytes',
  `mod_crm_doc_mime_type` varchar(100) DEFAULT NULL COMMENT 'Tipo MIME del archivo',
  `mod_crm_doc_related_type` enum('contact','opportunity','activity') NOT NULL COMMENT 'Tipo de entidad relacionada',
  `mod_crm_doc_related_id` int NOT NULL COMMENT 'ID de la entidad relacionada',
  `mod_crm_doc_description` varchar(500) DEFAULT NULL COMMENT 'Descripción del documento',
  `mod_crm_doc_user_id` int NOT NULL COMMENT 'ID del usuario que subió el documento (FK a users)',
  `mod_crm_doc_ent_id` int NOT NULL COMMENT 'ID de la entidad/empresa propietaria',
  `mod_crm_doc_state` tinyint DEFAULT 0 COMMENT 'Estado del registro: 0=activo, 1=archivado, 2=eliminado',
  `mod_crm_doc_created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha y hora de creación',
  PRIMARY KEY (`mod_crm_doc_id`),
  KEY `idx_related_created` (`mod_crm_doc_related_type`, `mod_crm_doc_related_id`, `mod_crm_doc_created_at`),
  KEY `idx_user` (`mod_crm_doc_user_id`),
  KEY `idx_entity_state` (`mod_crm_doc_ent_id`, `mod_crm_doc_state`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- DATOS INICIALES
-- ============================================

-- Pipeline por defecto
INSERT INTO `mod_crm_pipelines` (`mod_crm_pip_name`, `mod_crm_pip_description`, `mod_crm_pip_is_default`, `mod_crm_pip_order`, `mod_crm_pip_ent_id`, `mod_crm_pip_state`, `mod_crm_pip_create_user_id`) VALUES
('Pipeline de Ventas', 'Pipeline principal de ventas para gestionar oportunidades de negocio', TRUE, 1, 1, 0, 1);

-- Etapas del pipeline por defecto
INSERT INTO `mod_crm_pipeline_stages` (`mod_crm_pst_pip_id`, `mod_crm_pst_name`, `mod_crm_pst_probability`, `mod_crm_pst_order`, `mod_crm_pst_color`, `mod_crm_pst_ent_id`, `mod_crm_pst_state`, `mod_crm_pst_create_user_id`) VALUES
(1, 'Prospección', 10, 1, '#95a5a6', 1, 0, 1),
(1, 'Calificación', 20, 2, '#3498db', 1, 0, 1),
(1, 'Propuesta', 40, 3, '#f39c12', 1, 0, 1),
(1, 'Negociación', 60, 4, '#e67e22', 1, 0, 1),
(1, 'Cierre', 90, 5, '#27ae60', 1, 0, 1);

-- Etiquetas por defecto
INSERT INTO `mod_crm_tags` (`mod_crm_tag_name`, `mod_crm_tag_color`, `mod_crm_tag_ent_id`, `mod_crm_tag_state`, `mod_crm_tag_create_user_id`) VALUES
('VIP', '#e74c3c', 1, 0, 1),
('Potencial Alto', '#27ae60', 1, 0, 1),
('Seguimiento', '#f39c12', 1, 0, 1),
('Frío', '#3498db', 1, 0, 1),
('Referido', '#9b59b6', 1, 0, 1),
('Urgente', '#c0392b', 1, 0, 1);

-- Plantillas de email por defecto
INSERT INTO `mod_crm_email_templates` (`mod_crm_emt_name`, `mod_crm_emt_subject`, `mod_crm_emt_body`, `mod_crm_emt_variables`, `mod_crm_emt_category`, `mod_crm_emt_ent_id`, `mod_crm_emt_state`, `mod_crm_emt_create_user_id`) VALUES
('Bienvenida Lead', 'Bienvenido {{first_name}} - {{company_name}}', '<p>Hola {{first_name}},</p><p>Gracias por tu interés en nuestros servicios. En {{company_name}} estamos comprometidos con brindarte la mejor solución para tus necesidades.</p><p>Un representante de nuestro equipo se pondrá en contacto contigo pronto.</p><p>Saludos cordiales,<br>{{user_name}}<br>{{user_position}}</p>', '{"first_name": "Nombre del contacto", "company_name": "Nombre de la empresa", "user_name": "Nombre del usuario", "user_position": "Cargo del usuario"}', 'leads', 1, 0, 1),
('Seguimiento', 'Seguimiento - {{company}}', '<p>Hola {{first_name}},</p><p>Me comunico para dar seguimiento a nuestra conversación del {{last_contact_date}}.</p><p>¿Tienes alguna pregunta adicional sobre nuestra propuesta?</p><p>Quedo atento a tus comentarios.</p><p>Saludos cordiales,<br>{{user_name}}</p>', '{"first_name": "Nombre del contacto", "company": "Empresa del contacto", "last_contact_date": "Fecha del último contacto", "user_name": "Nombre del usuario"}', 'seguimiento', 1, 0, 1),
('Propuesta Enviada', 'Propuesta Comercial - {{company}}', '<p>Hola {{first_name}},</p><p>Adjunto encontrarás nuestra propuesta comercial según lo conversado.</p><p>Hemos preparado una solución personalizada que se ajusta a las necesidades de {{company}}.</p><p>Estoy disponible para aclarar cualquier duda.</p><p>Saludos cordiales,<br>{{user_name}}<br>Tel: {{user_phone}}</p>', '{"first_name": "Nombre del contacto", "company": "Empresa del contacto", "user_name": "Nombre del usuario", "user_phone": "Teléfono del usuario"}', 'propuestas', 1, 0, 1),
('Cierre Exitoso', '¡Bienvenido a {{company_name}}!', '<p>Estimado/a {{first_name}},</p><p>¡Es un placer darte la bienvenida como cliente de {{company_name}}!</p><p>Nuestro equipo iniciará el proceso de onboarding en los próximos días.</p><p>Gracias por confiar en nosotros.</p><p>Saludos,<br>{{user_name}}</p>', '{"first_name": "Nombre del contacto", "company_name": "Nombre de la empresa", "user_name": "Nombre del usuario"}', 'cierre', 1, 0, 1);

-- ============================================
-- ÍNDICES ADICIONALES PARA OPTIMIZACIÓN
-- ============================================

-- ============================================
-- FOREIGN KEYS - DESHABILITADAS
-- ============================================
-- Las Foreign Keys están comentadas para mantener el flujo abierto
-- durante el desarrollo. Puedes habilitarlas más adelante cuando
-- todas las tablas relacionadas estén creadas.
-- ============================================

/*
ALTER TABLE `mod_contacts`
  ADD CONSTRAINT `fk_con_assigned_user` FOREIGN KEY (`mod_con_assigned_user_id`) REFERENCES `users` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_con_customer_person` FOREIGN KEY (`mod_con_cpe_id`) REFERENCES `mod_customers_persons` (`mod_cpe_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_con_customer_enterprise` FOREIGN KEY (`mod_con_cen_id`) REFERENCES `mod_customers_enterprises` (`mod_cen_id`) ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `mod_crm_pipeline_stages`
  ADD CONSTRAINT `fk_pst_pipeline` FOREIGN KEY (`mod_crm_pst_pip_id`) REFERENCES `mod_crm_pipelines` (`mod_crm_pip_id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `mod_crm_opportunities`
  ADD CONSTRAINT `fk_opp_contact` FOREIGN KEY (`mod_crm_opp_con_id`) REFERENCES `mod_contacts` (`mod_con_id`) ON DELETE RESTRICT ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_opp_pipeline` FOREIGN KEY (`mod_crm_opp_pip_id`) REFERENCES `mod_crm_pipelines` (`mod_crm_pip_id`) ON DELETE RESTRICT ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_opp_stage` FOREIGN KEY (`mod_crm_opp_pst_id`) REFERENCES `mod_crm_pipeline_stages` (`mod_crm_pst_id`) ON DELETE RESTRICT ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_opp_assigned_user` FOREIGN KEY (`mod_crm_opp_assigned_user_id`) REFERENCES `users` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `mod_crm_activities`
  ADD CONSTRAINT `fk_act_assigned_user` FOREIGN KEY (`mod_crm_act_assigned_user_id`) REFERENCES `users` (`user_id`) ON DELETE SET NULL ON UPDATE CASCADE;

ALTER TABLE `mod_crm_interactions`
  ADD CONSTRAINT `fk_int_contact` FOREIGN KEY (`mod_crm_int_con_id`) REFERENCES `mod_contacts` (`mod_con_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_int_opportunity` FOREIGN KEY (`mod_crm_int_opp_id`) REFERENCES `mod_crm_opportunities` (`mod_crm_opp_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_int_user` FOREIGN KEY (`mod_crm_int_user_id`) REFERENCES `users` (`user_id`) ON DELETE RESTRICT ON UPDATE CASCADE;

ALTER TABLE `mod_crm_contact_tags`
  ADD CONSTRAINT `fk_cta_contact` FOREIGN KEY (`mod_crm_cta_con_id`) REFERENCES `mod_contacts` (`mod_con_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_cta_tag` FOREIGN KEY (`mod_crm_cta_tag_id`) REFERENCES `mod_crm_tags` (`mod_crm_tag_id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `mod_crm_custom_field_values`
  ADD CONSTRAINT `fk_cfv_field` FOREIGN KEY (`mod_crm_cfv_cfi_id`) REFERENCES `mod_crm_custom_fields` (`mod_crm_cfi_id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `mod_crm_workflow_logs`
  ADD CONSTRAINT `fk_wfl_log_workflow` FOREIGN KEY (`mod_crm_wfl_log_wfl_id`) REFERENCES `mod_crm_workflows` (`mod_crm_wfl_id`) ON DELETE CASCADE ON UPDATE CASCADE;
*/




/*
MEJORAS IMPLEMENTADAS:
1. Optimización de tipos de datos (TINYINT, SMALLINT, CHAR, JSON, BOOLEAN)
2. Índices compuestos estratégicos
3. Constraints y validaciones (CHECK, UNIQUE)
4. Columnas calculadas (GENERATED COLUMN)
5. Nuevas tablas (workflow_logs, notes, documents)
6. Vistas optimizadas para reportes
7. Stored procedures para lógica de negocio
8. Triggers para automatización
9. Foreign keys con cascadas apropiadas
10. Collation utf8mb4_unicode_ci
11. Índices FULLTEXT para búsquedas
12. Eventos programados para mantenimiento


mod_crm_view_{entidad}_{descripción}  → Vistas
mod_crm_sp_{entidad}_{acción}         → Stored Procedures
mod_crm_trg_{acción}                  → Triggers
mod_crm_evt_{acción}                  → Eventos
*/



DROP TABLE IF EXISTS `mod_crm_view_act_summary`;
DROP TABLE IF EXISTS `mod_crm_view_con_last_interaction`;
DROP TABLE IF EXISTS `mod_crm_view_opp_full`;
