diff --git a/handlers/keys/key_create.py b/handlers/keys/key_create.py index 345fe28e..e145ee78 100644 --- a/handlers/keys/key_create.py +++ b/handlers/keys/key_create.py @@ -457,6 +457,7 @@ async def create_key( selected_device_limit: int | None = None, selected_traffic_gb: int | None = None, selected_price_rub: int | None = None, + skip_balance_charge: bool | None = None, ): from_user = message_or_query.from_user if isinstance(message_or_query, CallbackQuery | Message) else None if from_user: @@ -472,9 +473,12 @@ async def create_key( use_country_selection = bool(MODES_CONFIG.get("COUNTRY_SELECTION_ENABLED", USE_COUNTRY_SELECTION)) - if state and any( - value is not None - for value in (selected_duration_days, selected_device_limit, selected_traffic_gb, selected_price_rub) + if state and ( + skip_balance_charge is not None + or any( + value is not None + for value in (selected_duration_days, selected_device_limit, selected_traffic_gb, selected_price_rub) + ) ): state_data = await state.get_data() if selected_duration_days is not None: @@ -485,6 +489,8 @@ async def create_key( state_data["config_selected_traffic_gb"] = selected_traffic_gb if selected_price_rub is not None: state_data["config_selected_price_rub"] = selected_price_rub + if skip_balance_charge is not None: + state_data["skip_balance_charge"] = skip_balance_charge await state.set_data(state_data) if use_country_selection: @@ -499,6 +505,7 @@ async def create_key( selected_device_limit=selected_device_limit, selected_traffic_gb=selected_traffic_gb, selected_price_rub=selected_price_rub, + skip_balance_charge=skip_balance_charge, ) else: await key_cluster_mode( @@ -511,4 +518,5 @@ async def create_key( selected_device_limit=selected_device_limit, selected_traffic_gb=selected_traffic_gb, selected_price_rub=selected_price_rub, + skip_balance_charge=skip_balance_charge, ) diff --git a/handlers/keys/key_mode/key_cluster_mode.py b/handlers/keys/key_mode/key_cluster_mode.py index f2c5779c..3d9bbc65 100644 --- a/handlers/keys/key_mode/key_cluster_mode.py +++ b/handlers/keys/key_mode/key_cluster_mode.py @@ -69,6 +69,7 @@ async def key_cluster_mode( selected_device_limit: int | None = None, selected_traffic_gb: int | None = None, selected_price_rub: int | None = None, + skip_balance_charge: bool | None = None, ): target_message = None safe_to_edit = False @@ -93,6 +94,7 @@ async def key_cluster_mode( try: data = await state.get_data() if state else {} is_trial = data.get("is_trial", False) + skip_balance_charge = bool(skip_balance_charge) if selected_device_limit is None: selected_device_limit = data.get("config_selected_device_limit") or data.get("selected_device_limit") @@ -182,7 +184,7 @@ async def key_cluster_mode( if trial_status in [0, -1]: await update_trial(session, tg_id, 1) - if price_to_charge: + if price_to_charge and not skip_balance_charge: await update_balance(session, tg_id, -int(price_to_charge)) except Exception as e: diff --git a/handlers/keys/key_mode/key_country_mode.py b/handlers/keys/key_mode/key_country_mode.py index d7ca6cba..6897feec 100644 --- a/handlers/keys/key_mode/key_country_mode.py +++ b/handlers/keys/key_mode/key_country_mode.py @@ -89,6 +89,7 @@ async def key_country_mode( selected_device_limit: int | None = None, selected_traffic_gb: int | None = None, selected_price_rub: int | None = None, + skip_balance_charge: bool | None = None, ): target_message = None safe_to_edit = False @@ -96,7 +97,10 @@ async def key_country_mode( if state and plan: await state.update_data(tariff_id=plan) - if state and any(value is not None for value in (selected_device_limit, selected_traffic_gb, selected_price_rub)): + if state and ( + skip_balance_charge is not None + or any(value is not None for value in (selected_device_limit, selected_traffic_gb, selected_price_rub)) + ): data = await state.get_data() if selected_device_limit is not None: data["config_selected_device_limit"] = selected_device_limit @@ -104,6 +108,8 @@ async def key_country_mode( data["config_selected_traffic_gb"] = selected_traffic_gb if selected_price_rub is not None: data["config_selected_price_rub"] = selected_price_rub + if skip_balance_charge is not None: + data["skip_balance_charge"] = skip_balance_charge await state.set_data(data) if isinstance(message_or_query, CallbackQuery) and message_or_query.message: @@ -502,6 +508,7 @@ async def finalize_key_creation( data = await state.get_data() if state else {} is_trial = data.get("is_trial", False) + skip_balance_charge = bool(data.get("skip_balance_charge", False)) selected_traffic_gb = data.get("config_selected_traffic_gb") if selected_traffic_gb is None: @@ -726,9 +733,12 @@ async def finalize_key_creation( trial_status = await get_trial(session, tg_id) if trial_status in [0, -1]: await update_trial(session, tg_id, 1) - if not is_trial and price_to_charge: + if not is_trial and price_to_charge and not skip_balance_charge: await update_balance(session, tg_id, -int(price_to_charge)) + if state: + await state.update_data(skip_balance_charge=False) + await session.commit() except Exception as e: diff --git a/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so b/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so index f2dd0e9c..617334e1 100644 Binary files a/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so and b/handlers/payments/gift.cpython-312-x86_64-linux-gnu.so differ diff --git a/handlers/payments/yookassa/service.cpython-312-x86_64-linux-gnu.so b/handlers/payments/yookassa/service.cpython-312-x86_64-linux-gnu.so index 09901a6d..ac8a7c6b 100644 Binary files a/handlers/payments/yookassa/service.cpython-312-x86_64-linux-gnu.so and b/handlers/payments/yookassa/service.cpython-312-x86_64-linux-gnu.so differ diff --git a/handlers/payments/yoomoney/webhook.cpython-312-x86_64-linux-gnu.so b/handlers/payments/yoomoney/webhook.cpython-312-x86_64-linux-gnu.so index 81bde4d0..724bbfd4 100644 Binary files a/handlers/payments/yoomoney/webhook.cpython-312-x86_64-linux-gnu.so and b/handlers/payments/yoomoney/webhook.cpython-312-x86_64-linux-gnu.so differ