-- 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;