# Leave Agent - Database Design ## Database Schema ### 1. Employees Stores employee information and their leave balances. ```sql CREATE TABLE employees ( employee_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### 2. Leave Types Defines different types of leaves available in the system. ```sql CREATE TABLE leave_types ( leave_types_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL, -- e.g., "Annual Leave", "Sick Leave" description TEXT, max_days INTEGER NOT NULL, is_active BOOLEAN DEFAULT true, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### 3. Leave Balances Tracks the number of leave days available for each employee by leave type. ```sql CREATE TABLE leave_balances ( leave_balances_id INTEGER PRIMARY KEY AUTOINCREMENT, employee_id INTEGER NOT NULL, leave_type_id INTEGER NOT NULL, balance_days REAL NOT NULL, year INTEGER NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES employees(employee_id) ON DELETE CASCADE, FOREIGN KEY (leave_type_id) REFERENCES leave_types(leave_types_id) ON DELETE CASCADE, UNIQUE(employee_id, leave_type_id, year) ); ``` ### 4. Leave Requests Tracks all leave requests made by employees. ```sql CREATE TABLE leave_requests ( leave_requests_id INTEGER PRIMARY KEY AUTOINCREMENT, employee_id INTEGER NOT NULL, leave_type_id INTEGER NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, reason TEXT, status TEXT NOT NULL, -- 'pending', 'approved', 'rejected', 'cancelled' business_days REAL NOT NULL, notes TEXT, approved_by INTEGER, approved_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (employee_id) REFERENCES employees(employee_id) ON DELETE CASCADE, FOREIGN KEY (leave_type_id) REFERENCES leave_types(leave_types_id) ON DELETE CASCADE, FOREIGN KEY (approved_by) REFERENCES employees(employee_id) ON DELETE SET NULL ); ``` ### 5. Holidays Stores public holidays. ```sql CREATE TABLE holidays ( holidays_id INTEGER PRIMARY KEY AUTOINCREMENT, date DATE NOT NULL, name TEXT NOT NULL, description TEXT, is_recurring BOOLEAN DEFAULT false, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(date, name) ); ``` ### 6. Team Events Stores company events and team activities. ```sql CREATE TABLE team_events ( team_events_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, description TEXT, start_date DATE NOT NULL, end_date DATE, is_recurring BOOLEAN DEFAULT false, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ## Entity Relationship Diagram ```mermaid erDiagram employees ||--o{ leave_balances : has employees ||--o{ leave_requests : makes leave_types ||--o{ leave_balances : has leave_types ||--o{ leave_requests : has employees ||--o{ leave_requests : approves employees { int employee_id PK string name string email timestamp created_at timestamp updated_at } leave_types { int leave_types_id PK string name string description int max_days boolean is_active timestamp created_at } leave_balances { int leave_balances_id PK int employee_id FK int leave_type_id FK real balance_days int year timestamp created_at timestamp updated_at } leave_requests { int leave_requests_id PK int employee_id FK int leave_type_id FK date start_date date end_date string reason string status real business_days string notes int approved_by FK timestamp approved_at timestamp created_at timestamp updated_at } holidays { int holidays_id PK date date string name string description boolean is_recurring timestamp created_at } team_events { int team_events_id PK string name string description date start_date date end_date boolean is_recurring timestamp created_at timestamp updated_at } ``` ## Initial Data Setup ### Default Leave Types ```sql INSERT INTO leave_types (name, description, max_days, is_active) VALUES ('Annual Leave', 'Paid time off for vacation or personal reasons', 24, true), ('Sick Leave', 'Paid time off for illness or medical appointments', 12, true), ('Maternity Leave', 'Paid leave for new mothers', 182, true), ('Paternity Leave', 'Paid leave for new fathers', 14, true), ('Bereavement Leave', 'Paid time off following the death of a family member', 5, true), ('Marriage Leave', 'Paid time off for employee''s own marriage', 5, true); ``` ### Sample Holidays (2025) ```sql INSERT INTO holidays (date, name, description, is_recurring) VALUES ('2025-01-01', 'New Year''s Day', 'First day of the year', true), ('2025-01-26', 'Republic Day', 'Indian Republic Day', true), ('2025-03-17', 'Holi', 'Festival of Colors', true), ('2025-04-14', 'Ambedkar Jayanti', 'Birth anniversary of Dr. B.R. Ambedkar', true), ('2025-08-15', 'Independence Day', 'Indian Independence Day', true), ('2025-10-02', 'Gandhi Jayanti', 'Birth anniversary of Mahatma Gandhi', true), ('2025-12-25', 'Christmas Day', 'Christmas holiday', true); ``` ## Indexes For better query performance, the following indexes are recommended: ```sql -- Indexes for leave_requests CREATE INDEX idx_leave_requests_employee_id ON leave_requests(employee_id); CREATE INDEX idx_leave_requests_status ON leave_requests(status); CREATE INDEX idx_leave_requests_dates ON leave_requests(start_date, end_date); -- Indexes for leave_balances CREATE INDEX idx_leave_balances_employee ON leave_balances(employee_id, year); ```