diff --git a/app/database/crud/promo_group.py b/app/database/crud/promo_group.py index eaa6fabb..3bc093f2 100644 --- a/app/database/crud/promo_group.py +++ b/app/database/crud/promo_group.py @@ -60,7 +60,6 @@ async def create_promo_group( device_discount_percent: int, period_discounts: Optional[Dict[int, int]] = None, auto_assign_total_spent_kopeks: Optional[int] = None, - apply_addon_discounts: bool = True, ) -> PromoGroup: normalized_period_discounts = _normalize_period_discounts(period_discounts) @@ -77,7 +76,6 @@ async def create_promo_group( device_discount_percent=max(0, min(100, device_discount_percent)), period_discounts=normalized_period_discounts or None, auto_assign_total_spent_kopeks=auto_assign_total_spent_kopeks, - apply_addon_discounts=bool(apply_addon_discounts), is_default=False, ) @@ -86,15 +84,13 @@ async def create_promo_group( await db.refresh(promo_group) logger.info( - "Создана промогруппа '%s' с скидками (servers=%s%%, traffic=%s%%, devices=%s%%, periods=%s)," - " порогом автоприсвоения %s₽ и применением скидок на доп. услуги: %s", + "Создана промогруппа '%s' с скидками (servers=%s%%, traffic=%s%%, devices=%s%%, periods=%s) и порогом автоприсвоения %s₽", promo_group.name, promo_group.server_discount_percent, promo_group.traffic_discount_percent, promo_group.device_discount_percent, normalized_period_discounts, (auto_assign_total_spent_kopeks or 0) / 100, - promo_group.apply_addon_discounts, ) return promo_group @@ -110,7 +106,6 @@ async def update_promo_group( device_discount_percent: Optional[int] = None, period_discounts: Optional[Dict[int, int]] = None, auto_assign_total_spent_kopeks: Optional[int] = None, - apply_addon_discounts: Optional[bool] = None, ) -> PromoGroup: if name is not None: group.name = name.strip() @@ -125,8 +120,6 @@ async def update_promo_group( group.period_discounts = normalized_period_discounts or None if auto_assign_total_spent_kopeks is not None: group.auto_assign_total_spent_kopeks = max(0, auto_assign_total_spent_kopeks) - if apply_addon_discounts is not None: - group.apply_addon_discounts = bool(apply_addon_discounts) await db.commit() await db.refresh(group) diff --git a/app/database/crud/subscription.py b/app/database/crud/subscription.py index d4fc1642..91b79375 100644 --- a/app/database/crud/subscription.py +++ b/app/database/crud/subscription.py @@ -845,10 +845,6 @@ async def calculate_addon_cost_for_remaining_period( user = getattr(subscription, "user", None) promo_group = promo_group or (user.promo_group if user else None) - addon_discounts_enabled = True - if promo_group is not None: - addon_discounts_enabled = getattr(promo_group, "apply_addon_discounts", True) - if additional_traffic_gb > 0: traffic_price_per_month = settings.get_traffic_price(additional_traffic_gb) traffic_discount_percent = _get_discount_percent( @@ -857,8 +853,6 @@ async def calculate_addon_cost_for_remaining_period( "traffic", period_days=period_hint_days, ) - if not addon_discounts_enabled: - traffic_discount_percent = 0 traffic_discount_per_month = traffic_price_per_month * traffic_discount_percent // 100 discounted_traffic_per_month = traffic_price_per_month - traffic_discount_per_month traffic_total_cost = discounted_traffic_per_month * months_to_pay @@ -880,8 +874,6 @@ async def calculate_addon_cost_for_remaining_period( "devices", period_days=period_hint_days, ) - if not addon_discounts_enabled: - devices_discount_percent = 0 devices_discount_per_month = devices_price_per_month * devices_discount_percent // 100 discounted_devices_per_month = devices_price_per_month - devices_discount_per_month devices_total_cost = discounted_devices_per_month * months_to_pay @@ -911,8 +903,6 @@ async def calculate_addon_cost_for_remaining_period( "servers", period_days=period_hint_days, ) - if not addon_discounts_enabled: - servers_discount_percent = 0 server_discount_per_month = server_price_per_month * servers_discount_percent // 100 discounted_server_per_month = server_price_per_month - server_discount_per_month server_total_cost = discounted_server_per_month * months_to_pay diff --git a/app/database/crud/user.py b/app/database/crud/user.py index bf948d18..582c8695 100644 --- a/app/database/crud/user.py +++ b/app/database/crud/user.py @@ -97,7 +97,6 @@ async def create_user( server_discount_percent=0, traffic_discount_percent=0, device_discount_percent=0, - apply_addon_discounts=True, is_default=True, ) db.add(default_group) diff --git a/app/database/models.py b/app/database/models.py index 1db78205..0a3ad865 100644 --- a/app/database/models.py +++ b/app/database/models.py @@ -292,7 +292,6 @@ class PromoGroup(Base): device_discount_percent = Column(Integer, nullable=False, default=0) period_discounts = Column(JSON, nullable=True, default=dict) auto_assign_total_spent_kopeks = Column(Integer, nullable=True, default=None) - apply_addon_discounts = Column(Boolean, nullable=False, default=True) is_default = Column(Boolean, nullable=False, default=False) created_at = Column(DateTime, default=func.now()) updated_at = Column(DateTime, default=func.now(), onupdate=func.now()) diff --git a/app/database/universal_migration.py b/app/database/universal_migration.py index 5042a046..b123c750 100644 --- a/app/database/universal_migration.py +++ b/app/database/universal_migration.py @@ -790,7 +790,6 @@ async def ensure_promo_groups_setup(): server_discount_percent INTEGER NOT NULL DEFAULT 0, traffic_discount_percent INTEGER NOT NULL DEFAULT 0, device_discount_percent INTEGER NOT NULL DEFAULT 0, - apply_addon_discounts BOOLEAN NOT NULL DEFAULT 1, is_default BOOLEAN NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP @@ -813,7 +812,6 @@ async def ensure_promo_groups_setup(): server_discount_percent INTEGER NOT NULL DEFAULT 0, traffic_discount_percent INTEGER NOT NULL DEFAULT 0, device_discount_percent INTEGER NOT NULL DEFAULT 0, - apply_addon_discounts BOOLEAN NOT NULL DEFAULT TRUE, is_default BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP, @@ -832,7 +830,6 @@ async def ensure_promo_groups_setup(): server_discount_percent INT NOT NULL DEFAULT 0, traffic_discount_percent INT NOT NULL DEFAULT 0, device_discount_percent INT NOT NULL DEFAULT 0, - apply_addon_discounts TINYINT(1) NOT NULL DEFAULT 1, is_default TINYINT(1) NOT NULL DEFAULT 0, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -934,44 +931,6 @@ async def ensure_promo_groups_setup(): "Добавлена колонка promo_groups.auto_assign_total_spent_kopeks" ) - addon_discount_column_exists = await check_column_exists( - "promo_groups", "apply_addon_discounts" - ) - - if not addon_discount_column_exists: - if db_type == "sqlite": - await conn.execute( - text( - "ALTER TABLE promo_groups ADD COLUMN apply_addon_discounts BOOLEAN NOT NULL DEFAULT 1" - ) - ) - elif db_type == "postgresql": - await conn.execute( - text( - "ALTER TABLE promo_groups ADD COLUMN apply_addon_discounts BOOLEAN NOT NULL DEFAULT TRUE" - ) - ) - elif db_type == "mysql": - await conn.execute( - text( - "ALTER TABLE promo_groups ADD COLUMN apply_addon_discounts TINYINT(1) NOT NULL DEFAULT 1" - ) - ) - else: - logger.error( - f"Неподдерживаемый тип БД для promo_groups.apply_addon_discounts: {db_type}" - ) - return False - - await conn.execute( - text( - "UPDATE promo_groups SET apply_addon_discounts = 1 WHERE apply_addon_discounts IS NULL" - ) - ) - logger.info( - "Добавлена колонка promo_groups.apply_addon_discounts" - ) - column_exists = await check_column_exists("users", "promo_group_id") if not column_exists: @@ -2035,7 +1994,6 @@ async def check_migration_status(): "users_promo_group_column": False, "promo_groups_period_discounts_column": False, "promo_groups_auto_assign_column": False, - "promo_groups_addon_discount_column": False, "users_auto_promo_group_assigned_column": False, "subscription_crypto_link_column": False, } @@ -2053,7 +2011,6 @@ async def check_migration_status(): status["users_promo_group_column"] = await check_column_exists('users', 'promo_group_id') status["promo_groups_period_discounts_column"] = await check_column_exists('promo_groups', 'period_discounts') status["promo_groups_auto_assign_column"] = await check_column_exists('promo_groups', 'auto_assign_total_spent_kopeks') - status["promo_groups_addon_discount_column"] = await check_column_exists('promo_groups', 'apply_addon_discounts') status["users_auto_promo_group_assigned_column"] = await check_column_exists('users', 'auto_promo_group_assigned') status["subscription_crypto_link_column"] = await check_column_exists('subscriptions', 'subscription_crypto_link') @@ -2091,7 +2048,6 @@ async def check_migration_status(): "users_promo_group_column": "Колонка promo_group_id у пользователей", "promo_groups_period_discounts_column": "Колонка period_discounts у промо-групп", "promo_groups_auto_assign_column": "Колонка auto_assign_total_spent_kopeks у промо-групп", - "promo_groups_addon_discount_column": "Колонка apply_addon_discounts у промо-групп", "users_auto_promo_group_assigned_column": "Флаг автоназначения промогруппы у пользователей", "subscription_crypto_link_column": "Колонка subscription_crypto_link в subscriptions", } diff --git a/app/handlers/admin/promo_groups.py b/app/handlers/admin/promo_groups.py index 1b7ddb49..917f673f 100644 --- a/app/handlers/admin/promo_groups.py +++ b/app/handlers/admin/promo_groups.py @@ -39,21 +39,6 @@ def _format_discount_line(texts, group) -> str: ) -def _format_addon_discount_line(texts, group: PromoGroup) -> str: - enabled = getattr(group, "apply_addon_discounts", True) - key = ( - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_ENABLED" - if enabled - else "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_DISABLED" - ) - default = ( - "Скидки на доп. услуги: применяются" - if enabled - else "Скидки на доп. услуги: не применяются" - ) - return texts.t(key, default) - - def _normalize_periods_dict(raw: Optional[Dict]) -> Dict[int, int]: if not raw or not isinstance(raw, dict): return {} @@ -189,16 +174,6 @@ def _format_rubles(amount_kopeks: int) -> str: return formatted.replace(",", " ") -def _format_addon_discount_state(texts, enabled: bool) -> str: - key = ( - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_ENABLED" - if enabled - else "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_DISABLED" - ) - default = "включены" if enabled else "выключены" - return texts.t(key, default) - - def _format_auto_assign_line(texts, group: PromoGroup) -> str: threshold = getattr(group, "auto_assign_total_spent_kopeks", 0) or 0 @@ -248,17 +223,6 @@ def _parse_auto_assign_threshold_input(value: str) -> int: return max(0, kopeks) -def _parse_boolean_choice(value: str) -> bool: - cleaned = (value or "").strip().lower() - - if cleaned in {"1", "true", "yes", "y", "да", "+", "on", "вкл"}: - return True - if cleaned in {"0", "false", "no", "n", "нет", "-", "off", "выкл"}: - return False - - raise ValueError - - async def _prompt_for_auto_assign_threshold( message: types.Message, state: FSMContext, @@ -293,7 +257,6 @@ def _build_edit_menu_content( lines = [ header, _format_discount_line(texts, group), - _format_addon_discount_line(texts, group), _format_auto_assign_line(texts, group), ] @@ -355,15 +318,6 @@ def _build_edit_menu_content( callback_data=f"promo_group_edit_field_{group.id}_periods", ) ], - [ - types.InlineKeyboardButton( - text=texts.t( - "ADMIN_PROMO_GROUP_EDIT_FIELD_ADDONS", - "🎁 Скидки на доп. услуги", - ), - callback_data=f"promo_group_edit_field_{group.id}_addons", - ) - ], [ types.InlineKeyboardButton( text=texts.t( @@ -445,7 +399,6 @@ async def show_promo_groups_menu( group_lines = [ f"{'⭐' if group.is_default else '🎯'} {group.name}{default_suffix}", _format_discount_line(texts, group), - _format_addon_discount_line(texts, group), _format_auto_assign_line(texts, group), texts.t( "ADMIN_PROMO_GROUPS_MEMBERS_COUNT", @@ -521,7 +474,6 @@ async def show_promo_group_details( "💳 Промогруппа: {name}", ).format(name=group.name), _format_discount_line(texts, group), - _format_addon_discount_line(texts, group), _format_auto_assign_line(texts, group), texts.t( "ADMIN_PROMO_GROUP_DETAILS_MEMBERS", @@ -723,39 +675,6 @@ async def process_create_group_period_discounts( return await state.update_data(new_group_period_discounts=period_discounts) - await state.set_state(AdminStates.creating_promo_group_addon_discount) - - await message.answer( - texts.t( - "ADMIN_PROMO_GROUP_CREATE_ADDONS_PROMPT", - "Включать скидки на докупку доп. услуг? (да/нет)", - ) - ) - - -@admin_required -@error_handler -async def process_create_group_addon_discounts( - message: types.Message, - state: FSMContext, - db_user, - db: AsyncSession, -): - data = await state.get_data() - texts = get_texts(data.get("language", db_user.language)) - - try: - apply_addons = _parse_boolean_choice(message.text) - except ValueError: - await message.answer( - texts.t( - "ADMIN_PROMO_GROUP_INVALID_ADDON_DISCOUNT", - "Введите «да» или «нет».", - ) - ) - return - - await state.update_data(new_group_apply_addon_discounts=apply_addons) await state.set_state(AdminStates.creating_promo_group_auto_assign) await _prompt_for_auto_assign_threshold( @@ -797,7 +716,6 @@ async def process_create_group_auto_assign( device_discount_percent=data["new_group_devices"], period_discounts=data.get("new_group_period_discounts"), auto_assign_total_spent_kopeks=auto_assign_kopeks, - apply_addon_discounts=data.get("new_group_apply_addon_discounts", True), ) except Exception as e: logger.error(f"Не удалось создать промогруппу: {e}") @@ -908,17 +826,6 @@ async def prompt_edit_promo_group_field( "ADMIN_PROMO_GROUP_EDIT_PERIOD_PROMPT", "Введите новые скидки на периоды (текущие: {current}). Отправьте 0, если без скидок.", ).format(current=_format_period_discounts_value(current_discounts)) - elif field == "addons": - await state.set_state(AdminStates.editing_promo_group_addon_discount) - prompt = texts.t( - "ADMIN_PROMO_GROUP_EDIT_ADDONS_PROMPT", - "Включать скидки на докупку доп. услуг? Текущее значение: {current}. Введите да/нет.", - ).format( - current=_format_addon_discount_state( - texts, - getattr(group, "apply_addon_discounts", True), - ) - ) elif field == "auto": await state.set_state(AdminStates.editing_promo_group_auto_assign) prompt = texts.t( @@ -1112,46 +1019,6 @@ async def process_edit_group_period_discounts( ) -@admin_required -@error_handler -async def process_edit_group_addon_discounts( - message: types.Message, - state: FSMContext, - db_user, - db: AsyncSession, -): - data = await state.get_data() - texts = get_texts(data.get("language", db_user.language)) - - try: - apply_addons = _parse_boolean_choice(message.text) - except ValueError: - await message.answer( - texts.t( - "ADMIN_PROMO_GROUP_INVALID_ADDON_DISCOUNT", - "Введите «да» или «нет».", - ) - ) - return - - group = await get_promo_group_by_id(db, data.get("edit_group_id")) - if not group: - await message.answer("❌ Промогруппа не найдена") - await state.clear() - return - - group = await update_promo_group(db, group, apply_addon_discounts=apply_addons) - await state.set_state(AdminStates.editing_promo_group_menu) - - await _send_edit_menu_after_update( - message, - texts, - group, - data.get("language", db_user.language), - texts.t("ADMIN_PROMO_GROUP_UPDATED", "Промогруппа «{name}» обновлена.").format(name=group.name), - ) - - @admin_required @error_handler async def process_edit_group_auto_assign( @@ -1368,10 +1235,6 @@ def register_handlers(dp: Dispatcher): process_create_group_period_discounts, AdminStates.creating_promo_group_period_discount, ) - dp.message.register( - process_create_group_addon_discounts, - AdminStates.creating_promo_group_addon_discount, - ) dp.message.register( process_create_group_auto_assign, AdminStates.creating_promo_group_auto_assign, @@ -1394,10 +1257,6 @@ def register_handlers(dp: Dispatcher): process_edit_group_period_discounts, AdminStates.editing_promo_group_period_discount, ) - dp.message.register( - process_edit_group_addon_discounts, - AdminStates.editing_promo_group_addon_discount, - ) dp.message.register( process_edit_group_auto_assign, AdminStates.editing_promo_group_auto_assign, diff --git a/app/handlers/admin/users.py b/app/handlers/admin/users.py index 69b2b5ea..45fe983f 100644 --- a/app/handlers/admin/users.py +++ b/app/handlers/admin/users.py @@ -868,25 +868,16 @@ async def _render_user_promo_group( traffic=current_group.traffic_discount_percent, devices=current_group.device_discount_percent, ) - addon_line = texts.ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT.format( - state=( - texts.ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_ENABLED - if getattr(current_group, "apply_addon_discounts", True) - else texts.ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_DISABLED - ) - ) current_group_id = current_group.id else: current_line = texts.ADMIN_USER_PROMO_GROUP_CURRENT_NONE discount_line = texts.ADMIN_USER_PROMO_GROUP_DISCOUNTS_NONE - addon_line = texts.ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_NONE current_group_id = None text = ( f"{texts.ADMIN_USER_PROMO_GROUP_TITLE}\n\n" f"{current_line}\n" - f"{discount_line}\n" - f"{addon_line}\n\n" + f"{discount_line}\n\n" f"{texts.ADMIN_USER_PROMO_GROUP_SELECT}" ) diff --git a/app/states.py b/app/states.py index 6bf45cf3..f824f9a5 100644 --- a/app/states.py +++ b/app/states.py @@ -69,7 +69,6 @@ class AdminStates(StatesGroup): creating_promo_group_server_discount = State() creating_promo_group_device_discount = State() creating_promo_group_period_discount = State() - creating_promo_group_addon_discount = State() creating_promo_group_auto_assign = State() editing_promo_group_menu = State() @@ -78,7 +77,6 @@ class AdminStates(StatesGroup): editing_promo_group_server_discount = State() editing_promo_group_device_discount = State() editing_promo_group_period_discount = State() - editing_promo_group_addon_discount = State() editing_promo_group_auto_assign = State() editing_squad_price = State() diff --git a/locales/en.json b/locales/en.json index df0e9343..f217ed28 100644 --- a/locales/en.json +++ b/locales/en.json @@ -151,8 +151,6 @@ "ADMIN_PROMO_GROUPS_TITLE": "💳 Promo groups", "ADMIN_PROMO_GROUPS_SUMMARY": "Groups total: {count}\nMembers total: {members}", "ADMIN_PROMO_GROUPS_DISCOUNTS": "Discounts — servers: {servers}%, traffic: {traffic}%, devices: {devices}%", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_ENABLED": "🎁 Add-on discounts: applied", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_DISABLED": "🎁 Add-on discounts: not applied", "ADMIN_PROMO_GROUP_PERIOD_DISCOUNTS_HEADER": "⏳ Period discounts:", "ADMIN_PROMO_GROUPS_DEFAULT_LABEL": " (default)", "ADMIN_PROMO_GROUPS_MEMBERS_COUNT": "Members: {count}", @@ -229,10 +227,6 @@ "ADMIN_USER_PROMO_GROUP_CURRENT_NONE": "Current group: not assigned", "ADMIN_USER_PROMO_GROUP_DISCOUNTS": "Discounts — servers: {servers}%, traffic: {traffic}%, devices: {devices}%", "ADMIN_USER_PROMO_GROUP_DISCOUNTS_NONE": "No discounts configured.", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT": "Add-on discounts: {state}", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_ENABLED": "applied", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_DISABLED": "not applied", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_NONE": "Add-on discounts: no data", "ADMIN_USER_PROMO_GROUP_SELECT": "Select a promo group to assign:", "ADMIN_USER_PROMO_GROUP_UPDATED": "✅ User promo group updated: “{name}”", "ADMIN_USER_PROMO_GROUP_ALREADY": "ℹ️ The user is already in this promo group.", @@ -250,10 +244,8 @@ "ADMIN_PROMO_GROUP_CREATE_SERVERS_PROMPT": "Enter server discount (0-100):", "ADMIN_PROMO_GROUP_CREATE_DEVICES_PROMPT": "Enter device discount (0-100):", "ADMIN_PROMO_GROUP_CREATE_PERIOD_PROMPT": "Enter subscription period discounts (e.g. 30:10, 90:15). Send 0 if none.", - "ADMIN_PROMO_GROUP_CREATE_ADDONS_PROMPT": "Apply discounts to add-on purchases? (yes/no)", "ADMIN_PROMO_GROUP_INVALID_PERCENT": "Enter a number from 0 to 100.", "ADMIN_PROMO_GROUP_INVALID_PERIOD_DISCOUNTS": "Enter period:discount pairs separated by commas, e.g. 30:10, 90:15, or 0.", - "ADMIN_PROMO_GROUP_INVALID_ADDON_DISCOUNT": "Please enter “yes” or “no”.", "ADMIN_PROMO_GROUP_CREATED": "Promo group “{name}” created.", "ADMIN_PROMO_GROUP_CREATED_BACK_BUTTON": "↩️ Back to promo groups", "ADMIN_PROMO_GROUP_EDIT_NAME_PROMPT": "Enter a new name (current: {name}):", @@ -261,12 +253,9 @@ "ADMIN_PROMO_GROUP_EDIT_SERVERS_PROMPT": "Enter new server discount (0-100). Current value: {current}.", "ADMIN_PROMO_GROUP_EDIT_DEVICES_PROMPT": "Enter new device discount (0-100). Current value: {current}.", "ADMIN_PROMO_GROUP_EDIT_PERIOD_PROMPT": "Enter new period discounts (current: {current}). Send 0 if none.", - "ADMIN_PROMO_GROUP_EDIT_ADDONS_PROMPT": "Apply discounts to add-on purchases? Current value: {current}. Enter yes/no.", "ADMIN_PROMO_GROUP_UPDATED": "Promo group “{name}” updated.", "ADMIN_PROMO_GROUP_AUTO_ASSIGN_DISABLED": "Auto assignment by total spending: disabled", "ADMIN_PROMO_GROUP_AUTO_ASSIGN_LINE": "Auto assignment by total spending from {amount} ₽", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_ENABLED": "enabled", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_DISABLED": "disabled", "ADMIN_PROMO_GROUP_EDIT_MENU_TITLE": "✏️ Promo group settings “{name}”", "ADMIN_PROMO_GROUP_EDIT_MENU_HINT": "Select a parameter to change:", "ADMIN_PROMO_GROUP_EDIT_FIELD_NAME": "✏️ Rename", @@ -274,7 +263,6 @@ "ADMIN_PROMO_GROUP_EDIT_FIELD_SERVERS": "🖥 Server discount", "ADMIN_PROMO_GROUP_EDIT_FIELD_DEVICES": "📱 Device discount", "ADMIN_PROMO_GROUP_EDIT_FIELD_PERIODS": "⏳ Period discounts", - "ADMIN_PROMO_GROUP_EDIT_FIELD_ADDONS": "🎁 Add-on discounts", "ADMIN_PROMO_GROUP_EDIT_FIELD_AUTO_ASSIGN": "🤖 Auto assignment by spending", "ADMIN_PROMO_GROUP_CREATE_AUTO_ASSIGN_PROMPT": "Enter total spending (in ₽) required for automatic assignment. Send 0 to disable.", "ADMIN_PROMO_GROUP_INVALID_AUTO_ASSIGN": "Enter a non-negative amount in rubles or 0 to disable.", diff --git a/locales/ru.json b/locales/ru.json index c50d95a3..2524c1d4 100644 --- a/locales/ru.json +++ b/locales/ru.json @@ -17,8 +17,6 @@ "ADMIN_PROMO_GROUPS_TITLE": "💳 Промогруппы", "ADMIN_PROMO_GROUPS_SUMMARY": "Всего групп: {count}\nВсего участников: {members}", "ADMIN_PROMO_GROUPS_DISCOUNTS": "Скидки — серверы: {servers}%, трафик: {traffic}%, устройства: {devices}%", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_ENABLED": "🎁 Скидки на доп. услуги: применяются", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_DISABLED": "🎁 Скидки на доп. услуги: не применяются", "ADMIN_PROMO_GROUP_PERIOD_DISCOUNTS_HEADER": "⏳ Скидки по периодам:", "ADMIN_PROMO_GROUPS_DEFAULT_LABEL": " (базовая)", "ADMIN_PROMO_GROUPS_MEMBERS_COUNT": "Участников: {count}", @@ -95,10 +93,6 @@ "ADMIN_USER_PROMO_GROUP_CURRENT_NONE": "Текущая группа: не назначена", "ADMIN_USER_PROMO_GROUP_DISCOUNTS": "Скидки — серверы: {servers}%, трафик: {traffic}%, устройства: {devices}%", "ADMIN_USER_PROMO_GROUP_DISCOUNTS_NONE": "Скидки не заданы.", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT": "Скидки на доп. услуги: {state}", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_ENABLED": "применяются", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_DISABLED": "не применяются", - "ADMIN_USER_PROMO_GROUP_ADDON_DISCOUNT_NONE": "Скидки на доп. услуги: нет данных", "ADMIN_USER_PROMO_GROUP_SELECT": "Выберите промогруппу для назначения:", "ADMIN_USER_PROMO_GROUP_UPDATED": "✅ Промогруппа пользователя обновлена: «{name}»", "ADMIN_USER_PROMO_GROUP_ALREADY": "ℹ️ Пользователь уже состоит в этой промогруппе.", @@ -116,10 +110,8 @@ "ADMIN_PROMO_GROUP_CREATE_SERVERS_PROMPT": "Введите скидку на серверы (0-100):", "ADMIN_PROMO_GROUP_CREATE_DEVICES_PROMPT": "Введите скидку на устройства (0-100):", "ADMIN_PROMO_GROUP_CREATE_PERIOD_PROMPT": "Введите скидки на периоды подписки (например, 30:10, 90:15). Отправьте 0, если без скидок.", - "ADMIN_PROMO_GROUP_CREATE_ADDONS_PROMPT": "Включать скидки на докупку доп. услуг? (да/нет)", "ADMIN_PROMO_GROUP_INVALID_PERCENT": "Введите число от 0 до 100.", "ADMIN_PROMO_GROUP_INVALID_PERIOD_DISCOUNTS": "Введите пары период:скидка через запятую, например 30:10, 90:15, или 0.", - "ADMIN_PROMO_GROUP_INVALID_ADDON_DISCOUNT": "Введите «да» или «нет».", "ADMIN_PROMO_GROUP_CREATED": "Промогруппа «{name}» создана.", "ADMIN_PROMO_GROUP_CREATED_BACK_BUTTON": "↩️ К промогруппам", "ADMIN_PROMO_GROUP_EDIT_NAME_PROMPT": "Введите новое название промогруппы (текущее: {name}):", @@ -127,12 +119,9 @@ "ADMIN_PROMO_GROUP_EDIT_SERVERS_PROMPT": "Введите новую скидку на серверы (0-100). Текущее значение: {current}.", "ADMIN_PROMO_GROUP_EDIT_DEVICES_PROMPT": "Введите новую скидку на устройства (0-100). Текущее значение: {current}.", "ADMIN_PROMO_GROUP_EDIT_PERIOD_PROMPT": "Введите новые скидки на периоды (текущие: {current}). Отправьте 0, если без скидок.", - "ADMIN_PROMO_GROUP_EDIT_ADDONS_PROMPT": "Включать скидки на докупку доп. услуг? Текущее значение: {current}. Введите да/нет.", "ADMIN_PROMO_GROUP_UPDATED": "Промогруппа «{name}» обновлена.", "ADMIN_PROMO_GROUP_AUTO_ASSIGN_DISABLED": "Автовыдача по суммарным тратам: отключена", "ADMIN_PROMO_GROUP_AUTO_ASSIGN_LINE": "Автовыдача по суммарным тратам: от {amount} ₽", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_ENABLED": "включены", - "ADMIN_PROMO_GROUP_ADDON_DISCOUNT_STATE_DISABLED": "выключены", "ADMIN_PROMO_GROUP_EDIT_MENU_TITLE": "✏️ Настройки промогруппы «{name}»", "ADMIN_PROMO_GROUP_EDIT_MENU_HINT": "Выберите параметр для изменения:", "ADMIN_PROMO_GROUP_EDIT_FIELD_NAME": "✏️ Изменить название", @@ -140,7 +129,6 @@ "ADMIN_PROMO_GROUP_EDIT_FIELD_SERVERS": "🖥 Скидка на серверы", "ADMIN_PROMO_GROUP_EDIT_FIELD_DEVICES": "📱 Скидка на устройства", "ADMIN_PROMO_GROUP_EDIT_FIELD_PERIODS": "⏳ Скидки по периодам", - "ADMIN_PROMO_GROUP_EDIT_FIELD_ADDONS": "🎁 Скидки на доп. услуги", "ADMIN_PROMO_GROUP_EDIT_FIELD_AUTO_ASSIGN": "🤖 Автовыдача по тратам", "ADMIN_PROMO_GROUP_CREATE_AUTO_ASSIGN_PROMPT": "Введите сумму общих трат (в ₽) для автоматической выдачи этой группы. Отправьте 0, чтобы отключить.", "ADMIN_PROMO_GROUP_INVALID_AUTO_ASSIGN": "Введите неотрицательное число в рублях или 0 для отключения.",