135 lines
4.9 KiB
SQL
135 lines
4.9 KiB
SQL
-- Migration: Add HR Module
|
|
-- 1. Departments
|
|
CREATE TABLE IF NOT EXISTS hr_departments (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
description TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 2. Employees (Linked to users optionally)
|
|
CREATE TABLE IF NOT EXISTS hr_employees (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT UNIQUE DEFAULT NULL, -- Link to system login if applicable
|
|
department_id INT,
|
|
first_name VARCHAR(50) NOT NULL,
|
|
last_name VARCHAR(50) NOT NULL,
|
|
email VARCHAR(100),
|
|
phone VARCHAR(20),
|
|
gender ENUM('male', 'female') DEFAULT 'male',
|
|
birth_date DATE,
|
|
join_date DATE NOT NULL,
|
|
job_title VARCHAR(100),
|
|
basic_salary DECIMAL(10, 2) DEFAULT 0.00,
|
|
status ENUM('active', 'terminated', 'resigned', 'on_leave') DEFAULT 'active',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
FOREIGN KEY (department_id) REFERENCES hr_departments(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 3. Attendance
|
|
CREATE TABLE IF NOT EXISTS hr_attendance (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
employee_id INT NOT NULL,
|
|
date DATE NOT NULL,
|
|
check_in TIME,
|
|
check_out TIME,
|
|
status ENUM('present', 'absent', 'late', 'excused', 'holiday') DEFAULT 'absent',
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY emp_date (employee_id, date),
|
|
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 4. Leaves
|
|
CREATE TABLE IF NOT EXISTS hr_leaves (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
employee_id INT NOT NULL,
|
|
leave_type ENUM('annual', 'sick', 'unpaid', 'maternity', 'emergency', 'other') NOT NULL,
|
|
start_date DATE NOT NULL,
|
|
end_date DATE NOT NULL,
|
|
days_count INT DEFAULT 1,
|
|
reason TEXT,
|
|
status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending',
|
|
approved_by INT DEFAULT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (approved_by) REFERENCES users(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 5. Holidays
|
|
CREATE TABLE IF NOT EXISTS hr_holidays (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL,
|
|
date_from DATE NOT NULL,
|
|
date_to DATE NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- 6. Payroll
|
|
CREATE TABLE IF NOT EXISTS hr_payroll (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
employee_id INT NOT NULL,
|
|
month INT NOT NULL,
|
|
year INT NOT NULL,
|
|
basic_salary DECIMAL(10, 2) NOT NULL,
|
|
bonuses DECIMAL(10, 2) DEFAULT 0.00,
|
|
deductions DECIMAL(10, 2) DEFAULT 0.00,
|
|
net_salary DECIMAL(10, 2) NOT NULL,
|
|
status ENUM('pending', 'paid') DEFAULT 'pending',
|
|
payment_date DATE,
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE KEY emp_period (employee_id, month, year),
|
|
FOREIGN KEY (employee_id) REFERENCES hr_employees(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
-- Permissions for HR module (Assign to Admin by default)
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_dashboard',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|
|
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_employees',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|
|
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_attendance',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|
|
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_leaves',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|
|
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_payroll',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|
|
|
|
INSERT IGNORE INTO user_permissions (user_id, page, can_view, can_add, can_edit, can_delete)
|
|
SELECT id, 'hr_reports',
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0),
|
|
IF(role = 'admin', 1, 0)
|
|
FROM users;
|