diff --git a/app/config.py b/app/config.py index 3e18d7ee..878dcc0f 100644 --- a/app/config.py +++ b/app/config.py @@ -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 = "" diff --git a/app/handlers/admin/users.py b/app/handlers/admin/users.py index 6ce429be..3064016c 100644 --- a/app/handlers/admin/users.py +++ b/app/handlers/admin/users.py @@ -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 diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py index e1dedbca..649e8415 100644 --- a/app/handlers/subscription.py +++ b/app/handlers/subscription.py @@ -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