-- https://www.phpmyadmin.net/
--
-- Servidor: 127.0.0.1
-- Tiempo de generación: 24-07-2025 a las 01:03:31
-- Versión del servidor: 10.1.29-MariaDB
-- Versión de PHP: 7.2.0

START TRANSACTION;



--
-- Base de datos: `eneagrama`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `activity_logs`
--

CREATE TABLE `activity_logs` (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `action` varchar(100) NOT NULL,
  `details` text,
  `ip_address` varchar(45) DEFAULT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `admin_activity_logs`
--

CREATE TABLE `admin_activity_logs` (
  `id` int(11) NOT NULL,
  `admin_user_id` int(11) NOT NULL,
  `accion` varchar(100) NOT NULL,
  `descripcion` text,
  `ip_address` varchar(45) DEFAULT NULL,
  `user_agent` text,
  `datos_adicionales` text,
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `admin_sessions`
--

CREATE TABLE `admin_sessions` (
  `id` int(11) NOT NULL,
  `admin_user_id` int(11) NOT NULL,
  `token` varchar(255) NOT NULL,
  `ip_address` varchar(45) DEFAULT NULL,
  `user_agent` text,
  `expires_at` datetime NOT NULL,
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `admin_users`
--

CREATE TABLE `admin_users` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `password_hash` varchar(255) NOT NULL,
  `rol` enum('admin','super_admin') DEFAULT 'admin',
  `activo` tinyint(1) DEFAULT '1',
  `ultimo_acceso` datetime DEFAULT NULL,
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `clientes`
--

CREATE TABLE `clientes` (
  `id` int(11) NOT NULL,
  `razon_social` varchar(200) NOT NULL,
  `rfc` varchar(20) DEFAULT NULL,
  `calle` varchar(200) NOT NULL,
  `numero_exterior` varchar(20) NOT NULL,
  `numero_interior` varchar(20) DEFAULT '',
  `colonia` varchar(100) NOT NULL,
  `municipio` varchar(100) NOT NULL,
  `estado_direccion` varchar(100) DEFAULT 'Quintana Roo',
  `codigo_postal` varchar(5) DEFAULT '',
  `telefono` varchar(20) DEFAULT '',
  `email` varchar(150) DEFAULT '',
  `contacto_principal` varchar(100) DEFAULT '',
  `estado` enum('activo','inactivo') DEFAULT 'activo',
  `notas` text,
  `usuario_creacion` int(11) DEFAULT NULL,
  `usuario_actualizacion` int(11) DEFAULT NULL,
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `dashboard_stats`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `dashboard_stats` (
`total_test_requests` bigint(21)
,`completed_tests` bigint(21)
,`requests_last_week` bigint(21)
,`completed_last_week` bigint(21)
,`active_clients` bigint(21)
,`active_admins` bigint(21)
);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `enneagram_subtypes`
--

CREATE TABLE `enneagram_subtypes` (
  `id` int(11) NOT NULL,
  `nombre` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `codigo` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `descripcion` text COLLATE utf8mb4_unicode_ci,
  `activo` tinyint(1) DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `enneagram_types`
--

CREATE TABLE `enneagram_types` (
  `id` int(11) NOT NULL,
  `numero` tinyint(4) NOT NULL,
  `nombre` varchar(50) NOT NULL,
  `descripcion_corta` text,
  `descripcion_larga` text,
  `motivaciones` text,
  `miedos` text,
  `fortalezas` text,
  `areas_crecimiento` text,
  `color_hex` varchar(7) DEFAULT '#000000',
  `activo` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `group_accounts`
--

CREATE TABLE `group_accounts` (
  `id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `nombre_cuenta` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `tipo_acceso` enum('token','password') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'token',
  `token_acceso` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `password_hash` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `activo` tinyint(1) DEFAULT '1',
  `ultimo_acceso` datetime DEFAULT NULL,
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `creado_por` int(11) NOT NULL,
  `fecha_ultimo_test` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Disparadores `group_accounts`
--
DELIMITER $$
CREATE TRIGGER `log_group_account_activity` AFTER INSERT ON `group_accounts` FOR EACH ROW BEGIN
    INSERT INTO group_activity_logs 
    (group_id, group_account_id, admin_user_id, accion, descripcion) 
    VALUES 
    (NEW.group_id, NEW.id, NEW.creado_por, 'ACCOUNT_CREATED', 
     CONCAT('Cuenta creada: ', NEW.nombre_cuenta, ' (', NEW.username, ')'));
END
$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER `validate_group_account_limit` BEFORE INSERT ON `group_accounts` FOR EACH ROW BEGIN
    DECLARE account_count INT;
    DECLARE max_accounts INT;
    
    -- Obtener límite máximo de cuentas para el grupo
    SELECT max_cuentas INTO max_accounts 
    FROM test_groups 
    WHERE id = NEW.group_id AND activo = 1;
    
    -- Contar cuentas activas actuales
    SELECT COUNT(*) INTO account_count 
    FROM group_accounts 
    WHERE group_id = NEW.group_id AND activo = 1;
    
    -- Validar límite
    IF account_count >= max_accounts THEN
        SIGNAL SQLSTATE '45000' 
        SET MESSAGE_TEXT = 'Se ha alcanzado el límite máximo de cuentas para este grupo';
    END IF;
END
$$
DELIMITER ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `group_account_sessions`
--

CREATE TABLE `group_account_sessions` (
  `id` int(11) NOT NULL,
  `group_account_id` int(11) NOT NULL,
  `session_token` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_agent` text COLLATE utf8mb4_unicode_ci,
  `expires_at` datetime NOT NULL,
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `group_activity_logs`
--

CREATE TABLE `group_activity_logs` (
  `id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `group_account_id` int(11) DEFAULT NULL,
  `admin_user_id` int(11) DEFAULT NULL,
  `accion` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `descripcion` text COLLATE utf8mb4_unicode_ci,
  `datos_adicionales` text COLLATE utf8mb4_unicode_ci,
  `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_agent` text COLLATE utf8mb4_unicode_ci,
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `group_invitations`
--

CREATE TABLE `group_invitations` (
  `id` int(11) NOT NULL,
  `group_id` int(11) NOT NULL,
  `email` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `nombre_invitado` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `token_invitacion` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `estado` enum('pendiente','aceptada','expirada','cancelada') COLLATE utf8mb4_unicode_ci DEFAULT 'pendiente',
  `fecha_expiracion` datetime NOT NULL,
  `fecha_aceptada` datetime DEFAULT NULL,
  `group_account_id` int(11) DEFAULT NULL,
  `creado_por` int(11) NOT NULL,
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `grupos`
--

CREATE TABLE `grupos` (
  `id` int(11) NOT NULL,
  `nombre` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
  `descripcion` text COLLATE utf8mb4_unicode_ci,
  `tipo_test_asignado` enum('personal','student','business') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'personal',
  `max_cuentas` int(11) DEFAULT '50' COMMENT 'Máximo de cuentas permitidas en el grupo',
  `max_tests_por_cuenta` int(11) DEFAULT '1' COMMENT 'Máximo de tests por cuenta',
  `fecha_expiracion` datetime DEFAULT NULL COMMENT 'Fecha de expiración del grupo',
  `codigo_acceso` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Código opcional para unirse al grupo',
  `admin_user_id` int(11) NOT NULL COMMENT 'Admin que creó el grupo',
  `activo` tinyint(1) DEFAULT '1',
  `configuracion` text COLLATE utf8mb4_unicode_ci COMMENT 'Configuraciones adicionales en JSON',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `grupo_cuentas`
--

CREATE TABLE `grupo_cuentas` (
  `id` int(11) NOT NULL,
  `grupo_id` int(11) NOT NULL,
  `nombre_cuenta` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Nombre identificativo de la cuenta',
  `email` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Email opcional',
  `username` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Username autogenerado o personalizado',
  `password_hash` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Contraseña hash si usa login',
  `token_acceso` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Token único para acceso directo',
  `tipo_acceso` enum('token','password') COLLATE utf8mb4_unicode_ci DEFAULT 'token' COMMENT 'Tipo de autenticación',
  `tests_realizados` int(11) DEFAULT '0',
  `tests_completados` int(11) DEFAULT '0',
  `ultimo_acceso` datetime DEFAULT NULL,
  `fecha_ultimo_test` datetime DEFAULT NULL,
  `activo` tinyint(1) DEFAULT '1',
  `datos_adicionales` text COLLATE utf8mb4_unicode_ci COMMENT 'Datos adicionales en JSON (nombre real, etc.)',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `grupo_invitaciones`
--

CREATE TABLE `grupo_invitaciones` (
  `id` int(11) NOT NULL,
  `grupo_id` int(11) NOT NULL,
  `email` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
  `token_invitacion` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `nombre_invitado` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `mensaje_personalizado` text COLLATE utf8mb4_unicode_ci,
  `enviado_por` int(11) NOT NULL COMMENT 'Admin que envió la invitación',
  `fecha_envio` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_expiracion` datetime NOT NULL,
  `fecha_aceptada` datetime DEFAULT NULL,
  `cuenta_creada_id` int(11) DEFAULT NULL COMMENT 'ID de cuenta creada al aceptar',
  `estado` enum('pendiente','aceptada','expirada','cancelada') COLLATE utf8mb4_unicode_ci DEFAULT 'pendiente'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `grupo_test_resultados`
--

CREATE TABLE `grupo_test_resultados` (
  `id` int(11) NOT NULL,
  `grupo_cuenta_id` int(11) NOT NULL,
  `grupo_id` int(11) NOT NULL,
  `tipo_test` enum('personal','student','business') COLLATE utf8mb4_unicode_ci NOT NULL,
  `resultado_tipo` tinyint(4) DEFAULT NULL COMMENT 'Tipo de enneagrama resultante (1-9)',
  `puntuaciones` text COLLATE utf8mb4_unicode_ci COMMENT 'Puntuaciones detalladas en JSON',
  `respuestas` text COLLATE utf8mb4_unicode_ci COMMENT 'Respuestas del test en JSON',
  `tiempo_invertido` int(11) DEFAULT NULL COMMENT 'Tiempo en minutos',
  `ip_address` varchar(45) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user_agent` text COLLATE utf8mb4_unicode_ci,
  `fecha_inicio` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_completado` datetime DEFAULT NULL,
  `estado` enum('iniciado','completado','abandonado') COLLATE utf8mb4_unicode_ci DEFAULT 'iniciado'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Disparadores `grupo_test_resultados`
--
DELIMITER $$
CREATE TRIGGER `tr_update_cuenta_stats_after_test` AFTER UPDATE ON `grupo_test_resultados` FOR EACH ROW BEGIN
    IF NEW.estado = 'completado' AND OLD.estado != 'completado' THEN
        UPDATE grupo_cuentas 
        SET 
            tests_completados = tests_completados + 1,
            fecha_ultimo_test = NEW.fecha_completado
        WHERE id = NEW.grupo_cuenta_id;
    END IF;
END
$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER `tr_validate_test_limits_before_insert` BEFORE INSERT ON `grupo_test_resultados` FOR EACH ROW BEGIN
    DECLARE max_tests INT DEFAULT 1;
    DECLARE current_tests INT DEFAULT 0;
    DECLARE grupo_activo TINYINT DEFAULT 0;
    DECLARE cuenta_activa TINYINT DEFAULT 0;
    
    -- Obtener configuraciones del grupo
    SELECT g.max_tests_por_cuenta, g.activo, gc.activo
    INTO max_tests, grupo_activo, cuenta_activa
    FROM grupos g
    INNER JOIN grupo_cuentas gc ON g.id = gc.grupo_id
    WHERE g.id = NEW.grupo_id AND gc.id = NEW.grupo_cuenta_id;
    
    -- Validar que grupo y cuenta estén activos
    IF grupo_activo = 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'El grupo no está activo';
    END IF;
    
    IF cuenta_activa = 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'La cuenta no está activa';
    END IF;
    
    -- Contar tests completados de la cuenta
    SELECT COUNT(*)
    INTO current_tests
    FROM grupo_test_resultados
    WHERE grupo_cuenta_id = NEW.grupo_cuenta_id 
    AND estado = 'completado';
    
    -- Validar límite de tests
    IF current_tests >= max_tests THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Se ha alcanzado el límite máximo de tests para esta cuenta';
    END IF;
END
$$
DELIMITER ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `result_configurations`
--

CREATE TABLE `result_configurations` (
  `id` int(11) NOT NULL,
  `tipo_test` enum('personal','student','business') COLLATE utf8mb4_unicode_ci NOT NULL,
  `idioma` enum('es','en') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'es',
  `eneatipo` int(1) NOT NULL COMMENT 'Número del eneatipo (1-9)',
  `subtipo_id` int(11) DEFAULT NULL COMMENT 'ID del subtipo específico (opcional)',
  `is_for_students` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 para alumnos, 0 para general/negocios',
  `titulo_principal` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Título principal del resultado',
  `descripcion_corta` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Descripción breve del tipo',
  `descripcion_extendida` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Descripción completa y detallada',
  `caracteristicas_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Array JSON de características principales',
  `fortalezas_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Array JSON de fortalezas',
  `areas_desarrollo_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Array JSON de áreas de desarrollo',
  `consejos_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Array JSON de consejos específicos',
  `descripcion_opcional` text COLLATE utf8mb4_unicode_ci COMMENT 'Descripción adicional opcional',
  `activo` tinyint(1) NOT NULL DEFAULT '1',
  `creado_por` int(11) DEFAULT NULL COMMENT 'ID del admin que creó',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Configuraciones personalizables de resultados de test';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `sesiones_activas`
--

CREATE TABLE `sesiones_activas` (
  `id` int(11) NOT NULL,
  `idUsuario` int(11) NOT NULL,
  `token` varchar(255) NOT NULL,
  `activa` tinyint(1) DEFAULT '1',
  `ip_address` varchar(45) DEFAULT NULL,
  `user_agent` text,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `expires_at` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `subtype_content`
--

CREATE TABLE `subtype_content` (
  `id` int(11) NOT NULL,
  `result_config_id` int(11) NOT NULL COMMENT 'FK a result_configurations',
  `subtipo_id` int(11) NOT NULL COMMENT 'ID del subtipo',
  `titulo_subtipo` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Título del subtipo',
  `descripcion_subtipo` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Descripción específica del subtipo',
  `caracteristicas_subtipo_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Características específicas del subtipo',
  `consejos_subtipo_json` longtext COLLATE utf8mb4_unicode_ci COMMENT 'Consejos específicos para el subtipo',
  `activo` tinyint(1) NOT NULL DEFAULT '1',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Contenido adicional específico por subtipo';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `system_config`
--

CREATE TABLE `system_config` (
  `id` int(11) NOT NULL,
  `config_key` varchar(100) NOT NULL,
  `config_value` text,
  `descripcion` text,
  `tipo` enum('string','number','boolean','json') DEFAULT 'string',
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `tests_by_type`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `tests_by_type` (
`tipo_test` enum('personal','student','business')
,`total_requests` bigint(21)
,`completed` bigint(21)
,`completion_rate` decimal(26,2)
);

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_groups`
--

CREATE TABLE `test_groups` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `descripcion` text COLLATE utf8mb4_unicode_ci,
  `tipo_test_asignado` enum('personal','student','business') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'personal',
  `max_cuentas` int(11) NOT NULL DEFAULT '50',
  `max_tests_por_cuenta` int(11) NOT NULL DEFAULT '1',
  `codigo_acceso` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `fecha_expiracion` datetime NOT NULL,
  `activo` tinyint(1) DEFAULT '1',
  `fecha_creacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `creado_por` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_options`
--

CREATE TABLE `test_options` (
  `id` int(11) NOT NULL,
  `question_id` int(11) NOT NULL,
  `opcion_texto` text NOT NULL,
  `valor_tipo1` tinyint(4) DEFAULT '0',
  `valor_tipo2` tinyint(4) DEFAULT '0',
  `valor_tipo3` tinyint(4) DEFAULT '0',
  `valor_tipo4` tinyint(4) DEFAULT '0',
  `valor_tipo5` tinyint(4) DEFAULT '0',
  `valor_tipo6` tinyint(4) DEFAULT '0',
  `valor_tipo7` tinyint(4) DEFAULT '0',
  `valor_tipo8` tinyint(4) DEFAULT '0',
  `valor_tipo9` tinyint(4) DEFAULT '0',
  `orden_opcion` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_questions`
--

CREATE TABLE `test_questions` (
  `id` int(11) NOT NULL,
  `pregunta` text NOT NULL,
  `tipo_test` enum('personal','student','business') NOT NULL,
  `orden_pregunta` int(11) NOT NULL,
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_questions_base`
--

CREATE TABLE `test_questions_base` (
  `id` int(11) NOT NULL,
  `codigo_pregunta` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Código único ej: P001, P002',
  `concepto_clave` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Concepto que evalúa la pregunta',
  `eneatipo` tinyint(4) NOT NULL COMMENT 'Eneatipo al que pertenece (1-9)',
  `subtipo_id` int(11) NOT NULL COMMENT 'ID del subtipo',
  `categoria` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'Categoría de la pregunta',
  `orden_global` int(11) NOT NULL COMMENT 'Orden global en el test',
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `creado_por` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Preguntas base del sistema';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_questions_variants`
--

CREATE TABLE `test_questions_variants` (
  `id` int(11) NOT NULL,
  `question_base_id` int(11) NOT NULL COMMENT 'ID de la pregunta base',
  `tipo_test` enum('personal','student','business') COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Tipo de test',
  `idioma` enum('es','en') COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'es' COMMENT 'Idioma de la pregunta',
  `texto_pregunta` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Texto de la pregunta',
  `notas_redaccion` text COLLATE utf8mb4_unicode_ci COMMENT 'Notas sobre la redacción',
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `creado_por` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Variaciones de redacción por tipo e idioma';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_question_responses`
--

CREATE TABLE `test_question_responses` (
  `id` int(11) NOT NULL,
  `question_base_id` int(11) NOT NULL,
  `scale_id` int(11) NOT NULL DEFAULT '1',
  `valor_respuesta` tinyint(4) NOT NULL COMMENT 'Valor de la respuesta (1-5)',
  `etiqueta_es` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Etiqueta en español',
  `etiqueta_en` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Etiqueta en inglés',
  `valor_tipo1` tinyint(4) DEFAULT '0',
  `valor_tipo2` tinyint(4) DEFAULT '0',
  `valor_tipo3` tinyint(4) DEFAULT '0',
  `valor_tipo4` tinyint(4) DEFAULT '0',
  `valor_tipo5` tinyint(4) DEFAULT '0',
  `valor_tipo6` tinyint(4) DEFAULT '0',
  `valor_tipo7` tinyint(4) DEFAULT '0',
  `valor_tipo8` tinyint(4) DEFAULT '0',
  `valor_tipo9` tinyint(4) DEFAULT '0',
  `orden_respuesta` tinyint(4) NOT NULL,
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Opciones de respuesta para preguntas base';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_question_scales`
--

CREATE TABLE `test_question_scales` (
  `id` int(11) NOT NULL,
  `nombre` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Nombre de la escala',
  `descripcion` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `tipo` enum('likert','custom') COLLATE utf8mb4_unicode_ci DEFAULT 'likert',
  `valores_json` text COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'JSON con valores y etiquetas',
  `activa` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Escalas de respuesta para preguntas';

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `test_requests`
--

CREATE TABLE `test_requests` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `email` varchar(150) NOT NULL,
  `tipo_test` enum('personal','student','business') NOT NULL,
  `token` varchar(255) NOT NULL,
  `activo` tinyint(1) DEFAULT '1',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_expiracion` datetime NOT NULL,
  `fecha_completado` datetime DEFAULT NULL,
  `ip_address` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `user_tests`
--

CREATE TABLE `user_tests` (
  `id` int(11) NOT NULL,
  `user_id` int(11) DEFAULT NULL,
  `group_account_id` int(11) DEFAULT NULL,
  `request_id` int(11) DEFAULT NULL,
  `email_guest` varchar(150) DEFAULT NULL,
  `tipo_test` enum('personal','student','business') NOT NULL,
  `resultado_tipo` tinyint(4) DEFAULT NULL,
  `puntuaciones` text,
  `respuestas` text,
  `fecha_inicio` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_completado` datetime DEFAULT NULL,
  `pagado` tinyint(1) DEFAULT '0',
  `precio` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Disparadores `user_tests`
--
DELIMITER $$
CREATE TRIGGER `log_group_test_completion` AFTER UPDATE ON `user_tests` FOR EACH ROW BEGIN
    -- Solo log si se completó un test de cuenta de grupo
    IF NEW.group_account_id IS NOT NULL 
       AND OLD.fecha_completado IS NULL 
       AND NEW.fecha_completado IS NOT NULL THEN
        
        INSERT INTO group_activity_logs 
        (group_id, group_account_id, accion, descripcion) 
        SELECT ga.group_id, NEW.group_account_id, 'TEST_COMPLETED', 
               CONCAT('Test completado - Resultado: Tipo ', NEW.resultado_tipo)
        FROM group_accounts ga 
        WHERE ga.id = NEW.group_account_id;
    END IF;
END
$$
DELIMITER ;
DELIMITER $$
CREATE TRIGGER `validate_tests_per_account_limit` BEFORE INSERT ON `user_tests` FOR EACH ROW BEGIN
    DECLARE test_count INT;
    DECLARE max_tests INT;
    
    -- Solo validar si es una cuenta de grupo
    IF NEW.group_account_id IS NOT NULL THEN
        -- Obtener límite máximo de tests por cuenta
        SELECT tg.max_tests_por_cuenta INTO max_tests
        FROM test_groups tg
        INNER JOIN group_accounts ga ON tg.id = ga.group_id
        WHERE ga.id = NEW.group_account_id AND tg.activo = 1;
        
        -- Contar tests actuales de la cuenta
        SELECT COUNT(*) INTO test_count
        FROM user_tests
        WHERE group_account_id = NEW.group_account_id;
        
        -- Validar límite
        IF test_count >= max_tests THEN
            SIGNAL SQLSTATE '45000' 
            SET MESSAGE_TEXT = 'Se ha alcanzado el límite máximo de tests para esta cuenta';
        END IF;
    END IF;
END
$$
DELIMITER ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuarios`
--

CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  `email` varchar(150) NOT NULL,
  `password` varchar(255) NOT NULL,
  `tipo` enum('admin','user') DEFAULT 'user',
  `activo` tinyint(1) DEFAULT '1',
  `email_verificado` tinyint(1) DEFAULT '0',
  `fecha_creacion` datetime DEFAULT CURRENT_TIMESTAMP,
  `fecha_actualizacion` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_cuentas_grupos`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_cuentas_grupos` (
`id` int(11)
,`group_id` int(11)
,`nombre_cuenta` varchar(100)
,`username` varchar(50)
,`email` varchar(150)
,`tipo_acceso` enum('token','password')
,`activo` tinyint(1)
,`ultimo_acceso` datetime
,`fecha_creacion` timestamp
,`grupo_nombre` varchar(100)
,`tipo_test_asignado` enum('personal','student','business')
,`tests_realizados` bigint(21)
,`tests_completados` bigint(21)
,`ultimo_test_completado` datetime
,`ultimo_resultado_tipo` tinyint(4)
,`ultimo_tipo_nombre` varchar(50)
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_estadisticas_grupos`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_estadisticas_grupos` (
`id` int(11)
,`nombre` varchar(100)
,`descripcion` text
,`tipo_test_asignado` enum('personal','student','business')
,`max_cuentas` int(11)
,`max_tests_por_cuenta` int(11)
,`codigo_acceso` varchar(20)
,`fecha_expiracion` datetime
,`activo` tinyint(1)
,`fecha_creacion` timestamp
,`creado_por_nombre` varchar(100)
,`total_cuentas` bigint(21)
,`cuentas_activas` bigint(21)
,`tests_realizados` bigint(21)
,`tests_completados` bigint(21)
,`porcentaje_completados` decimal(26,2)
,`tiempo_promedio_minutos` decimal(23,2)
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_estadisticas_preguntas`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_estadisticas_preguntas` (
`eneatipo` tinyint(4)
,`subtipo_nombre` varchar(20)
,`subtipo_codigo` varchar(10)
,`total_preguntas` bigint(21)
,`tipos_test_disponibles` bigint(21)
,`variaciones_espanol` bigint(21)
,`variaciones_ingles` bigint(21)
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_grupos_estadisticas`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_grupos_estadisticas` (
`id` int(11)
,`nombre` varchar(200)
,`tipo_test_asignado` enum('personal','student','business')
,`max_cuentas` int(11)
,`fecha_expiracion` datetime
,`activo` tinyint(1)
,`total_cuentas` bigint(21)
,`cuentas_activas` bigint(21)
,`total_tests_realizados` bigint(21)
,`tests_completados` bigint(21)
,`tiempo_promedio_minutos` decimal(13,2)
,`fecha_creacion` datetime
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_grupos_resultados_tipos`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_grupos_resultados_tipos` (
`grupo_id` int(11)
,`grupo_nombre` varchar(200)
,`tipo_numero` tinyint(4)
,`tipo_nombre` varchar(50)
,`cantidad_resultados` bigint(21)
,`porcentaje` decimal(26,2)
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_preguntas_completas`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_preguntas_completas` (
`question_base_id` int(11)
,`codigo_pregunta` varchar(20)
,`concepto_clave` varchar(100)
,`categoria` varchar(50)
,`orden_global` int(11)
,`variant_id` int(11)
,`tipo_test` enum('personal','student','business')
,`idioma` enum('es','en')
,`texto_pregunta` text
,`notas_redaccion` text
,`base_activa` tinyint(1)
,`variant_activa` tinyint(1)
,`fecha_creacion_base` datetime
,`fecha_creacion_variant` datetime
);

-- --------------------------------------------------------

--
-- Estructura Stand-in para la vista `vista_preguntas_con_respuestas`
-- (Véase abajo para la vista actual)
--
CREATE TABLE `vista_preguntas_con_respuestas` (
`question_base_id` int(11)
,`codigo_pregunta` varchar(20)
,`concepto_clave` varchar(100)
,`orden_global` int(11)
,`tipo_test` enum('personal','student','business')
,`idioma` enum('es','en')
,`texto_pregunta` text
,`response_id` int(11)
,`valor_respuesta` tinyint(4)
,`etiqueta_es` varchar(50)
,`etiqueta_en` varchar(50)
,`valor_tipo1` tinyint(4)
,`valor_tipo2` tinyint(4)
,`valor_tipo3` tinyint(4)
,`valor_tipo4` tinyint(4)
,`valor_tipo5` tinyint(4)
,`valor_tipo6` tinyint(4)
,`valor_tipo7` tinyint(4)
,`valor_tipo8` tinyint(4)
,`valor_tipo9` tinyint(4)
,`orden_respuesta` tinyint(4)
);

-- --------------------------------------------------------

--
-- Estructura para la vista `dashboard_stats`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `dashboard_stats`  AS  select (select count(0) from `test_requests` where (`test_requests`.`activo` = 1)) AS `total_test_requests`,(select count(0) from `test_requests` where (`test_requests`.`fecha_completado` is not null)) AS `completed_tests`,(select count(0) from `test_requests` where (`test_requests`.`fecha_creacion` >= (now() - interval 7 day))) AS `requests_last_week`,(select count(0) from `test_requests` where (`test_requests`.`fecha_completado` >= (now() - interval 7 day))) AS `completed_last_week`,(select count(0) from `clientes` where (`clientes`.`estado` = 'activo')) AS `active_clients`,(select count(0) from `admin_users` where (`admin_users`.`activo` = 1)) AS `active_admins` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `tests_by_type`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `tests_by_type`  AS  select `test_requests`.`tipo_test` AS `tipo_test`,count(0) AS `total_requests`,count(`test_requests`.`fecha_completado`) AS `completed`,round(((count(`test_requests`.`fecha_completado`) / count(0)) * 100),2) AS `completion_rate` from `test_requests` where (`test_requests`.`activo` = 1) group by `test_requests`.`tipo_test` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_cuentas_grupos`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_cuentas_grupos`  AS  select `ga`.`id` AS `id`,`ga`.`group_id` AS `group_id`,`ga`.`nombre_cuenta` AS `nombre_cuenta`,`ga`.`username` AS `username`,`ga`.`email` AS `email`,`ga`.`tipo_acceso` AS `tipo_acceso`,`ga`.`activo` AS `activo`,`ga`.`ultimo_acceso` AS `ultimo_acceso`,`ga`.`fecha_creacion` AS `fecha_creacion`,`tg`.`nombre` AS `grupo_nombre`,`tg`.`tipo_test_asignado` AS `tipo_test_asignado`,count(`ut`.`id`) AS `tests_realizados`,count((case when (`ut`.`fecha_completado` is not null) then 1 end)) AS `tests_completados`,max(`ut`.`fecha_completado`) AS `ultimo_test_completado`,`ut_last`.`resultado_tipo` AS `ultimo_resultado_tipo`,`et`.`nombre` AS `ultimo_tipo_nombre` from ((((`group_accounts` `ga` join `test_groups` `tg` on((`ga`.`group_id` = `tg`.`id`))) left join `user_tests` `ut` on((`ga`.`id` = `ut`.`group_account_id`))) left join `user_tests` `ut_last` on(((`ga`.`id` = `ut_last`.`group_account_id`) and (`ut_last`.`fecha_completado` = (select max(`ut2`.`fecha_completado`) from `user_tests` `ut2` where ((`ut2`.`group_account_id` = `ga`.`id`) and (`ut2`.`fecha_completado` is not null))))))) left join `enneagram_types` `et` on((`ut_last`.`resultado_tipo` = `et`.`numero`))) where (`tg`.`activo` = 1) group by `ga`.`id`,`ga`.`group_id`,`ga`.`nombre_cuenta`,`ga`.`username`,`ga`.`email`,`ga`.`tipo_acceso`,`ga`.`activo`,`ga`.`ultimo_acceso`,`ga`.`fecha_creacion`,`tg`.`nombre`,`tg`.`tipo_test_asignado`,`ut_last`.`resultado_tipo`,`et`.`nombre` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_estadisticas_grupos`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_estadisticas_grupos`  AS  select `tg`.`id` AS `id`,`tg`.`nombre` AS `nombre`,`tg`.`descripcion` AS `descripcion`,`tg`.`tipo_test_asignado` AS `tipo_test_asignado`,`tg`.`max_cuentas` AS `max_cuentas`,`tg`.`max_tests_por_cuenta` AS `max_tests_por_cuenta`,`tg`.`codigo_acceso` AS `codigo_acceso`,`tg`.`fecha_expiracion` AS `fecha_expiracion`,`tg`.`activo` AS `activo`,`tg`.`fecha_creacion` AS `fecha_creacion`,`au`.`nombre` AS `creado_por_nombre`,count(distinct `ga`.`id`) AS `total_cuentas`,count(distinct (case when (`ga`.`activo` = 1) then `ga`.`id` end)) AS `cuentas_activas`,count(distinct `ut`.`id`) AS `tests_realizados`,count(distinct (case when (`ut`.`fecha_completado` is not null) then `ut`.`id` end)) AS `tests_completados`,round((case when (count(distinct `ga`.`id`) > 0) then ((count(distinct (case when (`ut`.`fecha_completado` is not null) then `ut`.`id` end)) * 100.0) / count(distinct `ga`.`id`)) else 0 end),2) AS `porcentaje_completados`,round(avg((case when ((`ut`.`fecha_completado` is not null) and (`ut`.`fecha_inicio` is not null)) then timestampdiff(MINUTE,`ut`.`fecha_inicio`,`ut`.`fecha_completado`) else NULL end)),2) AS `tiempo_promedio_minutos` from (((`test_groups` `tg` left join `group_accounts` `ga` on((`tg`.`id` = `ga`.`group_id`))) left join `user_tests` `ut` on((`ga`.`id` = `ut`.`group_account_id`))) left join `admin_users` `au` on((`tg`.`creado_por` = `au`.`id`))) where (`tg`.`activo` = 1) group by `tg`.`id`,`tg`.`nombre`,`tg`.`descripcion`,`tg`.`tipo_test_asignado`,`tg`.`max_cuentas`,`tg`.`max_tests_por_cuenta`,`tg`.`codigo_acceso`,`tg`.`fecha_expiracion`,`tg`.`activo`,`tg`.`fecha_creacion`,`au`.`nombre` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_estadisticas_preguntas`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_estadisticas_preguntas`  AS  select `qb`.`eneatipo` AS `eneatipo`,`st`.`nombre` AS `subtipo_nombre`,`st`.`codigo` AS `subtipo_codigo`,count(0) AS `total_preguntas`,count(distinct `qv`.`tipo_test`) AS `tipos_test_disponibles`,count((case when (`qv`.`idioma` = 'es') then 1 end)) AS `variaciones_espanol`,count((case when (`qv`.`idioma` = 'en') then 1 end)) AS `variaciones_ingles` from ((`test_questions_base` `qb` left join `enneagram_subtypes` `st` on((`qb`.`subtipo_id` = `st`.`id`))) left join `test_questions_variants` `qv` on((`qb`.`id` = `qv`.`question_base_id`))) where (`qb`.`activa` = 1) group by `qb`.`eneatipo`,`st`.`id` order by `qb`.`eneatipo`,`st`.`id` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_grupos_estadisticas`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_grupos_estadisticas`  AS  select `g`.`id` AS `id`,`g`.`nombre` AS `nombre`,`g`.`tipo_test_asignado` AS `tipo_test_asignado`,`g`.`max_cuentas` AS `max_cuentas`,`g`.`fecha_expiracion` AS `fecha_expiracion`,`g`.`activo` AS `activo`,count(`gc`.`id`) AS `total_cuentas`,count((case when (`gc`.`activo` = 1) then 1 end)) AS `cuentas_activas`,count(`gtr`.`id`) AS `total_tests_realizados`,count((case when (`gtr`.`estado` = 'completado') then 1 end)) AS `tests_completados`,round(avg(`gtr`.`tiempo_invertido`),2) AS `tiempo_promedio_minutos`,`g`.`fecha_creacion` AS `fecha_creacion` from ((`grupos` `g` left join `grupo_cuentas` `gc` on((`g`.`id` = `gc`.`grupo_id`))) left join `grupo_test_resultados` `gtr` on((`g`.`id` = `gtr`.`grupo_id`))) where (`g`.`activo` = 1) group by `g`.`id` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_grupos_resultados_tipos`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_grupos_resultados_tipos`  AS  select `g`.`id` AS `grupo_id`,`g`.`nombre` AS `grupo_nombre`,`et`.`numero` AS `tipo_numero`,`et`.`nombre` AS `tipo_nombre`,count(`gtr`.`id`) AS `cantidad_resultados`,round(((count(`gtr`.`id`) * 100.0) / (select count(0) from `grupo_test_resultados` `gtr2` where ((`gtr2`.`grupo_id` = `g`.`id`) and (`gtr2`.`estado` = 'completado')))),2) AS `porcentaje` from ((`grupos` `g` left join `grupo_test_resultados` `gtr` on(((`g`.`id` = `gtr`.`grupo_id`) and (`gtr`.`estado` = 'completado') and (`gtr`.`resultado_tipo` is not null)))) left join `enneagram_types` `et` on((`gtr`.`resultado_tipo` = `et`.`numero`))) where (`g`.`activo` = 1) group by `g`.`id`,`et`.`numero` having (`cantidad_resultados` > 0) order by `g`.`id`,count(`gtr`.`id`) desc ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_preguntas_completas`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_preguntas_completas`  AS  select `qb`.`id` AS `question_base_id`,`qb`.`codigo_pregunta` AS `codigo_pregunta`,`qb`.`concepto_clave` AS `concepto_clave`,`qb`.`categoria` AS `categoria`,`qb`.`orden_global` AS `orden_global`,`qv`.`id` AS `variant_id`,`qv`.`tipo_test` AS `tipo_test`,`qv`.`idioma` AS `idioma`,`qv`.`texto_pregunta` AS `texto_pregunta`,`qv`.`notas_redaccion` AS `notas_redaccion`,`qb`.`activa` AS `base_activa`,`qv`.`activa` AS `variant_activa`,`qb`.`fecha_creacion` AS `fecha_creacion_base`,`qv`.`fecha_creacion` AS `fecha_creacion_variant` from (`test_questions_base` `qb` left join `test_questions_variants` `qv` on((`qb`.`id` = `qv`.`question_base_id`))) where (`qb`.`activa` = 1) order by `qb`.`orden_global`,`qv`.`tipo_test`,`qv`.`idioma` ;

-- --------------------------------------------------------

--
-- Estructura para la vista `vista_preguntas_con_respuestas`
--

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `vista_preguntas_con_respuestas`  AS  select `qb`.`id` AS `question_base_id`,`qb`.`codigo_pregunta` AS `codigo_pregunta`,`qb`.`concepto_clave` AS `concepto_clave`,`qb`.`orden_global` AS `orden_global`,`qv`.`tipo_test` AS `tipo_test`,`qv`.`idioma` AS `idioma`,`qv`.`texto_pregunta` AS `texto_pregunta`,`qr`.`id` AS `response_id`,`qr`.`valor_respuesta` AS `valor_respuesta`,`qr`.`etiqueta_es` AS `etiqueta_es`,`qr`.`etiqueta_en` AS `etiqueta_en`,`qr`.`valor_tipo1` AS `valor_tipo1`,`qr`.`valor_tipo2` AS `valor_tipo2`,`qr`.`valor_tipo3` AS `valor_tipo3`,`qr`.`valor_tipo4` AS `valor_tipo4`,`qr`.`valor_tipo5` AS `valor_tipo5`,`qr`.`valor_tipo6` AS `valor_tipo6`,`qr`.`valor_tipo7` AS `valor_tipo7`,`qr`.`valor_tipo8` AS `valor_tipo8`,`qr`.`valor_tipo9` AS `valor_tipo9`,`qr`.`orden_respuesta` AS `orden_respuesta` from ((`test_questions_base` `qb` join `test_questions_variants` `qv` on((`qb`.`id` = `qv`.`question_base_id`))) join `test_question_responses` `qr` on((`qb`.`id` = `qr`.`question_base_id`))) where ((`qb`.`activa` = 1) and (`qv`.`activa` = 1) and (`qr`.`activa` = 1)) order by `qb`.`orden_global`,`qr`.`orden_respuesta` ;

--
-- Índices para tablas volcadas
--

--
-- Indices de la tabla `activity_logs`
--
ALTER TABLE `activity_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `user_id` (`user_id`);

--
-- Indices de la tabla `admin_activity_logs`
--
ALTER TABLE `admin_activity_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_admin_user` (`admin_user_id`),
  ADD KEY `idx_accion` (`accion`),
  ADD KEY `idx_fecha` (`fecha_creacion`);

--
-- Indices de la tabla `admin_sessions`
--
ALTER TABLE `admin_sessions`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `token` (`token`),
  ADD KEY `idx_token` (`token`),
  ADD KEY `idx_admin_user` (`admin_user_id`),
  ADD KEY `idx_expires` (`expires_at`);

--
-- Indices de la tabla `admin_users`
--
ALTER TABLE `admin_users`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `email` (`email`),
  ADD KEY `idx_email` (`email`),
  ADD KEY `idx_activo` (`activo`);

--
-- Indices de la tabla `clientes`
--
ALTER TABLE `clientes`
  ADD PRIMARY KEY (`id`),
  ADD KEY `usuario_creacion` (`usuario_creacion`),
  ADD KEY `usuario_actualizacion` (`usuario_actualizacion`),
  ADD KEY `idx_rfc` (`rfc`),
  ADD KEY `idx_estado` (`estado`),
  ADD KEY `idx_municipio` (`municipio`);

--
-- Indices de la tabla `enneagram_subtypes`
--
ALTER TABLE `enneagram_subtypes`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_codigo_subtipo` (`codigo`);

--
-- Indices de la tabla `enneagram_types`
--
ALTER TABLE `enneagram_types`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `numero` (`numero`);

--
-- Indices de la tabla `group_accounts`
--
ALTER TABLE `group_accounts`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_group_id` (`group_id`),
  ADD KEY `idx_tipo_acceso` (`tipo_acceso`),
  ADD KEY `idx_activo` (`activo`),
  ADD KEY `idx_email` (`email`),
  ADD KEY `idx_creado_por` (`creado_por`),
  ADD KEY `idx_group_accounts_group_active` (`group_id`,`activo`);

--
-- Indices de la tabla `group_account_sessions`
--
ALTER TABLE `group_account_sessions`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_group_account` (`group_account_id`),
  ADD KEY `idx_expires_at` (`expires_at`),
  ADD KEY `idx_activa` (`activa`);

--
-- Indices de la tabla `group_activity_logs`
--
ALTER TABLE `group_activity_logs`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_group_id` (`group_id`),
  ADD KEY `idx_group_account_id` (`group_account_id`),
  ADD KEY `idx_admin_user_id` (`admin_user_id`),
  ADD KEY `idx_accion` (`accion`),
  ADD KEY `idx_fecha_creacion` (`fecha_creacion`),
  ADD KEY `idx_group_activity_group_date` (`group_id`,`fecha_creacion`);

--
-- Indices de la tabla `group_invitations`
--
ALTER TABLE `group_invitations`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_group_id` (`group_id`),
  ADD KEY `idx_email` (`email`),
  ADD KEY `idx_estado` (`estado`),
  ADD KEY `idx_fecha_expiracion` (`fecha_expiracion`),
  ADD KEY `idx_creado_por` (`creado_por`),
  ADD KEY `fk_invitations_account` (`group_account_id`);

--
-- Indices de la tabla `grupos`
--
ALTER TABLE `grupos`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `codigo_acceso` (`codigo_acceso`),
  ADD KEY `idx_admin_user` (`admin_user_id`),
  ADD KEY `idx_tipo_test` (`tipo_test_asignado`),
  ADD KEY `idx_activo` (`activo`),
  ADD KEY `idx_codigo` (`codigo_acceso`),
  ADD KEY `idx_grupos_admin_activo` (`admin_user_id`,`activo`);

--
-- Indices de la tabla `grupo_cuentas`
--
ALTER TABLE `grupo_cuentas`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_grupo` (`grupo_id`),
  ADD KEY `idx_username` (`username`),
  ADD KEY `idx_token` (`token_acceso`(191)),
  ADD KEY `idx_activo` (`activo`),
  ADD KEY `idx_cuentas_grupo_activo` (`grupo_id`,`activo`);

--
-- Indices de la tabla `grupo_invitaciones`
--
ALTER TABLE `grupo_invitaciones`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_grupo` (`grupo_id`),
  ADD KEY `idx_email` (`email`),
  ADD KEY `idx_token` (`token_invitacion`(191)),
  ADD KEY `idx_estado` (`estado`),
  ADD KEY `idx_enviado_por` (`enviado_por`),
  ADD KEY `idx_cuenta_creada` (`cuenta_creada_id`);

--
-- Indices de la tabla `grupo_test_resultados`
--
ALTER TABLE `grupo_test_resultados`
  ADD PRIMARY KEY (`id`),
  ADD KEY `idx_cuenta` (`grupo_cuenta_id`),
  ADD KEY `idx_grupo` (`grupo_id`),
  ADD KEY `idx_resultado` (`resultado_tipo`),
  ADD KEY `idx_estado` (`estado`),
  ADD KEY `idx_fecha_completado` (`fecha_completado`),
  ADD KEY `idx_resultados_cuenta_estado` (`grupo_cuenta_id`,`estado`),
  ADD KEY `idx_resultados_grupo_completado` (`grupo_id`,`estado`,`fecha_completado`);

--
-- Indices de la tabla `result_configurations`
--
ALTER TABLE `result_configurations`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `unique_config` (`tipo_test`,`idioma`,`eneatipo`,`subtipo_id`,`is_for_students`),
  ADD KEY `idx_tipo_test` (`tipo_test`),
  ADD KEY `idx_idioma` (`idioma`),
  ADD KEY `idx_eneatipo` (`eneatipo`),
  ADD KEY `idx_subtipo` (`subtipo_id`),
  ADD KEY `idx_activo` (`activo`),
  ADD KEY `fk_result_config_admin` (`creado_por`);

--
-- Indices de la tabla `sesiones_activas`
--
ALTER TABLE `sesiones_activas`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `token` (`token`),
  ADD KEY `idUsuario` (`idUsuario`);

--
-- Indices de la tabla `subtype_content`
--
ALTER TABLE `subtype_content`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `unique_subtype_content` (`result_config_id`,`subtipo_id`),
  ADD KEY `idx_subtipo_id` (`subtipo_id`);

--
-- Indices de la tabla `system_config`
--
ALTER TABLE `system_config`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `config_key` (`config_key`),
  ADD KEY `idx_key` (`config_key`);

--
-- Indices de la tabla `test_groups`
--
ALTER TABLE `test_groups`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_nombre` (`nombre`),
  ADD UNIQUE KEY `uk_codigo_acceso` (`codigo_acceso`),
  ADD KEY `idx_tipo_test` (`tipo_test_asignado`),
  ADD KEY `idx_activo` (`activo`),
  ADD KEY `idx_fecha_expiracion` (`fecha_expiracion`),
  ADD KEY `idx_creado_por` (`creado_por`),
  ADD KEY `idx_test_groups_active_expiration` (`activo`,`fecha_expiracion`),
  ADD KEY `idx_test_groups_search` (`nombre`,`descripcion`(100));

--
-- Indices de la tabla `test_options`
--
ALTER TABLE `test_options`
  ADD PRIMARY KEY (`id`),
  ADD KEY `question_id` (`question_id`);

--
-- Indices de la tabla `test_questions`
--
ALTER TABLE `test_questions`
  ADD PRIMARY KEY (`id`);

--
-- Indices de la tabla `test_questions_base`
--
ALTER TABLE `test_questions_base`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_codigo_pregunta` (`codigo_pregunta`),
  ADD KEY `idx_orden_global` (`orden_global`),
  ADD KEY `idx_activa` (`activa`),
  ADD KEY `idx_categoria` (`categoria`),
  ADD KEY `idx_creado_por` (`creado_por`),
  ADD KEY `idx_eneatipo` (`eneatipo`),
  ADD KEY `idx_subtipo` (`subtipo_id`);

--
-- Indices de la tabla `test_questions_variants`
--
ALTER TABLE `test_questions_variants`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_question_type_lang` (`question_base_id`,`tipo_test`,`idioma`),
  ADD KEY `idx_question_base` (`question_base_id`),
  ADD KEY `idx_tipo_test` (`tipo_test`),
  ADD KEY `idx_idioma` (`idioma`),
  ADD KEY `idx_activa` (`activa`),
  ADD KEY `idx_creado_por` (`creado_por`);

--
-- Indices de la tabla `test_question_responses`
--
ALTER TABLE `test_question_responses`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_question_valor` (`question_base_id`,`valor_respuesta`),
  ADD KEY `idx_question_base` (`question_base_id`),
  ADD KEY `idx_scale` (`scale_id`),
  ADD KEY `idx_valor_respuesta` (`valor_respuesta`),
  ADD KEY `idx_activa` (`activa`);

--
-- Indices de la tabla `test_question_scales`
--
ALTER TABLE `test_question_scales`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `uk_nombre_escala` (`nombre`),
  ADD KEY `idx_activa` (`activa`);

--
-- Indices de la tabla `test_requests`
--
ALTER TABLE `test_requests`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `token` (`token`),
  ADD KEY `idx_token` (`token`),
  ADD KEY `idx_email` (`email`),
  ADD KEY `idx_expiracion` (`fecha_expiracion`),
  ADD KEY `idx_activo` (`activo`);

--
-- Indices de la tabla `user_tests`
--
ALTER TABLE `user_tests`
  ADD PRIMARY KEY (`id`),
  ADD KEY `user_id` (`user_id`),
  ADD KEY `request_id` (`request_id`),
  ADD KEY `resultado_tipo` (`resultado_tipo`),
  ADD KEY `idx_group_account_id` (`group_account_id`),
  ADD KEY `idx_user_tests_group_account_completed` (`group_account_id`,`fecha_completado`);

--
-- Indices de la tabla `usuarios`
--
ALTER TABLE `usuarios`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `email` (`email`);

--
-- AUTO_INCREMENT de las tablas volcadas
--

--
-- AUTO_INCREMENT de la tabla `activity_logs`
--
ALTER TABLE `activity_logs`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `admin_activity_logs`
--
ALTER TABLE `admin_activity_logs`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;

--
-- AUTO_INCREMENT de la tabla `admin_sessions`
--
ALTER TABLE `admin_sessions`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=24;

--
-- AUTO_INCREMENT de la tabla `admin_users`
--
ALTER TABLE `admin_users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `clientes`
--
ALTER TABLE `clientes`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `enneagram_subtypes`
--
ALTER TABLE `enneagram_subtypes`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `enneagram_types`
--
ALTER TABLE `enneagram_types`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;

--
-- AUTO_INCREMENT de la tabla `group_accounts`
--
ALTER TABLE `group_accounts`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `group_account_sessions`
--
ALTER TABLE `group_account_sessions`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `group_activity_logs`
--
ALTER TABLE `group_activity_logs`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

--
-- AUTO_INCREMENT de la tabla `group_invitations`
--
ALTER TABLE `group_invitations`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `grupos`
--
ALTER TABLE `grupos`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `grupo_cuentas`
--
ALTER TABLE `grupo_cuentas`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `grupo_invitaciones`
--
ALTER TABLE `grupo_invitaciones`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `grupo_test_resultados`
--
ALTER TABLE `grupo_test_resultados`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `result_configurations`
--
ALTER TABLE `result_configurations`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=13;

--
-- AUTO_INCREMENT de la tabla `sesiones_activas`
--
ALTER TABLE `sesiones_activas`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `subtype_content`
--
ALTER TABLE `subtype_content`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;

--
-- AUTO_INCREMENT de la tabla `system_config`
--
ALTER TABLE `system_config`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;

--
-- AUTO_INCREMENT de la tabla `test_groups`
--
ALTER TABLE `test_groups`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `test_options`
--
ALTER TABLE `test_options`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT de la tabla `test_questions`
--
ALTER TABLE `test_questions`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;

--
-- AUTO_INCREMENT de la tabla `test_questions_base`
--
ALTER TABLE `test_questions_base`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=181;

--
-- AUTO_INCREMENT de la tabla `test_questions_variants`
--
ALTER TABLE `test_questions_variants`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=461;

--
-- AUTO_INCREMENT de la tabla `test_question_responses`
--
ALTER TABLE `test_question_responses`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=931;

--
-- AUTO_INCREMENT de la tabla `test_question_scales`
--
ALTER TABLE `test_question_scales`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT de la tabla `test_requests`
--
ALTER TABLE `test_requests`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;

--
-- AUTO_INCREMENT de la tabla `user_tests`
--
ALTER TABLE `user_tests`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;

--
-- AUTO_INCREMENT de la tabla `usuarios`
--
ALTER TABLE `usuarios`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- Restricciones para tablas volcadas
--

--
-- Filtros para la tabla `activity_logs`
--
ALTER TABLE `activity_logs`
  ADD CONSTRAINT `activity_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `usuarios` (`id`) ON DELETE SET NULL;

--
-- Filtros para la tabla `admin_activity_logs`
--
ALTER TABLE `admin_activity_logs`
  ADD CONSTRAINT `admin_activity_logs_ibfk_1` FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `admin_sessions`
--
ALTER TABLE `admin_sessions`
  ADD CONSTRAINT `admin_sessions_ibfk_1` FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `clientes`
--
ALTER TABLE `clientes`
  ADD CONSTRAINT `clientes_ibfk_1` FOREIGN KEY (`usuario_creacion`) REFERENCES `usuarios` (`id`),
  ADD CONSTRAINT `clientes_ibfk_2` FOREIGN KEY (`usuario_actualizacion`) REFERENCES `usuarios` (`id`);

--
-- Filtros para la tabla `group_accounts`
--
ALTER TABLE `group_accounts`
  ADD CONSTRAINT `fk_group_accounts_creado_por` FOREIGN KEY (`creado_por`) REFERENCES `admin_users` (`id`),
  ADD CONSTRAINT `fk_group_accounts_group` FOREIGN KEY (`group_id`) REFERENCES `test_groups` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `group_account_sessions`
--
ALTER TABLE `group_account_sessions`
  ADD CONSTRAINT `fk_group_sessions_account` FOREIGN KEY (`group_account_id`) REFERENCES `group_accounts` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `group_activity_logs`
--
ALTER TABLE `group_activity_logs`
  ADD CONSTRAINT `fk_group_logs_account` FOREIGN KEY (`group_account_id`) REFERENCES `group_accounts` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_group_logs_admin` FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_group_logs_group` FOREIGN KEY (`group_id`) REFERENCES `test_groups` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `group_invitations`
--
ALTER TABLE `group_invitations`
  ADD CONSTRAINT `fk_invitations_account` FOREIGN KEY (`group_account_id`) REFERENCES `group_accounts` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_invitations_creado_por` FOREIGN KEY (`creado_por`) REFERENCES `admin_users` (`id`),
  ADD CONSTRAINT `fk_invitations_group` FOREIGN KEY (`group_id`) REFERENCES `test_groups` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `grupos`
--
ALTER TABLE `grupos`
  ADD CONSTRAINT `fk_grupos_admin` FOREIGN KEY (`admin_user_id`) REFERENCES `admin_users` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `grupo_cuentas`
--
ALTER TABLE `grupo_cuentas`
  ADD CONSTRAINT `fk_cuentas_grupo` FOREIGN KEY (`grupo_id`) REFERENCES `grupos` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `grupo_invitaciones`
--
ALTER TABLE `grupo_invitaciones`
  ADD CONSTRAINT `fk_invitaciones_admin` FOREIGN KEY (`enviado_por`) REFERENCES `admin_users` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `fk_invitaciones_cuenta` FOREIGN KEY (`cuenta_creada_id`) REFERENCES `grupo_cuentas` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_invitaciones_grupo` FOREIGN KEY (`grupo_id`) REFERENCES `grupos` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `grupo_test_resultados`
--
ALTER TABLE `grupo_test_resultados`
  ADD CONSTRAINT `fk_resultados_cuenta` FOREIGN KEY (`grupo_cuenta_id`) REFERENCES `grupo_cuentas` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `fk_resultados_grupo` FOREIGN KEY (`grupo_id`) REFERENCES `grupos` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `fk_resultados_tipo` FOREIGN KEY (`resultado_tipo`) REFERENCES `enneagram_types` (`numero`) ON DELETE SET NULL;

--
-- Filtros para la tabla `result_configurations`
--
ALTER TABLE `result_configurations`
  ADD CONSTRAINT `fk_result_config_admin` FOREIGN KEY (`creado_por`) REFERENCES `admin_users` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `fk_result_config_subtipo` FOREIGN KEY (`subtipo_id`) REFERENCES `enneagram_subtypes` (`id`) ON DELETE SET NULL;

--
-- Filtros para la tabla `sesiones_activas`
--
ALTER TABLE `sesiones_activas`
  ADD CONSTRAINT `sesiones_activas_ibfk_1` FOREIGN KEY (`idUsuario`) REFERENCES `usuarios` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `subtype_content`
--
ALTER TABLE `subtype_content`
  ADD CONSTRAINT `fk_subtype_content_config` FOREIGN KEY (`result_config_id`) REFERENCES `result_configurations` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `fk_subtype_content_subtipo` FOREIGN KEY (`subtipo_id`) REFERENCES `enneagram_subtypes` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `test_groups`
--
ALTER TABLE `test_groups`
  ADD CONSTRAINT `fk_test_groups_creado_por` FOREIGN KEY (`creado_por`) REFERENCES `admin_users` (`id`);

--
-- Filtros para la tabla `test_options`
--
ALTER TABLE `test_options`
  ADD CONSTRAINT `test_options_ibfk_1` FOREIGN KEY (`question_id`) REFERENCES `test_questions` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `test_questions_base`
--
ALTER TABLE `test_questions_base`
  ADD CONSTRAINT `fk_questions_subtipo` FOREIGN KEY (`subtipo_id`) REFERENCES `enneagram_subtypes` (`id`);

--
-- Filtros para la tabla `test_questions_variants`
--
ALTER TABLE `test_questions_variants`
  ADD CONSTRAINT `fk_variants_base` FOREIGN KEY (`question_base_id`) REFERENCES `test_questions_base` (`id`) ON DELETE CASCADE;

--
-- Filtros para la tabla `test_question_responses`
--
ALTER TABLE `test_question_responses`
  ADD CONSTRAINT `fk_responses_base` FOREIGN KEY (`question_base_id`) REFERENCES `test_questions_base` (`id`) ON DELETE CASCADE,
  ADD CONSTRAINT `fk_responses_scale` FOREIGN KEY (`scale_id`) REFERENCES `test_question_scales` (`id`);

--
-- Filtros para la tabla `user_tests`
--
ALTER TABLE `user_tests`
  ADD CONSTRAINT `fk_user_tests_group_account` FOREIGN KEY (`group_account_id`) REFERENCES `group_accounts` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `user_tests_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `usuarios` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `user_tests_ibfk_2` FOREIGN KEY (`request_id`) REFERENCES `test_requests` (`id`) ON DELETE SET NULL,
  ADD CONSTRAINT `user_tests_ibfk_3` FOREIGN KEY (`resultado_tipo`) REFERENCES `enneagram_types` (`numero`);
COMMIT;

