Yimaru-BackEnd/db/migrations/000011_team_management.up.sql

73 lines
2.2 KiB
SQL

-- Team members table for managing internal LMS company staff
CREATE TABLE IF NOT EXISTS team_members (
id BIGSERIAL PRIMARY KEY,
-- Basic info
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
phone_number VARCHAR(20),
-- Authentication
password BYTEA NOT NULL,
-- Role within the team (different from learner roles)
team_role VARCHAR(50) NOT NULL CHECK (
team_role IN (
'super_admin', -- Full system access
'admin', -- Administrative tasks
'content_manager', -- Manages courses, content
'support_agent', -- Customer support
'instructor', -- Creates/manages courses
'finance', -- Payment/subscription management
'hr', -- Team member management
'analyst' -- Reports and analytics
)
),
-- Department
department VARCHAR(100),
-- Job title
job_title VARCHAR(150),
-- Employment details
employment_type VARCHAR(50) CHECK (
employment_type IN ('full_time', 'part_time', 'contract', 'intern')
),
hire_date DATE,
-- Profile
profile_picture_url TEXT,
bio TEXT,
-- Contact
work_phone VARCHAR(20),
emergency_contact VARCHAR(255),
-- Status
status VARCHAR(50) NOT NULL DEFAULT 'active' CHECK (
status IN ('active', 'inactive', 'suspended', 'terminated')
),
-- Verification
email_verified BOOLEAN NOT NULL DEFAULT FALSE,
-- Permissions (JSON array of permission strings)
permissions JSONB DEFAULT '[]'::jsonb,
-- Tracking
last_login TIMESTAMPTZ,
created_by BIGINT REFERENCES team_members(id),
updated_by BIGINT REFERENCES team_members(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMPTZ
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_team_members_email ON team_members(email);
CREATE INDEX IF NOT EXISTS idx_team_members_team_role ON team_members(team_role);
CREATE INDEX IF NOT EXISTS idx_team_members_department ON team_members(department);
CREATE INDEX IF NOT EXISTS idx_team_members_status ON team_members(status);