-- ============================================================ -- Migration: 20260302_lab_09_formularios -- Módulo Formularios: creador drag&drop, envío a clientes, firma -- ============================================================ -- 1. Plantillas de formularios (diseñadas por admins) CREATE TABLE IF NOT EXISTS `lab_formularios` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `nombre` VARCHAR(150) NOT NULL, `descripcion` TEXT DEFAULT NULL, `categoria` ENUM( 'consentimiento', 'historia_clinica', 'autorizacion', 'encuesta', 'otro' ) NOT NULL DEFAULT 'otro', `esquema` LONGTEXT NOT NULL COMMENT 'JSON con el array de campos del formulario', `permite_firma` TINYINT(1) NOT NULL DEFAULT 1, `requiere_firma` TINYINT(1) NOT NULL DEFAULT 0, `version` SMALLINT NOT NULL DEFAULT 1, `is_active` TINYINT(1) NOT NULL DEFAULT 1, `creado_por` INT(11) DEFAULT NULL, `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_form_activo` (`is_active`), KEY `idx_form_categ` (`categoria`), CONSTRAINT `fk_form_admin` FOREIGN KEY (`creado_por`) REFERENCES `admin_users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Plantillas de formularios creadas por administradores'; -- 2. Envíos (instancias de un formulario enviado a un paciente) CREATE TABLE IF NOT EXISTS `lab_form_envios` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `formulario_id` INT(11) NOT NULL, `paciente_id` INT(11) DEFAULT NULL, `domicilio_id` INT(11) DEFAULT NULL, `token` CHAR(64) NOT NULL UNIQUE COMMENT 'Token público único para acceso del cliente', `datos_prefilled` LONGTEXT DEFAULT NULL COMMENT 'JSON con datos pre-llenados por el enfermero', `datos_cliente` LONGTEXT DEFAULT NULL COMMENT 'JSON con respuestas del cliente', `firma_svg` LONGTEXT DEFAULT NULL COMMENT 'Firma del cliente como SVG/PNG base64', `ip_cliente` VARCHAR(45) DEFAULT NULL, `user_agent` VARCHAR(512) DEFAULT NULL, `estado` ENUM('pendiente','completado','firmado','expirado') NOT NULL DEFAULT 'pendiente', `enviado_por` INT(11) DEFAULT NULL COMMENT 'ID admin_users que envió el link', `enviado_via` ENUM('whatsapp','email','link') DEFAULT 'whatsapp', `expira_en` DATETIME DEFAULT NULL, `completado_en` DATETIME DEFAULT NULL, `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_fenv_form` (`formulario_id`), KEY `idx_fenv_paciente` (`paciente_id`), KEY `idx_fenv_token` (`token`), KEY `idx_fenv_estado` (`estado`), CONSTRAINT `fk_fenv_form` FOREIGN KEY (`formulario_id`) REFERENCES `lab_formularios` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_fenv_paciente` FOREIGN KEY (`paciente_id`) REFERENCES `lab_pacientes` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_fenv_domicilio` FOREIGN KEY (`domicilio_id`) REFERENCES `lab_domicilios` (`id`) ON DELETE SET NULL, CONSTRAINT `fk_fenv_enviado` FOREIGN KEY (`enviado_por`) REFERENCES `admin_users` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Instancias de formularios enviados a pacientes';