2026-04-25 20:43:37 +12:00
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProductCreate(BaseModel):
|
|
|
|
|
client_name: str
|
|
|
|
|
item_id: str | None = None
|
|
|
|
|
name: str
|
|
|
|
|
mix_id: int
|
|
|
|
|
sale_type: str = "standard"
|
|
|
|
|
own_bag: bool = False
|
|
|
|
|
unit_of_measure: str = "20kg bag"
|
|
|
|
|
items_per_pallet: int = Field(default=50, gt=0)
|
|
|
|
|
bagging_process: str | None = None
|
|
|
|
|
distributor_margin: float | None = Field(default=None, gt=0, lt=1)
|
|
|
|
|
wholesale_margin: float | None = Field(default=None, gt=0, lt=1)
|
|
|
|
|
notes: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProductUpdate(BaseModel):
|
|
|
|
|
client_name: str | None = None
|
|
|
|
|
item_id: str | None = None
|
|
|
|
|
name: str | None = None
|
|
|
|
|
mix_id: int | None = None
|
|
|
|
|
sale_type: str | None = None
|
|
|
|
|
own_bag: bool | None = None
|
|
|
|
|
unit_of_measure: str | None = None
|
|
|
|
|
items_per_pallet: int | None = Field(default=None, gt=0)
|
|
|
|
|
bagging_process: str | None = None
|
|
|
|
|
distributor_margin: float | None = Field(default=None, gt=0, lt=1)
|
|
|
|
|
wholesale_margin: float | None = Field(default=None, gt=0, lt=1)
|
|
|
|
|
notes: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProductRead(BaseModel):
|
|
|
|
|
id: int
|
|
|
|
|
tenant_id: str
|
|
|
|
|
client_name: str
|
|
|
|
|
item_id: str | None
|
|
|
|
|
name: str
|
|
|
|
|
mix_id: int
|
|
|
|
|
mix_name: str
|
|
|
|
|
sale_type: str
|
|
|
|
|
own_bag: bool
|
|
|
|
|
unit_of_measure: str
|
|
|
|
|
items_per_pallet: int
|
|
|
|
|
bagging_process: str | None
|
|
|
|
|
distributor_margin: float | None
|
|
|
|
|
wholesale_margin: float | None
|
|
|
|
|
notes: str | None
|
|
|
|
|
created_at: datetime
|
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ProductCostBreakdown(BaseModel):
|
|
|
|
|
product_id: int
|
|
|
|
|
product_name: str
|
2026-04-27 21:53:36 +12:00
|
|
|
client_name: str
|
|
|
|
|
mix_name: str
|
2026-04-25 20:43:37 +12:00
|
|
|
cleaned_product_cost: float
|
|
|
|
|
grading_cost: float
|
|
|
|
|
bagging_cost: float
|
|
|
|
|
cracking_cost: float
|
|
|
|
|
bag_cost: float
|
|
|
|
|
freight_cost: float
|
|
|
|
|
finished_product_delivered: float
|
|
|
|
|
distributor_price: float | None
|
|
|
|
|
wholesale_price: float | None
|
|
|
|
|
warnings: list[str]
|
|
|
|
|
inputs: dict[str, object]
|