-- CMS schema export for phpMyAdmin import -- Generated to match the PHP migrations SET NAMES utf8mb4; SET time_zone = '+00:00'; SET foreign_key_checks = 0; SET sql_notes = 0; DROP TABLE IF EXISTS attachments; DROP TABLE IF EXISTS comments; DROP TABLE IF EXISTS issue_labels; DROP TABLE IF EXISTS labels; DROP TABLE IF EXISTS issues; DROP TABLE IF EXISTS subscriptions; DROP TABLE IF EXISTS activity; DROP TABLE IF EXISTS audit; DROP TABLE IF EXISTS projects; DROP TABLE IF EXISTS settings; DROP TABLE IF EXISTS users; DROP TABLE IF EXISTS customers; SET foreign_key_checks = 1; SET sql_notes = 1; CREATE TABLE customers ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, orgno VARCHAR(100) NOT NULL, billing_email VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, role ENUM('sysadmin','developer','customer') NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, pass_hash VARCHAR(255) NOT NULL, phone VARCHAR(50) NULL, address VARCHAR(255) NULL, customer_id INT UNSIGNED NULL, is_active TINYINT(1) NOT NULL DEFAULT 1, twofa_secret VARCHAR(255) NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_users_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE projects ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, customer_id INT UNSIGNED NOT NULL, name VARCHAR(255) NOT NULL, description TEXT NULL, status ENUM('active','archived') NOT NULL DEFAULT 'active', created_by INT UNSIGNED NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_projects_customer FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, CONSTRAINT fk_projects_creator FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_projects_customer_status (customer_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE labels ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, project_id INT UNSIGNED NOT NULL, name VARCHAR(100) NOT NULL, color VARCHAR(7) NOT NULL, CONSTRAINT fk_labels_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE issues ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, project_id INT UNSIGNED NOT NULL, type ENUM('bug','feature','task') NOT NULL, priority ENUM('low','medium','high','urgent') NOT NULL DEFAULT 'medium', status ENUM('new','in_progress','in_review','resolved','closed') NOT NULL DEFAULT 'new', assignee_id INT UNSIGNED NULL, title VARCHAR(255) NOT NULL, description TEXT NOT NULL, environment VARCHAR(50) NULL, version VARCHAR(100) NULL, steps_to_reproduce TEXT NULL, created_by INT UNSIGNED NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT fk_issues_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, CONSTRAINT fk_issues_assignee FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL, CONSTRAINT fk_issues_creator FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_issues_project_status (project_id, status), INDEX idx_issues_priority (priority), INDEX idx_issues_assignee (assignee_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE issue_labels ( issue_id INT UNSIGNED NOT NULL, label_id INT UNSIGNED NOT NULL, PRIMARY KEY (issue_id, label_id), CONSTRAINT fk_issue_labels_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE, CONSTRAINT fk_issue_labels_label FOREIGN KEY (label_id) REFERENCES labels(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE comments ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, issue_id INT UNSIGNED NOT NULL, user_id INT UNSIGNED NOT NULL, body TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_comments_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE, CONSTRAINT fk_comments_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_comments_issue_created (issue_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE attachments ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, comment_id INT UNSIGNED NOT NULL, filename VARCHAR(255) NOT NULL, path VARCHAR(255) NOT NULL, size INT UNSIGNED NOT NULL, mime VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_attachments_comment FOREIGN KEY (comment_id) REFERENCES comments(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE subscriptions ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, project_id INT UNSIGNED NULL, issue_id INT UNSIGNED NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_subscriptions_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, CONSTRAINT fk_subscriptions_project FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, CONSTRAINT fk_subscriptions_issue FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE, INDEX idx_subscriptions_user (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE activity ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, entity_type VARCHAR(50) NOT NULL, entity_id INT UNSIGNED NOT NULL, user_id INT UNSIGNED NOT NULL, action VARCHAR(100) NOT NULL, meta_json JSON NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_activity_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_activity_entity (entity_type, entity_id), INDEX idx_activity_user (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE audit ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NULL, entity VARCHAR(100) NOT NULL, entity_id INT UNSIGNED NULL, action VARCHAR(100) NOT NULL, meta_json JSON NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_audit_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_audit_entity (entity, entity_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE settings ( `key` VARCHAR(100) PRIMARY KEY, `value` TEXT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;