-- HR Position System Database Schema
-- Database: db_A102
-- Schema: hr_position_system

-- Create schema if not exists
CREATE SCHEMA IF NOT EXISTS hr_position_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE hr_position_system;

-- ============================================================
-- Table: positions (崗位基礎資料)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_positions (
    id VARCHAR(20) PRIMARY KEY COMMENT '崗位編號',
    position_code VARCHAR(20) NOT NULL UNIQUE COMMENT '崗位編號',
    position_name VARCHAR(100) NOT NULL COMMENT '崗位名稱',
    position_category VARCHAR(2) COMMENT '崗位類別代碼',
    position_category_name VARCHAR(50) COMMENT '崗位類別名稱',
    position_nature VARCHAR(2) COMMENT '崗位性質代碼',
    position_nature_name VARCHAR(50) COMMENT '崗位性質名稱',
    headcount INT COMMENT '編制人數',
    position_level VARCHAR(2) COMMENT '崗位級別',
    effective_date DATE COMMENT '生效日期',
    position_desc TEXT COMMENT '崗位描述',
    position_remark TEXT COMMENT '崗位備注',

    -- Recruitment Info
    min_education VARCHAR(3) COMMENT '最低學歷',
    required_gender VARCHAR(1) COMMENT '要求性別',
    salary_range VARCHAR(1) COMMENT '薪酬范圍',
    work_experience VARCHAR(2) COMMENT '工作經驗(年)',
    min_age INT COMMENT '最小年齡',
    max_age INT COMMENT '最大年齡',
    job_type VARCHAR(2) COMMENT '工作性質',
    recruit_position VARCHAR(3) COMMENT '招聘職位',
    job_title VARCHAR(100) COMMENT '職位名稱',
    job_desc TEXT COMMENT '職位描述',
    position_req TEXT COMMENT '崗位要求',
    title_req VARCHAR(4) COMMENT '職稱要求',
    major_req VARCHAR(200) COMMENT '專業要求',
    skill_req VARCHAR(200) COMMENT '技能要求',
    lang_req VARCHAR(100) COMMENT '語言要求',
    other_req VARCHAR(200) COMMENT '其他要求',
    superior_position VARCHAR(20) COMMENT '上級崗位編號',
    recruit_remark TEXT COMMENT '備注說明',

    -- Metadata
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
    created_by VARCHAR(50) COMMENT '建立人',
    updated_by VARCHAR(50) COMMENT '更新人',

    INDEX idx_position_code (position_code),
    INDEX idx_position_name (position_name),
    INDEX idx_position_category (position_category),
    INDEX idx_position_level (position_level)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='崗位基礎資料表';

-- ============================================================
-- Table: jobs (職務基礎資料)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_jobs (
    id VARCHAR(20) PRIMARY KEY COMMENT '職務編號',
    job_category_code VARCHAR(4) NOT NULL COMMENT '職務類別編號',
    job_category_name VARCHAR(50) COMMENT '職務類別名稱',
    job_code VARCHAR(20) NOT NULL UNIQUE COMMENT '職務編號',
    job_name VARCHAR(100) NOT NULL COMMENT '職務名稱',
    job_name_en VARCHAR(100) COMMENT '職務英文名稱',
    job_effective_date DATE COMMENT '生效日期',
    job_headcount INT COMMENT '編制人數',
    job_sort_order INT COMMENT '排列順序',
    job_remark TEXT COMMENT '備注說明',
    job_level VARCHAR(50) COMMENT '職務層級',
    has_attendance_bonus BOOLEAN DEFAULT FALSE COMMENT '是否有全勤',
    has_housing_allowance BOOLEAN DEFAULT FALSE COMMENT '是否住房補貼',

    -- Metadata
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
    created_by VARCHAR(50) COMMENT '建立人',
    updated_by VARCHAR(50) COMMENT '更新人',

    INDEX idx_job_code (job_code),
    INDEX idx_job_name (job_name),
    INDEX idx_job_category (job_category_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='職務基礎資料表';

-- ============================================================
-- Table: job_descriptions (崗位描述)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_job_descriptions (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    emp_no VARCHAR(20) COMMENT '工號',
    emp_name VARCHAR(50) COMMENT '姓名',
    position_code VARCHAR(20) COMMENT '崗位代碼',
    version_date DATE COMMENT '版本更新日期',

    -- Position Info
    position_name VARCHAR(100) COMMENT '崗位名稱',
    department VARCHAR(100) COMMENT '所屬部門',
    position_effective_date DATE COMMENT '崗位生效日期',
    direct_supervisor VARCHAR(100) COMMENT '直接領導職務',
    position_grade_job VARCHAR(100) COMMENT '崗位職等&職務',
    report_to VARCHAR(100) COMMENT '匯報對象職務',
    direct_reports VARCHAR(200) COMMENT '直接下級',
    work_location VARCHAR(3) COMMENT '任職地點',
    emp_attribute VARCHAR(2) COMMENT '員工屬性',

    -- Responsibilities
    position_purpose VARCHAR(500) COMMENT '崗位設置目的',
    main_responsibilities TEXT COMMENT '主要崗位職責',

    -- Requirements
    education VARCHAR(200) COMMENT '教育程度',
    basic_skills TEXT COMMENT '基本技能',
    professional_knowledge TEXT COMMENT '專業知識',
    work_experience_req TEXT COMMENT '工作經驗',
    other_requirements TEXT COMMENT '其他要求',

    -- Metadata
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',
    created_by VARCHAR(50) COMMENT '建立人',
    updated_by VARCHAR(50) COMMENT '更新人',

    INDEX idx_emp_no (emp_no),
    INDEX idx_position_code (position_code),
    INDEX idx_version_date (version_date),
    FOREIGN KEY (position_code) REFERENCES HR_position_positions(position_code) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='崗位描述表';

-- ============================================================
-- Table: reference_codes (參照資料代碼表)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_reference_codes (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    code_type VARCHAR(50) NOT NULL COMMENT '代碼類型',
    code_value VARCHAR(10) NOT NULL COMMENT '代碼值',
    code_name VARCHAR(100) NOT NULL COMMENT '代碼名稱',
    code_name_en VARCHAR(100) COMMENT '英文名稱',
    sort_order INT DEFAULT 0 COMMENT '排序',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
    remark VARCHAR(200) COMMENT '備注',

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',

    UNIQUE KEY uk_code_type_value (code_type, code_value),
    INDEX idx_code_type (code_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='參照資料代碼表';

-- ============================================================
-- Table: audit_logs (審計日誌)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_audit_logs (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    action VARCHAR(20) NOT NULL COMMENT '操作類型(CREATE/UPDATE/DELETE)',
    entity_type VARCHAR(50) NOT NULL COMMENT '實體類型',
    entity_id VARCHAR(50) NOT NULL COMMENT '實體ID',
    old_data JSON COMMENT '變更前資料',
    new_data JSON COMMENT '變更後資料',
    user_id VARCHAR(50) COMMENT '操作用戶',
    ip_address VARCHAR(50) COMMENT 'IP地址',
    user_agent VARCHAR(200) COMMENT '用戶代理',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '操作時間',

    INDEX idx_entity_type_id (entity_type, entity_id),
    INDEX idx_user_id (user_id),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='審計日誌表';

-- ============================================================
-- Insert Reference Data (參照資料初始化)
-- ============================================================

-- 崗位類別 (Position Category)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('POSITION_CATEGORY', '01', '技術職', 1),
('POSITION_CATEGORY', '02', '管理職', 2),
('POSITION_CATEGORY', '03', '業務職', 3),
('POSITION_CATEGORY', '04', '行政職', 4);

-- 崗位性質 (Position Nature)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, code_name_en, sort_order) VALUES
('POSITION_NATURE', 'FT', '全職', 'Full-time', 1),
('POSITION_NATURE', 'PT', '兼職', 'Part-time', 2),
('POSITION_NATURE', 'CT', '約聘', 'Contract', 3),
('POSITION_NATURE', 'IN', '實習', 'Intern', 4);

-- 崗位級別 (Position Level)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('POSITION_LEVEL', 'L1', '基層員工', 1),
('POSITION_LEVEL', 'L2', '資深員工', 2),
('POSITION_LEVEL', 'L3', '主管', 3),
('POSITION_LEVEL', 'L4', '經理', 4),
('POSITION_LEVEL', 'L5', '總監', 5),
('POSITION_LEVEL', 'L6', '副總', 6),
('POSITION_LEVEL', 'L7', '總經理', 7);

-- 職務類別 (Job Category)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('JOB_CATEGORY', 'MGR', '管理職', 1),
('JOB_CATEGORY', 'TECH', '技術職', 2),
('JOB_CATEGORY', 'SALE', '業務職', 3),
('JOB_CATEGORY', 'ADMIN', '行政職', 4),
('JOB_CATEGORY', 'RD', '研發職', 5),
('JOB_CATEGORY', 'PROD', '生產職', 6);

-- 學歷 (Education)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, code_name_en, sort_order) VALUES
('EDUCATION', 'HS', '高中', 'High School', 1),
('EDUCATION', 'JC', '專科', 'Junior College', 2),
('EDUCATION', 'BA', '大學', 'Bachelor', 3),
('EDUCATION', 'MA', '碩士', 'Master', 4),
('EDUCATION', 'PHD', '博士', 'PhD', 5);

-- 薪酬范圍 (Salary Range)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('SALARY_RANGE', 'A', 'A級', 1),
('SALARY_RANGE', 'B', 'B級', 2),
('SALARY_RANGE', 'C', 'C級', 3),
('SALARY_RANGE', 'D', 'D級', 4),
('SALARY_RANGE', 'E', 'E級', 5),
('SALARY_RANGE', 'N', '面議', 6);

-- 任職地點 (Work Location)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('WORK_LOCATION', 'HQ', '總部', 1),
('WORK_LOCATION', 'TPE', '台北辦公室', 2),
('WORK_LOCATION', 'TYC', '桃園廠區', 3),
('WORK_LOCATION', 'KHH', '高雄廠區', 4),
('WORK_LOCATION', 'SH', '上海辦公室', 5),
('WORK_LOCATION', 'SZ', '深圳辦公室', 6);

-- 員工屬性 (Employee Attribute)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('EMP_ATTRIBUTE', 'FT', '正式員工', 1),
('EMP_ATTRIBUTE', 'CT', '約聘人員', 2),
('EMP_ATTRIBUTE', 'PT', '兼職人員', 3),
('EMP_ATTRIBUTE', 'IN', '實習生', 4),
('EMP_ATTRIBUTE', 'DP', '派遣人員', 5);

-- 招聘職位 (Recruit Position)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('RECRUIT_POSITION', 'ENG', '工程師', 1),
('RECRUIT_POSITION', 'MGR', '經理', 2),
('RECRUIT_POSITION', 'AST', '助理', 3),
('RECRUIT_POSITION', 'OP', '操作員', 4),
('RECRUIT_POSITION', 'SAL', '業務', 5);

-- 職稱要求 (Title Requirement)
INSERT INTO HR_position_reference_codes (code_type, code_value, code_name, sort_order) VALUES
('TITLE_REQ', 'NONE', '無要求', 1),
('TITLE_REQ', 'CERT', '需證書', 2),
('TITLE_REQ', 'LIC', '需執照', 3);

-- ============================================================
-- Table: business_units (事業體)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_business_units (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    business_code VARCHAR(20) NOT NULL UNIQUE COMMENT '事業體代碼',
    business_name VARCHAR(100) NOT NULL COMMENT '事業體名稱',
    sort_order INT DEFAULT 0 COMMENT '排序',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
    remark VARCHAR(500) COMMENT '備註',

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',

    INDEX idx_business_name (business_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='事業體表';

-- ============================================================
-- Table: divisions (處級單位)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_divisions (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    division_code VARCHAR(20) NOT NULL UNIQUE COMMENT '處級單位代碼',
    division_name VARCHAR(100) NOT NULL COMMENT '處級單位名稱',
    business_id INT COMMENT '所屬事業體ID',
    sort_order INT DEFAULT 0 COMMENT '排序',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
    remark VARCHAR(500) COMMENT '備註',

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',

    INDEX idx_division_name (division_name),
    INDEX idx_business_id (business_id),
    FOREIGN KEY (business_id) REFERENCES HR_position_business_units(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='處級單位表';

-- ============================================================
-- Table: departments (部級單位)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_departments (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    department_code VARCHAR(20) NOT NULL UNIQUE COMMENT '部級單位代碼',
    department_name VARCHAR(100) NOT NULL COMMENT '部級單位名稱',
    division_id INT COMMENT '所屬處級單位ID',
    sort_order INT DEFAULT 0 COMMENT '排序',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',
    remark VARCHAR(500) COMMENT '備註',

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',

    INDEX idx_department_name (department_name),
    INDEX idx_division_id (division_id),
    FOREIGN KEY (division_id) REFERENCES HR_position_divisions(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部級單位表';

-- ============================================================
-- Table: organization_positions (組織崗位關聯)
-- ============================================================
CREATE TABLE IF NOT EXISTS HR_position_organization_positions (
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵',
    business_id INT NOT NULL COMMENT '事業體ID',
    division_id INT NOT NULL COMMENT '處級單位ID',
    department_id INT NOT NULL COMMENT '部級單位ID',
    position_title VARCHAR(100) NOT NULL COMMENT '崗位名稱',
    sort_order INT DEFAULT 0 COMMENT '排序',
    is_active BOOLEAN DEFAULT TRUE COMMENT '是否啟用',

    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間',
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間',

    INDEX idx_business_id (business_id),
    INDEX idx_division_id (division_id),
    INDEX idx_department_id (department_id),
    INDEX idx_position_title (position_title),
    UNIQUE KEY uk_org_position (business_id, division_id, department_id, position_title),
    FOREIGN KEY (business_id) REFERENCES HR_position_business_units(id) ON DELETE CASCADE,
    FOREIGN KEY (division_id) REFERENCES HR_position_divisions(id) ON DELETE CASCADE,
    FOREIGN KEY (department_id) REFERENCES HR_position_departments(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='組織崗位關聯表';

-- ============================================================
-- End of Schema
-- ============================================================
