Граф Wiki

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

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

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

2. Тарификация

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

Обучающее видео 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. У одной услуги может быть много тарифов, у одного тарифа — много услуг.

2.1. Тарифы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тариф — Основное

Директория тарифа

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

Карточка тарифа — поле «Директория» на месте валюты

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вкладка «RADIUS»

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

Тариф — вкладка 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. Пока оповещение не разослано и документы на сайте не обновлены, боевой режим включать нельзя, каким бы готовым ни был механизм.

2.1.1. Медиа тарифа

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

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

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

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

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

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

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

2.1.3. На телефоне

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

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

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

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

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

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

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

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

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

Кнопка «Мастер» слева в тулбаре списка (на телефоне — круглая кнопка «плюс»). Полная карточка тарифа — это несколько десятков полей: лимиты, смена тарифа, обещанный платёж, 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 style CHECK fill:#fff3cd,stroke:#f0ad4e
Черновик — не решение. Помощник опирается на живой прайс, но цену и название всё равно перечитывайте: за то, по чему будут списывать деньги, отвечает оператор, а не подсказка. Линейку, которую вы выбрали, помощник не меняет.

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

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

  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: услуги и цена Мастер, шаг 3: проверка перед созданием

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

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

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

Список услуг: 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-фильтре и СОРМ-выгрузке).

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

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

URL: /admin/tarifs/TarifRuleset/

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

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

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

📋
Правило«Льготные сайты»
приоритет 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 style ACL fill:#e8f6ef,stroke:#43b77a
Выгрузка не затирает ручные адреса. Записи, созданные правилом, помечены в комментарии меткой [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-группа и приоритет

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

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

Копия правила

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

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

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

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 style SKIP fill:#fff3cd,stroke:#f0ad4e

Панель массовых действий

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

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

Подтверждение массового действия

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

На телефоне

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

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

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

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

Пункт «Карты оплаты» убран из меню раздела (решение от 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/ — список всех программ с количеством активных привязок.

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

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 style ST fill:#f1f3f5,stroke:#adb5bd
КолонкаЧто показывает
СтатусКружок: зелёный — программа действует, серый — выключена. Выключение не снимает клиентов с программы, скидка просто перестаёт применяться. Скрыть колонку нельзя
Орг.Организации, в которых действует программа; прочерк — во всех. Скрыть колонку нельзя
Скидка / БонусПроцент или фиксированная сумма; иконка повтора — скидка применяется ежемесячно
ЛинейкаКаким услугам достаётся скидка (см. 2.6. Линейки услуг)
Приор.Чем выше число, тем раньше применяется программа: ≥100 — красный, ≥50 — оранжевый
КлиентыДействующих подключений. Клик открывает вкладку «Клиенты» карточки программы

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

Меню действий программы

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

Копия удобна, когда нужна та же скидка для другой организации или линейки: параметры переносятся, остаётся поправить название и одно-два поля.

Массовые действия в лояльности

Массовые действия те же, что в правилах сети: включить, выключить, удалить.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Единый тулбар списка: KPI, виды, чипы

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

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

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

🔎
Собрали срезчипы + поиск
+ линейка
«Вид»дали имя
срезу
👤
Профильвид хранится
за сотрудником
📌
Открываетсякликом или сразу
при заходе

Полоса сохранённых видов над чипами

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

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

Меню действий с видом

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

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

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

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

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

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

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

Пример

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

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

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

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

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

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

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

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

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