From bcef64bafac29dfef4bef178cdc32f55e38e7ec9 Mon Sep 17 00:00:00 2001 From: Egor Date: Mon, 12 Jan 2026 18:11:21 +0300 Subject: [PATCH] Update miniapp.py --- app/webapi/routes/miniapp.py | 69 +++++++++++++++++++++++++++++------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/app/webapi/routes/miniapp.py b/app/webapi/routes/miniapp.py index b19d8acd..9c45c773 100644 --- a/app/webapi/routes/miniapp.py +++ b/app/webapi/routes/miniapp.py @@ -6548,21 +6548,35 @@ async def purchase_tariff_endpoint( }, ) - # Получаем цену за выбранный период - base_price_kopeks = tariff.get_price_for_period(payload.period_days) - if base_price_kopeks is None: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail={ - "code": "invalid_period", - "message": "Invalid period for this tariff", - }, - ) + # Получаем цену + is_daily_tariff = getattr(tariff, 'is_daily', False) + if is_daily_tariff: + # Для суточного тарифа берём daily_price_kopeks (первый день) + base_price_kopeks = getattr(tariff, 'daily_price_kopeks', 0) + if base_price_kopeks <= 0: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail={ + "code": "invalid_daily_price", + "message": "Daily tariff has no price configured", + }, + ) + else: + # Для обычного тарифа получаем цену за выбранный период + base_price_kopeks = tariff.get_price_for_period(payload.period_days) + if base_price_kopeks is None: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail={ + "code": "invalid_period", + "message": "Invalid period for this tariff", + }, + ) - # Применяем скидку промогруппы + # Применяем скидку промогруппы (только для обычных тарифов, не для суточных) price_kopeks = base_price_kopeks discount_percent = 0 - if promo_group: + if not is_daily_tariff and promo_group: raw_discounts = getattr(promo_group, 'period_discounts', None) or {} for k, v in raw_discounts.items(): try: @@ -6589,7 +6603,9 @@ async def purchase_tariff_endpoint( subscription = getattr(user, "subscription", None) # Списываем баланс - if discount_percent > 0: + if is_daily_tariff: + description = f"Активация суточного тарифа '{tariff.name}' (первый день)" + elif discount_percent > 0: description = f"Покупка тарифа '{tariff.name}' на {payload.period_days} дней (скидка {discount_percent}%)" else: description = f"Покупка тарифа '{tariff.name}' на {payload.period_days} дней" @@ -6636,6 +6652,16 @@ async def purchase_tariff_endpoint( tariff_id=tariff.id, ) + # Инициализация daily полей при покупке суточного тарифа + is_daily_tariff = getattr(tariff, 'is_daily', False) + if is_daily_tariff: + subscription.is_daily_paused = False + subscription.last_daily_charge_at = datetime.utcnow() + # Для суточного тарифа end_date = сейчас + 1 день (первый день уже оплачен) + subscription.end_date = datetime.utcnow() + timedelta(days=1) + await db.commit() + await db.refresh(subscription) + # Синхронизируем с RemnaWave service = SubscriptionService() await service.update_remnawave_user(db, subscription) @@ -6923,6 +6949,23 @@ async def switch_tariff_endpoint( # Сбрасываем докупленный трафик при смене тарифа subscription.purchased_traffic_gb = 0 + # Обработка daily полей при смене тарифа + new_is_daily = getattr(new_tariff, 'is_daily', False) + old_is_daily = getattr(current_tariff, 'is_daily', False) + + if new_is_daily: + # Переход на суточный тариф + subscription.is_daily_paused = False + subscription.last_daily_charge_at = datetime.utcnow() + # Для суточного тарифа end_date = сейчас + 1 день + subscription.end_date = datetime.utcnow() + timedelta(days=1) + logger.info(f"🔄 Смена на суточный тариф: установлены daily поля, end_date={subscription.end_date}") + elif old_is_daily and not new_is_daily: + # Переход с суточного на обычный тариф - очищаем daily поля + subscription.is_daily_paused = False + subscription.last_daily_charge_at = None + logger.info(f"🔄 Смена с суточного на обычный тариф: очищены daily поля") + await db.commit() await db.refresh(subscription) await db.refresh(user)