diff --git a/app/handlers/balance/main.py b/app/handlers/balance/main.py index 75032ca9..3134d82a 100644 --- a/app/handlers/balance/main.py +++ b/app/handlers/balance/main.py @@ -209,25 +209,102 @@ async def handle_balance_history_pagination( async def show_payment_methods( callback: types.CallbackQuery, db_user: User, + db: AsyncSession, state: FSMContext ): from app.utils.payment_utils import get_payment_methods_text + from app.database.crud.subscription import get_subscription_by_user_id + from app.utils.pricing_utils import calculate_months_from_days, apply_percentage_discount + from app.config import settings + from app.utils.subscription_service import SubscriptionService texts = get_texts(db_user.language) payment_text = get_payment_methods_text(db_user.language) + # Добавляем информацию о текущем тарифе пользователя + subscription = await get_subscription_by_user_id(db, db_user.id) + tariff_info = "" + if subscription and not subscription.is_trial: + # Рассчитываем приблизительную стоимость продления на 30 дней + duration_days = 30 # Берем для примера 30 дней + current_traffic = subscription.traffic_limit_gb + current_connected_squads = subscription.connected_squads + current_device_limit = subscription.device_limit or settings.DEFAULT_DEVICE_LIMIT + + try: + # Получаем цены для текущих параметров + from app.config import PERIOD_PRICES + base_price_original = PERIOD_PRICES.get(duration_days, 0) + period_discount_percent = db_user.get_promo_discount("period", duration_days) + base_price, base_discount_total = apply_percentage_discount( + base_price_original, + period_discount_percent, + ) + + # Рассчитываем стоимость серверов + subscription_service = SubscriptionService() + servers_price_per_month, per_server_monthly_prices = await subscription_service.get_countries_price_by_uuids( + current_connected_squads, + db, + promo_group_id=db_user.promo_group_id, + ) + servers_discount_percent = db_user.get_promo_discount("servers", duration_days) + total_servers_price = 0 + for server_price in per_server_monthly_prices: + discounted_per_month, discount_per_month = apply_percentage_discount( + server_price, + servers_discount_percent, + ) + total_servers_price += discounted_per_month + + # Рассчитываем стоимость трафика + traffic_price_per_month = settings.get_traffic_price(current_traffic) + traffic_discount_percent = db_user.get_promo_discount("traffic", duration_days) + traffic_discounted_per_month, traffic_discount_per_month = apply_percentage_discount( + traffic_price_per_month, + traffic_discount_percent, + ) + + # Рассчитываем стоимость устройств + additional_devices = max(0, (current_device_limit or 0) - settings.DEFAULT_DEVICE_LIMIT) + devices_price_per_month = additional_devices * settings.PRICE_PER_DEVICE + devices_discount_percent = db_user.get_promo_discount("devices", duration_days) + devices_discounted_per_month, devices_discount_per_month = apply_percentage_discount( + devices_price_per_month, + devices_discount_percent, + ) + + # Общая стоимость + months_in_period = calculate_months_from_days(duration_days) + total_price = ( + base_price + + total_servers_price * months_in_period + + traffic_discounted_per_month * months_in_period + + devices_discounted_per_month * months_in_period + ) + + current_tariff_desc = f"📱 Подписка: {len(current_connected_squads)} серверов, {current_traffic} ГБ, {current_device_limit} устр." + estimated_price_info = f"💰 Стоимость продления (примерно): {texts.format_price(total_price)} за {duration_days} дней" + + tariff_info = f"\n\n📋 Ваш текущий тариф:\n{current_tariff_desc}\n{estimated_price_info}" + except Exception as e: + logger.warning(f"Не удалось рассчитать стоимость текущей подписки для пользователя {db_user.id}: {e}") + tariff_info = "" + + full_text = payment_text + tariff_info + keyboard = get_payment_methods_keyboard(0, db_user.language) try: await callback.message.edit_text( - payment_text, + full_text, reply_markup=keyboard, parse_mode="HTML" ) except TelegramBadRequest: try: await callback.message.edit_caption( - payment_text, + full_text, reply_markup=keyboard, parse_mode="HTML" ) @@ -237,7 +314,7 @@ async def show_payment_methods( except TelegramBadRequest: pass await callback.message.answer( - payment_text, + full_text, reply_markup=keyboard, parse_mode="HTML" ) @@ -825,4 +902,4 @@ def register_balance_handlers(dp: Dispatcher): dp.callback_query.register( handle_topup_amount_callback, F.data.startswith("topup_amount|") - ) \ No newline at end of file + )