import uuid from datetime import date, datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field class ProductCreate(BaseModel): name: str form: Optional[str] = None strength: Optional[str] = None unit: str description: Optional[str] = None is_active: bool = True class ProductUpdate(BaseModel): name: Optional[str] = None form: Optional[str] = None strength: Optional[str] = None unit: Optional[str] = None description: Optional[str] = None is_active: Optional[bool] = None class ProductRead(BaseModel): id: uuid.UUID study_id: uuid.UUID name: str form: Optional[str] strength: Optional[str] unit: str description: Optional[str] is_active: bool created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class BatchCreate(BaseModel): product_id: uuid.UUID batch_no: str expiry_date: Optional[date] = None manufacture_date: Optional[date] = None class BatchUpdate(BaseModel): status: Optional[str] = None expiry_date: Optional[date] = None manufacture_date: Optional[date] = None class BatchRead(BaseModel): id: uuid.UUID study_id: uuid.UUID product_id: uuid.UUID batch_no: str expiry_date: Optional[date] manufacture_date: Optional[date] status: str created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class InventoryRead(BaseModel): site_id: uuid.UUID batch_id: uuid.UUID quantity_on_hand: int updated_at: datetime model_config = ConfigDict(from_attributes=True) class TxCreate(BaseModel): site_id: uuid.UUID batch_id: uuid.UUID subject_id: Optional[uuid.UUID] = None tx_type: str quantity: int = Field(gt=0) tx_date: date reference: Optional[str] = None notes: Optional[str] = None class TxRead(BaseModel): id: uuid.UUID study_id: uuid.UUID site_id: uuid.UUID batch_id: uuid.UUID subject_id: Optional[uuid.UUID] tx_type: str quantity: int tx_date: date reference: Optional[str] notes: Optional[str] created_by: uuid.UUID created_at: datetime model_config = ConfigDict(from_attributes=True)