-- Work Allocation System Database Schema -- This version is for Docker init (database already created by environment variables) -- Departments table CREATE TABLE IF NOT EXISTS departments ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Sub-departments table (for Groundnut department) CREATE TABLE IF NOT EXISTS sub_departments ( id INT PRIMARY KEY AUTO_INCREMENT, department_id INT NOT NULL, name VARCHAR(200) NOT NULL, primary_activity VARCHAR(200) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE CASCADE ); -- Users table (for all roles: SuperAdmin, Supervisor, Contractor, Employee) CREATE TABLE IF NOT EXISTS users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(100) NOT NULL UNIQUE, name VARCHAR(200) NOT NULL, email VARCHAR(200) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, role ENUM('SuperAdmin', 'Supervisor', 'Contractor', 'Employee') NOT NULL, department_id INT, contractor_id INT, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL, FOREIGN KEY (contractor_id) REFERENCES users(id) ON DELETE SET NULL ); -- Contractor rates table (rates per contractor + sub-department combination) CREATE TABLE IF NOT EXISTS contractor_rates ( id INT PRIMARY KEY AUTO_INCREMENT, contractor_id INT NOT NULL, sub_department_id INT, activity VARCHAR(200), rate DECIMAL(10, 2) NOT NULL, effective_date DATE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (contractor_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (sub_department_id) REFERENCES sub_departments(id) ON DELETE SET NULL ); -- Work allocations table CREATE TABLE IF NOT EXISTS work_allocations ( id INT PRIMARY KEY AUTO_INCREMENT, employee_id INT NOT NULL, supervisor_id INT NOT NULL, contractor_id INT NOT NULL, sub_department_id INT, activity VARCHAR(100), description TEXT, assigned_date DATE NOT NULL, status ENUM('Pending', 'InProgress', 'Completed', 'Cancelled') DEFAULT 'Pending', completion_date DATE, rate DECIMAL(10, 2), units DECIMAL(10, 2), total_amount DECIMAL(10, 2), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (supervisor_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (contractor_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (sub_department_id) REFERENCES sub_departments(id) ON DELETE SET NULL ); -- Attendance table CREATE TABLE IF NOT EXISTS attendance ( id INT PRIMARY KEY AUTO_INCREMENT, employee_id INT NOT NULL, supervisor_id INT NOT NULL, check_in_time DATETIME NOT NULL, check_out_time DATETIME, work_date DATE NOT NULL, status ENUM('CheckedIn', 'CheckedOut') DEFAULT 'CheckedIn', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (supervisor_id) REFERENCES users(id) ON DELETE CASCADE ); -- Insert default departments INSERT IGNORE INTO departments (name) VALUES ('Tudki'), ('Dana'), ('Groundnut'); -- Insert Groundnut sub-departments INSERT IGNORE INTO sub_departments (department_id, name, primary_activity) SELECT id, 'Mufali Aavak Katai', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Mufali Aavak Dhang', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Dhang Se Katai', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Guthli Bori Silai Dhang', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Guthali dada Pala Tulai Silai Dhang', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Mufali Patthar Bori silai dhang', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Mufali Patthar Bori Utrai', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Bardana Bandal Loading Unloading', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Bardana Gatthi Loading', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Black Dana Loading/Unloading', 'Loading/Unloading' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Pre Cleaning', 'Pre Cleaning' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Destoner', 'Destoner' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Water', 'Water' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Decordicater', 'Decordicater & Cleaning' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Round Chalna', 'Round Chalna & Cleaning' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Cleaning', 'Decordicater & Cleaning' FROM departments WHERE name = 'Groundnut' UNION ALL SELECT id, 'Round Chalna No.1', 'Round Chalna No.1' FROM departments WHERE name = 'Groundnut'; -- Note: Admin user will be created by running: npm run seed -- This ensures the password is properly hashed with bcrypt