diff --git a/app/cabinet/routes/subscription.py b/app/cabinet/routes/subscription.py index e93fecc0..94a56335 100644 --- a/app/cabinet/routes/subscription.py +++ b/app/cabinet/routes/subscription.py @@ -1070,6 +1070,19 @@ async def get_trial_info( """Get trial subscription info and availability.""" await db.refresh(user, ['subscription']) + # Проверяем, отключён ли триал для этого типа пользователя + if settings.is_trial_disabled_for_user(getattr(user, 'auth_type', 'telegram')): + return TrialInfoResponse( + is_available=False, + duration_days=settings.TRIAL_DURATION_DAYS, + traffic_limit_gb=settings.TRIAL_TRAFFIC_LIMIT_GB, + device_limit=settings.TRIAL_DEVICE_LIMIT, + requires_payment=bool(settings.TRIAL_PAYMENT_ENABLED), + price_kopeks=0, + price_rubles=0, + reason_unavailable='Trial is not available for your account type', + ) + duration_days = settings.TRIAL_DURATION_DAYS traffic_limit_gb = settings.TRIAL_TRAFFIC_LIMIT_GB device_limit = settings.TRIAL_DEVICE_LIMIT @@ -1148,6 +1161,13 @@ async def activate_trial( """Activate trial subscription.""" await db.refresh(user, ['subscription']) + # Проверяем, отключён ли триал для этого типа пользователя + if settings.is_trial_disabled_for_user(getattr(user, 'auth_type', 'telegram')): + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail='Trial is not available for your account type', + ) + # Check if user already has an active subscription if user.subscription: now = datetime.utcnow() diff --git a/app/config.py b/app/config.py index dc35b786..b023e2cd 100644 --- a/app/config.py +++ b/app/config.py @@ -112,6 +112,7 @@ class Settings(BaseSettings): TRIAL_PAYMENT_ENABLED: bool = False TRIAL_ACTIVATION_PRICE: int = 0 TRIAL_USER_TAG: str | None = None + TRIAL_DISABLED_FOR: str = 'none' # none, email, telegram, all DEFAULT_TRAFFIC_LIMIT_GB: int = 100 DEFAULT_DEVICE_LIMIT: int = 1 DEFAULT_TRAFFIC_RESET_STRATEGY: str = 'MONTH' @@ -1309,6 +1310,16 @@ class Settings(BaseSettings): def get_trial_user_tag(self) -> str | None: return self._normalize_user_tag(self.TRIAL_USER_TAG, 'TRIAL_USER_TAG') + def is_trial_disabled_for_user(self, auth_type: str | None) -> bool: + disabled_for = self.TRIAL_DISABLED_FOR + if disabled_for == 'all': + return True + if disabled_for == 'email' and auth_type == 'email': + return True + if disabled_for == 'telegram' and (auth_type is None or auth_type == 'telegram'): + return True + return False + def get_paid_subscription_user_tag(self) -> str | None: return self._normalize_user_tag( self.PAID_SUBSCRIPTION_USER_TAG, diff --git a/app/handlers/subscription/purchase.py b/app/handlers/subscription/purchase.py index 8f5aa6cf..0a64389d 100644 --- a/app/handlers/subscription/purchase.py +++ b/app/handlers/subscription/purchase.py @@ -560,6 +560,15 @@ async def show_trial_offer(callback: types.CallbackQuery, db_user: User, db: Asy texts = get_texts(db_user.language) + # Проверяем, отключён ли триал для этого типа пользователя + if settings.is_trial_disabled_for_user(getattr(db_user, 'auth_type', 'telegram')): + await callback.message.edit_text( + texts.t('TRIAL_DISABLED_FOR_USER_TYPE', 'Пробный период недоступен'), + reply_markup=get_back_keyboard(db_user.language), + ) + await callback.answer() + return + # Проверяем, использовал ли пользователь триал # PENDING триальные подписки не считаются - пользователь может повторить оплату trial_blocked = False @@ -752,6 +761,15 @@ async def activate_trial(callback: types.CallbackQuery, db_user: User, db: Async await callback.answer() return + # Проверяем, отключён ли триал для этого типа пользователя + if settings.is_trial_disabled_for_user(getattr(db_user, 'auth_type', 'telegram')): + await callback.message.edit_text( + texts.t('TRIAL_DISABLED_FOR_USER_TYPE', 'Пробный период недоступен'), + reply_markup=get_back_keyboard(db_user.language), + ) + await callback.answer() + return + # Проверяем, использовал ли пользователь триал # PENDING триальные подписки не считаются - пользователь может повторить оплату trial_blocked = False diff --git a/app/services/system_settings_service.py b/app/services/system_settings_service.py index 1b0c744a..28c4d307 100644 --- a/app/services/system_settings_service.py +++ b/app/services/system_settings_service.py @@ -465,6 +465,12 @@ class BotConfigurationService: ChoiceOption('ERROR', '❌ Error'), ChoiceOption('CRITICAL', '🔥 Critical'), ], + 'TRIAL_DISABLED_FOR': [ + ChoiceOption('none', '✅ Включён для всех'), + ChoiceOption('email', '📧 Отключён для Email'), + ChoiceOption('telegram', '📱 Отключён для Telegram'), + ChoiceOption('all', '🚫 Отключён для всех'), + ], } SETTING_HINTS: dict[str, dict[str, str]] = { diff --git a/app/webapi/routes/miniapp.py b/app/webapi/routes/miniapp.py index 17f3977f..7e44a304 100644 --- a/app/webapi/routes/miniapp.py +++ b/app/webapi/routes/miniapp.py @@ -3047,6 +3047,9 @@ def _is_trial_available_for_user(user: User) -> bool: if settings.TRIAL_DURATION_DAYS <= 0: return False + if settings.is_trial_disabled_for_user(getattr(user, 'auth_type', 'telegram')): + return False + if getattr(user, 'has_had_paid_subscription', False): return False