CREATE DATABASE IF NOT EXISTS check_list CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE check_list; CREATE TABLE IF NOT EXISTS templates ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(100) NOT NULL, name VARCHAR(200) NOT NULL, description TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_templates_code (code) ); CREATE TABLE IF NOT EXISTS template_versions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, template_id BIGINT UNSIGNED NOT NULL, version_number INT NOT NULL, status ENUM('draft', 'active', 'retired') NOT NULL DEFAULT 'draft', definition_json JSON NOT NULL, published_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_template_version (template_id, version_number), KEY idx_template_versions_template_status (template_id, status), CONSTRAINT fk_template_versions_template FOREIGN KEY (template_id) REFERENCES templates (id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS lookup_sets ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(100) NOT NULL, name VARCHAR(200) NOT NULL, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_lookup_sets_code (code) ); CREATE TABLE IF NOT EXISTS lookup_values ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, lookup_set_id BIGINT UNSIGNED NOT NULL, value VARCHAR(100) NOT NULL, label VARCHAR(200) NOT NULL, sort_order INT NOT NULL DEFAULT 0, is_default TINYINT(1) NOT NULL DEFAULT 0, is_active TINYINT(1) NOT NULL DEFAULT 1, PRIMARY KEY (id), UNIQUE KEY uq_lookup_value (lookup_set_id, value), KEY idx_lookup_values_lookup_set (lookup_set_id), CONSTRAINT fk_lookup_values_lookup_set FOREIGN KEY (lookup_set_id) REFERENCES lookup_sets (id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS image_rules ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(100) NOT NULL, name VARCHAR(200) NOT NULL, allowed_mime_types_json JSON NOT NULL, max_file_size_bytes INT UNSIGNED NOT NULL, max_width_px INT UNSIGNED NOT NULL, max_height_px INT UNSIGNED NOT NULL, jpeg_quality INT UNSIGNED NOT NULL, oversize_behavior ENUM('auto_optimize', 'warn_then_optimize', 'block') NOT NULL DEFAULT 'auto_optimize', max_attachments_per_field INT UNSIGNED NOT NULL DEFAULT 5, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_image_rules_code (code) ); CREATE TABLE IF NOT EXISTS export_profiles ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(100) NOT NULL, name VARCHAR(200) NOT NULL, zip_image_dir VARCHAR(100) NOT NULL DEFAULT 'images', excel_sheet_name VARCHAR(100) NOT NULL DEFAULT 'Checklist', include_template_version TINYINT(1) NOT NULL DEFAULT 1, include_export_timestamp TINYINT(1) NOT NULL DEFAULT 1, is_active TINYINT(1) NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_export_profiles_code (code) ); CREATE TABLE IF NOT EXISTS app_config ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, config_key VARCHAR(100) NOT NULL, config_value_json JSON NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY uq_app_config_key (config_key) );