From 84f06a96b38961220b5ed3442c4fd03a1b94dad5 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 5 Oct 2025 17:24:25 +0300 Subject: [PATCH] Adjust discount claim CTA for purchase offers --- app/handlers/subscription.py | 28 +++++++++++++++++++--------- app/localization/locales/en.json | 2 +- app/localization/locales/ru.json | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/handlers/subscription.py b/app/handlers/subscription.py index a6e33e28..f12b8d97 100644 --- a/app/handlers/subscription.py +++ b/app/handlers/subscription.py @@ -5253,6 +5253,15 @@ async def claim_discount_offer( extra_data = offer.extra_data or {} raw_duration = extra_data.get("active_discount_hours") template_id = extra_data.get("template_id") + offer_type = extra_data.get("offer_type") + + subscription = getattr(db_user, "subscription", None) + has_active_subscription = False + if subscription: + try: + has_active_subscription = subscription.actual_status in {"active", "trial"} + except Exception: # pragma: no cover - defensive fallback + has_active_subscription = False if raw_duration in (None, "") and template_id: try: @@ -5287,19 +5296,20 @@ async def claim_discount_offer( success_message = texts.get( "DISCOUNT_CLAIM_SUCCESS", - "πŸŽ‰ Π‘ΠΊΠΈΠ΄ΠΊΠ° {percent}% Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°! Она автоматичСски примСнится ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ»Π°Ρ‚Π΅.", + "πŸŽ‰ Π‘ΠΊΠΈΠ΄ΠΊΠ° {percent}% Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°! Она суммируСтся с ΠΏΡ€ΠΎΠΌΠΎΠ³Ρ€ΡƒΠΏΠΏΠΎΠΉ ΠΈ автоматичСски примСнится ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ»Π°Ρ‚Π΅.", ).format(percent=discount_percent) await callback.answer("βœ… Π‘ΠΊΠΈΠ΄ΠΊΠ° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°!", show_alert=True) + + if offer_type == "purchase_discount" and not has_active_subscription: + cta_text = texts.get("MENU_BUY_SUBSCRIPTION", "πŸ’Ž ΠšΡƒΠΏΠΈΡ‚ΡŒ подписку") + cta_callback = "menu_buy" + else: + cta_text = texts.get("SUBSCRIPTION_EXTEND", "πŸ’Ž ΠŸΡ€ΠΎΠ΄Π»ΠΈΡ‚ΡŒ подписку") + cta_callback = "subscription_extend" + buy_keyboard = InlineKeyboardMarkup( - inline_keyboard=[ - [ - InlineKeyboardButton( - text=texts.get("SUBSCRIPTION_EXTEND", "πŸ’Ž ΠŸΡ€ΠΎΠ΄Π»ΠΈΡ‚ΡŒ подписку"), - callback_data="subscription_extend", - ) - ] - ] + inline_keyboard=[[InlineKeyboardButton(text=cta_text, callback_data=cta_callback)]] ) await callback.message.answer(success_message, reply_markup=buy_keyboard) diff --git a/app/localization/locales/en.json b/app/localization/locales/en.json index 9ceccc9c..15c09a68 100644 --- a/app/localization/locales/en.json +++ b/app/localization/locales/en.json @@ -566,7 +566,7 @@ "PROMO_OFFER_CLOSE": "❌ Close", "DISCOUNT_CLAIM_EXPIRED": "⚠️ The offer has expired.", "DISCOUNT_CLAIM_NOT_FOUND": "❌ Offer not found.", - "DISCOUNT_CLAIM_SUCCESS": "πŸŽ‰ Discount of {percent}% activated! It will be applied automatically to your next payment.", + "DISCOUNT_CLAIM_SUCCESS": "πŸŽ‰ Discount of {percent}% activated! It stacks with your promo group and will be applied automatically to your next payment.", "TEST_ACCESS_ALREADY_CONNECTED": "ℹ️ This server is already connected to your subscription.", "ENTER_BLOCK_MINUTES": "Enter the number of minutes to block the user (e.g., 15):", "LANGUAGE_SELECTION_DISABLED": "βš™οΈ Language selection is temporarily unavailable. Using the default language.", diff --git a/app/localization/locales/ru.json b/app/localization/locales/ru.json index a8fc41d6..bf59af5b 100644 --- a/app/localization/locales/ru.json +++ b/app/localization/locales/ru.json @@ -566,7 +566,7 @@ "PROMO_OFFER_CLOSE": "❌ Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ", "DISCOUNT_CLAIM_EXPIRED": "⚠️ ВрСмя дСйствия прСдлоТСния истСкло.", "DISCOUNT_CLAIM_NOT_FOUND": "❌ ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ.", - "DISCOUNT_CLAIM_SUCCESS": "πŸŽ‰ Π‘ΠΊΠΈΠ΄ΠΊΠ° {percent}% Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°! Она автоматичСски примСнится ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ»Π°Ρ‚Π΅.", + "DISCOUNT_CLAIM_SUCCESS": "πŸŽ‰ Π‘ΠΊΠΈΠ΄ΠΊΠ° {percent}% Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°! Она суммируСтся с ΠΏΡ€ΠΎΠΌΠΎΠ³Ρ€ΡƒΠΏΠΏΠΎΠΉ ΠΈ автоматичСски примСнится ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΠ»Π°Ρ‚Π΅.", "TEST_ACCESS_ALREADY_CONNECTED": "ℹ️ Π­Ρ‚ΠΎΡ‚ сСрвСр ΡƒΠΆΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΊ вашСй подпискС.", "ENTER_BLOCK_MINUTES": "Π’Π²Π΅Π΄ΠΈΡ‚Π΅ количСство ΠΌΠΈΠ½ΡƒΡ‚ для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 15):", "LANGUAGE_SELECTION_DISABLED": "βš™οΈ Π’Ρ‹Π±ΠΎΡ€ языка Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ нСдоступСн. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ язык ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.",