CREATE TABLE tenants ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, slug VARCHAR(64) NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'active', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_tenants_slug (slug) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE users ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(64) NOT NULL, password_hash VARCHAR(255) NOT NULL, display_name VARCHAR(128) NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'active', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_users_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE roles ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, name VARCHAR(64) NOT NULL, code VARCHAR(64) NOT NULL, permissions JSON NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_roles_tenant_code (tenant_id, code), CONSTRAINT fk_roles_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE tenant_members ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, role_id BIGINT UNSIGNED NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'active', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_tenant_members (tenant_id, user_id), CONSTRAINT fk_members_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_members_user FOREIGN KEY (user_id) REFERENCES users(id), CONSTRAINT fk_members_role FOREIGN KEY (role_id) REFERENCES roles(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE scenarios ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, name VARCHAR(128) NOT NULL, industry VARCHAR(64) NOT NULL, role_name VARCHAR(64) NOT NULL, goal TEXT NOT NULL, trigger_text TEXT NOT NULL, visibility VARCHAR(24) NOT NULL DEFAULT 'tenant', status VARCHAR(24) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_scenarios_tenant_status (tenant_id, status), CONSTRAINT fk_scenarios_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_scenarios_creator FOREIGN KEY (created_by) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE scenario_fields ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, scenario_id BIGINT UNSIGNED NOT NULL, field_key VARCHAR(64) NOT NULL, field_name VARCHAR(128) NOT NULL, field_type VARCHAR(32) NOT NULL, required TINYINT(1) NOT NULL DEFAULT 0, options JSON NOT NULL, validation JSON NOT NULL, sort_order INT NOT NULL DEFAULT 0, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_scenario_fields_key (scenario_id, field_key), CONSTRAINT fk_fields_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_fields_scenario FOREIGN KEY (scenario_id) REFERENCES scenarios(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sops ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, scenario_id BIGINT UNSIGNED NOT NULL, name VARCHAR(128) NOT NULL, description TEXT NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_sops_scenario (tenant_id, scenario_id), CONSTRAINT fk_sops_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_sops_scenario FOREIGN KEY (scenario_id) REFERENCES scenarios(id), CONSTRAINT fk_sops_creator FOREIGN KEY (created_by) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_versions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, sop_id BIGINT UNSIGNED NOT NULL, version INT NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'draft', start_node_key VARCHAR(64) NOT NULL DEFAULT '', published_at DATETIME(3) NULL, created_by BIGINT UNSIGNED NOT NULL, reviewed_by BIGINT UNSIGNED NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_sop_versions (sop_id, version), CONSTRAINT fk_versions_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_versions_sop FOREIGN KEY (sop_id) REFERENCES sops(id) ON DELETE CASCADE, CONSTRAINT fk_versions_creator FOREIGN KEY (created_by) REFERENCES users(id), CONSTRAINT fk_versions_reviewer FOREIGN KEY (reviewed_by) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_nodes ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, sop_version_id BIGINT UNSIGNED NOT NULL, node_key VARCHAR(64) NOT NULL, type VARCHAR(32) NOT NULL, title VARCHAR(128) NOT NULL, content TEXT NOT NULL, config JSON NOT NULL, position_x INT NOT NULL DEFAULT 0, position_y INT NOT NULL DEFAULT 0, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_sop_nodes_key (sop_version_id, node_key), CONSTRAINT fk_nodes_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_nodes_version FOREIGN KEY (sop_version_id) REFERENCES sop_versions(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_edges ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, sop_version_id BIGINT UNSIGNED NOT NULL, source_node_key VARCHAR(64) NOT NULL, target_node_key VARCHAR(64) NOT NULL, `condition` JSON NOT NULL, priority INT NOT NULL DEFAULT 0, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_sop_edges_source (sop_version_id, source_node_key, priority), CONSTRAINT fk_edges_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_edges_version FOREIGN KEY (sop_version_id) REFERENCES sop_versions(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE knowledge_cards ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, scenario_id BIGINT UNSIGNED NOT NULL, title VARCHAR(128) NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'draft', created_by BIGINT UNSIGNED NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_cards_scenario (tenant_id, scenario_id), CONSTRAINT fk_cards_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_cards_scenario FOREIGN KEY (scenario_id) REFERENCES scenarios(id), CONSTRAINT fk_cards_creator FOREIGN KEY (created_by) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE knowledge_card_versions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, knowledge_card_id BIGINT UNSIGNED NOT NULL, version INT NOT NULL, content JSON NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'draft', created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_card_versions (knowledge_card_id, version), CONSTRAINT fk_card_versions_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_card_versions_card FOREIGN KEY (knowledge_card_id) REFERENCES knowledge_cards(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_runs ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, sop_id BIGINT UNSIGNED NOT NULL, sop_version_id BIGINT UNSIGNED NOT NULL, operator_id BIGINT UNSIGNED NOT NULL, current_node_key VARCHAR(64) NOT NULL, status VARCHAR(24) NOT NULL DEFAULT 'running', answers JSON NOT NULL, result VARCHAR(64) NOT NULL DEFAULT '', started_at DATETIME(3) NOT NULL, completed_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_runs_tenant_status (tenant_id, status), CONSTRAINT fk_runs_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_runs_sop FOREIGN KEY (sop_id) REFERENCES sops(id), CONSTRAINT fk_runs_version FOREIGN KEY (sop_version_id) REFERENCES sop_versions(id), CONSTRAINT fk_runs_operator FOREIGN KEY (operator_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_run_events ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, run_id BIGINT UNSIGNED NOT NULL, node_key VARCHAR(64) NOT NULL, action VARCHAR(64) NOT NULL, payload JSON NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_run_events (run_id, created_at), CONSTRAINT fk_run_events_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_run_events_run FOREIGN KEY (run_id) REFERENCES sop_runs(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE sop_feedback ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, run_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, score INT NOT NULL, comment TEXT NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_feedback_run_user (run_id, user_id), CONSTRAINT fk_feedback_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_feedback_run FOREIGN KEY (run_id) REFERENCES sop_runs(id) ON DELETE CASCADE, CONSTRAINT fk_feedback_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE audit_logs ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, action VARCHAR(64) NOT NULL, resource VARCHAR(64) NOT NULL, resource_id BIGINT UNSIGNED NOT NULL, payload JSON NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_audit_tenant_time (tenant_id, created_at), CONSTRAINT fk_audit_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_audit_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE refresh_tokens ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, tenant_id BIGINT UNSIGNED NOT NULL, user_id BIGINT UNSIGNED NOT NULL, token_hash VARCHAR(64) NOT NULL, expires_at DATETIME(3) NOT NULL, revoked_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_refresh_token_hash (token_hash), CONSTRAINT fk_refresh_tenant FOREIGN KEY (tenant_id) REFERENCES tenants(id), CONSTRAINT fk_refresh_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;