botserver/migrations/tasks/6.1.0/up.sql

81 lines
3.5 KiB
SQL

-- Legacy Tasks Tables extracted from consolidated
-- Core tasks table
CREATE TABLE IF NOT EXISTS tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title TEXT NOT NULL,
description TEXT,
status TEXT NOT NULL DEFAULT 'todo',
priority TEXT NOT NULL DEFAULT 'medium',
assignee_id UUID REFERENCES users(id) ON DELETE SET NULL,
reporter_id UUID REFERENCES users(id) ON DELETE SET NULL,
project_id UUID,
due_date TIMESTAMPTZ,
tags TEXT[] DEFAULT '{}',
dependencies UUID[] DEFAULT '{}',
estimated_hours FLOAT8,
actual_hours FLOAT8,
progress INT DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
completed_at TIMESTAMPTZ,
CONSTRAINT check_task_status CHECK (status IN ('todo', 'in_progress', 'review', 'blocked', 'on_hold', 'done', 'completed', 'cancelled')),
CONSTRAINT check_task_priority CHECK (priority IN ('low', 'medium', 'high', 'urgent'))
);
CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee_id);
CREATE INDEX IF NOT EXISTS idx_tasks_reporter ON tasks(reporter_id);
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id);
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date);
CREATE INDEX IF NOT EXISTS idx_tasks_created ON tasks(created_at);
-- Task dependencies
CREATE TABLE IF NOT EXISTS task_dependencies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
depends_on_task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
dependency_type VARCHAR(20) DEFAULT 'finish_to_start',
lag_days INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
CONSTRAINT check_dependency_type CHECK (dependency_type IN ('finish_to_start', 'start_to_start', 'finish_to_finish', 'start_to_finish')),
CONSTRAINT unique_task_dependency UNIQUE (task_id, depends_on_task_id)
);
CREATE INDEX IF NOT EXISTS idx_task_dependencies_task ON task_dependencies(task_id);
CREATE INDEX IF NOT EXISTS idx_task_dependencies_depends ON task_dependencies(depends_on_task_id);
-- Task time tracking
CREATE TABLE IF NOT EXISTS task_time_entries (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
description TEXT,
started_at TIMESTAMPTZ NOT NULL,
ended_at TIMESTAMPTZ,
duration_minutes INTEGER,
is_billable BOOLEAN DEFAULT false,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_task_time_task ON task_time_entries(task_id);
CREATE INDEX IF NOT EXISTS idx_task_time_user ON task_time_entries(user_id, started_at);
-- Task recurring rules
CREATE TABLE IF NOT EXISTS task_recurrence (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
task_template_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
recurrence_pattern VARCHAR(20) NOT NULL,
interval_value INTEGER DEFAULT 1,
days_of_week_json TEXT,
day_of_month INTEGER,
month_of_year INTEGER,
end_date TIMESTAMPTZ,
occurrence_count INTEGER,
next_occurrence TIMESTAMPTZ,
is_active BOOLEAN DEFAULT true,
created_at TIMESTAMPTZ DEFAULT NOW(),
CONSTRAINT check_recurrence CHECK (recurrence_pattern IN ('daily', 'weekly', 'monthly', 'yearly', 'custom'))
);
CREATE INDEX IF NOT EXISTS idx_task_recurrence_next ON task_recurrence(next_occurrence) WHERE is_active = true;