Граф Wiki

Справочники

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

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

7. Справочники

Что на что опирается

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

flowchart TD
    ADDR["Адреса
(дом, улица, район)"] STATUS["Статусы
подключения"] ATTR["Дополнительные
поля клиента"] UTYPE["Типы услуг"] RANGE["Линейки услуг"] POOL["Пулы адресов"] CARD["Карточка клиента"] TAR["Тарифы и услуги"] NET["Оборудование
и доступ"] SORM["Выгрузки СОРМ"] ADDR --> CARD ADDR --> NET STATUS --> CARD ATTR --> CARD ATTR --> SORM UTYPE --> TAR RANGE --> TAR POOL --> NET CARD --> SORM TAR --> SORM

Раздел меню «Справочники» — все нормативно-справочные данные системы: пулы IP, ACL, адреса, валюты, статусы и т.д.

7.1. Пулы IP и VLAN

Подменю с двумя справочниками: пулы IP-адресов для выдачи через RADIUS и пулы VLAN для разметки портов на коммутаторах.

Пулы IP — назначение и роль

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

IP-пул — это диапазон IP-адресов [start_ip…end_ip], из которого FreeRADIUS выдаёт клиенту Framed-IP-Address при PPPoE/IPoE-авторизации. Хранится в таблице ip_pull, редактируется на /admin/dictionary/IpPull/.

Зачем нужен IP-пул

Пул решает две задачи:

  1. Автоматическая выдача IP клиенту. При авторизации FreeRADIUS вызывает allocate_ip_from_pool() (см. billing/services/ip_allocation.py), который находит первый свободный IP в диапазоне пула, помечает его в Users.IP и возвращает в RADIUS-ответе как Framed-IP-Address. Без пула — пришлось бы вручную проставлять IP каждому клиенту в карточке.
  2. Сегментация сети. Разным NAS можно привязать разные пулы → разные подсети для разных регионов / типов услуг (PPPoE-клиенты vs Hotspot, белые IP vs NAT).
4 роли пула на NAS

Один и тот же NAS может ссылаться на 4 разных пула, каждый со своим назначением:

Поле NASТег в UIКогда выдаётся
PULL_ID🟢 mainОсновной — для обычной авторизации клиентов
NAT_PULL_ID🟠 natДля клиентов с серым IP (NAT за роутером провайдера)
WHITE_PULL_ID🔵 whiteДля клиентов с белым IP — отдельный платный сервис
HOTSPOT_PULL_ID🟣 hotspotДля гостевых Wi-Fi-сетей (бесплатный интернет с ограничениями)

Какой пул использует FreeRADIUS — определяется по статусу клиента (tarif, has_white_ip, hotspot-флаг). На странице /admin/dictionary/IpPull/ в колонке «Привязка к NAS» видно, какие роли выполняет пул на каждом NAS.

Chain-цепочки (NEXT_PULL_ID)

Поле ip_pull.NEXT_PULL_ID позволяет связать пулы в цепочку резервирования: когда основной пул исчерпан, аллокатор автоматически переходит к следующему. Пример (рабочий сервер, 2026-05):

ЦепочкаОбъёмСтатус
JOY-1 → JOY-2 → JOY-3510 + 510 + 510 = 1530 IP34.2% занято (chain Σ)
TOY-1 → TOY-2 → TOY-3510 + 510 + 510 = 1530 IP39.6% занято (chain Σ)

Защита от циклов: _expand_next_pull_chain() ограничивает глубину 10 шагами и держит set уже посещённых ID. UI отображает chain-цепочку бейджем 🔗 с tooltip-разбивкой JOY-1 (510/510) → JOY-2 (14/510) → JOY-3 (0/510).

Когда нужно создавать новый пул
Что делать со старыми пулами
  1. Тестовые пулы (имя содержит «test», «tmp», «proba») — удаляются через UI кнопкой 🗑, если у пула 0 пользователей и 0 NAS-привязок;
  2. Декомиссированные пулы — поставить enabled=false вместо удаления, если есть исторические Users с IP из этого пула. Это сохранит историческую целостность;
  3. Не трогать пулы, упомянутые в любом из 4 полей nas.*_PULL_ID или в NEXT_PULL_ID другого пула — это сразу разрушит chain-цепочку.
Важно: при ручной правке Users.IP через карточку клиента, биллинг автоматически проверяет уникальность IP во всех источниках (users.IP, users.SNATIP, RADIUS_SESSIONS.IP) — это защита от race condition при выдаче дубля. См. billing/services/ip_allocation.py::collect_used_ips().

Пулы IP-адресов

URL: /admin/dictionary/IpPull/

Пул IP-адресов — это диапазон от start_ip до end_ip, из которого FreeRADIUS выдаёт Framed-IP-Address при авторизации клиента. Один пул привязан к одному или нескольким NAS-устройствам через 4 разных поля (см. роли). Список загружается AJAX, статистика занятости считается раз в минуту с кешем.

Список IP-пулов

Возможности списка
Добавление пула

Кнопка «+ Новый IP-пул» в правом верхнем углу открывает модалку:

Модалка добавления IP-пула

Обязательные поля:

Опциональные поля:

Что происходит после сохранения:

  1. Запись в БД (ip_pull): новый pull_id генерируется автоинкрементом.
  2. Audit-запись в AuditOperations (table_name='IP_PULL', object_id=pull_id).
  3. Кеш статистики (ip_pool_stats_v3) инвалидируется — следующая загрузка списка пересчитывает использование.
  4. Пул автоматически становится доступным в Select-полях NAS (Pull / NAT-pull / White-pull / Hotspot-pull) и в RADIUS_USERAUTH при авторизации.
Редактирование пула

Клик по строке (или иконке карандаша справа) открывает ту же модалку с предзаполненными полями:

Модалка редактирования IP-пула

Все поля редактируются. Изменение start_ip / end_ip у используемого пула — опасная операция: если новый диапазон не покрывает уже выданные адреса, клиенты со «старыми» IP не попадут в пул при следующей авторизации (allocate_ip_from_pools не считает их занятыми, может выдать дубль). Прежде чем сужать диапазон — проверьте через find_ip_duplicates --pool_id=N.

Удаление через кнопку «Удалить» внутри модалки. Защита: пул нельзя удалить, если на него ссылается хоть один NAS (через любое из 4 полей pull_id / nat_pull_id / white_pull_id / hotspot_pull_id) или другой пул через next_pull_id. Сервер вернёт ошибку «Пул используется в N NAS / M пулах. Сначала уберите ссылки.»

Роли пула на NAS (4 поля)

Один NAS может ссылаться на пул через 4 разных поля, что определяет как IP из этого пула используется:

Поле NASРоль (бейдж)Назначение
pull_id🟢 mainОсновной пул для выдачи серых IP клиентам через DHCP/PPPoE.
nat_pull_id🟠 natNAT-пул: серые IP, скрытые за внешним NAT. Через RADIUS уходит как Framed-IP-Address, на NAS настраивается NAT в сторону интернета.
white_pull_id🔵 whiteБелые (публичные) IP. Выдаются за дополнительную плату, маршрутизируются напрямую без NAT.
hotspot_pull_id🟣 hotspotПул для гостевого Wi-Fi (hotspot). Часто короткие диапазоны с walled-garden ACL.

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

Цепочки пулов (next_pull)

Когда клиентов больше, чем размер одного /24-пула (254 адреса), используется цепочка: основной пул ссылается на резервный через next_pull_id. Алгоритм allocate_ip_from_pools() в billing/services/ip_allocation.py:

  1. Проверяет основной пул (NAS.pull_id).
  2. Если он исчерпан — переходит в next_pull.
  3. Из next_pull снова в его next_pull, и т.д.
  4. Защита от циклов: max_depth=10 + seen-set по pull_id.
  5. Если все пулы цепочки исчерпаны — fallback на глобальный FALLBACK_IP_POOL_ID (если задан в VpnConst), затем reclaim из offline-клиентов, затем Telegram-алерт.

Пример (рабочий сервер, 2026-05): JOY-1 → JOY-2 → JOY-3, каждый по 510 адресов. Σ-блок в UI показывает «🔗 Σ 1006 / 1530 ×3» — итого занято 1006 из 1530, цепочка из 3 пулов.

Visual: на пуле, у которого задан next_pull_id, в колонке «Название» появляется бейдж «🔗 → #N». Клик открывает модалку следующего пула.

Пулы VLAN — назначение и роль

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

Пул VLAN — это диапазон номеров VLAN [start_vlan…end_vlan], закреплённых за конкретным оператором связи или сегментом сети. Хранится в vlan_pull, редактируется на /admin/dictionary/VlanPull/.

Зачем нужен пул VLAN

Пул VLAN решает две задачи:

  1. Сегментация L2-сети. Каждой точке подключения (CONNECTION_POINTS) можно присвоить отдельный VLAN из пула — изолировать трафик клиентов друг от друга на коммутаторах. Биллинг подсказывает свободный VLAN из пула при создании точки.
  2. Учёт использования номеров VLAN. На корпоративных сетях (или нескольких операторов в одной инфраструктуре) выделение VLAN строгое: например, оператор А получил 100–200, оператор Б — 201–300. Пул не даёт случайно занять чужой номер.
Где это поле используется
ГдеПоле / связьЧто происходит
vlan_pullstart_vlan, end_vlanДиапазон номеров (1–4094 в стандарте 802.1Q)
vlan_pulloperator (FK на Abonents)За каким провайдером закреплён пул (если несколько ISP в одной инфре)
CONNECTION_POINTSVLAN-номер (через UI выбора)Присвоенный точке VLAN. Из пула выбирается свободный номер при создании точки
Когда нужно создавать пул VLAN
Что делать со старыми пулами
Single-operator hide-fix: если в системе только один оператор связи, в модалке создания пула колонка «Оператор» автоматически скрывается через CSS-класс .vp-op-col-hidden (бьёт Bootstrap-сетку с !important). Это упрощает UI для маленьких ISP.

Пулы VLAN

URL: /admin/dictionary/VlanPull/

Пул VLAN — диапазон номеров VLAN, выделенных оператору связи. Используется при настройке точек подключения (одна точка = одна VLAN из пула) и в шаблонах конфигурации коммутаторов.

Список VLAN-пулов

Возможности списка
Добавление и редактирование

Кнопка «+ Новый VLAN-пул» открывает модалку:

Модалка добавления VLAN-пула

Поля:

Модалка редактирования VLAN-пула

На скриншоте edit-режим: модалка идентична add, но с заполненными значениями + кнопкой «Удалить» снизу слева.

Защита удаления: VLAN-пул нельзя удалить, если он использован хотя бы в одной точке подключения. Сервер вернёт ошибку «Пул используется в N точках. Удаление запрещено для сохранения связей.»

Мониторинг и алерты

Beat-задача ip-pool-monitor (раз в час) обходит все enabled IP-пулы:

На дашборде /admin/welcome/ — компактный виджет «IP-пулы» с топ-3 опасными и сводкой использования.

7.2. Контроль доступа (ACL)

Подменю с двумя справочниками для управления сетевыми правилами доступа.

Подраздел «ACL группы»

Именованные списки правил для firewall: «Домашние пользователи», «Корпоративные», «VIP», «Социальный тариф» и т.п. Каждой группе соответствует набор правил — разрешения и запреты по портам, протоколам и адресам. Группа назначается клиенту в его карточке (на вкладке «Точки подключения») и попадает в RADIUS-ответ как Filter-Id.

ACL группы

Подраздел «Списки разрешённых сайтов»

Белые списки доменов для клиентов в финансовой блокировке (captive portal): сайт оператора, страница оплаты, личный кабинет. Когда клиент в долге, NAS ограничивает его трафик до этих доменов — чтобы он мог пополнить счёт, но не мог пользоваться интернетом для развлечений.

ACL — белые списки

7.3. Все адреса

Подменю с тремя справочниками для адресной системы оператора.

Адреса (Homes) — назначение и роль

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

Адрес (Homes) — запись в иерархическом справочнике Россия → регион → город → район → улица → дом. Хранится в таблице homes как самоссылочное дерево (через parent_id), редактируется на /admin/dictionary/Homes/.

Зачем нужен справочник адресов

Справочник homes решает четыре задачи:

  1. Привязка клиента к физическому адресу. Поле Abonents.HOME_ID → конкретный дом. Используется для печатных форм договоров, счетов, СОРМ-выгрузок (поле ABONENT_ADDR).
  2. Привязка оборудования к месту установки. Поле switch.HOME_ID и nas.HOME_ID — где установлена железка. Это техдокументация для выезжающих инженеров.
  3. Точки подключения. CONNECTION_POINTS.HOME_ID — на каком доме точка подключения находится. Один дом может иметь много точек (квартиры, офисы).
  4. Геокодинг и карта. Поля lat/lon хранят координаты дома (геокодируются через DaData). Используются на карте клиентов /admin/abonents/map/ — кружки с цветом по статусу клиента.
Где используется адрес
ГдеПолеЧто происходит
AbonentsHOME_IDАдрес клиента — печатные формы, СОРМ, карта
usersHOME_IDАдрес учётной записи (если несколько услуг по одному клиенту в разных точках)
switchHOME_IDГде стоит коммутатор (для техника)
nasHOME_IDГде стоит NAS (обычно центральный узел)
CONNECTION_POINTSHOME_IDТочка подключения в подъезде/щитке этого дома
Дерево и геокодинг

Адреса организованы как самоссылочное дерево:

Подробнее про карту см. «Карта клиентов».

Что делать с адресами без жителей

В аудите БД часто видны адреса без привязанных клиентов и Users (на рабочем сервере 2026-05: 992 шт). Это не мусор, а адресная база региона — список потенциальных адресов для подключения.

Важно: при создании нового клиента UI подсказывает существующие адреса через Select2-AJAX (billing/static/js/address_widget.js). Если адреса нет в справочнике — лучше сначала добавить его, а уже потом привязать клиента. Это сохраняет адресное дерево чистым.

Подраздел «Адреса»

Иерархия Россия → регион → город → район → улица → дом. Хранится как дерево с unicode-сравнением, дома содержат геокоординаты (lat/lon), индекс, дату начала обслуживания.

Адреса

Возможности списка:

Подраздел «Точки подключения»

Физическое место подключения клиента: коммутатор + порт + VLAN. Один дом может содержать несколько точек (если в подъезде несколько коммутаторов или несколько провайдерских узлов). Используется для DHCP Option 82, RADIUS-фильтра и СОРМ-выгрузки.

Точки подключения

Подраздел «Типы адресных единиц»

Словарь сокращений: ул, пер, наб, пр, пл, бульв, проезд, тупик, шоссе, поселение, мкрн и т.д. Используется для нормализации и парсинга полных адресов, передачи в DaData и в форматирование адреса для печатных документов.

Типы адресных единиц

7.4. Реквизиты

Шаблоны атрибутов для физлиц и юрлиц. Физлицо: паспорт серия/номер, дата выдачи, кем выдан, адрес регистрации, СНИЛС. Юрлицо: ИНН, КПП, ОГРН, юридический/физический/почтовый адрес, расчётный счёт, банк, БИК, корреспондентский счёт, в лице, директор.

Реквизиты

Атрибуты автоматически создаются у клиента при создании в зависимости от типа (физлицо / юрлицо). Заполняются во вкладке «Реквизиты» карточки клиента. Для юрлиц также собираются на вкладке СОРМ.

7.5. Валюты

Список валют биллинга. По умолчанию — рубль (₽). Для мультивалютных схем можно добавить USD/EUR с курсами.

Валюты

7.6. Выходные дни

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

Выходные дни

Статусы клиентов — назначение и роль

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

Статус клиента — состояние его подключения: «Активный», «Заблокирован», «На паузе», «Тестовый период», «Должник», «Корпоративный VIP». Хранится через FK Abonents.status_id → таблицу STATUS. Управляется в /admin/dictionary/Status/.

Зачем нужны статусы

Статусы решают четыре задачи:

  1. Визуальная индикация — цветной бейдж рядом с именем клиента в списке. Оператор видит «должник», «новый», «активный» одним взглядом;
  2. Автоматизация смены — при определённых событиях (баланс ушёл в минус, истёк тестовый период) Целери-задача меняет статус автоматически;
  3. Триггер для сообщений — при смене статуса автоматически шлётся email/SMS/push/Telegram-сообщение из StatusMsgTemplate;
  4. Изменение поведения сети — каждому статусу можно привязать StatusRadiusParam — RADIUS-атрибуты для NAS (например Filter-Id := block у статуса «Заблокирован»).
Поля и связанные модели
Поле STATUSНазначение
nameИмя статуса (видно оператору)
default_statusАвтоматически присваивается новым клиентам
set_on_activateУстанавливается при активации подключения
block_on_setСразу блокировать клиента (создаётся AbonentsBlock)
move_toFK на папку (Abonents с is_folder=true) — куда перемещать клиента при смене статуса
move_to_group_from_tarifПапка берётся из тарифа (для агентских схем)

Дополнительные модели:

4 категории событий аудита

В AUDIT_OPERATIONS поле op_type_category разделяет события на 4 группы:

КатегорияЧто попадает
statusСмены статуса клиента (ручные и автоматические)
blockСоздание/снятие AbonentsBlock
paymentФиноперации, изменения баланса
SORMИзменения СОРМ-полей клиента (паспорт, ИНН, ОГРН)

В UI вкладки «Аудит» карточки клиента можно фильтровать по категории — получаешь только статусные смены или только финансовые операции.

Связь с шаблонами сообщений

Когда статус меняется, через post-save сигнал биллинг проходит по StatusMsgTemplate для нового статуса и отправляет:

Управление шаблонами — в модалке статуса (вкладка «Шаблоны»). Каждый канал включается / выключается отдельно.

Связь с RADIUS

При авторизации клиента FreeRADIUS читает его текущий статус и применяет связанные с ним атрибуты:

Это альтернатива полной блокировке — клиент остаётся подключён, но с ограничениями. Гибче чем boolean enabled=false.

Редактирование статусов — AJAX CRUD с модальными окнами на 2 вкладки (Шаблоны сообщений + RADIUS-параметры). Шаблоны сообщений и RADIUS-параметры редактируются в одной модалке статуса.

7.7. Управление статусами

Подменю с двумя справочниками для управления пользовательскими статусами клиентов.

Подраздел «Статусы»

Пользовательские статусы клиента: «Тестовый период», «Должник», «Перерыв на лето», «Корпоративный», «VIP» и т.п. Каждый статус имеет цвет (показывается как бейдж рядом с именем клиента в списке) и шаблон сообщения, которое отправляется автоматически при назначении статуса.

Статусы

В модалке статуса есть вкладки для шаблонов сообщений по каналам (Email / SMS / Push / Telegram) и RADIUS-параметров (если статус должен влиять на скорость или ACL клиента в авторизации).

Подраздел «Настройка статусов»

Правила автоматической смены статуса по событиям: платёж выше N руб → статус «Активный»; задержка платежа > N дней → статус «Должник»; истечение договора → статус «Архив». Правила применяются Celery-задачей раз в час.

Настройка статусов

7.8. Типы отчётов

Категории SQL-отчётов для разделения по ролям сотрудников: Техсервис, Руководство, Бухгалтерия, ЦОК, Телефония, Техподдержка, ЦУС. Каждый тип имеет цвет и иконку.

Типы отчётов

Управляется из этого справочника или прямо из Библиотеки отчётов кнопкой «Типы».

7.9. Единицы измерения

Словарь единиц измерения для услуг: МБ, ГБ, минуты, штуки. Используется в названиях услуг и в детализации расхода.

Единицы измерения

7.10. Периоды

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

Периоды