66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
"""Активация кода пополнения."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from services.db import Database
|
|
from services.topup_codes import is_valid_code_format, normalize_code
|
|
|
|
|
|
class TopupCodeError(ValueError):
|
|
pass
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class TopupCodeRedeemResult:
|
|
ok: bool
|
|
message: str
|
|
amount: float = 0.0
|
|
balance: float = 0.0
|
|
already: bool = False
|
|
|
|
|
|
def redeem_topup_code(
|
|
db: Database,
|
|
*,
|
|
telegram_id: int,
|
|
raw_code: str,
|
|
) -> TopupCodeRedeemResult:
|
|
code = normalize_code(raw_code)
|
|
if not is_valid_code_format(code):
|
|
raise TopupCodeError("Некорректный формат кода (ожидается XXXX-XXXX-XXXX-XXXX)")
|
|
|
|
db.ensure_user(telegram_id)
|
|
try:
|
|
amount, already = db.redeem_topup_code(code=code, telegram_id=telegram_id)
|
|
except ValueError as exc:
|
|
raise TopupCodeError(str(exc)) from exc
|
|
if already:
|
|
balance = db.get_balance(telegram_id)
|
|
return TopupCodeRedeemResult(
|
|
ok=True,
|
|
already=True,
|
|
message="Этот код уже был использован.",
|
|
amount=amount,
|
|
balance=balance,
|
|
)
|
|
|
|
balance = db.add_balance(
|
|
telegram_id,
|
|
amount,
|
|
kind="code_topup",
|
|
meta=f"code:{code}",
|
|
)
|
|
text = (
|
|
f"✅ <b>Баланс пополнен по коду</b>\n\n"
|
|
f"+{amount:.0f} ₽\n"
|
|
f"Доступно: <b>{balance:.0f} ₽</b>"
|
|
)
|
|
return TopupCodeRedeemResult(
|
|
ok=True,
|
|
message=text,
|
|
amount=amount,
|
|
balance=balance,
|
|
)
|