feat(subscription): improve subscription sync and renewal logic.
This commit is contained in:
@@ -25,9 +25,18 @@ from bot.texts import (
|
||||
)
|
||||
from db.models.users import User
|
||||
from misc import utils
|
||||
from misc.utils import build_main_menu_text, format_subscription_link
|
||||
from misc.utils import (
|
||||
build_main_menu_text,
|
||||
convert_duration_to_int,
|
||||
format_subscription_link,
|
||||
)
|
||||
from schemas.di import DependenciesDTO
|
||||
from schemas.subscriptions import InternalSquads, SubscriptionPlan
|
||||
from schemas.subscriptions import (
|
||||
InternalSquads,
|
||||
SubscriptionDuration,
|
||||
SubscriptionPlan,
|
||||
SubscriptionStatus,
|
||||
)
|
||||
from services.rw import delete_hwid, get_hwid_list, get_user_by_telegram_id
|
||||
|
||||
router = Router()
|
||||
@@ -140,25 +149,40 @@ async def sub_info(
|
||||
await cb.answer(CALLBACK_FALLBACK)
|
||||
return
|
||||
|
||||
dto = SubscriptionPlan(
|
||||
devices=max(rw_user.hwid_device_limit, 3),
|
||||
whitelists=bool(rw_user.active_squads.count(InternalSquads.WHITELISTS)),
|
||||
)
|
||||
if rw_user and not sub:
|
||||
try:
|
||||
dto = SubscriptionPlan(
|
||||
devices=rw_user.hwid_device_limit,
|
||||
whitelists=bool(rw_user.active_squads.count(InternalSquads.WHITELISTS)),
|
||||
discount=0,
|
||||
)
|
||||
sub = await deps.subscriptions_repository.create_subscription(
|
||||
session,
|
||||
user_id=user.id,
|
||||
end_date=rw_user.expire_at,
|
||||
devices=rw_user.hwid_device_limit,
|
||||
duration_days=30,
|
||||
devices=dto.devices,
|
||||
duration_days=convert_duration_to_int(SubscriptionDuration.MONTH) * 30,
|
||||
whitelists=dto.whitelists,
|
||||
plan_price_paid=utils.calculate_price(dto),
|
||||
)
|
||||
except Exception:
|
||||
await cb.answer(CALLBACK_FALLBACK)
|
||||
return
|
||||
else:
|
||||
await deps.subscriptions_repository.update_sub(
|
||||
session,
|
||||
cb.from_user.id,
|
||||
status=(
|
||||
SubscriptionStatus.ACTIVE
|
||||
if rw_user.status == "ACTIVE"
|
||||
else SubscriptionStatus.EXPIRED
|
||||
),
|
||||
end_date=rw_user.expire_at,
|
||||
devices=dto.devices,
|
||||
whitelists=dto.whitelists,
|
||||
duration_days=convert_duration_to_int(SubscriptionDuration.MONTH) * 30,
|
||||
plan_price_paid=utils.calculate_price(dto),
|
||||
autorenew=sub.autorenew
|
||||
)
|
||||
|
||||
await cb.message.edit_text(
|
||||
deps.user_service.format_subscription_message(
|
||||
|
||||
@@ -64,7 +64,9 @@ def subscription_controls(
|
||||
)
|
||||
builder.row(InlineKeyboardButton(text=autorenewal_text, callback_data="toggle:autorenewal"))
|
||||
|
||||
builder.row(InlineKeyboardButton(text="💻 Управление устройствами", callback_data="hwid_control"))
|
||||
builder.row(
|
||||
InlineKeyboardButton(text="💻 Управление устройствами", callback_data="hwid_control")
|
||||
)
|
||||
builder.row(_return_to_menu_btn)
|
||||
return builder.as_markup()
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ AUTORENEWAL_INSUFFICIENT_FUNDS = (
|
||||
)
|
||||
|
||||
AUTORENEWAL_SUCCESS = (
|
||||
f"<b>{MALENIA_CARD} Подписка продлена автоматически. Списано <code>{{price}}₽</code>.</b>"
|
||||
f"<b>{MALENIA_CARD} Подписка продлена автоматически. Списано <code>{{price}}₽</code>.</b>\n"
|
||||
"Новая дата окончания: <code>{end_date}</code>."
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user