from aiogram.types import InlineKeyboardMarkup
from database.models import Tariff
from .keyboard import build_single_tariff_kb
MAX_TARIFF_NAME_LENGTH = 40
MAX_SUBGROUP_TITLE_LENGTH = 40
def validate_tariff_name(name: str) -> tuple[bool, str]:
if len(name) > MAX_TARIFF_NAME_LENGTH:
return False, f"Название тарифа слишком длинное. Максимум {MAX_TARIFF_NAME_LENGTH} символов."
return True, ""
def validate_subgroup_title(title: str) -> tuple[bool, str]:
if len(title) > MAX_SUBGROUP_TITLE_LENGTH:
return False, f"Название подгруппы слишком длинное. Максимум {MAX_SUBGROUP_TITLE_LENGTH} символов."
return True, ""
def tariff_to_dict(tariff) -> dict:
if isinstance(tariff, dict):
return tariff
return {
"id": tariff.id,
"name": tariff.name,
"price_rub": tariff.price_rub,
"group_code": tariff.group_code,
"subgroup_title": tariff.subgroup_title,
"sort_order": tariff.sort_order,
}
def render_tariff_card(tariff: Tariff) -> tuple[str, InlineKeyboardMarkup]:
traffic_text = f"{tariff.traffic_limit} ГБ" if tariff.traffic_limit else "Безлимит"
device_text = f"{tariff.device_limit}" if tariff.device_limit is not None else "Безлимит"
sort_order = getattr(tariff, "sort_order", 1)
vless_text = "Да" if getattr(tariff, "vless", False) else "Нет"
configurable = bool(getattr(tariff, "configurable", False))
configurable_text = "Включен" if configurable else "Выключен"
external_squad_text = getattr(tariff, "external_squad", None) or "Не задан"
text = (
f"📄 Тариф: {tariff.name}\n\n"
f"📁 Группа: {tariff.group_code}\n"
f"📅 Длительность: {tariff.duration_days} дней\n"
f"💰 Стоимость: {tariff.price_rub}₽\n"
f"📦 Трафик: {traffic_text}\n"
f"📱 Устройств: {device_text}\n"
f"🔗 VLESS: {vless_text}\n"
f"⚙️ Конфигуратор: {configurable_text}\n"
f"Внешний сквад: {external_squad_text}\n"
f"🔢 Позиция: {sort_order}\n"
f"{'✅ Активен' if tariff.is_active else '⛔ Отключен'}"
)
return text, build_single_tariff_kb(tariff.id, tariff.group_code, configurable=configurable)