Files
web-hosts/domains/coppertone.tech/backend/migrations/011_add_project_request_approval.up.sql
2025-12-26 13:38:04 +01:00

42 lines
1.6 KiB
SQL

-- Add project request/approval workflow fields
-- Create enum for project request status
CREATE TYPE project_request_status AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
-- Add columns to projects table for request workflow
ALTER TABLE projects
ADD COLUMN IF NOT EXISTS requested_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS approved_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS request_status project_request_status,
ADD COLUMN IF NOT EXISTS requested_at TIMESTAMP,
ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP,
ADD COLUMN IF NOT EXISTS rejection_reason TEXT;
-- Create index for request status for faster querying of pending requests
CREATE INDEX idx_projects_request_status ON projects(request_status) WHERE request_status IS NOT NULL;
CREATE INDEX idx_projects_requested_by ON projects(requested_by) WHERE requested_by IS NOT NULL;
-- Comment explaining the workflow:
-- When a CLIENT creates a project:
-- - request_status = 'PENDING'
-- - requested_by = client user_id
-- - requested_at = NOW()
-- - status = 'PLANNING'
--
-- When an ADMIN/STAFF creates a project:
-- - request_status = NULL (not a request, directly approved)
-- - approved_by = creator user_id
-- - approved_at = NOW()
-- - status = 'PLANNING'
--
-- When ADMIN/STAFF approves a client request:
-- - request_status = 'APPROVED'
-- - approved_by = approver user_id
-- - approved_at = NOW()
--
-- When ADMIN/STAFF rejects a client request:
-- - request_status = 'REJECTED'
-- - approved_by = approver user_id (who rejected)
-- - approved_at = NOW()
-- - rejection_reason = text explaining why