Тарификация

Правила и логика начисления платы за услуги определяются в описании класса услуги. В АСР “Pyzzle.ISP” входит класс Service_prepaid, который определяет следующие принципы тарификации абонентов:
  • У абонента ведутся расчетные периоды. При этом возможно состояние, когда один период завершился, а другой еще не начался.

  • Абонент находится в одном из трех статусов:

    • “Услуга активна” (Статус: 0). Доступ к услугам разблокирован.
    • “Нет денег на трафик” (Статус: 1). Доступ к услугам заблокирован, при этом расчетный период активен.
    • “Нет денег на аб. плату” (Статус: 2). Доступ к услугам заблокирован, при этом расчетный период завершен, а новый расчетный период не начат.
  • Тарификация в пределах расчетного периода ведется в соответствии с выбранном абонентом тарифным планом. Тарифный план не может быть изменен задним числом, возможно только указание тарифного плана, который будет активирован в следующем расчетном периоде.

  • Списание средств с лицевого счета определяется описанием тарифного плана.

  • В описании тарифного плана, определяются условия открытия и завершения расчетного периода.

  • Переход из статуса “Услуга Активна” в статус “Нет денег на трафик” определяется по “эффективному балансу” абонента.

Note

В описании класса абонента может быть активирована функциональность “никогда не блокировать услуги” - в этом случае у абонент не будет переходить в статус “Нет денег на трафик”

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

Тарифные планы

Система поддерживает несколько типов тарифных планов. Каждый тип описывается в виде класса в конфигурационном файле enviroment.py. Описание класса формируется из компонентов и констант. В класс тарифного плана входят функции которые определяют условия открытия и закрытия расчетного периода, функции отвечающие за списание периодических платежей (абонентской платы) а так же функции вычисляющие стоимость потребленных услуг, а так же различные дополнительные возможности. Конкретная стоимость услуг и другие параметры тарифов не указываются в описании класса тарифного плана.
В комплект АСР “Pyzzle.ISP” входят следующие под-классы, которые могут быть использованы при определении класса тарифа:
Название под-класса Возможности
Tarif_daily Тариф имеет фиксированную длительность, длительность или указывается в константе при определении класса тарифа, или задается индивидуально в настройках каждого тарифного плана
Tarif_monthly Тариф привязан к календарным месяцам: дата окончания расчетного периода - тот же день следующего месяца, что дата начала расчетного периода
Tarif_std_traff Тариф предназначен для учета потребления IP-трафика, и включает в себя определенное кол-во трафика включенного в тариф, и стоимость превышения трафика
Tarif_ab_plata В тарифе, в начале расчетного периода, со счета списывается определенная сумма (задается в параметрах тарифа)
Tarif_unlim_traff Безлимитный тариф с фиксированным ограничением входящей и исходящей скорости (значения задаются в параметрах тарифа)
Tarif_unlim_traff_dualspeed Безлимитный тариф с двумя скоростями ограничения (ночной и дневной). Значения скоростей и временных интервалов задаются в параметрах тарифа.
Tarif_traffic_mark Позволяет формировать правила для маркировки трафика от абонентов этого тарифа.
Tarif_unlim_with_grace_traff Безлимитный тариф в двумя скоростями, первая скорость действует пока абонент не израсходует пороговое значение трафика, после активируется вторая скорость. (Скорости и пороговое значение задаются в параметрах тарифа)
Tarif_traff_rounding Позволяет округлять значение потребленного трафика с разной степенью точности. (например может использоваться в тарифах учитывающих “каждый полный и не полный Гигабайт”)
Tarif_daily_ab_plata Тариф, при котором списывает аб. платы происходит ежедневно. В этом случае условием завершения расчетного периода является нехватка средств для списания средств за очередной день, а длительность расчетного периода принудительно не ограничена.

Note

Настройку классов описания типов тарифных планов осуществляет разработчик системы в соответствии с требованиями заказчика.

Настроив в системе классы тарифных планов, через web-интерфейс можно создавать и настраивать тарифные планы. Тарифный план характеризуется названием, типом (указывает какой класс использовать при работе этого тарифного плана) и набором параметров, список параметров зависит от описания класса тарифа.
Для управления тарифными планами используется раздел web-интерфейса “Настройка” - “Тарифы”.
_images/tarif1.png
На этой странице присутствует таблица со списком текущий тарифных планов, заведенных в систему, а так же форма для добавления нового тарифа.
Если добавить новый тариф, или выбрать один из существующих, то откроется страница для редактирования параметров тарифного плана.
_images/tarif2.png
На этой странице можно указать все параметры тарифного плана, набор параметров зависит от описания класса тарифа. Удалить тариф можно только в том случае если этот тариф не используется абонентами.
Все изменения в параметрах тарифов протоколируются. Увидеть изменения в тарифе можно на странице “История тарифа”.

Тарифные группы

АСР “Pyzzle.ISP” позволяет группировать тарифные планы в группы, а абонентов привязывать к определенной тарифной группе, в этом случае абонент может изменять свой тарифный план только в пределах своей тарифной группы. Тарифная группа в системе является обычным словарем и настраивается на странице “Настройка” - “Словари” - “Тарифная группа”.
Принадлежность тарифа к тарифной группе может быть настроена на странице редактирования параметров тарифа, для это нужно перейти по ссылке “Тарифная группа” в верхнем меню.
_images/tarif4.png
Так же можно настроить принадлежность тарифов к группам на странице “Настройка” - “Свойства тарифных групп”
_images/tarif5.png

Трафик

АСР “Pyzzle.ISP” позволяет тарифицировать потребление IP-трафика абонентов. Трафик разделяется на классы. В простейшем виде это Входящий и Исходящий, однако система может поддерживать и более сложную тарификацию. В информационную систему загружается информация о потребленном трафик в процессе оказания услуг. В систему вносится информация о том сколько байт каждого класса тарифа потребили различные IP адреса. Для этого используется команда CLI-интерфейса системы.
Pyzzle> iptraff load input output 192.168.0.1 15545 15456 192.168.0.2 1565 46246 192.168.0.3 16675 67543
^D
Этой команде в качестве аргументов передаются названия классов тарифа, про которые будет передаваться информация, а STDIN поток передается исходная информация в виде строк. В каждой строке указывается IP адрес и количество потребленных услуг для разных классов, разделенные пробелами.
Загруженный трафик привязывается к абонентам, а не привязанный трафик (в случае его наличия) маркируется специальным образом. Полученный трафик суммируется со значениями уже хранящимися в базе данных и сохраняется в виде отдельных записей для наглядного изображения информации о потреблении услуг. При расчете стоимости потребленных услуг используется только суммарное значение, детальная информация о потреблении используется только в информационных целях. При завершении расчетного периода суммарное значение обнуляется.
Для просмотра истории потребления трафика пользователем используется страница “График трафика” в разделе пользователя. На этой странице можно посмотреть информацию за заданный промежуток времени, для абонента, или для определенного IP адреса, если у абонента их несколько.
В разделе групповых операций над абонентами, можно получить аналогичный график потребления услуг суммарно для всех абонентов выбранной группы.
В разделе статистика можно получить отчет о наиболее потребляющих услугу абонентах. Эта страница называется “ТОП по трафику”. Выборку можно производить за произвольный промежуток времени.

Пример получения данных о трафике по протоколу Netflow

Исходные данные о трафике удобно получать используя Netflow. По этому протоколу можно получать данные с маршрутизаторов Cisco, PC-маршрутизаторов на базе Linux/BSD, а так же с другого сетевого оборудования.
Для сбора информации используется программное обеспечение flow-tools (http://www.splintered.net/sw/flow-tools/). В АСР “Pyzzle.ISP” данные о трафике должны быть классифицированы и агрегированы, для этого так же используется flow-tools.
Для настройки работы flow-tools нужно выполнить следующее:
  1. Настроить сбор данных. Для этого используется программа flow-capture, в параметрах запуска которой указывается в какие каталоги складывать “сырые netflow” данные, как часто сбрасывать информацию в файлы и какую программу для обработки этих данных нужно запускать.

    flow-capture -R /opt/billing/bin/parse_netflow_file -N -1 -n 287 -w /netflow/ 0/10.10.10.10/9996
    Приведенный пример означает что данные с netflow будут поступать от маршрутизатора 10.10.10.10 на порт 9996, файлы с “сырым netflow” будут записываться в каталог /netflow/. Параметр "-N 1" означает что в каталоге /netflow/ будут созданы каталоги для каждого дня, названием каталога будет дата в формате ГГГГ-MM-ДД, а уже в этом каталоге будут файлы. Каждый файл будет хранить информацию про трафик за 5 минут (параметр -n 287 означает что за сутки будет создано 287 файлов, как раз и соответствует 5 минутному интервалу). Параметр -R /opt/billing/bin/parse_netflow_file означает, что для после сохранения файла будет запущен скрипт parse_netflow_file для обработки собранных данных. (Содержимое скрипта описано ниже). Подробнее о параметрах запуска flow-capture можно узнать в документации к пакету flow-tools.
  2. Настроить правила классификации трафика. Для классификации используется команда flow-nfilter. Для настройки используется конфигурационный файл filter.cfg в каталоге /etc/flow-tools/cfg (каталог может отличаться в зависимости от используемого дистрибутива операционной системы). Детальное описании этого файла можно узнать в документации к пакету flow-tools. Пример настройки фильтрации трафика для варианта с двумя классами трафика “интернет входящий”, “интернет исходящий”, при этом должен быть исключен локальный трафик между абонентам и серверами провайдера.

    filter-primitive lan_network
      type ip-address-prefix
      permit 192.168.0.0/16
      permit 10.0.0.0/8
      permit 195.195.195.0/24
      permit 134.134.134.0/23
      default deny
    
    filter-primitive inet_network
      type ip-address-prefix
      deny 192.168.0.0/16
      deny 10.0.0.0/8
      deny 195.195.195.0/24
      deny 134.134.134.0/23
      default permit
    
    filter-definition inet_out
      match src-ip-addr lan_network
      match dst-ip-addr inet_network
    
    filter-definition inet_in
      match dst-ip-addr lan_network
      match src-ip-addr inet_network
    В примере настроены два АСL для классификации трафика lan_network который срабатывает на локальные адреса (указаны глобально не маршрутизируемые сети, используемые провайдером для выдачи абонентам, а так же сети с реальными адресами принадлежащему провайдеру), а так же inet_network которые срабатывает на “чужие” IP адреса. Далее в конфигурационном файле описаны два определения фильтров, фильтр inet_out определяет трафик идущий от локальных адресов на чужие, а фильтр inet_in определяет трафик идущий с чужих адресов на локальные.
  3. Создаем скрипт для обработки “сырого netflow” parse_netflow_file. Этот скрипт вызывается командой flow-capture для обработки собранных данных. Задача это скрипта обработать файл с данными и загрузить информацию в АСР “Pyzzle.ISP”.

    Пример скрипта для обработки двух классов трафика:
    #!/bin/sh
    
    FILE="/netflow/$1"
    
    export PYZZLE_HOME="/opt/billing/"
    LOAD_IN_SYSTEM_CMD="$BILLING_HOME/cli iptraff load input"
    LOAD_OUT_SYSTEM_CMD="$BILLING_HOME/cli iptraff load output"
    
    flow-cat $FILE | flow-nfilter -F inet_in | flow-stat -f8 | awk '{ print $1," ",$3; }' | $LOAD_IN_SYSTEM_CMD && \
    flow-cat $FILE | flow-nfilter -F inet_out | flow-stat -f9 | awk '{ print $1," ",$3; }' | $LOAD_OUT_SYSTEM_CMD && \
    mv $FILE $FILE.parsed
    Этот скрипт получает в качестве аргумента название файла, но без пути к корневому каталогу, поэтому в переменную FILE мы заносим полный путь к файлу с сырыми данными. Далее мы определяем переменные окружения для корректной работы системы, и команды для загрузки трафика в АСР.
    Далее скрипт вызывает комбинацию команд, в результате которых, исходный файл с данными фильтруется на соответствие нужному классу трафика, после этого агрегируется для получения суммарного потребления трафика с группировкой по локальному IP адресу, далее результат немного переформатируется, используя стандартную команду awk. В результате данные полностью преобразованы в формат пригодный за загрузки в АСР “Pyzzle.ISP” после чего данные загружаются в систему. В случае если загрузка прошла успешно, то скрипт переименовывает исходный файл, добавляя к его имени .parsed, это позволяет легко обнаруживать необработанные файлы.

    Note

    Настройка классификации трафика, а так же проверка корректности работу осуществляется совместно разработчиком и заказчиком в ходе внедрения информационной системы.

Распределение хранения информации с историей трафика

Детальная информация о потреблении трафика (кто, когда, сколько и какого типа трафика) храниться в базе данных в таблице iptraff_history и используется только в информационных целях (для отображения детальной информации о потреблении), данные из этой таблице не используются при расчете состояния лицевого счета абонента. Данные в эту таблицу постоянно добавляются и со временем количество записей в этой таблице становиться очень большим, что приводит к росту размера базы данных и замедляет не только получение данных из этой таблицы, он и процедуры резервного копирования базы данных и восстановления.
АСР “Pyzzle.ISP” позволяет оптимизировать хранение и выборку данных о потреблении трафика путем распределения хранения этих данных по разным таблицам и даже возможно распределение по разным базам данных. Это позволит хранить данные в таблице iptraff_history только наиболее свежие данные за небольшой промежуток времени, а в более старые данные хранить отдельно. В результате старые данные остаются доступными для просмотра (выбор источника данные при запросе информации о потреблении трафика выполняется автоматически и абсолютно прозрачен для оператора информационной системы), однако эти данные не участвуют в процессе резервного копирования (их нужно скопировать вручную при разделении свежих и старых данных, при этом регулярное копирование не требуется так как старые данные неизменны). В результате, в случае необходимости, база данных будет восстановлена намного быстрее, а информацию о старом трафике можно восстановить из резервных копий позже, и это не окажет влияния на работоспособность системы). Дополнительным плюсом разделения является то, что для архивных данных можно использовать безтранзакционный тип хранения, т.к. данные только читаются.
Разбиение данных осуществляется автоматически а детали разбиения индивидуальны для каждой инсталляции системы. При необходимости получения информации о потребленном трафике информационная система определяет из каких таблиц нужно получать данные.

Учет налогов

При необходимости информационная система может вести учет налогов за пользование услугами связи.

Note

АСР не является, и не задумывалась как замена бухгалтерскому ПО, и учет налогов реализован на минимально необходимом уровне.

Для включения учета налогов в конфигурационном файле enviroment.py, в контексте объекта “абонент”, нужно указать константы:
ENABLE_TAXES = True
TAXES_PAY_TYPES = ['ab_plata', 'traffic']
TAXES_VOLUME = 18
Эти строки включают режим учета налогов, указывают типы платежей подлежащие вычислению налога, и размер налога в процентах. В результате при совершении платежей указанных типов, сумма платежа будет увеличена на указанное кол-во процентов, а в истории платежей отдельным полем будет храниться и отображаться размер налогов. Таким образом, в описании тарифного плана нужно указывать стоимости без учета налогов. Если в системе заведено несколько разных классов абонента, то ставки налога могут быть различны для них. Например описав в конфигурационном файле enviroment.py два класса абонента “резидент” и “не резидент” можно указать разную ставку налога и в этом случае стоимость услуг будет различна для этих классов, хотя в описании тарифных планов стоимость будет одинакова.

Округление денег и трафика

Данные о потребленном трафике за расчетный период хранятся в системе с точностью до байта. Трафик отражается в истории платежей фиксируется только по окончанию расчетного периода, это значит что погрешность округления стоимости трафика происходит только один раз в конце расчетного периода. В течении расчетного периода актуальная стоимость трафик каждый раз вычисляется в соответствии с правилами тарифного плана.
Стоимость услуг и поступивших платежей система округляет с точностью до двух знаков после запятой, используя правила арифметического округления. При необходимости точность можно задать переопределив константу MAKE_PAYMENT_ROUNDING_QUONTIZE в классе абонента, в ней нужно указать количество знаков после запятой (по умолчанию 2).
Если в описании тарифа добавлен класс Tarif_traff_rounding, то это позволяет использовать округление трафика отличное от точности до байта, при вычислении стоимости трафика. То есть сам трафик за период продолжает накапливаться с точностью до байта, однако при вычислении стоимости может округляться, что позволяет реализовать тарифы вида “за каждый полный и не полный Мегабайт”. Для настройки правил округления нужно использовать константы DEFAULT_TRAFFIC_ROUNTING_QUANTIZE - указывает точность подсчета трафик (1 с точностью до байта, 1024 до килобайта и т п.) DEFAULT_TRAFFIC_ROUNDING_TYPE указывает на метод округления: (0 - арифметическое, 1 - в большую сторону, -1 - в меньшую).
В описании тарифов параметры связанные с трафиком указываются в мегабайтах. Система позволяет настроить правила перевода мегабайт в байты, для этого в описании объекта BillObject или в описании тарифа нужно определить константу MEGABYTE, значение по умолчанию 1048576).