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

Возможности

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

  • Снятие денег с дополнительного счёта при использовании параметра $conf{EXT_BILL_ACCOUNT}

  • Возможность производить снятия как по фиксированным периодам: начало месяца, начало квартала, начало года, так и по произвольным через месяц после последнего снятия, через квартал, через полгода, через год

  • Добавление комментариев при назначении периодических платежей пользователям. Комментарии отображаются при снятии денег по периодическим платежам.

  • Отображение даты следующего периодического платежа

  • Индивидуальная скидка для каждой услуги

  • Выполнение внешних программ для объявленных услуг.

Установка

Настройка работы с базой данных и создание таблиц:

mysql --default-character-set=utf8  -D abills < db/Abon.sql
cp Abon.pm  /usr/abills/Abills/mysql

Подключение модуля. abills/libexec/config.pl

@MODULES = (
          'Abon'
          );


Снятие абон. платы в ручном режиме

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

/usr/abills/libexec/periodic daily MODULES=Abon  DATE=xxxx-xx-xx


Плагины

internet_static_ip.pl

Для выдачи статических IP можно использовать /usr/abills/Abills/modules/Abon/internet_static_ip.pl


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

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


Для этого в тарифном плане в поле  "Внешняя обработка" нужно прописать следующее

/usr/abills/Abills/modules/Abon/internet_static_ip.pl POOL_ID=%ID%

Вместо %ID% нужно подставить ID пула из которого будут браться свободные адреса


Если добавить опцию FORCE_IP_ASSIGN=1, то система проверит входит ли поточный IP адрес абонента в рекомендуемый пул адресов (POOL_ID). Если в пуле адресов заполнено поле "Следующий пул" - то проверка по наличию IP адреса будет выполнена и в нем. Если IP адрес абонента не найден ни в одном пуле, то IP будет заменён на свободный IP адрес с рекомендуемого пула.

/usr/abills/Abills/modules/Abon/internet_static_ip.pl POOL_ID=%ID% UID=%UID% ACTION=ACTIVE FORCE_IP_ASSIGN=1

Опции

POOL_ID
Пул из которого брать IP
UID
UID
ACTIONACTIVE or ALERT  включение отключение IP
FORCE_IP_ASSIGN
Присваивать IP абоненту даже если у него есть IP адрес, но не соответствует пулу
SKIP_ALERT
Не выполнять снятие IP
DEBUGОтладка

internet_filter.pl

Для выдачи определенных фильтров,  например блокировка определённых ресурсов, использовать  внешнюю команду /usr/abills/Abills/modules/Abon/internet_filter.pl

Для этого в тарифном плане в поле "Внешняя обработка" нужно прописать следующее

/usr/abills/Abills/modules/Abon/internet_filter.pl FILTER_ID=%ID%

Вместо %ID% нужно подставить id фильтра

Тревожные пометки абонента

Если на момент снятия у абонента не было средств для активации услуги, услуга приостанавливается (тревожные пометки абонента). Для активации услуги необходимо перезавести ее в ручном режиме.

АбонентОпис ошибки
test_android

Абонент временно не оплатил услугу

для активации сервиса


Также в карточке абонента система предупреждает что есть не продленные сервисы


Внешний обработчик

Внешний обработчик запускает внешние программы обработки при изменении учетной записи абонента через веб-интерфейс.

В качестве аргументов передаются параметры сервиса абонента: UID, TP_ID, LOGIN, DEPOSIT, CREDIT.

Пример внешней программы для добавления ТП Abon:

При подключении тарифного плана "Интернет" с TP_ID=196 активировать ТП "Abon" с ID=14 (например, Статический IP)

$conf{INTERNET_EXTERNAL_CMD} = '/usr/abills/Abills/modules/Abon/abon_activate.pl';
#!/usr/bin/perl
=head NAME abon_activate.pl

=cut
no if $] >= 5.017011, warnings => 'experimental::smartmatch';
use strict;

our $libpath;
BEGIN {
  use FindBin '$Bin';

  our $Bin;
  use FindBin '$Bin';

  $libpath = $Bin . '/../';
  if ($Bin =~ m/\/abills(\/)/) {
    $libpath = substr($Bin, 0, $-[1]);
  }

  unshift(@INC, $libpath,
    $libpath . '/Abills/',
    $libpath . '/Abills/mysql/',
    $libpath . '/Abills/Control/',
    $libpath . '/Abills/modules/',
    $libpath . '/lib/'
  );
}
do 'libexec/config.pl';
our (%conf);

use Abills::SQL;
use Abills::Base qw/parse_arguments/;
use Admins;

my $argv = parse_arguments(\@ARGV);
my $debug = $argv->{DEBUG} || 0;

our $db = Abills::SQL->connect(@conf{qw/dbtype dbhost dbname dbuser dbpasswd/},
  { CHARSET => $conf{dbcharset} });

my $Admin = Admins->new($db, \%conf);
$Admin->info($conf{SYSTEM_ADMIN_ID}, { IP => '127.0.0.3', SHORT => 1 });

abon_activate();

#**********************************************************
=head2 abon_activate()

=cut
#**********************************************************
sub abon_activate {

  return 0 if !$argv->{UID} || !$argv->{add} || !$argv->{TP_ID} || $argv->{TP_ID} ne '196';

  require Abon::Services;
  Abon::Services->import();
  my $Abon_services = Abon::Services->new($db, $Admin, \%conf);

  my $result = $Abon_services->abon_user_tariff_activate({
    UID => $argv->{UID},
    ID  => 14, #Tariff ID
  });

  if ($result->{errno}) {
    print $result->{errno} . ($result->{errstr} ? ":$result->{errstr}" : '');
    return 0;
  }

  my $messages = $result->{MESSAGES} && ref $result->{MESSAGES} eq 'ARRAY' ? join("\n", @{$result->{MESSAGES}}) : '';
  print "1:$messages";
  return 1;
}

1;