import uuid from datetime import date, datetime from typing import Optional from pydantic import BaseModel, ConfigDict class VisitCreate(BaseModel): subject_id: uuid.UUID visit_code: str planned_date: Optional[date] = None window_start: Optional[date] = None window_end: Optional[date] = None actual_date: Optional[date] = None notes: Optional[str] = None class VisitUpdate(BaseModel): actual_date: Optional[date] = None status: Optional[str] = None notes: Optional[str] = None class EarlyTerminationCreate(BaseModel): termination_date: date reason: str notes: Optional[str] = None class VisitRead(BaseModel): id: uuid.UUID study_id: uuid.UUID subject_id: uuid.UUID visit_code: str planned_date: Optional[date] actual_date: Optional[date] status: str window_start: Optional[date] window_end: Optional[date] notes: Optional[str] created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class VisitLostItem(BaseModel): visit_id: uuid.UUID subject_id: uuid.UUID subject_no: str site_id: uuid.UUID | None visit_code: str status: str updated_at: datetime model_config = ConfigDict(from_attributes=True)