CREATE TABLE IF NOT EXISTS departments ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(120) NOT NULL UNIQUE, created_at DATETIME NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(80) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, full_name VARCHAR(160) NOT NULL, email VARCHAR(190) NOT NULL, role ENUM('mitarbeiter','bauleiter','buero','geschaeftsfuehrung','admin') NOT NULL DEFAULT 'mitarbeiter', department_id INT NULL, vacation_days DECIMAL(5,2) NOT NULL DEFAULT 30, carryover_days DECIMAL(5,2) NOT NULL DEFAULT 0, must_change_password TINYINT(1) NOT NULL DEFAULT 1, two_factor_enabled TINYINT(1) NOT NULL DEFAULT 0, active TINYINT(1) NOT NULL DEFAULT 1, last_login_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NULL, CONSTRAINT fk_users_department FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS absences ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, type VARCHAR(80) NOT NULL, status ENUM('offen','genehmigt','abgelehnt','zurueckgezogen','storniert') NOT NULL DEFAULT 'offen', start_date DATE NOT NULL, end_date DATE NOT NULL, day_part ENUM('ganzer_tag','halber_tag') NOT NULL DEFAULT 'ganzer_tag', days_count DECIMAL(6,2) NOT NULL DEFAULT 0, comment TEXT NULL, decided_by INT NULL, decided_at DATETIME NULL, decision_note TEXT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NULL, CONSTRAINT fk_absences_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, CONSTRAINT fk_absences_decider FOREIGN KEY (decided_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_absences_dates (start_date, end_date), INDEX idx_absences_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS absence_types ( id INT AUTO_INCREMENT PRIMARY KEY, code VARCHAR(80) NOT NULL UNIQUE, label VARCHAR(120) NOT NULL, requires_approval TINYINT(1) NOT NULL DEFAULT 1, reduces_vacation TINYINT(1) NOT NULL DEFAULT 0, active TINYINT(1) NOT NULL DEFAULT 1, sort_order INT NOT NULL DEFAULT 100, created_at DATETIME NOT NULL, updated_at DATETIME NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS audit_logs ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id INT NULL, action VARCHAR(120) NOT NULL, entity_type VARCHAR(80) NULL, entity_id INT NULL, ip_address VARCHAR(64) NULL, payload JSON NULL, created_at DATETIME NOT NULL, INDEX idx_audit_created (created_at), CONSTRAINT fk_audit_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;