feat(products): compute price tiers from objective price/use
This commit is contained in:
parent
c5ea38880c
commit
83ba4cc5c0
13 changed files with 664 additions and 48 deletions
|
|
@ -94,7 +94,8 @@ class ProductBase(SQLModel):
|
|||
absorption_speed: AbsorptionSpeed | None = None
|
||||
leave_on: bool
|
||||
|
||||
price_tier: PriceTier | None = None
|
||||
price_amount: float | None = Field(default=None, gt=0)
|
||||
price_currency: str | None = Field(default=None, min_length=3, max_length=3)
|
||||
size_ml: float | None = Field(default=None, gt=0)
|
||||
full_weight_g: float | None = Field(default=None, gt=0)
|
||||
empty_weight_g: float | None = Field(default=None, gt=0)
|
||||
|
|
@ -145,9 +146,6 @@ class Product(ProductBase, table=True):
|
|||
|
||||
id: UUID = Field(default_factory=uuid4, primary_key=True)
|
||||
|
||||
# Override: add index for table context
|
||||
price_tier: PriceTier | None = Field(default=None, index=True)
|
||||
|
||||
# Override 9 JSON fields with sa_column (only in table model)
|
||||
inci: list[str] = Field(
|
||||
default_factory=list, sa_column=Column(JSON, nullable=False)
|
||||
|
|
@ -217,9 +215,17 @@ class Product(ProductBase, table=True):
|
|||
if self.is_medication and not self.usage_notes:
|
||||
raise ValueError("Medication products must have usage_notes")
|
||||
|
||||
if self.price_currency is not None:
|
||||
self.price_currency = self.price_currency.upper()
|
||||
|
||||
return self
|
||||
|
||||
def to_llm_context(self) -> dict:
|
||||
def to_llm_context(
|
||||
self,
|
||||
*,
|
||||
computed_price_tier: PriceTier | None = None,
|
||||
price_per_use_pln: float | None = None,
|
||||
) -> dict:
|
||||
ctx: dict = {
|
||||
"id": str(self.id),
|
||||
"name": self.name,
|
||||
|
|
@ -238,8 +244,14 @@ class Product(ProductBase, table=True):
|
|||
ctx["texture"] = _ev(self.texture)
|
||||
if self.absorption_speed is not None:
|
||||
ctx["absorption_speed"] = _ev(self.absorption_speed)
|
||||
if self.price_tier is not None:
|
||||
ctx["price_tier"] = _ev(self.price_tier)
|
||||
if self.price_amount is not None:
|
||||
ctx["price_amount"] = self.price_amount
|
||||
if self.price_currency is not None:
|
||||
ctx["price_currency"] = self.price_currency
|
||||
if computed_price_tier is not None:
|
||||
ctx["price_tier"] = _ev(computed_price_tier)
|
||||
if price_per_use_pln is not None:
|
||||
ctx["price_per_use_pln"] = round(price_per_use_pln, 4)
|
||||
if self.size_ml is not None:
|
||||
ctx["size_ml"] = self.size_ml
|
||||
if self.pao_months is not None:
|
||||
|
|
@ -370,6 +382,9 @@ class ProductPublic(ProductBase):
|
|||
id: UUID
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
price_tier: PriceTier | None = None
|
||||
price_per_use_pln: float | None = None
|
||||
price_tier_source: str | None = None
|
||||
|
||||
|
||||
class ProductWithInventory(ProductPublic):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue