-- Add work_plan_entries and work_plan_overrides tables plus the plan_category -- enum. Both tables are owned by users (Cascade on delete) and reference -- projects (SetNull). `created_by` uses Restrict so we never silently lose -- the audit trail of who created the entry. -- CreateTable CREATE TABLE `work_plan_entries` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `user_id` INTEGER NOT NULL, `date_from` DATE NOT NULL, `date_to` DATE NOT NULL, `project_id` INTEGER NULL, `category` ENUM('work', 'preparation', 'travel', 'leave', 'sick', 'training', 'other') NOT NULL DEFAULT 'work', `note` VARCHAR(500) NOT NULL, `created_by` INTEGER NOT NULL, `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), `is_deleted` BOOLEAN NULL DEFAULT false, INDEX `idx_wpe_user_from`(`user_id`, `date_from`), INDEX `idx_wpe_user_to`(`user_id`, `date_to`), INDEX `idx_wpe_project`(`project_id`), INDEX `idx_wpe_dates`(`date_from`, `date_to`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `work_plan_overrides` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `user_id` INTEGER NOT NULL, `shift_date` DATE NOT NULL, `project_id` INTEGER NULL, `category` ENUM('work', 'preparation', 'travel', 'leave', 'sick', 'training', 'other') NOT NULL, `note` VARCHAR(500) NOT NULL, `created_by` INTEGER NOT NULL, `created_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), `updated_at` TIMESTAMP(0) NULL DEFAULT CURRENT_TIMESTAMP(0), `is_deleted` BOOLEAN NULL DEFAULT false, INDEX `idx_wpo_date`(`shift_date`), UNIQUE INDEX `uniq_wpo_user_date`(`user_id`, `shift_date`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `work_plan_entries` ADD CONSTRAINT `work_plan_entries_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; -- AddForeignKey ALTER TABLE `work_plan_entries` ADD CONSTRAINT `work_plan_entries_project_id_fkey` FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; -- AddForeignKey ALTER TABLE `work_plan_entries` ADD CONSTRAINT `work_plan_entries_created_by_fkey` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE NO ACTION; -- AddForeignKey ALTER TABLE `work_plan_overrides` ADD CONSTRAINT `work_plan_overrides_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE NO ACTION; -- AddForeignKey ALTER TABLE `work_plan_overrides` ADD CONSTRAINT `work_plan_overrides_project_id_fkey` FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON DELETE SET NULL ON UPDATE NO ACTION; -- AddForeignKey ALTER TABLE `work_plan_overrides` ADD CONSTRAINT `work_plan_overrides_created_by_fkey` FOREIGN KEY (`created_by`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE NO ACTION;