Тарифы и услуги
Тарифные планы и услуги, правила и наборы, серии карт оплаты, программа лояльности и диапазоны услуг.
Содержание раздела
- Тарифы — назначение и роль
- 2.1. Тарифы
- Услуги (Usluga) — назначение и роль
- Политики абонентских начислений
- 2.1.1. Медиа тарифа
- 2.1.2. Настройка колонок таблицы
- 2.1.3. На телефоне
- 2.1.4. Мастер создания тарифа
- 2.2. Услуги и Бонусы
- 2.3. Правила и сети
- 2.4. Карты оплаты
- Программы лояльности — назначение и роль
- 2.5. Программы лояльности
- 2.6. Линейки услуг
- 2.7. Общие приёмы раздела
2. Тарификация
Раздел меню «Тарификация» содержит всё, что связано с услугами, которые получают клиенты, и правилами их тарификации.
Чем тариф отличается от услуги, откуда берётся цена в счёте, зачем нужны линейки и почему правило сети не работает без выгрузки в ACL.
Тарифы — назначение и роль
Содержание раздела
Тариф (Tarif) — это шаблон услуг и цен, которые получает клиент после подключения. Хранится в таблице tarif, редактируется на /admin/tarifs/Tarif/.
Зачем нужен тариф
Тариф решает три задачи:
- Группировка услуг — один тариф = пакет из 1-N услуг (интернет 100 Мбит + IPTV + статический IP) с заданными ценами;
- Автоматическое списание — Celery-задача
billing_workerраз в день обходит активных клиентов, выбирает их тариф, проходит по списку услуг и списывает с лицевого счёта; - Применение шейпера — через
TarifRadiusParamsFreeRADIUS получает атрибут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 приставка прилипает к тарифу) |
Как биллинг использует тариф
- Привязка к клиенту:
Abonents.TARIF_ID(главное поле), опциональноUsers.TARIF_IDдля специальных учёток; - Ежемесячное списание (
billing_worker.py):- Берёт
abonent.tarif.tarif_tuu.all()— все услуги тарифа; - Для каждой услуги ищет соответствующую
UsersUslugaу клиента (или создаёт новую); - Списывает каскадно:
UsersUsluga.summ → usluga.summa → usluga.price(берётся первое заполненное); - Создаёт
FINANCE_OPERATIONSсop_type=32(тарифное списание);
- Берёт
- RADIUS: при авторизации FreeRADIUS подгружает
TarifRadiusParamsи отдаёт NAS-у соответствующий шейпер.
Архивирование vs удаление
IS_ARCHIVE=true— тариф недоступен для назначения новым клиентам, но текущие подписчики продолжают на нём работать. Это правильный путь для устаревших тарифов;- Удаление — почти невозможно, FK
PROTECTблокирует если есть хоть один клиент или один TUU. Можно удалять только если 0 ссылок; - Перевод клиентов на новый тариф — массовое действие в глобальном поиске
/admin/Abonents/search/(chip «Тариф» + bulk actionchange_tarif).
Специальные сценарии
| Поле | Сценарий |
|---|---|
PROMO_NEXT_ID + PROMO_DAYS или PROMO_MONTH | Через N дней/месяцев тариф автоматически переключится на PROMO_NEXT (например, после льготного периода) |
RESERVE_PLAN | Резервный тариф если основной недоступен. Используется в сценарии «отключение услуги, но сохранение базовой связи» |
INACTIVE_TARIF | На какой тариф переводить клиента, если он не пользуется услугами (по дате ACT_DATE) |
OWN_DISABLED_* | Параметры добровольной блокировки: на сколько дней/месяцев минимум, какая стоимость в дни паузы |
2.1. Тарифы
Список всех тарифных планов оператора. Открывается из меню Тарификация → Тарифы. Над таблицей — два фильтра по типу клиента: «Бизнес» и «Физ.лица» (по признаку «Для юр.лиц» у тарифа). Рядом — счётчик количества тарифов в текущем фильтре.

Над таблицей — KPI по текущему срезу: тарифов в выборке, клиентов на них, средняя абонплата, сколько показывается на сайте и сколько осталось без услуг. Цифры считаются по тому, что видно, поэтому всегда согласованы с фильтрами.
Toolbar над таблицей:
- Поиск по имени, описанию или ID тарифа. Шорткат Ctrl+K ставит фокус в поле.
- Кнопка «Компактный вид» уменьшает плотность строк и скрывает столбец «Описание».
- Кнопка «CSV» экспортирует видимый срез (с учётом фильтра Бизнес/Физ.лица, поиска и линейки).
- Кнопка «Добавить тариф» открывает модальное окно нового тарифа.
Колонки таблицы:
- Название с подсказкой ID при наведении.
- Цена в рублях.
- Линейка услуг (см. 1.6).
- Юр.лиц — иконка ✓ если тариф предназначен только организациям.
- Клиенты: основное число + красный ▼N (заблокированные). Tooltip разворачивает разбивку Активных / Заблокированных / Всего.
- Привязок — сколько услуг привязано к тарифу.
- Действия: ✏ редактировать, 🗑 удалить (заблокировано если есть активные клиенты).
Сортировка работает по любому столбцу — клик по заголовку. Активная сортировка выделяется синим цветом и стрелкой ▲/▼.
Тарифы и организация
В мультиорганизационном режиме тариф принадлежит компании. Список показывает ровно те тарифы, которые относятся к выбранной в шапке организации: переключили компанию — список пересобрался. Столбец «Орг.» при этом не нужен и скрывается: все строки и так одной компании. Он появляется только когда выбрано «Все организации» — там принадлежность действительно важно видеть.
Организация тарифа задаётся в карточке (вкладка «Основное» → секция «Общее») и определяет, из какой папки-«дома» строится список директорий и куда попадут новые клиенты этого тарифа.

Bulk-операции — выберите тарифы галочками, появится плавающий тулбар со следующими действиями: В архив, Из архива, привязка к Линейке, CSV-экспорт выбранных, Удалить. Удаление блокируется на сервере, если у тарифа есть активные клиенты — выводится список ID, которые надо сначала перевести на другой тариф.
Модальное окно тарифа делится на четыре верхних вкладки (Основное / Услуги / RADIUS / Клиенты) и пять секций левой side-nav во вкладке «Основное». В шапке модалки бейдж «Назначено клиентам: N». На мобильном side-nav становится горизонтальным скроллбаром.
Вкладка «Основное» → секция «Общее»
Идентификация тарифа: название, описание, организация, директория, привязка к линейке услуг и оператору связи, флаг «Введён в эксплуатацию», «Архивный», «Отображать на сайте», период действия. Цена считается автоматически по сумме привязанных услуг.

Директория тарифа
Директория — папка, в которую попадают новые клиенты этого тарифа. Поле заняло место «Валюты»: валюта в интерфейсе не использовалась, в базе колонка сохранена.
- Список папок строится от папки-«дома» организации тарифа: корень и всё, что внутри него, с отступами по уровню вложенности. Так видно, что «Подъезд №1» лежит внутри ЖК, а не сам по себе;
- Если у тарифа своей директории нет, поле показывает папку его организации — это и есть значение по умолчанию, пока в карточке ничего не сохраняли;
- Смена организации в карточке очищает выбор и подтягивает папку новой компании: прежняя директория к ней не относится;
- Тариф без директории раскладку не меняет — клиент уходит в папку организации.

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

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

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

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

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

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

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

Услуги (Usluga) — назначение и роль
Содержание раздела
Услуга (Usluga) — атомарная единица биллинга: то, что списывается со счёта (абонплата, статический IP, IPTV-пакет) или начисляется (бонус, компенсация). Хранится в таблице usluga.
Зачем нужна услуга
Услуга решает три задачи:
- Списание с баланса — раз в месяц
billing_workerсоздаётFinanceOperationsна сумму услуги и уменьшаетOSTATOK; - Применение скорости через шейпер — поля
RATE_IN,RATE_OUTпопадают в RADIUS-ответ какMikrotik-Rate-Limit; - Бонусирование — услуги с отрицательной ценой или системные (
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 списывает абонплату, он берёт цену из первого заполненного источника:
UsersUsluga.summ— индивидуальная скидка/цена для конкретного клиента;Usluga.summa— стандартная сумма услуги;Usluga.price— fallback цена (часто за единицу, например за Мбайт трафика).
В UI это видно в списке услуг: если используется fallback, цена подсвечена оранжевым с tooltip «эффективная цена: X ₽ / источник: Usluga.price».
Системные услуги
Несколько услуг имеют особое поведение, защищены от удаления и не показываются в обычных списках:
| Usluga ID | Назначение |
|---|---|
30353 | «Обещанный платёж (5 дней, 30 руб/день)» — system_type=11. Управляется через ОП-flow в LK / Mobile / SMS |
30280 | Системная служебная услуга — не удаляется |
-3, -4 | Legacy-записи для старого формата ОП — оставлены для совместимости |
Поле system=true у услуги — флаг «не показывать клиенту в счётах», даже если списывается.
Что делать со старыми услугами
- Не используется ни в TUU, ни в UU — кандидат на удаление. Можно удалять через UI;
- Используется в TUU — сначала уберите её из тарифов (или архивируйте тарифы);
- Используется в UU — отвяжите от клиентов или дождитесь пока услуга выключится по сроку;
- Системные (id 30353/30280) — не удалять никогда, потеря этих записей сломает ОП и системные функции.
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 ₽/мес для клиентов, у которых больше двух календарных месяцев нет ни платежей, ни интернет-сессий. Начисляется независимо от баланса; прекращается автоматически, как только клиент возвращается к пользованию. Через шесть месяцев в состоянии — пометка «к расторжению».
Смысл для клиента: линия и порт остаются закреплёнными за ним, номер договора и настройки сохраняются, возобновить услугу можно без повторного подключения.
Как запускается и что проверять
- Ежедневная задача в 8:00 (до часа ежемесячных начислений) прогоняет все включённые политики.
- Общий выключатель
SERVICE_POLICY_ENABLEDглушит механизм целиком — задача выходит, не проверяя политики. - Включение боевого режима — два переключателя на странице политик: сам механизм и режим политики.
Что смотреть в режиме наблюдения: число кандидатов и его динамику по дням. Резкий скачок означает, что условия входа задевают не тех, кого задумывали — например, слишком короткий порог по месяцам или неучтённая добровольная приостановка.
2.1.1. Медиа тарифа
В карточке тарифа на вкладке «Общее» есть блок «Медиа» — четыре слота: обложка и видео, отдельно для светлой и тёмной темы сайта. Файлы уезжают в GCS, в тарифе хранится только ссылка.

- Картинки — JPG/PNG/WebP до 5 МБ, видео — MP4/WebM до 16 МБ (без звука).
- Превью видео проигрывается при наведении, двойной клик по грипу сбрасывает ширину колонки.
- В списке тарифов рядом с названием видно, что залито: иконка-картинка или иконка-плёнка, солнце — светлая тема, луна — тёмная. Наведение показывает превью.
- Обложки сайтовых тарифов переносятся командой
manage.py import_tarif_covers_from_site --apply: она читаетtariffs.jsonс сайта, сопоставляет тарифы по названию и заливает файлы в GCS. Спорные пары задаются через--map "Смит=131".
2.1.2. Настройка колонок таблицы
Кнопка «Колонки» в тулбаре открывает список колонок: галочками выбирается состав, перетаскиванием строк — порядок. Заголовки в самой таблице тоже перетаскиваются, а правый край заголовка тянется мышью — так меняется ширина.

Рядом — переключатель плотности строк. Компактный режим срезает вертикальные отступы почти вдвое (строка 53 → 38 px) и даёт на экран на 5-6 записей больше; шрифт при этом не мельче 13 px. Режим тоже запоминается за сотрудником.
Настройка сохраняется в аккаунте сотрудника, а не в браузере — на другом
компьютере таблица откроется так же. Колонка с чекбоксом выбора строк и колонка действий
не переставляются и не скрываются. Механизм общий: то же поведение получает любая таблица,
размеченная как smit-tbl.
2.1.3. На телефоне
На узком экране тулбар сворачивается в строку [поиск] [Фильтры], фильтры уезжают в нижнюю панель, KPI превращаются в горизонтальную ленту, а строки таблицы — в карточки «поле — значение». Кнопка «плюс» внизу справа добавляет тариф.

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

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

Шаг 2 — что тариф даёт клиенту и почём. Шаг 3 — сводка; до нажатия «Создать тариф» в базе ничего не появляется.
Дальше тариф открывается обычной карточкой: лимиты, правила смены, обещанный платёж и остальное правится там.
2.2. Услуги и Бонусы

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

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

Toolbar:
- Вкладки по типам (абонплата, разовая, бонус, обещанный платёж и т.д.); вкладка «Все» показывает полное имя.
- Чип «Не привязанные» с счётчиком — показывает услуги-сироты, которые не используются ни в одном тарифе и ни одним клиентом. Полезно для уборки справочника.
- Поиск по имени, тарифу или точному ID.
Колонки таблицы:
- Услуга — название с тултипом ID.
- Эфф. цена — итоговая цена, рассчитанная по каскаду: индивидуальная сумма клиента → шаблон summa у услуги → шаблон price у услуги. Если используется fallback — цена показана оранжевым с подчёркиванием, а в tooltip написан источник. Пустое значение «—» означает что услуга бесплатна или цена назначается индивидуально.
- Метод — иконка fa-sync (Ежемесячно) или fa-bolt (Разово).
- В ЛК — отмечены услуги, которые клиент видит в личном кабинете.
Системные услуги с фиксированными 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/
Правило сети отвечает на вопрос «что клиенту доступно и на каких условиях, когда обычный интернет ему уже не положен». Самый частый случай — нулевой баланс: интернет закрыт, но личный кабинет, сайт банка и госуслуги должны открываться, иначе клиент не сможет заплатить и вернуть связь.
Путь от правила до клиента
приоритет 100
сверху вниз
«Применение»
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 | Адрес или сеть в формате CIDR | 10.0.0.0/24, 93.158.134.3 |
| Домен | Имя хоста; протокол и путь отбрасываются при сохранении | lk.вашдомен.ru |
| Адрес страницы | Полный URL, обязательно с http:// или https:// | https://вашдомен.ru/pay |
| Действие | Что означает |
|---|---|
| Открыть бесплатно | Адрес доступен даже при закрытом интернете. Только такие условия уезжают в ACL-группу |
| Тарифицировать по ценам правила | Трафик считается по ценам из вкладки «Правило». Работает только там, где включён повременной учёт |
| Отправить на страницу-заглушку | Запрос к адресу перенаправляется на портал (HTTP-адрес правила) |
| Запретить | Адрес закрыт независимо от остальных правил |
Адрес проверяется при сохранении: 10.0.0.300 и «сайт банка»
не пройдут — оператор увидит подсказку с примером вместо молчаливо
испорченного списка доступа.
Вкладка «Применение»

- ACL-группа портала — куда выгружать разрешающие условия. Группу читает страница-заглушка Captive Portal; без выбранной группы кнопка выгрузки объяснит, что выгружать некуда.
- Приоритет — чем больше число, тем раньше правило применяется среди прочих.
- Правило включено — выключенное правило перестаёт применяться, но условия, привязки услуг и уже выгруженные адреса остаются на месте.
- Строка под селектором показывает состояние группы: сколько всего адресов, сколько из них от этого правила и сколько разрешающих условий готово к выгрузке.
Действия со строкой

- Редактировать — карточка правила (три вкладки: Правило · Условия · Применение).
- Копировать — открывается карточка с заполненными полями и именем «… (копия)». Условия исходного правила переносятся сервером при сохранении, поэтому копировать «Льготные сайты» под другую организацию — одно действие, а не пятнадцать.
- Включить / Выключить — переключение прямо из списка.
- Удалить — заблокировано, пока на правило ссылаются услуги; подсказка объясняет причину.

Копия — это новая запись: исходное правило не меняется, а на вкладке «Условия» видно, что они приедут вместе с ним после сохранения.
Массовые действия и общая таблица
Списки «Правила и сети» и «Программы лояльности» работают на одном табличном компоненте: одинаковые чекбоксы, одинаковая панель действий, одинаковый менеджер колонок и одинаковое поведение на телефоне.
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. Карты оплаты
/admin/tarifs/CardSeries/,
и пункт меню возвращается одной строкой в MENU_LIST.Серии бумажных карт оплаты с PIN-кодами. Каждая серия — это пакет карт номинала N₽ с уникальными PIN. Клиент пополняет счёт, введя PIN в личном кабинете или через кассу.

Серия определяется: имя серии, номинал, количество карт, дата выпуска, дата окончания действия. PIN-коды генерируются автоматически и выгружаются в PDF/CSV для печати.
Программы лояльности — назначение и роль
Содержание раздела
Программа лояльности — механизм скидок, акций и спец-условий для группы клиентов. Реализуется двумя моделями: Loyaltys (сама программа = шаблон) и AbonentsLoyalty (привязка клиента к программе = экземпляр).
Зачем нужна лояльность
Программы решают четыре задачи:
- Скидки — социальные тарифы (пенсионеры, многодетные), корпоративные скидки, акции «приведи друга»;
- Спец-условия для группы — например, «жильцы дома №15 платят на 100 ₽ меньше за интернет» (распределённая по адресу программа);
- Бонусы за продление — «оплатил год вперёд → 10% скидка»;
- Учёт в финансовых отчётах — отдельная строка «Скидки по программам лояльности».
Модели
| Модель | Что хранит |
|---|---|
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-задач списания) |
Приоритет и применение
Один клиент может попасть в несколько программ одновременно (например: пенсионер + жилец акционного дома). При начислении скидки выбирается одна:
- Поле
priorityуLoyaltys— целое число. Выше = раньше применяется; - Цветовое кодирование в UI:
- ≥ 100 — красный бейдж «критично» (типа «соцтариф для всех»);
- ≥ 50 — оранжевый «важно» (корпоративные);
- < 50 — серый (обычные акции).
- Применение в
billing_worker: при начислении тарифа проверяются все активныеAbonentsLoyaltyклиента, выбирается с максимальнымpriority, скидка применяется кop_summa.
Связь с линейками услуг
Поле Loyaltys.usluga_range (FK на UslugaRangeTypes) ограничивает применимость:
- Если
usluga_range = NULL— программа применяется ко всем услугам тарифа; - Если
usluga_range = X— только к услугам в линейке X (например, скидка только на интернет, не на IPTV); - Это требует, чтобы
Tarif.usluga_range_type_idу тарифа клиента совпадал сLoyalty.usluga_range_id; - См. подробнее в 2.6 Линейки услуг.
Что делать со старыми программами
- Программа закончилась (срок акции прошёл) — выключить через
enabled=falseвместо удаления. Нельзя удалить, если есть активныеAbonentsLoyalty; - Завершить программу для всех — перед удалением программы проставить
end_dateу всехAbonentsLoyalty. Тогда программа становится «архивной» и удаляется; - Удалить отдельную привязку — кнопка в карточке клиента, вкладка «Лояльность». Это не удаляет программу, только конкретную привязку.
/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) — это
группа тарифов и услуг одного оператора связи или одной целевой аудитории.
Линейка решает две задачи: логически разграничить тарифные планы между
юр.лицами-операторами на одной инсталляции биллинга и технически
ограничить, какие тарифы попадают в выпадающие списки в личном кабинете
клиента и в программах лояльности.

Примеры использования
- Разделение по аудиториям: «Физические лица», «Юридические лица», «Социальные тарифы» — каждой линейке привязаны свои тарифы. В Quick Add клиента линейки переключаются автоматически вместе с флагом «Юр.лицо» (см. раздел 7.1).
- Несколько операторов на одной инсталляции: «СмИТ Волгоград», «СмИТ Камышин», «Малдер-связь». Оператор-инсталлятор обслуживает несколько юр.лиц с одним биллингом, у каждого свой набор тарифов. В отчётах СОРМ выгрузка идёт по оператору-владельцу линейки.
- Промо-кампании: «Акция «Лето 2026»», «Тарифы для пенсионеров» —
отдельная линейка содержит только промо-тарифы; в программах лояльности
(Loyaltys) включается через поле
usluga_range, и клиентам с этой лояльностью становится доступен льготный тариф. - Технические/служебные тарифы: линейка «Внутренние» —
для сотрудников, тестовых учёток, оборудования. Не показывается в ЛК
обычных клиентов через настройку
LK_TARIFF_REQUIRE_RANGE.
Модальное окно «Добавить / Редактировать линейку»
Открывается кнопкой «Линейка» в правом верхнем углу списка
или иконкой карандаша в строке таблицы (urtModal в шаблоне
usluga_range_types_list.html). Поля:
- Название * — текст, как будет отображаться в селектах при создании тарифа и программы лояльности. Примеры: «Бизнес-линейка», «Эконом физ.лица», «Промо Лето 2026».
- Оператор — выпадающий список клиентов из служебной папки «Операторы» (id = 9002). Это юр.лицо, владеющее линейкой: именно ему уходит выручка по тарифам этой линейки в финансовой отчётности и СОРМ-выгрузках. Можно оставить пустым («не указан») — тогда линейка считается общей.
Сохранение через POST /admin/tarifs/range_types_crud/
(или /<id>/ для редактирования). Удаление —
DELETE /admin/tarifs/range_types_crud/<id>/; защищено:
если на линейку ссылается хотя бы один тариф или программа лояльности,
сервер вернёт ошибку с понятным текстом.
Список линеек

Над таблицей — KPI по текущему срезу: линеек в срезе, включено, тарифов в линейках, программ лояльности и линеек без тарифов. Ниже — чипы Все · Включённые · Выключенные · С тарифами · Пустые · С лояльностью со счётчиками.
| Колонка | Что показывает |
|---|---|
| Статус | кружок: зелёный — линейка включена, серый — выключена. Выключенную линейку не предлагают при создании тарифа |
| Название | иконка направления и заголовок линейки |
| Орг. | бейдж организации; пусто — линейка общая, её видят все (см. 2.7.3) |
| Тарифов | счётчик Tarif.usluga_range_type_id.
Зелёный, если есть привязки; серый — линейка пустая |
| Лояльности | счётчик Loyaltys.usluga_range_id,
жёлтый бейдж при наличии программ |
| Действ. | меню строки: правка, включить/выключить, удаление с проверкой ссылок |
Поиск — Ctrl+K, кнопка CSV выгружает видимый срез. Набор колонок и сохранённые виды — как во всех списках раздела (2.7). На телефоне строки превращаются в карточки.
Связи и где используется
- Тариф (
Tarif.usluga_range_type) — поле «Линейка» на форме редактирования тарифа. Один тариф может принадлежать одной линейке. - Программа лояльности (
Loyaltys.usluga_range) — определяет, какой набор тарифов доступен участнику программы. - Личный кабинет — настройка
LK_TARIFF_REQUIRE_RANGE(ЛК → Возможности) включает фильтрацию: клиенту в ЛК показываются только тарифы из той же линейки, что и его текущий тариф. Полезно когда у одной инсталляции несколько операторов и нельзя смешивать тарифы. - Quick Add клиента (7.1) —
при включении чекбокса «Юр.лицо» автоматически отбираются тарифы
с признаком
is_business=True; линейка же определяет, какому оператору такой тариф принадлежит.
2.7. Общие приёмы раздела
Пять списков раздела — тарифы, услуги, правила, программы лояльности и линейки — собраны на одних и тех же деталях. Разобравшись с ними один раз, вы работаете одинаково во всех пяти.
2.7.1. Срез: чипы, KPI, поиск, выгрузка

Программы лояльности. Сверху KPI по срезу, под ними полоса сохранённых видов, ниже — чипы со счётчиками и шестерёнка настройки набора.
- Чипы отбирают срез и показывают, сколько записей в каждом. Шестерёнка справа открывает панель, где можно спрятать ненужные чипы — набор запоминается за сотрудником.
- KPI сверху считаются по видимому срезу, а не по всей базе. Поэтому цифры всегда сходятся с тем, что в таблице, и не спорят с фильтрами.
- Поиск — Ctrl+K или / ставит фокус в поле из любого места страницы.
- CSV выгружает видимый срез: с учётом чипов, поиска и выбранной линейки. Файл в UTF-8 с разделителем «;» — Excel открывает его без плясок с кодировкой.
2.7.2. Сохранённые виды
Оператор изо дня в день возвращается к одним и тем же выборкам: «скидочные программы», «правила без условий», «тарифы партнёрской компании на сайте». Чипы и поиск сбрасываются при уходе со страницы, и срез приходится собирать заново. Вид — это имя плюс состояние страницы: какие чипы нажаты, что в поиске, какая линейка выбрана.
+ линейка
срезу
за сотрудником
при заходе

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

| Пункт | Что делает |
|---|---|
| Обновить текущим срезом | перезаписывает вид тем, что сейчас на экране |
| Переименовать | меняет имя, срез остаётся прежним |
| Открывать по умолчанию | вид применяется сразу при заходе на страницу. Такой вид один: у остальных признак снимается |
| Удалить вид | убирает только сохранённый срез — записи списка не трогает |
Повторный клик по активному виду снимает его и возвращает полный список.
Пример: срез «Скидочные программы»
- Программы лояльности → чип «Скидка %».
- «+ Вид» → имя
Скидочные программы→ «Сохранить». - Назавтра открываете раздел и жмёте чип с этим именем — срез на месте. Если это ваш основной срез, отметьте в меню вида «Открывать по умолчанию»: страница будет открываться сразу с ним.
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 |
| Попадает в массовое действие | да | да | нет |
Ограничение действует и на массовые действия: в набор берутся только доступные записи, чужие идентификаторы отсекаются на сервере, даже если их подставить в запрос руками.
Пример
Программа «Скидка за стаж 5 лет» принадлежит первой организации, «Многоквартирный дом» — второй. Сотрудник второй видит в списке свою программу и все общие; ссылка на чужую отдаёт 404. Если он выделит обе строки и нажмёт «Выключить», сервер выключит только свою.
2.7.4. Меню действий строки
Иконки действий в конце строки собраны в одно меню — на компьютере это экономит место, на телефоне иначе просто не помещается. Меню рисуется поверх таблицы, поэтому его не режет горизонтальный скролл.

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

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