""" DataFlow Server — Pydantic Schemas """ from pydantic import BaseModel, EmailStr from typing import Optional, List from datetime import datetime # ─── Auth ─── class UserLogin(BaseModel): email: str password: str class UserRegister(BaseModel): full_name: str email: str password: str position: Optional[str] = None role: str = "developer" class Token(BaseModel): access_token: str token_type: str = "bearer" user_id: str full_name: str role: str class UserOut(BaseModel): id: str full_name: str email: str position: Optional[str] role: str language: str currency: str timezone: str two_factor_enabled: bool biometric_enabled: bool model_config = {"from_attributes": True} # ─── Project ─── class ProjectCreate(BaseModel): name: str description: str = "" start_date: datetime end_date: datetime budget: float status: str = "active" class ProjectUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None end_date: Optional[datetime] = None budget: Optional[float] = None spent: Optional[float] = None status: Optional[str] = None progress: Optional[float] = None risk_level: Optional[str] = None class ProjectOut(BaseModel): id: str name: str description: str start_date: datetime end_date: datetime budget: float spent: float status: str progress: float risk_level: str owner_id: Optional[str] created_at: datetime model_config = {"from_attributes": True} # ─── Task ─── class SubTaskOut(BaseModel): id: str title: str completed: bool model_config = {"from_attributes": True} class TaskCreate(BaseModel): title: str description: str = "" project_id: str status: str = "todo" priority: str = "medium" assignee_id: Optional[str] = None assignee_name: Optional[str] = None deadline: Optional[datetime] = None tags: str = "" class TaskUpdate(BaseModel): title: Optional[str] = None status: Optional[str] = None priority: Optional[str] = None assignee_id: Optional[str] = None assignee_name: Optional[str] = None deadline: Optional[datetime] = None class TaskOut(BaseModel): id: str title: str description: str project_id: str status: str priority: str assignee_id: Optional[str] assignee_name: Optional[str] deadline: Optional[datetime] created_at: datetime tags: str subtasks: List[SubTaskOut] = [] model_config = {"from_attributes": True} # ─── Expense ─── class ExpenseCreate(BaseModel): project_id: str title: str amount: float category: str date: Optional[datetime] = None description: Optional[str] = None class ExpenseUpdate(BaseModel): status: Optional[str] = None amount: Optional[float] = None title: Optional[str] = None class ExpenseOut(BaseModel): id: str project_id: str title: str amount: float category: str date: datetime status: str description: Optional[str] receipt_url: Optional[str] created_at: datetime model_config = {"from_attributes": True} # ─── Document ─── class DocumentOut(BaseModel): id: str name: str project_id: str type: str size_bytes: int is_favorite: bool extracted_text: Optional[str] recognition_confidence: Optional[float] detected_type: Optional[str] extracted_amount: Optional[float] extracted_date: Optional[datetime] extracted_supplier: Optional[str] uploaded_at: datetime model_config = {"from_attributes": True} # ─── Notification ─── class NotificationOut(BaseModel): id: str title: str body: str type: str is_read: bool created_at: datetime model_config = {"from_attributes": True} # ─── AI Forecast ─── class ForecastOut(BaseModel): id: str project_id: str current_spent: float planned_budget: float risk_level: str overrun_probability: float optimistic_forecast: float realistic_forecast: float pessimistic_forecast: float recommendations: str generated_at: datetime model_config = {"from_attributes": True} class ForecastRequest(BaseModel): project_id: str class OCRRequest(BaseModel): project_id: str