Схемы Что нового

Тарифы и услуги

Тарифные планы и услуги, правила и наборы, серии карт оплаты, программа лояльности и диапазоны услуг.

Тарифы — гибкие тарифные планы
Модуль «Биллинг-ядро» — на сайте продукта
Содержание раздела

Тарификация

Раздел меню «Тарификация» содержит всё, что связано с услугами, которые получают клиенты, и правилами их тарификации.

Обучающее видео 2:56

Чем тариф отличается от услуги, откуда берётся цена в счёте, зачем нужны линейки и почему правило сети не работает без выгрузки в ACL.

1920×1080 с озвучкой Скачать

Тарифы — назначение и роль

Содержание раздела

Тариф (Tarif) — это шаблон услуг и цен, которые получает клиент после подключения. Хранится в таблице tarif, редактируется на /admin/tarifs/Tarif/.

Зачем нужен тариф

Тариф решает три задачи:

  1. Группировка услуг — один тариф = пакет из 1-N услуг (интернет 100 Мбит + IPTV + статический IP) с заданными ценами;
  2. Автоматическое списание — Celery-задача billing_worker раз в день обходит активных клиентов, выбирает их тариф, проходит по списку услуг и списывает с лицевого счёта;
  3. Применение шейпера — через TarifRadiusParams FreeRADIUS получает атрибут Mikrotik-Rate-Limit или аналог. На NAS включается ограничение скорости.
Структура: Tarif + TarifUsersUsluga
СущностьЧто хранит
tarifИмя тарифа, флаги (IS_BUSINESS, IS_ARCHIVE), ссылки на лояльности, промо-настройки, резервный тариф
TARIF_USERS_USLUGA (TUU)M2M-связка тариф ↔ услуга. Один тариф содержит несколько TUU (по одной на каждую услугу пакета)
TARIF_RADIUS_PARAMSКастомные RADIUS-атрибуты для тарифа (Mikrotik-Rate-Limit, Pool-Name, Idle-Timeout)
TARIF_USERS_USLUGA_FOLLOW«Сопутствующие» услуги — авто-подключаются при смене тарифа (например, IPTV приставка прилипает к тарифу)
Как биллинг использует тариф
  1. Привязка к клиенту: Abonents.TARIF_ID (главное поле), опционально Users.TARIF_ID для специальных учёток;
  2. Ежемесячное списание (billing_worker.py):
    • Берёт abonent.tarif.tarif_tuu.all() — все услуги тарифа;
    • Для каждой услуги ищет соответствующую UsersUsluga у клиента (или создаёт новую);
    • Списывает каскадно: UsersUsluga.summ → usluga.summa → usluga.price (берётся первое заполненное);
    • Создаёт FINANCE_OPERATIONS с op_type=32 (тарифное списание);
  3. RADIUS: при авторизации FreeRADIUS подгружает TarifRadiusParams и отдаёт NAS-у соответствующий шейпер.
Архивирование vs удаление
Специальные сценарии
ПолеСценарий
PROMO_NEXT_ID + PROMO_DAYS или PROMO_MONTHЧерез N дней/месяцев тариф автоматически переключится на PROMO_NEXT (например, после льготного периода)
RESERVE_PLANРезервный тариф если основной недоступен. Используется в сценарии «отключение услуги, но сохранение базовой связи»
INACTIVE_TARIFНа какой тариф переводить клиента, если он не пользуется услугами (по дате ACT_DATE)
OWN_DISABLED_*Параметры добровольной блокировки: на сколько дней/месяцев минимум, какая стоимость в дни паузы
Не путайте Tarif и Usluga. Тариф — это пакет (Интернет 100 Мбит). Usluga — отдельная услуга (Интернет 100 Мбит, ОП, статический IP). Тариф состоит из услуг через TUU. У одной услуги может быть много тарифов, у одного тарифа — много услуг.

Тарифы

Список всех тарифных планов оператора. Открывается из меню Тарификация → Тарифы. Над таблицей — два фильтра по типу клиента: «Бизнес» и «Физ.лица» (по признаку «Для юр.лиц» у тарифа). Рядом — счётчик количества тарифов в текущем фильтре.

Список тарифов: KPI, фильтры, значки медиа
Список тарифов: KPI, фильтры, значки медиа

Над таблицей — KPI по текущему срезу: тарифов в выборке, клиентов на них, средняя абонплата, сколько показывается на сайте и сколько осталось без услуг. Цифры считаются по тому, что видно, поэтому всегда согласованы с фильтрами.

Toolbar над таблицей:

Колонки таблицы:

Сортировка работает по любому столбцу — клик по заголовку. Активная сортировка выделяется синим цветом и стрелкой ▲/▼.

Тарифы и организация

В мультиорганизационном режиме тариф принадлежит компании. Список показывает ровно те тарифы, которые относятся к выбранной в шапке организации: переключили компанию — список пересобрался. Столбец «Орг.» при этом не нужен и скрывается: все строки и так одной компании. Он появляется только когда выбрано «Все организации» — там принадлежность действительно важно видеть.

Организация тарифа задаётся в карточке (вкладка «Основное» → секция «Общее») и определяет, из какой папки-«дома» строится список директорий и куда попадут новые клиенты этого тарифа.

Список тарифов отфильтрован по выбранной организации, столбец «Орг.» скрыт
Список тарифов отфильтрован по выбранной организации, столбец «Орг.» скрыт

Bulk-операции — выберите тарифы галочками, появится плавающий тулбар со следующими действиями: В архив, Из архива, привязка к Линейке, CSV-экспорт выбранных, Удалить. Удаление блокируется на сервере, если у тарифа есть активные клиенты — выводится список ID, которые надо сначала перевести на другой тариф.

Модальное окно тарифа делится на четыре верхних вкладки (Основное / Услуги / RADIUS / Клиенты) и пять секций левой side-nav во вкладке «Основное». В шапке модалки бейдж «Назначено клиентам: N». На мобильном side-nav становится горизонтальным скроллбаром.

Вкладка «Основное» → секция «Общее»

Идентификация тарифа: название, описание, организация, директория, привязка к линейке услуг и оператору связи, флаг «Введён в эксплуатацию», «Архивный», «Отображать на сайте», период действия. Цена считается автоматически по сумме привязанных услуг.

Тариф — Основное
Тариф — Основное
Директория тарифа

Директория — папка, в которую попадают новые клиенты этого тарифа. Поле заняло место «Валюты»: валюта в интерфейсе не использовалась, в базе колонка сохранена.

Карточка тарифа — поле «Директория» на месте валюты
Карточка тарифа — поле «Директория» на месте валюты
Когда поле не работает: раскладка управляется настройкой «Раскладка новых клиентов». В режимах «Только по папке организации» и «Не раскладывать» директория тарифа игнорируется, и карточка помечает поле предупреждением — чтобы оно не выглядело рабочим вхолостую.

Секция «Лимиты»

Объёмы и пороги: лимит трафика (ГБ/мес), число подключений, число VPN-сессий, размер скидки за неиспользование. Используется в комплекте с услугами типа «Трафик».

Тариф — Лимиты
Тариф — Лимиты

Секция «Смена тарифа»

Параметры авто-смены тарифа. Промо-тариф: после N дней или N месяцев клиент переходит на другой тариф автоматически. Сюда же — резервный тариф, на который система переводит клиента при долгой блокировке.

Тариф — Смена тарифа
Тариф — Смена тарифа

Секция «ОП и Доб. блок»

Параметры обещанного платежа (срок в днях, стоимость дня) и добровольной блокировки (минимум и максимум дней). Если поля пустые — функции отключены для этого тарифа.

Тариф — ОП и Доб. блок
Тариф — ОП и Доб. блок

Секция «NAT и прочее»

NAT-пулы (для трансляции серых IP в публичные), параметры RADIUS-атрибутов, дополнительные сетевые настройки. На большинстве тарифов остаётся пустой — заполняется только если используется специфическая сетевая логика.

Тариф — NAT и прочее
Тариф — NAT и прочее

Вкладка «Услуги»

Список услуг, привязанных к этому тарифу. Сюда добавляются абонплата, бонусы по умолчанию, шейпер. Цена тарифа = сумма цен этих услуг (с учётом методов и периодичности).

Тариф — вкладка Услуги
Тариф — вкладка Услуги

Вкладка «RADIUS»

RADIUS-атрибуты, которые попадают в Access-Accept клиентов на этом тарифе: ограничение скорости (Mikrotik-Rate-Limit), ACL (Filter-Id), pool name и т.д. Эти значения уходят на NAS и определяют поведение сети для клиента.

Тариф — вкладка RADIUS
Тариф — вкладка RADIUS

Вкладка «Клиенты»

Список клиентов, которые сейчас на этом тарифе. Можно перейти в карточку кликом по имени, либо массово перевести группу на другой тариф.

Тариф — вкладка Клиенты
Тариф — вкладка Клиенты

Услуги (Usluga) — назначение и роль

Содержание раздела

Услуга (Usluga) — атомарная единица биллинга: то, что списывается со счёта (абонплата, статический IP, IPTV-пакет) или начисляется (бонус, компенсация). Хранится в таблице usluga.

Зачем нужна услуга

Услуга решает три задачи:

  1. Списание с баланса — раз в месяц billing_worker создаёт FinanceOperations на сумму услуги и уменьшает OSTATOK;
  2. Применение скорости через шейпер — поля RATE_IN, RATE_OUT попадают в RADIUS-ответ как Mikrotik-Rate-Limit;
  3. Бонусирование — услуги с отрицательной ценой или системные (system_type) выполняют разные роли: ОП, акции, компенсации.
TUU (шаблон) vs UsersUsluga (экземпляр)
СущностьЧто этоКто создаёт
TARIF_USERS_USLUGA (TUU)Шаблон: «эта услуга входит в этот тариф». Цена в TUU.summ может переопределять usluga.summaАдмин при настройке тарифа
USERS_USLUGA (UU)Экземпляр: «эта услуга подключена этому клиенту с такой даты». Хранит индивидуальные настройкиАвтоматически billing_worker при назначении тарифа, или вручную через карточку клиента

Один usluga может фигурировать в нескольких TUU (для разных тарифов) и иметь много UU (по одной на каждого подписчика). Удаление usluga заблокировано FK PROTECT, если есть хоть один TUU или UU.

Каскад цены

Когда billing_worker списывает абонплату, он берёт цену из первого заполненного источника:

  1. UsersUsluga.summ — индивидуальная скидка/цена для конкретного клиента;
  2. Usluga.summa — стандартная сумма услуги;
  3. Usluga.price — fallback цена (часто за единицу, например за Мбайт трафика).

В UI это видно в списке услуг: если используется fallback, цена подсвечена оранжевым с tooltip «эффективная цена: X ₽ / источник: Usluga.price».

Системные услуги

Несколько услуг имеют особое поведение, защищены от удаления и не показываются в обычных списках:

Usluga IDНазначение
30353«Обещанный платёж (5 дней, 30 руб/день)» — system_type=11. Управляется через ОП-flow в LK / Mobile / SMS
30280Системная служебная услуга — не удаляется
-3, -4Legacy-записи для старого формата ОП — оставлены для совместимости

Поле system=true у услуги — флаг «не показывать клиенту в счётах», даже если списывается.

Что делать со старыми услугами
Найти orphan-услуги (не привязанные ни к одному тарифу и ни к одному клиенту) можно через SQL:
SELECT u.* FROM usluga u
WHERE NOT EXISTS (SELECT 1 FROM "USERS_USLUGA" WHERE "USLUGA_ID"=u."ID" AND "DELETED"=false)
  AND NOT EXISTS (SELECT 1 FROM "TARIF_USERS_USLUGA" WHERE "USLUGA_ID"=u."ID")
  AND u."ID" NOT IN (30353, 30280) AND u."ID" >= 0;
Эти услуги — кандидаты на удаление при чистке БД.

Политики абонентских начислений

Содержание раздела

Политика — правило, по которому услуга сама назначается клиенту при попадании в заданное состояние и снимается при выходе из него. Настраивается на странице /admin/settings/service_policies/, работает ежедневной задачей.

Зачем это нужно

Обычная услуга назначается вручную или при подключении тарифа. Политика закрывает другой случай: «всем, кто попал в такую-то ситуацию, начислять вот это, пока ситуация держится». Классический пример — клиент перестал платить и пользоваться интернетом, но линия и порт на оборудовании продолжают быть закреплёнными за ним.

Механизм универсальный: новая политика настраивается записью в интерфейсе, без изменения кода. Пресеты в галерее задают типовые наборы условий.

Два режима: наблюдение и боевой
РежимЧто делает
Наблюдение (log) Только считает, кто попал бы под политику. Ничего не назначает и не списывает. Список кандидатов кладётся в кэш для сверки, счётчик за каждый день копится в настройке SERVICE_POLICY_LOG_HISTORY (120 дней).
Боевой (active) Назначает услугу при входе в состояние, снимает при выходе, ведёт эскалацию по числу месяцев. Начисление идёт через обычный ежемесячный расчёт.
Перед боевым режимом — месяц наблюдения. Политика затрагивает сразу тысячи клиентов, и ошибка в условиях обходится дорого. Месяц в режиме наблюдения показывает и состав кандидатов, и динамику: сколько людей уходит из состояния само по себе, когда возвращается к оплате.
Из чего состоит политика
ПараметрСмысл
УслугаЧто назначается при входе в состояние.
Условия входаСколько месяцев без платежей и без интернет-сессий, учитывать ли добровольную приостановку, минимальный «возраст» договора.
ЭскалацияЧерез сколько месяцев в состоянии клиент помечается «к расторжению».
ОрганизацияОграничить политику одной организацией или применять ко всем.
РежимНаблюдение или боевой.

Два поля услуги меняют поведение ежемесячного расчёта:

Пресет «Содержание линии»

Услуга «Содержание линии связи и аренда порта при приостановке пользования» — 150 ₽/мес для клиентов, у которых больше двух календарных месяцев нет ни платежей, ни интернет-сессий. Начисляется независимо от баланса; прекращается автоматически, как только клиент возвращается к пользованию. Через шесть месяцев в состоянии — пометка «к расторжению».

Смысл для клиента: линия и порт остаются закреплёнными за ним, номер договора и настройки сохраняются, возобновить услугу можно без повторного подключения.

Как запускается и что проверять
  1. Ежедневная задача в 8:00 (до часа ежемесячных начислений) прогоняет все включённые политики.
  2. Общий выключатель SERVICE_POLICY_ENABLED глушит механизм целиком — задача выходит, не проверяя политики.
  3. Включение боевого режима — два переключателя на странице политик: сам механизм и режим политики.

Что смотреть в режиме наблюдения: число кандидатов и его динамику по дням. Резкий скачок означает, что условия входа задевают не тех, кого задумывали — например, слишком короткий порог по месяцам или неучтённая добровольная приостановка.

Оповещение клиентов — обязательный шаг. Введение платной услуги требует заблаговременного уведомления: сайт, e-mail, личный кабинет, SMS. Пока оповещение не разослано и документы на сайте не обновлены, боевой режим включать нельзя, каким бы готовым ни был механизм.

Медиа тарифа

В карточке тарифа на вкладке «Общее» есть блок «Медиа» — четыре слота: обложка и видео, отдельно для светлой и тёмной темы сайта. Файлы уезжают в GCS, в тарифе хранится только ссылка.

Блок Медиа в карточке тарифа
Блок Медиа в карточке тарифа

Настройка колонок таблицы

Кнопка «Колонки» в тулбаре открывает список колонок: галочками выбирается состав, перетаскиванием строк — порядок. Заголовки в самой таблице тоже перетаскиваются, а правый край заголовка тянется мышью — так меняется ширина.

Модалка настройки колонок
Модалка настройки колонок

Рядом — переключатель плотности строк. Компактный режим срезает вертикальные отступы почти вдвое (строка 53 → 38 px) и даёт на экран на 5-6 записей больше; шрифт при этом не мельче 13 px. Режим тоже запоминается за сотрудником.

Настройка сохраняется в аккаунте сотрудника, а не в браузере — на другом компьютере таблица откроется так же. Колонка с чекбоксом выбора строк и колонка действий не переставляются и не скрываются. Механизм общий: то же поведение получает любая таблица, размеченная как smit-tbl.

На телефоне

На узком экране тулбар сворачивается в строку [поиск] [Фильтры], фильтры уезжают в нижнюю панель, KPI превращаются в горизонтальную ленту, а строки таблицы — в карточки «поле — значение». Кнопка «плюс» внизу справа добавляет тариф.

Список тарифов на телефоне
Список тарифов на телефоне
Панель фильтров на телефоне
Панель фильтров на телефоне

Обложка в карточке

Если у тарифа залита обложка, карточка показывает её сверху: картинку или зацикленный ролик без звука. Ролик включается, только когда карточка попала на экран, — иначе телефон тянул бы десяток видео разом. В тёмной теме подставляется тёмный вариант, если он загружен.

Значок в углу обложки означает, что её можно открыть целиком. Тап открывает обложку отдельным слоем поверх списка: картинка во весь экран, ролик — со звуком и полосой перемотки. Закрывается клавишей Esc, крестиком или тапом мимо. На компьютере обложки в карточках нет: там работает превью при наведении на название.

Карточка тарифа с обложкой
Карточка тарифа с обложкой
Обложка открыта отдельным слоем
Обложка открыта отдельным слоем

Слева — обложка в карточке со значком «развернуть». Справа — она же, открытая слоем: ролик проигрывается с управлением, под ним название тарифа.

Круглая кнопка «плюс» внизу справа запускает не пустую форму, а мастер создания тарифа — тот же, что на компьютере.

Мастер создания тарифа

Кнопка «Мастер» слева в тулбаре списка (на телефоне — круглая кнопка «плюс»). Полная карточка тарифа — это несколько десятков полей: лимиты, смена тарифа, обещанный платёж, NAT. Заполнять их при заведении нового тарифа не нужно — мастер спрашивает только то, без чего тариф не заработает, остальное берёт по умолчанию и остаётся доступным в карточке потом.

💬
Фраза оператора«безлимит 300 Мбит/с,
850 ₽»
→
🤖
Помощникчитает действующий
прайс линейки
→
📝
Шаг 1название, описание,
линейка, организация
→
💰
Шаг 2интернет-услуга
и цена в месяц
→
✅
Шаг 3сводка перед
записью в базу

Помощник заполняет черновик

Поле «Опишите тариф словами» и кнопка «Заполнить». Помощник не придумывает цифры из воздуха: перед ответом он получает действующие тарифы выбранной линейки и организации — их названия, описания и цены. Поэтому черновик попадает в принятый у оператора формат имени, а не выдаёт «Тариф 300 Мбит».

Подсказка под полем меняется вслед за выбором и всегда говорит, на что именно смотрит помощник: «Помощник смотрит на действующий прайс: линейка „Интернет“, „СмИТ“. Проверьте, что получилось.»

Мастер: помощник заполнил название, описание и цену
Шаг 1 после нажатия «Заполнить». Название и описание пришли от помощника, линейка и организация были выбраны заранее.
flowchart LR
    OP["Оператор"] -->|"фраза"| AI["Помощник"]
    PRICE[("Прайс линейки
и организации")] --> AI AI --> DRAFT["Черновик"] DRAFT --> CHECK["Оператор
проверяет"] CHECK --> T[("Тариф")] style PRICE fill:#e8f6ef,stroke:#43b77a,color:#1b1b1b style CHECK fill:#fff3cd,stroke:#f0ad4e,color:#1b1b1b
Черновик — не решение. Помощник опирается на живой прайс, но цену и название всё равно перечитывайте: за то, по чему будут списывать деньги, отвечает оператор, а не подсказка. Линейку, которую вы выбрали, помощник не меняет.

Организация и линейка

Пример: тариф за минуту

  1. Тулбар → «Мастер». В полях уже стоят линейка «Интернет» и организация «СмИТ».
  2. В поле описания — безлимит 300 Мбит/с для частного сектора, 850 ₽, кнопка «Заполнить».
  3. Помощник возвращает черновик — на живых данных это было:
    {
      "name": "2025_SmIT300",
      "comment": "Безлимитный интернет со скоростью до 300 Мбит/с для частного сектора.",
      "range_id": 1,
      "inet_price": 850
    }
    Имя собрано по образцу соседних тарифов линейки (2025_SmIT10, 2025_SmIT20), цена взята из фразы.
  4. «Далее» — шаг 2 подставил интернет-услугу и цену 850 ₽/мес.
  5. «Далее» — шаг 3 показывает всё, что уйдёт в базу. Кнопка «Создать тариф».
Мастер, шаг 2: услуги и цена
Мастер, шаг 2: услуги и цена
Мастер, шаг 3: проверка перед созданием
Мастер, шаг 3: проверка перед созданием

Шаг 2 — что тариф даёт клиенту и почём. Шаг 3 — сводка; до нажатия «Создать тариф» в базе ничего не появляется.

Дальше тариф открывается обычной карточкой: лимиты, правила смены, обещанный платёж и остальное правится там.

Услуги и Бонусы

Список услуг: KPI и колонка организации
Список услуг: KPI и колонка организации

У услуги есть организация. Пустое значение означает «общая услуга» — её видят все организации. Сотрудник видит свои услуги плюс общие: при включённой изоляции персонала чужой прайс в списке не показывается. Колонка «Орг.» появляется только при мультиорге.

Организация в карточке услуги
Организация в карточке услуги

При смене организации у тарифа его услуги переезжают вместе с ним — кроме тех, что используются тарифами других организаций. Перенос показывается в подтверждении и попадает в журнал.

Услуги — то, что списывается с лицевого счёта (абонплата, доп. услуги, разовые работы). Бонусы — то, что начисляется на счёт (компенсации, скидки, акции). Для оператора это один справочник, разделённый по знаку суммы и типу.

Список услуг
Список услуг

Toolbar:

Колонки таблицы:

Системные услуги с фиксированными ID удалить нельзя — они используются ядром биллинга для обещанных платежей, бонусов и блокировок трафика.

Модальное окно услуги делится на 6 секций (вертикальная навигация слева). Открывается кликом по карандашу в строке списка.

Секция «Основные»

Название, тип услуги (трафик / IP-телевидение / стандартный / бонус / обещанный платёж / системный), цена, валюта, тип абонплаты (помесячно / разово / детализированно). Также — флаг «Включена», описание для оператора.

Услуга — Основные
Услуга — Основные

Секция «Периодичность»

Когда и какими долями списывается услуга. Правило собирается из галок этой секции и «Метода списания» со вкладки «Основные»; итог показан словами в зелёной плашке над галками — там же видно, что именно посчитает биллинг.

Периодику включают галки. «Метод списания» сам по себе её не включает: он лишь уточняет шаг там, где периодика уже включена. Так сделано намеренно — в базе метод и галки исторически разошлись (например, услуги с методом «Разово» фактически списываются ежемесячно), и если бы главным стал метод, часть начислений просто прекратилась бы.

НастройкаЧто делает
Периодическая (1 раз в месяц) Регулярное списание. Шаг берётся из «Метода списания»: Ежемесячно — раз в месяц, Ежечасно / Ежедневно / Ежегодно — соответственно, Ежемесячно равными долями в день — месячная цена делится на дни.
Списывать ежедневно Каждый день списывается указанная сумма (не делится). Чтобы делить месячную цену на дни, выберите метод «Ежемесячно равными долями в день».
Авансовое списание (начало месяца) 1-го числа за наступающий месяц. Период дописывается в описание операции («Абонплата: Интернет (за сентябрь 2026)»).
Постоплатное (конец месяца) В последний день месяца за прожитый период. Если выбраны обе галки — работает аванс, форма об этом предупреждает.
Деактивировать при недостатке средств Списание, уводящее счёт ниже порога отключения, не выполняется: услуга выключается, клиенту уходит сообщение, событие пишется в аудит. Порог берётся из лицевого счёта («Порог отключения», «Не отключать при превышении порога»); если порог не задан — правило «не уходить в минус».
Не списывать абон.плату пока услуга активна Тарифная абонплата приостанавливается, пока услуга активна — так работает «Содержание линии связи».
Сдвигать дату следующего списания Списание привязано ко дню подключения, а не к 1-му числу: подключили 17-го — следующее 17-го числа следующего месяца. Короткие месяцы учитываются: 31-е превращается в 30-е или 28-е.

Равными долями. Месячная цена делится на число дней текущего месяца, поэтому за февраль и за март клиент платит одинаково, а при подключении в середине месяца — только за прожитые дни. Остаток от деления раздаётся первым дням месяца, чтобы за месяц вышла ровно месячная сумма.

Правило целиком описано в billing/services/charge_schedule.py — им пользуются и ежедневный прогон биллинга, и смена тарифа, и ручное подключение услуги в карточке клиента, поэтому дата первого списания везде одна и та же.

Услуга — Периодичность
Услуга — Периодичность

Секция «ЛК клиента»

Отображение услуги в личном кабинете клиента: видимое имя, иконка, описание, флаг «Доступна для подключения через ЛК» (клиент может сам её включить), флаг «Видна» (только показывать без возможности изменения).

Услуга — ЛК
Услуга — ЛК

Секция «Скидки»

Условия скидок при подключении услуги: фиксированная сумма / процент, условия применения (для определённых тарифов или типов клиентов), даты действия скидки.

Услуга — Скидки
Услуга — Скидки

Секция «Шейпер»

Параметры ограничения скорости (только для услуг типа «Трафик»). RX/TX скорости, burst-параметры, размер очереди. Эти значения попадают в RADIUS-атрибут Mikrotik-Rate-Limit или аналогичный для других вендоров.

Услуга — Шейпер
Услуга — Шейпер

Секция «Связи»

Привязка к подсети (Tariff Ruleset — для специальной тарификации в локальной сети) и к типу услуги (используется в RADIUS-фильтре и СОРМ-выгрузке).

Услуга — Связи
Услуга — Связи

Правила и сети

URL: /admin/tarifs/TarifRuleset/

Правило сети отвечает на вопрос «что клиенту доступно и на каких условиях, когда обычный интернет ему уже не положен». Самый частый случай — нулевой баланс: интернет закрыт, но личный кабинет, сайт банка и госуслуги должны открываться, иначе клиент не сможет заплатить и вернуть связь.

Что в правиле работает, а что нет. Поля «Цена входящего», «Цена исходящего» и «Лимит» относятся к повременной тарификации трафика по подсетям, которая в текущей версии не используется, поэтому эти поля стоят пустыми у всех правил. Рабочая часть правила — условия: список адресов и действие для каждого. Их и выгружают в белый список портала.

Путь от правила до клиента

📋
Правило«Льготные сайты»
приоритет 100
→
🔢
Условияадрес + действие,
сверху вниз
→
📤
Выгрузка в ACLкнопка на вкладке
«Применение»
→
🛡
ACL-группа«Отрицат. баланс»
24 адреса
→
🙋
Клиент в минусевидит только
эти адреса

Ключевой шаг здесь — выгрузка. Пока разрешающие условия не уехали в ACL-группу, правило остаётся описанием на бумаге: страница-заглушка читает именно группу, а не таблицу правил.

flowchart LR
    OP["Оператор"] --> C[("Условия
правила")] C -->|"«Выгрузить в ACL»
только «открыть»"| ACL[("ACL-группа")] ACL --> PP["Captive Portal"] --> USER["Клиент в минусе"] C -.->|"без выгрузки"| NONE["Не применяется"] style NONE fill:#fff3cd,stroke:#f0ad4e,color:#1b1b1b style ACL fill:#e8f6ef,stroke:#43b77a,color:#1b1b1b
Выгрузка не затирает ручные адреса. Записи, созданные правилом, помечены в комментарии меткой [rule:N]. При повторной выгрузке удаляются и создаются заново только они — адреса, которые оператор добавил в группу руками, остаются на месте.

Список правил

Список правил сети
Статус — кружок (зелёный работает, серый выключено), дальше название, организации и описание. Справа — счётчики условий и услуг.
КолонкаЧто показывает
СтатусКружок: зелёный — правило применяется, серый — выключено. Подпись доступна в подсказке и голосом скринридера. Скрыть колонку нельзя
Орг.Организации, за которыми закреплено правило (единый бейдж). Прочерк — правило общее, его видят все. Скрыть колонку нельзя
УсловийСколько адресов описано в правиле; в подсказке — сколько из них разрешающих
УслугСколько услуг ссылается на правило. Пока счётчик не нулевой, удалить правило нельзя
Вх. ₽ · Исх. ₽ · ЛимитНаследие повременной тарификации, у всех правил пусто. Колонки можно скрыть

Колонки, плотность строк и их порядок настраиваются кнопками справа от поиска и сохраняются в профиле сотрудника, а не в браузере — на другом компьютере список выглядит так же.

Менеджер колонок
Колонки «Статус», «Название», «Орг.» и «Действ» помечены как обязательные: без них строка перестаёт что-либо значить.

Условия правила

Условие — это одна строка списка доступа: тип адреса, сам адрес и что с ним делать. Порядок важен так же, как на сетевом железе: проверка идёт сверху вниз, и решает первое подошедшее условие. Поэтому частные адреса держат выше общих, а строки можно двигать стрелками, не пересоздавая правило.

Конструктор условий правила
Вкладка «Условия»: адрес, действие, комментарий «зачем открыт». Каждое условие сохраняется сразу, отдельной кнопкой «Сохранить» пользоваться не нужно.
Тип адресаЧто принимаетПример
Подсеть / IPАдрес или сеть в формате CIDR10.0.0.0/24, 93.158.134.3
ДоменИмя хоста; протокол и путь отбрасываются при сохраненииlk.вашдомен.ru
Адрес страницыПолный URL, обязательно с http:// или https://https://вашдомен.ru/pay
ДействиеЧто означает
Открыть бесплатноАдрес доступен даже при закрытом интернете. Только такие условия уезжают в ACL-группу
Тарифицировать по ценам правилаТрафик считается по ценам из вкладки «Правило». Работает только там, где включён повременной учёт
Отправить на страницу-заглушкуЗапрос к адресу перенаправляется на портал (HTTP-адрес правила)
ЗапретитьАдрес закрыт независимо от остальных правил

Адрес проверяется при сохранении: 10.0.0.300 и «сайт банка» не пройдут — оператор увидит подсказку с примером вместо молчаливо испорченного списка доступа.

Вкладка «Применение»

Вкладка «Применение» — ACL-группа и приоритет
Вкладка «Применение» — ACL-группа и приоритет

Действия со строкой

Меню действий строки
Меню действий строки
Копия правила
Копия — это новая запись: исходное правило не меняется, а на вкладке «Условия» видно, что они приедут вместе с ним после сохранения.

Массовые действия и общая таблица

Списки «Правила и сети» и «Программы лояльности» работают на одном табличном компоненте: одинаковые чекбоксы, одинаковая панель действий, одинаковый менеджер колонок и одинаковое поведение на телефоне.

flowchart LR
    SEL["Отметили
строки"] --> BAR["Панель
действий"] --> ACT{"Вкл · Выкл
Удалить"} ACT --> CONF["Подтверждение:
что будет + 5 имён"] CONF -->|"Отмена"| BACK["Без изменений"] CONF -->|"Да"| SRV["Сервер применяет"] SRV --> SKIP["Занятые
пропущены"] --> TOAST["Сделано N,
пропущено M"] SRV --> LOG[("Аудит")] style CONF fill:#e8f6ef,stroke:#43b77a,color:#1b1b1b style SKIP fill:#fff3cd,stroke:#f0ad4e,color:#1b1b1b
Панель массовых действий
Панель появляется, когда выбрана хотя бы одна строка, и показывает, сколько записей отмечено.

Подтверждение всегда объясняет что произойдёт и перечисляет первые пять выбранных записей — оператор видит, что именно он отметил, а не только количество.

Подтверждение массового действия
Подтверждение массового действия
Занятые записи сервер не трогает. Правило, на которое ссылаются услуги, и программа с действующими подключениями клиентов не удаляются даже в массовом действии: они возвращаются списком пропущенных, и оператор видит, сколько записей осталось нетронутыми и почему.

На телефоне

Таблица разбирается на карточки: подписи полей берутся из шапки, служебные колонки и чекбоксы скрываются (массовые операции — работа за компьютером), поиск и кнопка добавления делят одну строку.

Правила и сети на телефоне
Правила и сети на телефоне
Программы лояльности на телефоне
Программы лояльности на телефоне

Слева правила, справа программы лояльности: одинаковые карточки, кнопка действий в конце карточки.

Карты оплаты

Пункт «Карты оплаты» убран из меню раздела (решение от 24.08.2026): картами никто не пополняет, в базе остались шесть серий и три карты из старого биллинга. Страница и данные на месте — она открывается по прямой ссылке /admin/tarifs/CardSeries/, и пункт меню возвращается одной строкой в MENU_LIST.

Серии бумажных карт оплаты с PIN-кодами. Каждая серия — это пакет карт номинала N₽ с уникальными PIN. Клиент пополняет счёт, введя PIN в личном кабинете или через кассу.

Карты оплаты
Карты оплаты

Серия определяется: имя серии, номинал, количество карт, дата выпуска, дата окончания действия. PIN-коды генерируются автоматически и выгружаются в PDF/CSV для печати.

Программы лояльности — назначение и роль

Содержание раздела

Программа лояльности — механизм скидок, акций и спец-условий для группы клиентов. Реализуется двумя моделями: Loyaltys (сама программа = шаблон) и AbonentsLoyalty (привязка клиента к программе = экземпляр).

Зачем нужна лояльность

Программы решают четыре задачи:

  1. Скидки — социальные тарифы (пенсионеры, многодетные), корпоративные скидки, акции «приведи друга»;
  2. Спец-условия для группы — например, «жильцы дома №15 платят на 100 ₽ меньше за интернет» (распределённая по адресу программа);
  3. Бонусы за продление — «оплатил год вперёд → 10% скидка»;
  4. Учёт в финансовых отчётах — отдельная строка «Скидки по программам лояльности».
Модели
МодельЧто хранит
Loyaltys
(шаблон)
Список самих программ. Поля: name, comment, priority, operator (FK на Abonents-папку с операторами), usluga_range (FK на UslugaRangeTypes), discount_percent, bonus_amount, recurring (ежемесячно), enabled
AbonentsLoyalty
(экземпляр)
Привязки «клиент ↔ программа». Поля: abonent (FK CASCADE), loyalty (FK CASCADE), start_date, end_date (NULL = активна), processed_date, next_date (для beat-задач списания)
Приоритет и применение

Один клиент может попасть в несколько программ одновременно (например: пенсионер + жилец акционного дома). При начислении скидки выбирается одна:

Связь с линейками услуг

Поле Loyaltys.usluga_range (FK на UslugaRangeTypes) ограничивает применимость:

Что делать со старыми программами
Где видеть программы клиента: в карточке клиента → вкладка «Лояльность». Там список с цветными бейджами по приоритету, дата начала/окончания, остатки бонусов. В UI /admin/tarifs/Loyaltys/ — список всех программ с количеством активных привязок.

Программы лояльности

URL: /admin/tarifs/Loyaltys/

Программа лояльности — это скидка или бонус для определённой группы клиентов: скидка за стаж, социальный тариф, многоквартирный дом, «приведи друга». Скидка применяется автоматически при ежемесячном списании.

Список программ лояльности
Статус кружком, организации бейджем, дальше вознаграждение, линейка услуг, приоритет и число клиентов на программе.
flowchart LR
    L["Программа
скидка % / бонус ₽"] --> R{"Линейка
услуг"} R -->|"задана"| ONLY["Только её услуги"] --> AB R -->|"пусто"| ALL["Все услуги"] --> AB["Клиент
на программе"] AB --> BW["Списание
1-го числа"] --> SUM["Сумма
со скидкой"] ST(["Выключена"]) -.->|"скидка не применяется,
клиенты остаются"| BW style SUM fill:#e8f6ef,stroke:#43b77a,color:#1b1b1b style ST fill:#f1f3f5,stroke:#adb5bd,color:#1b1b1b
КолонкаЧто показывает
СтатусКружок: зелёный — программа действует, серый — выключена. Выключение не снимает клиентов с программы, скидка просто перестаёт применяться. Скрыть колонку нельзя
Орг.Организации, в которых действует программа; прочерк — во всех. Скрыть колонку нельзя
Скидка / БонусПроцент или фиксированная сумма; иконка повтора — скидка применяется ежемесячно
ЛинейкаКаким услугам достаётся скидка (см. Линейки услуг)
Приор.Чем выше число, тем раньше применяется программа: ≥100 — красный, ≥50 — оранжевый
КлиентыДействующих подключений. Клик открывает вкладку «Клиенты» карточки программы

Действия со строкой

Меню действий программы
Меню действий программы
Копия программы лояльности
Копия удобна, когда нужна та же скидка для другой организации или линейки: параметры переносятся, остаётся поправить название и одно-два поля.
Массовые действия в лояльности
Массовые действия те же, что в правилах сети: включить, выключить, удалить.
Карточка программы. Вкладка «Параметры» — сама программа (название, организации, линейка, тип вознаграждения, периодичность, статус). Вкладка «Клиенты» — участники: поиск, массовое назначение по фильтру (тариф, папка, стаж, даты) и снятие. Назначить программу конкретному клиенту можно и из его карточки, вкладка «Лояльность».

Линейки услуг

Линейка услуг (модель UslugaRangeTypes) — это группа тарифов и услуг одного оператора связи или одной целевой аудитории. Линейка решает две задачи: логически разграничить тарифные планы между юр.лицами-операторами на одной инсталляции биллинга и технически ограничить, какие тарифы попадают в выпадающие списки в личном кабинете клиента и в программах лояльности.

Линейки услуг
Линейки услуг

Примеры использования

Модальное окно «Добавить / Редактировать линейку»

Открывается кнопкой «Линейка» в правом верхнем углу списка или иконкой карандаша в строке таблицы (urtModal в шаблоне usluga_range_types_list.html). Поля:

Сохранение через POST /admin/tarifs/range_types_crud/ (или /<id>/ для редактирования). Удаление — DELETE /admin/tarifs/range_types_crud/<id>/; защищено: если на линейку ссылается хотя бы один тариф или программа лояльности, сервер вернёт ошибку с понятным текстом.

Список линеек

Список линеек услуг: KPI, чипы, колонки
Список линеек услуг: KPI, чипы, колонки

Над таблицей — KPI по текущему срезу: линеек в срезе, включено, тарифов в линейках, программ лояльности и линеек без тарифов. Ниже — чипы Все · Включённые · Выключенные · С тарифами · Пустые · С лояльностью со счётчиками.

КолонкаЧто показывает
Статускружок: зелёный — линейка включена, серый — выключена. Выключенную линейку не предлагают при создании тарифа
Названиеиконка направления и заголовок линейки
Орг.бейдж организации; пусто — линейка общая, её видят все (см. 2.7.3)
Тарифовсчётчик Tarif.usluga_range_type_id. Зелёный, если есть привязки; серый — линейка пустая
Лояльностисчётчик Loyaltys.usluga_range_id, жёлтый бейдж при наличии программ
Действ.меню строки: правка, включить/выключить, удаление с проверкой ссылок

Поиск — Ctrl+K, кнопка CSV выгружает видимый срез. Набор колонок и сохранённые виды — как во всех списках раздела (2.7). На телефоне строки превращаются в карточки.

Связи и где используется

Общие приёмы раздела

Пять списков раздела — тарифы, услуги, правила, программы лояльности и линейки — собраны на одних и тех же деталях. Разобравшись с ними один раз, вы работаете одинаково во всех пяти.

Срез: чипы, KPI, поиск, выгрузка

Единый тулбар списка: KPI, виды, чипы
Программы лояльности. Сверху KPI по срезу, под ними полоса сохранённых видов, ниже — чипы со счётчиками и шестерёнка настройки набора.

Сохранённые виды

Оператор изо дня в день возвращается к одним и тем же выборкам: «скидочные программы», «правила без условий», «тарифы партнёрской компании на сайте». Чипы и поиск сбрасываются при уходе со страницы, и срез приходится собирать заново. Вид — это имя плюс состояние страницы: какие чипы нажаты, что в поиске, какая линейка выбрана.

🔎
Собрали срезчипы + поиск
+ линейка
→
➕
«Вид»дали имя
срезу
→
👤
Профильвид хранится
за сотрудником
→
📌
Открываетсякликом или сразу
при заходе
Полоса сохранённых видов над чипами
Виды стоят над чипами и выглядят иначе: чип — разовый фильтр, вид — сохранённый набор. Кнопка «+ Вид» сохраняет текущий срез.

У активного вида справа появляется меню:

Меню действий с видом
Меню действий с видом
ПунктЧто делает
Обновить текущим срезомперезаписывает вид тем, что сейчас на экране
Переименоватьменяет имя, срез остаётся прежним
Открывать по умолчаниювид применяется сразу при заходе на страницу. Такой вид один: у остальных признак снимается
Удалить видубирает только сохранённый срез — записи списка не трогает

Повторный клик по активному виду снимает его и возвращает полный список.

Пример: срез «Скидочные программы»
  1. Программы лояльности → чип «Скидка %».
  2. «+ Вид» → имя Скидочные программы → «Сохранить».
  3. Назавтра открываете раздел и жмёте чип с этим именем — срез на месте. Если это ваш основной срез, отметьте в меню вида «Открывать по умолчанию»: страница будет открываться сразу с ним.
Где это живёт. Виды хранятся в профиле сотрудника (UserProfile.ui_prefs), а не в браузере: на другом компьютере они те же. На страницу — до 20 видов. Endpoint — /admin/ui/views/ (GET список, POST сохранить, DELETE удалить).
Вид не расширяет доступ. Это личная настройка отображения: какие записи попадут в срез, решает вьюха списка со своим ограничением по организации. Сохранённый вид не покажет чужие данные.

Организация — это право, а не фильтр

У каждой записи справочников раздела — тарифа, услуги, правила, программы, линейки — может быть организация. Пустое поле означает общая запись: её видят все. Заполненное — запись принадлежит компании, и чужой сотрудник её не получит.

flowchart LR
    U["Сотрудник
организации"] --> Q{"Чья запись?"} Q -->|"своя"| OK["Видит и правит"] Q -->|"пусто"| OK Q -->|"чужая"| NO["404"] style OK fill:#e8f6ef,stroke:#43b77a,color:#1b1b1b style NO fill:#f8d7da,stroke:#dc3545,color:#1b1b1b
Что делает сотрудникСвоя записьОбщаяЧужая
Видит в спискедаданет
Открывает по прямой ссылкедада404
Правит, включает, удаляетдада404
Попадает в массовое действиедаданет
Почему 404, а не «нет прав». Ответ «403» подсказал бы, что запись с таким номером существует. По коду ответа не должно быть видно, есть ли у соседней компании такой тариф, — поэтому чужая и несуществующая запись отвечают одинаково.

Ограничение действует и на массовые действия: в набор берутся только доступные записи, чужие идентификаторы отсекаются на сервере, даже если их подставить в запрос руками.

Пример

Программа «Скидка за стаж 5 лет» принадлежит первой организации, «Многоквартирный дом» — второй. Сотрудник второй видит в списке свою программу и все общие; ссылка на чужую отдаёт 404. Если он выделит обе строки и нажмёт «Выключить», сервер выключит только свою.

Меню действий строки

Иконки действий в конце строки собраны в одно меню — на компьютере это экономит место, на телефоне иначе просто не помещается. Меню рисуется поверх таблицы, поэтому его не режет горизонтальный скролл.

Меню действий строки тарифа
Меню действий строки тарифа
ПунктЧто делает
Редактироватьоткрывает модалку — то же, что клик по названию. Правка одной цены не требует перезагрузки страницы
Полная формауводит на карточку со всеми полями: лимиты, NAT, правила смены тарифа. Нужна редко
Дублировать / Копироватьсоздаёт копию. У правил сети копируются и условия, у программ — параметры скидки
Включить / Выключитьпереводит запись в рабочее состояние и обратно, не удаляя её
В архивтариф пропадает из выбора при подключении, клиенты и история остаются
Удалитьзаблокировано, пока на записи висят клиенты или ссылки; подсказка объясняет, что мешает

Колонки и закреплённые поля

Состав, порядок и ширина колонок настраиваются кнопкой «Колонки» и сохраняются в профиле — подробно в 2.1.2.

Окно выбора колонок с закреплёнными
Окно выбора колонок с закреплёнными

Часть колонок помечена «(обязательная)» и не скрывается: колонка «Выбор строк» с чекбоксами, статус, организация и действия. Без них список перестаёт быть рабочим: пропадает возможность выделить строки, понять, работает запись или нет, и чья она.