from typing import List, Optional from sqlalchemy.orm import Session from sqlalchemy import or_ from app.crud.base import CRUDBase from app.models.employee import Employee from app.schemas.employee import EmployeeCreate, EmployeeUpdate, EmployeeSearchParams class CRUDEmployee(CRUDBase[Employee, EmployeeCreate, EmployeeUpdate]): def get_by_email(self, db: Session, *, email: str) -> Optional[Employee]: return db.query(Employee).filter(Employee.email == email).first() def get_all(self, db: Session, *, skip: int = 0, limit: int = 100) -> List[Employee]: return db.query(Employee).offset(skip).limit(limit).all() def get_by_department(self, db: Session, *, department_id: str, skip: int = 0, limit: int = 100) -> List[Employee]: return db.query(Employee).filter(Employee.department_id == department_id).offset(skip).limit(limit).all() def get_by_job_title(self, db: Session, *, job_title_id: str, skip: int = 0, limit: int = 100) -> List[Employee]: return db.query(Employee).filter(Employee.job_title_id == job_title_id).offset(skip).limit(limit).all() def get_by_manager(self, db: Session, *, manager_id: str, skip: int = 0, limit: int = 100) -> List[Employee]: return db.query(Employee).filter(Employee.manager_id == manager_id).offset(skip).limit(limit).all() def search(self, db: Session, *, params: EmployeeSearchParams, skip: int = 0, limit: int = 100) -> List[Employee]: query = db.query(Employee) # Apply filters based on the search parameters if params.department_id: query = query.filter(Employee.department_id == params.department_id) if params.job_title_id: query = query.filter(Employee.job_title_id == params.job_title_id) if params.is_active is not None: query = query.filter(Employee.is_active == params.is_active) if params.name: query = query.filter( or_( Employee.first_name.ilike(f"%{params.name}%"), Employee.last_name.ilike(f"%{params.name}%") ) ) if params.skills: skill_filters = [] for skill in params.skills: skill_filters.append(Employee.skills.ilike(f"%{skill}%")) if skill_filters: query = query.filter(or_(*skill_filters)) if params.categories: category_filters = [] for category in params.categories: category_filters.append(Employee.categories.ilike(f"%{category}%")) if category_filters: query = query.filter(or_(*category_filters)) return query.offset(skip).limit(limit).all() employee = CRUDEmployee(Employee)