feat(promo): Добавлена поддержка промокодов на скидку для всех платёжных систем
This commit is contained in:
@@ -18,6 +18,7 @@ async def pay_crypto_callback_handler(
|
|||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
cryptopay_service: CryptoPayService,
|
cryptopay_service: CryptoPayService,
|
||||||
|
promo_code_service=None,
|
||||||
):
|
):
|
||||||
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
||||||
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
||||||
@@ -65,6 +66,7 @@ async def pay_crypto_callback_handler(
|
|||||||
amount=price_amount,
|
amount=price_amount,
|
||||||
description=payment_description,
|
description=payment_description,
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
|
promo_code_service=promo_code_service,
|
||||||
)
|
)
|
||||||
|
|
||||||
if invoice_url:
|
if invoice_url:
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from bot.middlewares.i18n import JsonI18n
|
|||||||
from bot.services.freekassa_service import FreeKassaService
|
from bot.services.freekassa_service import FreeKassaService
|
||||||
from config.settings import Settings
|
from config.settings import Settings
|
||||||
from db.dal import payment_dal
|
from db.dal import payment_dal
|
||||||
|
from bot.handlers.user.subscription.payment_discount_helper import apply_discount_to_payment
|
||||||
|
|
||||||
router = Router(name="user_subscription_payments_freekassa_router")
|
router = Router(name="user_subscription_payments_freekassa_router")
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ async def pay_fk_callback_handler(
|
|||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
freekassa_service: FreeKassaService,
|
freekassa_service: FreeKassaService,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
|
promo_code_service=None,
|
||||||
):
|
):
|
||||||
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
||||||
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
||||||
@@ -68,14 +70,22 @@ async def pay_fk_callback_handler(
|
|||||||
)
|
)
|
||||||
currency_code = getattr(freekassa_service, "default_currency", None) or settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
currency_code = getattr(freekassa_service, "default_currency", None) or settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
||||||
|
|
||||||
|
# Apply active discount if exists
|
||||||
|
final_price_rub, discount_amount, promo_code_id = await apply_discount_to_payment(
|
||||||
|
session, user_id, price_rub, promo_code_service
|
||||||
|
)
|
||||||
|
|
||||||
payment_record_payload = {
|
payment_record_payload = {
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"amount": price_rub,
|
"amount": final_price_rub,
|
||||||
|
"original_amount": price_rub if discount_amount else None,
|
||||||
|
"discount_applied": discount_amount,
|
||||||
"currency": currency_code,
|
"currency": currency_code,
|
||||||
"status": "pending_freekassa",
|
"status": "pending_freekassa",
|
||||||
"description": payment_description,
|
"description": payment_description,
|
||||||
"subscription_duration_months": int(months),
|
"subscription_duration_months": int(months),
|
||||||
"provider": "freekassa",
|
"provider": "freekassa",
|
||||||
|
"promo_code_id": promo_code_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -101,7 +111,7 @@ async def pay_fk_callback_handler(
|
|||||||
payment_db_id=payment_record.payment_id,
|
payment_db_id=payment_record.payment_id,
|
||||||
user_id=payment_record.user_id,
|
user_id=payment_record.user_id,
|
||||||
months=months,
|
months=months,
|
||||||
amount=price_rub,
|
amount=final_price_rub,
|
||||||
currency=freekassa_service.default_currency,
|
currency=freekassa_service.default_currency,
|
||||||
payment_method_id=freekassa_service.payment_method_id,
|
payment_method_id=freekassa_service.payment_method_id,
|
||||||
ip_address=freekassa_service.server_ip,
|
ip_address=freekassa_service.server_ip,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from bot.middlewares.i18n import JsonI18n
|
|||||||
from bot.services.platega_service import PlategaService
|
from bot.services.platega_service import PlategaService
|
||||||
from config.settings import Settings
|
from config.settings import Settings
|
||||||
from db.dal import payment_dal
|
from db.dal import payment_dal
|
||||||
|
from bot.handlers.user.subscription.payment_discount_helper import apply_discount_to_payment
|
||||||
|
|
||||||
router = Router(name="user_subscription_payments_platega_router")
|
router = Router(name="user_subscription_payments_platega_router")
|
||||||
|
|
||||||
@@ -21,6 +22,7 @@ async def pay_platega_callback_handler(
|
|||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
platega_service: PlategaService,
|
platega_service: PlategaService,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
|
promo_code_service=None,
|
||||||
):
|
):
|
||||||
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
||||||
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
||||||
@@ -68,14 +70,22 @@ async def pay_platega_callback_handler(
|
|||||||
)
|
)
|
||||||
currency_code = settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
currency_code = settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
||||||
|
|
||||||
|
# Apply active discount if exists
|
||||||
|
final_price_rub, discount_amount, promo_code_id = await apply_discount_to_payment(
|
||||||
|
session, user_id, price_rub, promo_code_service
|
||||||
|
)
|
||||||
|
|
||||||
payment_record_payload = {
|
payment_record_payload = {
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"amount": price_rub,
|
"amount": final_price_rub,
|
||||||
|
"original_amount": price_rub if discount_amount else None,
|
||||||
|
"discount_applied": discount_amount,
|
||||||
"currency": currency_code,
|
"currency": currency_code,
|
||||||
"status": "pending_platega",
|
"status": "pending_platega",
|
||||||
"description": payment_description,
|
"description": payment_description,
|
||||||
"subscription_duration_months": int(months),
|
"subscription_duration_months": int(months),
|
||||||
"provider": "platega",
|
"provider": "platega",
|
||||||
|
"promo_code_id": promo_code_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -110,7 +120,7 @@ async def pay_platega_callback_handler(
|
|||||||
payment_db_id=payment_record.payment_id,
|
payment_db_id=payment_record.payment_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
months=months,
|
months=months,
|
||||||
amount=price_rub,
|
amount=final_price_rub,
|
||||||
currency=currency_code,
|
currency=currency_code,
|
||||||
description=payment_description,
|
description=payment_description,
|
||||||
payload=payload_meta,
|
payload=payload_meta,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from bot.middlewares.i18n import JsonI18n
|
|||||||
from bot.services.severpay_service import SeverPayService
|
from bot.services.severpay_service import SeverPayService
|
||||||
from config.settings import Settings
|
from config.settings import Settings
|
||||||
from db.dal import payment_dal
|
from db.dal import payment_dal
|
||||||
|
from bot.handlers.user.subscription.payment_discount_helper import apply_discount_to_payment
|
||||||
|
|
||||||
router = Router(name="user_subscription_payments_severpay_router")
|
router = Router(name="user_subscription_payments_severpay_router")
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ async def pay_severpay_callback_handler(
|
|||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
severpay_service: SeverPayService,
|
severpay_service: SeverPayService,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
|
promo_code_service=None,
|
||||||
):
|
):
|
||||||
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
||||||
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
||||||
@@ -67,14 +69,22 @@ async def pay_severpay_callback_handler(
|
|||||||
)
|
)
|
||||||
currency_code = settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
currency_code = settings.DEFAULT_CURRENCY_SYMBOL or "RUB"
|
||||||
|
|
||||||
|
# Apply active discount if exists
|
||||||
|
final_price_rub, discount_amount, promo_code_id = await apply_discount_to_payment(
|
||||||
|
session, user_id, price_rub, promo_code_service
|
||||||
|
)
|
||||||
|
|
||||||
payment_record_payload = {
|
payment_record_payload = {
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"amount": price_rub,
|
"amount": final_price_rub,
|
||||||
|
"original_amount": price_rub if discount_amount else None,
|
||||||
|
"discount_applied": discount_amount,
|
||||||
"currency": currency_code,
|
"currency": currency_code,
|
||||||
"status": "pending_severpay",
|
"status": "pending_severpay",
|
||||||
"description": payment_description,
|
"description": payment_description,
|
||||||
"subscription_duration_months": int(months),
|
"subscription_duration_months": int(months),
|
||||||
"provider": "severpay",
|
"provider": "severpay",
|
||||||
|
"promo_code_id": promo_code_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -100,7 +110,7 @@ async def pay_severpay_callback_handler(
|
|||||||
payment_db_id=payment_record.payment_id,
|
payment_db_id=payment_record.payment_id,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
months=months,
|
months=months,
|
||||||
amount=price_rub,
|
amount=final_price_rub,
|
||||||
currency=currency_code,
|
currency=currency_code,
|
||||||
description=payment_description,
|
description=payment_description,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ async def pay_stars_callback_handler(
|
|||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
session: AsyncSession,
|
session: AsyncSession,
|
||||||
stars_service: StarsService,
|
stars_service: StarsService,
|
||||||
|
promo_code_service=None,
|
||||||
):
|
):
|
||||||
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
current_lang = i18n_data.get("current_language", settings.DEFAULT_LANGUAGE)
|
||||||
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
i18n: Optional[JsonI18n] = i18n_data.get("i18n_instance")
|
||||||
@@ -66,6 +67,7 @@ async def pay_stars_callback_handler(
|
|||||||
stars_price=stars_price,
|
stars_price=stars_price,
|
||||||
description=payment_description,
|
description=payment_description,
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
|
promo_code_service=promo_code_service,
|
||||||
)
|
)
|
||||||
|
|
||||||
if payment_db_id:
|
if payment_db_id:
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ from bot.services.notification_service import NotificationService
|
|||||||
from db.dal import payment_dal, user_dal
|
from db.dal import payment_dal, user_dal
|
||||||
from bot.utils.text_sanitizer import sanitize_display_name, username_for_display
|
from bot.utils.text_sanitizer import sanitize_display_name, username_for_display
|
||||||
from bot.utils.config_link import prepare_config_links
|
from bot.utils.config_link import prepare_config_links
|
||||||
|
from bot.handlers.user.subscription.payment_discount_helper import apply_discount_to_payment
|
||||||
|
|
||||||
|
|
||||||
class CryptoPayService:
|
class CryptoPayService:
|
||||||
@@ -65,23 +66,32 @@ class CryptoPayService:
|
|||||||
amount: float,
|
amount: float,
|
||||||
description: str,
|
description: str,
|
||||||
sale_mode: str = "subscription",
|
sale_mode: str = "subscription",
|
||||||
|
promo_code_service=None,
|
||||||
) -> Optional[str]:
|
) -> Optional[str]:
|
||||||
if not self.configured or not self.client:
|
if not self.configured or not self.client:
|
||||||
logging.error("CryptoPayService not configured")
|
logging.error("CryptoPayService not configured")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
# Apply active discount if exists
|
||||||
|
final_amount, discount_amount, promo_code_id = await apply_discount_to_payment(
|
||||||
|
session, user_id, amount, promo_code_service
|
||||||
|
)
|
||||||
|
|
||||||
# Create pending payment in DB and commit to persist
|
# Create pending payment in DB and commit to persist
|
||||||
try:
|
try:
|
||||||
payment_record = await payment_dal.create_payment_record(
|
payment_record = await payment_dal.create_payment_record(
|
||||||
session,
|
session,
|
||||||
{
|
{
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"amount": float(amount),
|
"amount": final_amount,
|
||||||
|
"original_amount": amount if discount_amount else None,
|
||||||
|
"discount_applied": discount_amount,
|
||||||
"currency": self.settings.CRYPTOPAY_ASSET,
|
"currency": self.settings.CRYPTOPAY_ASSET,
|
||||||
"status": "pending_cryptopay",
|
"status": "pending_cryptopay",
|
||||||
"description": description,
|
"description": description,
|
||||||
"subscription_duration_months": int(months),
|
"subscription_duration_months": int(months),
|
||||||
"provider": "cryptopay",
|
"provider": "cryptopay",
|
||||||
|
"promo_code_id": promo_code_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
await session.commit()
|
await session.commit()
|
||||||
@@ -101,7 +111,7 @@ class CryptoPayService:
|
|||||||
})
|
})
|
||||||
try:
|
try:
|
||||||
invoice = await self.client.create_invoice(
|
invoice = await self.client.create_invoice(
|
||||||
amount=amount,
|
amount=final_amount,
|
||||||
currency_type=self.settings.CRYPTOPAY_CURRENCY_TYPE,
|
currency_type=self.settings.CRYPTOPAY_CURRENCY_TYPE,
|
||||||
fiat=self.settings.CRYPTOPAY_ASSET if self.settings.CRYPTOPAY_CURRENCY_TYPE == "fiat" else None,
|
fiat=self.settings.CRYPTOPAY_ASSET if self.settings.CRYPTOPAY_CURRENCY_TYPE == "fiat" else None,
|
||||||
asset=self.settings.CRYPTOPAY_ASSET if self.settings.CRYPTOPAY_CURRENCY_TYPE == "crypto" else None,
|
asset=self.settings.CRYPTOPAY_ASSET if self.settings.CRYPTOPAY_CURRENCY_TYPE == "crypto" else None,
|
||||||
@@ -153,6 +163,12 @@ class CryptoPayService:
|
|||||||
|
|
||||||
async with async_session_factory() as session:
|
async with async_session_factory() as session:
|
||||||
try:
|
try:
|
||||||
|
# Fetch payment record to get promo_code_id
|
||||||
|
payment_record = await payment_dal.get_payment_by_db_id(session, payment_db_id)
|
||||||
|
if not payment_record:
|
||||||
|
logging.error(f"CryptoPay: Payment record {payment_db_id} not found")
|
||||||
|
return
|
||||||
|
|
||||||
await payment_dal.update_provider_payment_and_status(
|
await payment_dal.update_provider_payment_and_status(
|
||||||
session,
|
session,
|
||||||
payment_db_id,
|
payment_db_id,
|
||||||
@@ -165,6 +181,7 @@ class CryptoPayService:
|
|||||||
int(months) if sale_mode != "traffic" else 0,
|
int(months) if sale_mode != "traffic" else 0,
|
||||||
float(invoice.amount),
|
float(invoice.amount),
|
||||||
payment_db_id,
|
payment_db_id,
|
||||||
|
promo_code_id_from_payment=payment_record.promo_code_id,
|
||||||
provider="cryptopay",
|
provider="cryptopay",
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
traffic_gb=traffic_gb if sale_mode == "traffic" else None,
|
traffic_gb=traffic_gb if sale_mode == "traffic" else None,
|
||||||
|
|||||||
@@ -293,6 +293,7 @@ class FreeKassaService:
|
|||||||
int(months) if sale_mode != "traffic" else 0,
|
int(months) if sale_mode != "traffic" else 0,
|
||||||
float(payment.amount),
|
float(payment.amount),
|
||||||
payment.payment_id,
|
payment.payment_id,
|
||||||
|
promo_code_id_from_payment=payment.promo_code_id,
|
||||||
provider="freekassa",
|
provider="freekassa",
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
traffic_gb=months if sale_mode == "traffic" else None,
|
traffic_gb=months if sale_mode == "traffic" else None,
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ class PlategaService:
|
|||||||
int(payment_months) if sale_mode != "traffic" else 0,
|
int(payment_months) if sale_mode != "traffic" else 0,
|
||||||
float(payment.amount),
|
float(payment.amount),
|
||||||
payment.payment_id,
|
payment.payment_id,
|
||||||
|
promo_code_id_from_payment=payment.promo_code_id,
|
||||||
provider="platega",
|
provider="platega",
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
traffic_gb=payment_months if sale_mode == "traffic" else None,
|
traffic_gb=payment_months if sale_mode == "traffic" else None,
|
||||||
|
|||||||
@@ -207,6 +207,7 @@ class SeverPayService:
|
|||||||
int(payment_months) if sale_mode != "traffic" else 0,
|
int(payment_months) if sale_mode != "traffic" else 0,
|
||||||
float(payment.amount),
|
float(payment.amount),
|
||||||
payment.payment_id,
|
payment.payment_id,
|
||||||
|
promo_code_id_from_payment=payment.promo_code_id,
|
||||||
provider="severpay",
|
provider="severpay",
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
traffic_gb=payment_months if sale_mode == "traffic" else None,
|
traffic_gb=payment_months if sale_mode == "traffic" else None,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import logging
|
import logging
|
||||||
|
import math
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from aiogram import Bot, types
|
from aiogram import Bot, types
|
||||||
@@ -14,6 +15,7 @@ from .notification_service import NotificationService
|
|||||||
from bot.keyboards.inline.user_keyboards import get_connect_and_main_keyboard
|
from bot.keyboards.inline.user_keyboards import get_connect_and_main_keyboard
|
||||||
from bot.utils.text_sanitizer import sanitize_display_name, username_for_display
|
from bot.utils.text_sanitizer import sanitize_display_name, username_for_display
|
||||||
from bot.utils.config_link import prepare_config_links
|
from bot.utils.config_link import prepare_config_links
|
||||||
|
from bot.handlers.user.subscription.payment_discount_helper import apply_discount_to_payment
|
||||||
|
|
||||||
|
|
||||||
class StarsService:
|
class StarsService:
|
||||||
@@ -27,15 +29,37 @@ class StarsService:
|
|||||||
self.referral_service = referral_service
|
self.referral_service = referral_service
|
||||||
|
|
||||||
async def create_invoice(self, session: AsyncSession, user_id: int, months: int,
|
async def create_invoice(self, session: AsyncSession, user_id: int, months: int,
|
||||||
stars_price: int, description: str, sale_mode: str = "subscription") -> Optional[int]:
|
stars_price: int, description: str, sale_mode: str = "subscription",
|
||||||
|
promo_code_service=None) -> Optional[int]:
|
||||||
|
# Apply active discount if exists (Stars use ceiling rounding)
|
||||||
|
original_stars_price = stars_price
|
||||||
|
discount_amount_stars = None
|
||||||
|
promo_code_id = None
|
||||||
|
|
||||||
|
if promo_code_service:
|
||||||
|
# Apply discount and round up using ceiling
|
||||||
|
final_price_float, discount_float, promo_code_id = await apply_discount_to_payment(
|
||||||
|
session, user_id, float(stars_price), promo_code_service
|
||||||
|
)
|
||||||
|
if discount_float:
|
||||||
|
# Apply ceiling rounding for fractional Stars amounts
|
||||||
|
stars_price = math.ceil(final_price_float)
|
||||||
|
discount_amount_stars = original_stars_price - stars_price
|
||||||
|
logging.info(
|
||||||
|
f"Stars discount applied: {original_stars_price} -> {final_price_float:.2f} -> {stars_price} (ceiling)"
|
||||||
|
)
|
||||||
|
|
||||||
payment_record_data = {
|
payment_record_data = {
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
"amount": float(stars_price),
|
"amount": float(stars_price),
|
||||||
|
"original_amount": float(original_stars_price) if discount_amount_stars else None,
|
||||||
|
"discount_applied": float(discount_amount_stars) if discount_amount_stars else None,
|
||||||
"currency": "XTR",
|
"currency": "XTR",
|
||||||
"status": "pending_stars",
|
"status": "pending_stars",
|
||||||
"description": description,
|
"description": description,
|
||||||
"subscription_duration_months": int(months),
|
"subscription_duration_months": int(months),
|
||||||
"provider": "telegram_stars",
|
"provider": "telegram_stars",
|
||||||
|
"promo_code_id": promo_code_id,
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
db_payment_record = await payment_dal.create_payment_record(
|
db_payment_record = await payment_dal.create_payment_record(
|
||||||
@@ -72,6 +96,10 @@ class StarsService:
|
|||||||
stars_amount: int,
|
stars_amount: int,
|
||||||
i18n_data: dict,
|
i18n_data: dict,
|
||||||
sale_mode: str = "subscription") -> None:
|
sale_mode: str = "subscription") -> None:
|
||||||
|
# Fetch payment record to get promo_code_id
|
||||||
|
payment_record = await payment_dal.get_payment_by_db_id(session, payment_db_id)
|
||||||
|
promo_code_id_from_payment = payment_record.promo_code_id if payment_record else None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await payment_dal.update_provider_payment_and_status(
|
await payment_dal.update_provider_payment_and_status(
|
||||||
session, payment_db_id,
|
session, payment_db_id,
|
||||||
@@ -91,6 +119,7 @@ class StarsService:
|
|||||||
int(months) if sale_mode != "traffic" else 0,
|
int(months) if sale_mode != "traffic" else 0,
|
||||||
float(stars_amount),
|
float(stars_amount),
|
||||||
payment_db_id,
|
payment_db_id,
|
||||||
|
promo_code_id_from_payment=promo_code_id_from_payment,
|
||||||
provider="telegram_stars",
|
provider="telegram_stars",
|
||||||
sale_mode=sale_mode,
|
sale_mode=sale_mode,
|
||||||
traffic_gb=months if sale_mode == "traffic" else None,
|
traffic_gb=months if sale_mode == "traffic" else None,
|
||||||
|
|||||||
Reference in New Issue
Block a user