Add configurable trial rollover for paid subscriptions

This commit is contained in:
Egor
2025-09-29 14:02:14 +03:00
parent 66ff2a38d3
commit 14bdfd4a1e
3 changed files with 45 additions and 16 deletions

View File

@@ -66,6 +66,7 @@ class Settings(BaseSettings):
TRIAL_DURATION_DAYS: int = 3
TRIAL_TRAFFIC_LIMIT_GB: int = 10
TRIAL_DEVICE_LIMIT: int = 2
TRIAL_ADD_REMAINING_DAYS_TO_PAID: bool = False
DEFAULT_TRAFFIC_LIMIT_GB: int = 100
DEFAULT_DEVICE_LIMIT: int = 1
TRIAL_SQUAD_UUID: str = ""

View File

@@ -2877,16 +2877,31 @@ async def admin_buy_subscription_execute(
if subscription:
current_time = datetime.utcnow()
bonus_period = timedelta()
if (
subscription.is_trial
and settings.TRIAL_ADD_REMAINING_DAYS_TO_PAID
and subscription.end_date
):
remaining_trial_delta = subscription.end_date - current_time
if remaining_trial_delta.total_seconds() > 0:
bonus_period = remaining_trial_delta
logger.info(
"Админ продлевает подписку: добавляем оставшееся время триала (%s) пользователю %s",
bonus_period,
target_user.telegram_id,
)
if subscription.end_date <= current_time:
subscription.start_date = current_time
subscription.end_date = current_time + timedelta(days=period_days)
subscription.end_date = current_time + timedelta(days=period_days) + bonus_period
subscription.status = SubscriptionStatus.ACTIVE.value
subscription.updated_at = current_time
if subscription.is_trial or not subscription.is_active:
subscription.is_trial = False
subscription.is_trial = False
if subscription.traffic_limit_gb != 0:
subscription.traffic_limit_gb = 0
subscription.device_limit = settings.DEFAULT_DEVICE_LIMIT

View File

@@ -3433,16 +3433,29 @@ async def confirm_purchase(
existing_subscription = db_user.subscription
was_trial_conversion = False
current_time = datetime.utcnow()
if existing_subscription:
logger.info(f"Обновляем существующую подписку пользователя {db_user.telegram_id}")
bonus_period = timedelta()
if existing_subscription.is_trial:
logger.info(f"Конверсия из триала в платную для пользователя {db_user.telegram_id}")
was_trial_conversion = True
trial_duration = (datetime.utcnow() - existing_subscription.start_date).days
trial_duration = (current_time - existing_subscription.start_date).days
if settings.TRIAL_ADD_REMAINING_DAYS_TO_PAID and existing_subscription.end_date:
remaining_trial_delta = existing_subscription.end_date - current_time
if remaining_trial_delta.total_seconds() > 0:
bonus_period = remaining_trial_delta
logger.info(
"Добавляем оставшееся время триала (%s) к новой подписке пользователя %s",
bonus_period,
db_user.telegram_id,
)
try:
from app.database.crud.subscription_conversion import create_subscription_conversion
await create_subscription_conversion(
@@ -3462,13 +3475,13 @@ async def confirm_purchase(
existing_subscription.traffic_limit_gb = final_traffic_gb
existing_subscription.device_limit = data['devices']
existing_subscription.connected_squads = data['countries']
existing_subscription.start_date = datetime.utcnow()
existing_subscription.end_date = datetime.utcnow() + timedelta(days=data['period_days'])
existing_subscription.updated_at = datetime.utcnow()
existing_subscription.start_date = current_time
existing_subscription.end_date = current_time + timedelta(days=data['period_days']) + bonus_period
existing_subscription.updated_at = current_time
existing_subscription.traffic_used_gb = 0.0
await db.commit()
await db.refresh(existing_subscription)
subscription = existing_subscription