-- 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;