diff --git a/handlers/admin/tariffs/tariff_configurator/device_pricing.py b/handlers/admin/tariffs/tariff_configurator/device_pricing.py index 8d7c8500..cb940777 100644 --- a/handlers/admin/tariffs/tariff_configurator/device_pricing.py +++ b/handlers/admin/tariffs/tariff_configurator/device_pricing.py @@ -5,6 +5,7 @@ from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, Message from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import attributes from database.models import Tariff from filters.admin import IsAdminFilter @@ -184,7 +185,8 @@ async def save_device_override_price(message: Message, state: FSMContext, sessio await state.clear() return - overrides = getattr(tariff, "device_overrides", None) or {} + existing_overrides = tariff.device_overrides + overrides = dict(existing_overrides) if existing_overrides else {} key = str(int(devices)) if extra_price == 0: @@ -192,7 +194,8 @@ async def save_device_override_price(message: Message, state: FSMContext, sessio else: overrides[key] = extra_price - tariff.device_overrides = overrides or None + tariff.device_overrides = overrides if overrides else None + attributes.flag_modified(tariff, "device_overrides") tariff.updated_at = datetime.utcnow() await session.commit() diff --git a/handlers/admin/tariffs/tariff_configurator/traffic_pricing.py b/handlers/admin/tariffs/tariff_configurator/traffic_pricing.py index 7cedf87d..8b443f87 100644 --- a/handlers/admin/tariffs/tariff_configurator/traffic_pricing.py +++ b/handlers/admin/tariffs/tariff_configurator/traffic_pricing.py @@ -5,6 +5,7 @@ from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, Message from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import attributes from database.models import Tariff from filters.admin import IsAdminFilter @@ -176,7 +177,8 @@ async def save_traffic_override_price(message: Message, state: FSMContext, sessi await state.clear() return - overrides = getattr(tariff, "traffic_overrides", None) or {} + existing_overrides = tariff.traffic_overrides + overrides = dict(existing_overrides) if existing_overrides else {} key = str(int(gb_value)) if extra_price == 0: @@ -184,7 +186,8 @@ async def save_traffic_override_price(message: Message, state: FSMContext, sessi else: overrides[key] = extra_price - tariff.traffic_overrides = overrides or None + tariff.traffic_overrides = overrides if overrides else None + attributes.flag_modified(tariff, "traffic_overrides") tariff.updated_at = datetime.utcnow() await session.commit() diff --git a/handlers/keys/key_renew.py b/handlers/keys/key_renew.py index fa350593..db5f5dcd 100644 --- a/handlers/keys/key_renew.py +++ b/handlers/keys/key_renew.py @@ -698,15 +698,27 @@ async def complete_key_renewal( logger.error(f"[Error] Ключ с client_id={client_id} не найден в БД.") return + new_tariff_device_limit = tariff.get("device_limit") + new_tariff_traffic_limit_bytes = tariff.get("traffic_limit") + new_tariff_traffic_limit_gb = int(new_tariff_traffic_limit_bytes / GB) if new_tariff_traffic_limit_bytes else None + selected_device_limit_db = key_info.get("selected_device_limit") selected_traffic_limit_db = key_info.get("selected_traffic_limit") + current_traffic_limit_db = key_info.get("current_traffic_limit") - final_device_limit = ( - int(selected_device_limit) if selected_device_limit is not None else selected_device_limit_db - ) - final_traffic_limit = ( - int(selected_traffic_limit) if selected_traffic_limit is not None else selected_traffic_limit_db - ) + if new_tariff_device_limit is None: + final_device_limit = None + elif selected_device_limit is not None: + final_device_limit = int(selected_device_limit) + else: + final_device_limit = new_tariff_device_limit + + if new_tariff_traffic_limit_gb is None: + final_traffic_limit = None + elif selected_traffic_limit is not None: + final_traffic_limit = int(selected_traffic_limit) + else: + final_traffic_limit = int(new_tariff_traffic_limit_gb) selected_traffic_gb_effective = int(final_traffic_limit) if final_traffic_limit is not None else None selected_device_limit_effective = int(final_device_limit) if final_device_limit is not None else None @@ -801,7 +813,25 @@ async def complete_key_renewal( effective_client_id = key_row["client_id"] if key_row else client_id await update_key_expiry(session, effective_client_id, new_expiry_time) - await session.execute(update(Key).where(Key.email == email).values(tariff_id=tariff_id)) + + update_values = {"tariff_id": tariff_id} + + if not tariff.get("configurable"): + if new_tariff_device_limit is None: + update_values["selected_device_limit"] = None + update_values["current_device_limit"] = None + else: + update_values["selected_device_limit"] = new_tariff_device_limit + update_values["current_device_limit"] = final_device_limit + + if new_tariff_traffic_limit_gb is None: + update_values["selected_traffic_limit"] = None + update_values["current_traffic_limit"] = None + else: + update_values["selected_traffic_limit"] = new_tariff_traffic_limit_gb + update_values["current_traffic_limit"] = final_traffic_limit + + await session.execute(update(Key).where(Key.email == email).values(**update_values)) await update_balance(session, tg_id, -cost) if tariff.get("configurable"):