-- Add missing columns to users table ALTER TABLE users ADD COLUMN IF NOT EXISTS full_name VARCHAR(255), ADD COLUMN IF NOT EXISTS phone VARCHAR(20) UNIQUE, ADD COLUMN IF NOT EXISTS email_verified BOOLEAN NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS phone_verified BOOLEAN NOT NULL DEFAULT false, ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ; -- user_roles: many-to-many, a user can hold multiple external roles CREATE TABLE IF NOT EXISTS user_roles ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE, status VARCHAR(50) NOT NULL DEFAULT 'PENDING', -- PENDING, APPROVED, REJECTED, SUSPENDED approved_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(user_id, role_id) ); -- role_permissions CREATE TABLE IF NOT EXISTS role_permissions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE, permission_key VARCHAR(100) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(role_id, permission_key) ); -- departments for internal staff CREATE TABLE IF NOT EXISTS departments ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- designations for internal staff CREATE TABLE IF NOT EXISTS designations ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- employees (internal staff records) CREATE TABLE IF NOT EXISTS employees ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE UNIQUE, role_id UUID NOT NULL REFERENCES roles(id), department_id UUID REFERENCES departments(id), designation_id UUID REFERENCES designations(id), employee_code VARCHAR(50), created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- onboarding_submissions: tracks verification submissions CREATE TABLE IF NOT EXISTS onboarding_submissions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, role_id UUID NOT NULL REFERENCES roles(id), config_id UUID REFERENCES onboarding_configs(id), data_json JSONB, status VARCHAR(50) NOT NULL DEFAULT 'DRAFT', submitted_at TIMESTAMPTZ, reviewed_at TIMESTAMPTZ, reviewed_by UUID REFERENCES users(id), rejection_reason TEXT, document_request TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- submission_documents: uploaded files for onboarding CREATE TABLE IF NOT EXISTS submission_documents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), submission_id UUID NOT NULL REFERENCES onboarding_submissions(id) ON DELETE CASCADE, document_type VARCHAR(100) NOT NULL, file_url VARCHAR(500) NOT NULL, file_name VARCHAR(255), uploaded_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_user_roles_user_id ON user_roles(user_id); CREATE INDEX IF NOT EXISTS idx_user_roles_status ON user_roles(status); CREATE INDEX IF NOT EXISTS idx_onboarding_submissions_user_id ON onboarding_submissions(user_id); CREATE INDEX IF NOT EXISTS idx_onboarding_submissions_status ON onboarding_submissions(status);