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)