from pydantic import BaseModel, ConfigDict, Field class EditorProductRow(BaseModel): id: int tenant_id: str client_name: str item_id: str | None name: str mix_id: int mix_client_name: str mix_name: str sale_type: str unit_of_measure: str visible: bool product_notes: str | None mix_notes: str | None class EditorProductUpdate(BaseModel): model_config = ConfigDict(extra="forbid") client_name: str | None = Field(default=None, min_length=1, max_length=255) name: str | None = Field(default=None, min_length=1, max_length=255) item_id: str | None = Field(default=None, max_length=128) mix_id: int | None = None sale_type: str | None = Field(default=None, min_length=1, max_length=64) unit_of_measure: str | None = Field(default=None, min_length=1, max_length=64) visible: bool | None = None notes: str | None = Field(default=None, max_length=2000) class EditorMixUpdate(BaseModel): model_config = ConfigDict(extra="forbid") client_name: str | None = Field(default=None, min_length=1, max_length=255) name: str | None = Field(default=None, min_length=1, max_length=255) notes: str | None = Field(default=None, max_length=2000) class EditorProductIngredientCreate(BaseModel): model_config = ConfigDict(extra="forbid") raw_material_id: int quantity_kg: float = Field(gt=0) notes: str | None = Field(default=None, max_length=1000) class EditorProductIngredientUpdate(BaseModel): model_config = ConfigDict(extra="forbid") quantity_kg: float | None = Field(default=None, gt=0) notes: str | None = Field(default=None, max_length=1000) class EditorProductIngredientRead(BaseModel): id: int raw_material_id: int raw_material_name: str quantity_kg: float sort_order: int notes: str | None class EditorProductFormulaRead(BaseModel): id: int tenant_id: str client_name: str name: str mix_id: int mix_name: str ingredients: list[EditorProductIngredientRead] total_kg: float