fix(billing): make quota seed and column names match the product SSOT

The product plan is the only source for quota numbers, but the 0001 seed
used a second set (agent_chat 20/50, tryon hard 10) and omitted hairstyle,
hd_export and report regen. Migration 0003 replaces the seed and renames
points_reserved → quota_reserved and bonus_value → bonus_granted so the
docs and the schema stop contradicting each other.

Effective limit now clips at hard_cap. CI runs the integration slice
against the Postgres/Redis services it already starts.
This commit is contained in:
xsl
2026-08-14 11:28:35 +08:00
parent c97f8ae3e1
commit 2009aa938c
11 changed files with 179 additions and 16 deletions
+5 -1
View File
@@ -74,10 +74,14 @@ class QuotaState:
used: int
base_limit: int
bonus: int = 0
hard_cap: int | None = None
@property
def effective_limit(self) -> int:
return self.base_limit + self.bonus
raw = self.base_limit + self.bonus
if self.hard_cap is None:
return raw
return min(raw, self.hard_cap)
@property
def remaining(self) -> int: