fix: configure referral bonuses per tariff period
This commit is contained in:
@@ -214,10 +214,10 @@ class Settings(BaseSettings):
|
||||
MONTH_6_ENABLED: bool = Field(default=True, alias="6_MONTHS_ENABLED")
|
||||
MONTH_12_ENABLED: bool = Field(default=True, alias="12_MONTHS_ENABLED")
|
||||
|
||||
RUB_PRICE_1_MONTH: Optional[int] = Field(default=None)
|
||||
RUB_PRICE_3_MONTHS: Optional[int] = Field(default=None)
|
||||
RUB_PRICE_6_MONTHS: Optional[int] = Field(default=None)
|
||||
RUB_PRICE_12_MONTHS: Optional[int] = Field(default=None)
|
||||
RUB_PRICE_1_MONTH: Optional[int] = Field(default=200)
|
||||
RUB_PRICE_3_MONTHS: Optional[int] = Field(default=600)
|
||||
RUB_PRICE_6_MONTHS: Optional[int] = Field(default=1200)
|
||||
RUB_PRICE_12_MONTHS: Optional[int] = Field(default=2400)
|
||||
|
||||
STARS_PRICE_1_MONTH: Optional[int] = Field(default=None)
|
||||
STARS_PRICE_3_MONTHS: Optional[int] = Field(default=None)
|
||||
|
||||
@@ -95,6 +95,8 @@ class Tariff(BaseModel):
|
||||
monthly_gb: Optional[float] = None
|
||||
prices_rub: Dict[str, float] = Field(default_factory=dict)
|
||||
prices_stars: Dict[str, float] = Field(default_factory=dict)
|
||||
referral_bonus_days_inviter: Dict[str, int] = Field(default_factory=dict)
|
||||
referral_bonus_days_referee: Dict[str, int] = Field(default_factory=dict)
|
||||
enabled_periods: List[int] = Field(default_factory=list)
|
||||
topup_packages: Optional[PackageSet] = None
|
||||
|
||||
@@ -129,6 +131,14 @@ class Tariff(BaseModel):
|
||||
if self.billing_model == "period":
|
||||
if self.monthly_gb is None or self.monthly_gb < 0:
|
||||
raise ValueError(f"period tariff {self.key}: monthly_gb must be >= 0")
|
||||
self.referral_bonus_days_inviter = self._normalize_referral_bonus_map(
|
||||
self.referral_bonus_days_inviter,
|
||||
"referral_bonus_days_inviter",
|
||||
)
|
||||
self.referral_bonus_days_referee = self._normalize_referral_bonus_map(
|
||||
self.referral_bonus_days_referee,
|
||||
"referral_bonus_days_referee",
|
||||
)
|
||||
if not self.enabled_periods:
|
||||
raise ValueError(f"period tariff {self.key}: enabled_periods is required")
|
||||
for months in self.enabled_periods:
|
||||
@@ -139,7 +149,7 @@ class Tariff(BaseModel):
|
||||
if rub_price <= 0 and stars_price <= 0:
|
||||
raise ValueError(
|
||||
f"period tariff {self.key}: period {months} needs a non-zero rub or stars price" # noqa: E501
|
||||
)
|
||||
)
|
||||
return self
|
||||
|
||||
if not self.traffic_packages or not self.traffic_packages.has_any():
|
||||
@@ -152,6 +162,23 @@ class Tariff(BaseModel):
|
||||
)
|
||||
return self
|
||||
|
||||
def _normalize_referral_bonus_map(
|
||||
self, values: Dict[str, int], field_name: str
|
||||
) -> Dict[str, int]:
|
||||
normalized: Dict[str, int] = {}
|
||||
for period, days in (values or {}).items():
|
||||
try:
|
||||
months = int(float(str(period).strip()))
|
||||
bonus_days = int(float(days))
|
||||
except (TypeError, ValueError):
|
||||
raise ValueError(f"tariff {self.key}: {field_name} contains invalid entry")
|
||||
if months <= 0:
|
||||
raise ValueError(f"tariff {self.key}: {field_name} periods must be positive")
|
||||
if bonus_days < 0:
|
||||
raise ValueError(f"tariff {self.key}: {field_name} days must be >= 0")
|
||||
normalized[str(months)] = bonus_days
|
||||
return normalized
|
||||
|
||||
def name(self, lang: str, fallback: str = "ru") -> str:
|
||||
return self.names.get(lang) or self.names.get(fallback) or self.key
|
||||
|
||||
@@ -173,6 +200,14 @@ class Tariff(BaseModel):
|
||||
value = source.get(str(months))
|
||||
return float(value) if value is not None else None
|
||||
|
||||
def referral_inviter_bonus_days(self, months: int) -> Optional[int]:
|
||||
value = self.referral_bonus_days_inviter.get(str(int(months)))
|
||||
return int(value) if value is not None else None
|
||||
|
||||
def referral_referee_bonus_days(self, months: int) -> Optional[int]:
|
||||
value = self.referral_bonus_days_referee.get(str(int(months)))
|
||||
return int(value) if value is not None else None
|
||||
|
||||
def min_period_price_rub(self) -> Optional[float]:
|
||||
prices = [
|
||||
float(self.prices_rub[str(months)])
|
||||
|
||||
Reference in New Issue
Block a user