83 lines
3.3 KiB
SQL
83 lines
3.3 KiB
SQL
-- 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);
|