from typing import Optional, List from pydantic import BaseModel, EmailStr from datetime import datetime, date from app.schemas.department import Department from app.schemas.job_title import JobTitle # Shared properties class EmployeeBase(BaseModel): first_name: Optional[str] = None last_name: Optional[str] = None email: Optional[EmailStr] = None phone: Optional[str] = None hire_date: Optional[date] = None birth_date: Optional[date] = None address: Optional[str] = None department_id: Optional[str] = None job_title_id: Optional[str] = None manager_id: Optional[str] = None skills: Optional[str] = None categories: Optional[str] = None is_active: Optional[bool] = True # Properties to receive via API on creation class EmployeeCreate(EmployeeBase): first_name: str last_name: str email: EmailStr hire_date: date department_id: str job_title_id: str # Properties to receive via API on update class EmployeeUpdate(EmployeeBase): pass class EmployeeInDBBase(EmployeeBase): id: Optional[str] = None created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class Config: from_attributes = True # Additional properties to return via API class Employee(EmployeeInDBBase): pass # Additional properties to return via API with expanded relationships class EmployeeWithDetails(EmployeeInDBBase): department: Optional[Department] = None job_title: Optional[JobTitle] = None manager: Optional[Employee] = None # Additional properties stored in DB class EmployeeInDB(EmployeeInDBBase): pass # For searching employees class EmployeeSearchParams(BaseModel): department_id: Optional[str] = None job_title_id: Optional[str] = None skills: Optional[List[str]] = None categories: Optional[List[str]] = None name: Optional[str] = None # For searching by first_name or last_name is_active: Optional[bool] = None