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 для отключения.",