119 lines
4.3 KiB
SQL
119 lines
4.3 KiB
SQL
-- Add new enum types
|
|
DO $$ BEGIN
|
|
CREATE TYPE project_status AS ENUM('active', 'completed', 'on_hold', 'cancelled');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
DO $$ BEGIN
|
|
CREATE TYPE todo_status AS ENUM('pending', 'in_progress', 'completed', 'cancelled');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
DO $$ BEGIN
|
|
CREATE TYPE todo_priority AS ENUM('low', 'medium', 'high', 'urgent');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
|
|
-- Create companies table
|
|
CREATE TABLE IF NOT EXISTS companies (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
address TEXT,
|
|
city TEXT,
|
|
country TEXT,
|
|
phone TEXT,
|
|
email TEXT,
|
|
website TEXT,
|
|
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Create projects table
|
|
CREATE TABLE IF NOT EXISTS projects (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
company_id UUID REFERENCES companies(id) ON DELETE CASCADE,
|
|
status project_status NOT NULL DEFAULT 'active',
|
|
start_date TIMESTAMP,
|
|
end_date TIMESTAMP,
|
|
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Create todos table
|
|
CREATE TABLE IF NOT EXISTS todos (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
company_id UUID REFERENCES companies(id) ON DELETE CASCADE,
|
|
assigned_to UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
status todo_status NOT NULL DEFAULT 'pending',
|
|
priority todo_priority NOT NULL DEFAULT 'medium',
|
|
due_date TIMESTAMP,
|
|
completed_at TIMESTAMP,
|
|
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Create notes table
|
|
CREATE TABLE IF NOT EXISTS notes (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
title TEXT,
|
|
content TEXT NOT NULL,
|
|
company_id UUID REFERENCES companies(id) ON DELETE CASCADE,
|
|
project_id UUID REFERENCES projects(id) ON DELETE CASCADE,
|
|
todo_id UUID REFERENCES todos(id) ON DELETE CASCADE,
|
|
contact_id UUID REFERENCES contacts(id) ON DELETE CASCADE,
|
|
created_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Add project_id to timesheets table if not exists
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='timesheets' AND column_name='project_id'
|
|
) THEN
|
|
ALTER TABLE timesheets ADD COLUMN project_id UUID REFERENCES projects(id) ON DELETE SET NULL;
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Add is_generated flag to timesheets if not exists
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM information_schema.columns
|
|
WHERE table_name='timesheets' AND column_name='is_generated'
|
|
) THEN
|
|
ALTER TABLE timesheets ADD COLUMN is_generated BOOLEAN NOT NULL DEFAULT FALSE;
|
|
END IF;
|
|
END $$;
|
|
|
|
-- Create indexes for better query performance
|
|
CREATE INDEX IF NOT EXISTS idx_companies_created_at ON companies(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_projects_company_id ON projects(company_id);
|
|
CREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);
|
|
CREATE INDEX IF NOT EXISTS idx_projects_created_at ON projects(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_todos_project_id ON todos(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_todos_company_id ON todos(company_id);
|
|
CREATE INDEX IF NOT EXISTS idx_todos_assigned_to ON todos(assigned_to);
|
|
CREATE INDEX IF NOT EXISTS idx_todos_status ON todos(status);
|
|
CREATE INDEX IF NOT EXISTS idx_todos_created_at ON todos(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_notes_company_id ON notes(company_id);
|
|
CREATE INDEX IF NOT EXISTS idx_notes_project_id ON notes(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_notes_todo_id ON notes(todo_id);
|
|
CREATE INDEX IF NOT EXISTS idx_notes_contact_id ON notes(contact_id);
|
|
CREATE INDEX IF NOT EXISTS idx_notes_created_at ON notes(created_at);
|
|
CREATE INDEX IF NOT EXISTS idx_timesheets_project_id ON timesheets(project_id);
|