From baaf5c457f00089394b9e3baae84096c19e04975 Mon Sep 17 00:00:00 2001 From: VAQYBIN Date: Tue, 20 Jan 2026 00:34:17 +0500 Subject: [PATCH] =?UTF-8?q?fix(promo):=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BE?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0=20=D0=BD=D0=B0=20=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B4=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/services/promo_code_service.py | 2 +- db/dal/promo_code_dal.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bot/services/promo_code_service.py b/bot/services/promo_code_service.py index 6ad7ede..5e477e8 100644 --- a/bot/services/promo_code_service.py +++ b/bot/services/promo_code_service.py @@ -34,7 +34,7 @@ class PromoCodeService: _ = lambda k, **kw: self.i18n.gettext(user_lang, k, **kw) code_input_upper = code_input.strip().upper() - promo_data = await promo_code_dal.get_active_promo_code_by_code_str( + promo_data = await promo_code_dal.get_active_bonus_promo_code_by_code_str( session, code_input_upper) if not promo_data: diff --git a/db/dal/promo_code_dal.py b/db/dal/promo_code_dal.py index e4025d6..0f6b174 100644 --- a/db/dal/promo_code_dal.py +++ b/db/dal/promo_code_dal.py @@ -43,6 +43,20 @@ async def get_active_promo_code_by_code_str( return result.scalar_one_or_none() +async def get_active_bonus_promo_code_by_code_str( + session: AsyncSession, code_str: str) -> Optional[PromoCode]: + """Get active bonus_days-type promo code by code string""" + stmt = select(PromoCode).where( + PromoCode.code == code_str.upper(), + PromoCode.promo_type == "bonus_days", + PromoCode.is_active == True, + PromoCode.current_activations < PromoCode.max_activations, + or_(PromoCode.valid_until == None, PromoCode.valid_until + > datetime.now(timezone.utc))) + result = await session.execute(stmt) + return result.scalar_one_or_none() + + async def get_active_discount_promo_code_by_code_str( session: AsyncSession, code_str: str) -> Optional[PromoCode]: """Get active discount-type promo code by code string"""