-- Fociz MariaDB Databaseschema -- UTF-8 / utf8mb4 ondersteuning voor emoticons, sticky notes en internationale tekens CREATE TABLE IF NOT EXISTS `users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(120) NOT NULL, `email` VARCHAR(191) NOT NULL UNIQUE, `password_hash` VARCHAR(255) NOT NULL, `role` ENUM('ADMIN', 'MEMBER') NOT NULL DEFAULT 'MEMBER', `two_factor_secret` VARCHAR(120) NULL, `two_factor_enabled` TINYINT(1) NOT NULL DEFAULT 0, `backup_codes` TEXT NULL, `remember_token` VARCHAR(64) NULL, `remember_token_expires_at` DATETIME NULL, `avatar_url` VARCHAR(255) NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `invites` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `token` VARCHAR(64) NOT NULL UNIQUE, `email` VARCHAR(191) NOT NULL, `role` ENUM('ADMIN', 'MEMBER') NOT NULL DEFAULT 'MEMBER', `expires_at` DATETIME NOT NULL, `used_at` DATETIME NULL, `created_by_id` INT NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, INDEX (`token`), CONSTRAINT `fk_invites_user` FOREIGN KEY (`created_by_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `daily_plans` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, `plan_date` DATE NOT NULL, `focus_goal` TEXT NULL, `secondary_goals` TEXT NULL, `notes` TEXT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY `uk_user_date` (`user_id`, `plan_date`), CONSTRAINT `fk_dailyplans_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `tasks` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, `daily_plan_id` INT NULL, `title` VARCHAR(255) NOT NULL, `description` TEXT NULL, `status` ENUM('TODO', 'IN_PROGRESS', 'DONE', 'CANCELLED') NOT NULL DEFAULT 'TODO', `priority` ENUM('P1', 'P2', 'P3') NOT NULL DEFAULT 'P2', `time_block_start` VARCHAR(10) NULL, `time_block_end` VARCHAR(10) NULL, `duration_minutes` INT NULL DEFAULT 30, `is_completed` TINYINT(1) NOT NULL DEFAULT 0, `source` VARCHAR(50) NOT NULL DEFAULT 'FOCIZ', `external_id` VARCHAR(100) NULL, `external_url` TEXT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX (`user_id`), CONSTRAINT `fk_tasks_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_tasks_plan` FOREIGN KEY (`daily_plan_id`) REFERENCES `daily_plans` (`id`) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `brainstorm_sessions` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `title` VARCHAR(255) NOT NULL, `description` TEXT NULL, `theme` VARCHAR(100) NOT NULL DEFAULT 'Algemeen', `created_by_id` INT NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX (`created_by_id`), CONSTRAINT `fk_brainstorm_user` FOREIGN KEY (`created_by_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `brainstorm_cards` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `session_id` INT NOT NULL, `content` TEXT NOT NULL, `category` VARCHAR(100) NOT NULL DEFAULT 'Ideeën', `color` VARCHAR(20) NOT NULL DEFAULT 'amber', `votes` INT NOT NULL DEFAULT 0, `author_name` VARCHAR(120) NULL, `converted_to_roadmap_item_id` INT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX (`session_id`), CONSTRAINT `fk_cards_session` FOREIGN KEY (`session_id`) REFERENCES `brainstorm_sessions` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `roadmap_items` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `title` VARCHAR(255) NOT NULL, `description` TEXT NULL, `type` VARCHAR(50) NOT NULL DEFAULT 'FEATURE', `status` VARCHAR(50) NOT NULL DEFAULT 'PLANNED', `quarter` VARCHAR(20) NOT NULL DEFAULT 'Q3', `priority` VARCHAR(20) NOT NULL DEFAULT 'MEDIUM', `progress` INT NOT NULL DEFAULT 0, `start_date` DATE NULL, `due_date` DATE NULL, `jira_issue_key` VARCHAR(50) NULL, `origin_brainstorm_card_id` INT NULL, `created_by_id` INT NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX (`created_by_id`), CONSTRAINT `fk_roadmap_user` FOREIGN KEY (`created_by_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS `integrations` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `user_id` INT NOT NULL, `provider` ENUM('OUTLOOK', 'TEAMS', 'JIRA') NOT NULL, `is_enabled` TINYINT(1) NOT NULL DEFAULT 1, `is_demo_mode` TINYINT(1) NOT NULL DEFAULT 1, `access_token` TEXT NULL, `refresh_token` TEXT NULL, `settings` TEXT NULL, `last_sync_at` DATETIME NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY `uk_user_provider` (`user_id`, `provider`), CONSTRAINT `fk_integrations_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;