from pydantic import BaseModel, Field from datetime import datetime from typing import Optional, List from enum import Enum class UserRole(str, Enum): admin = "admin" user = "user" class IssueStatus(str, Enum): new = "new" progress = "progress" complete = "complete" class IssueCategory(str, Enum): material_missing = "material_missing" dimension_defect = "dimension_defect" incoming_defect = "incoming_defect" # User schemas class UserBase(BaseModel): username: str full_name: Optional[str] = None role: UserRole = UserRole.user class UserCreate(UserBase): password: str class UserUpdate(BaseModel): full_name: Optional[str] = None password: Optional[str] = None role: Optional[UserRole] = None is_active: Optional[bool] = None class User(UserBase): id: int is_active: bool created_at: datetime class Config: from_attributes = True # Auth schemas class Token(BaseModel): access_token: str token_type: str user: User class TokenData(BaseModel): username: Optional[str] = None class LoginRequest(BaseModel): username: str password: str # Issue schemas class IssueBase(BaseModel): category: IssueCategory description: str class IssueCreate(IssueBase): photo: Optional[str] = None # Base64 encoded image class IssueUpdate(BaseModel): category: Optional[IssueCategory] = None description: Optional[str] = None work_hours: Optional[float] = None detail_notes: Optional[str] = None status: Optional[IssueStatus] = None photo: Optional[str] = None # Base64 encoded image for update class Issue(IssueBase): id: int photo_path: Optional[str] = None status: IssueStatus reporter_id: int reporter: User report_date: datetime work_hours: float detail_notes: Optional[str] = None class Config: from_attributes = True # Daily Work schemas class DailyWorkBase(BaseModel): date: datetime worker_count: int = Field(gt=0) overtime_workers: Optional[int] = 0 overtime_hours: Optional[float] = 0 class DailyWorkCreate(DailyWorkBase): pass class DailyWorkUpdate(BaseModel): worker_count: Optional[int] = Field(None, gt=0) overtime_workers: Optional[int] = None overtime_hours: Optional[float] = None class DailyWork(DailyWorkBase): id: int regular_hours: float overtime_total: float total_hours: float created_by_id: int created_by: User created_at: datetime class Config: from_attributes = True # Report schemas class ReportRequest(BaseModel): start_date: datetime end_date: datetime class CategoryStats(BaseModel): material_missing: int = 0 dimension_defect: int = 0 incoming_defect: int = 0 class ReportSummary(BaseModel): start_date: datetime end_date: datetime total_hours: float total_issues: int category_stats: CategoryStats completed_issues: int average_resolution_time: float