BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 10 июл 2025, 14:23

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Округление трафика
СообщениеДобавлено: 22 июл 2009, 16:16 
Не в сети

Зарегистрирован: 09 июл 2009, 11:31
Сообщения: 82
Откуда: Россия
Карма: 20
Добрый день.

А есть ли возможность в биллинге округлять полученный по NetFlow тарифик до мегабайтов, таким образом, чтобы в счете за месяц было целое количество мегабайт?

Я так понимаю, что пока единственное решение - это сделать скрипт, который дописывает в базу определенную дельту по трафику после отчетного месяца.

Есть ли другие варианты?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 05 авг 2009, 15:59 
Не в сети

Зарегистрирован: 09 июл 2009, 11:31
Сообщения: 82
Откуда: Россия
Карма: 20
Ответьте, пожалуйста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 авг 2009, 14:29 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Других вариантов нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 авг 2009, 15:50 
Не в сети

Зарегистрирован: 09 июл 2009, 11:31
Сообщения: 82
Откуда: Россия
Карма: 20
Выкладываю перловый скрипт для округления трафика, может кому и пригодится:
Код:
#!/usr/bin/perl -w
##################################################################
#  Скрипт округления трафика за предыдущий месяц в БД BGBilling  #
##################################################################

=for
Год и месяц задаются в командной строке, например:
# bg-round.pl 2009 7
Для передачи в скрипт текущей даты можно использовать команду date:
# bg-round.pl `date "+%Y"` `date "+%m"`
Для запуска из-под cron'а не забываем escape'ить символ "%":
20 0 1 * * bg-round.pl `date "+\%Y"` `date "+\%m"`
После выполнения скрипта необходимо запустить переначисление трафиков
в клиенте BGBilling
=cut

use strict;
use DBI;

my $mid = 2;             # Код модуля IPN
my $mb_bytes = 1048576;  # Байт в мегабайте

# Конфигурация БД
my %c = (
   host   => 'localhost',
        user   => 'user',
        pass   => 'pass',
   db     => 'bgbilling'
);

# Дата принимается из командной строки ...
my $year = $ARGV[0] ? $ARGV[0] : "2009";
my $month = $ARGV[1] ? $ARGV[1] : "7";
# ... и берется предыдущий месяц
if ($month == 1) {
   $year -= 1;
   $month = 12;
} else {
   $month -= 1;
}

my $yyyymm = $year.sprintf("%02d", $month);      # Нужный нам период в формате yyyymm
my $ipn_table = "ipn_contract_data_${mid}_${yyyymm}";   # Таблица с данными по трафику

my $dsn = join ';',
   "DBI:mysql:database=$c{'db'};host=$c{'host'}",
   'mysql_read_default_group=client',
   'mysql_read_default_file=/etc/my.cnf';
my $dbh = DBI->connect($dsn, $c{'user'}, $c{'pass'}, {RaiseError => 1, AutoCommit => 0}) || die "Can't connect to Mysql: $!";

# Выберем все договора, к которым привязан модуль IPN
my $sql = "select cid, title, comment from contract c join contract_module cm on c.id=cm.cid where mid=$mid group by cid, title, comment";
my $sth = $dbh->prepare($sql);
my $rc = $sth->execute;
my $ref = $sth->fetchall_arrayref;

# Заголовок отчета
print " cid |                    customer       | sid |     summa   |   rounded   |   delta |   max_id \n";
print "------------------------------------------------------------------------------------------------\n";
# Цикл по договорам
foreach my $r (@$ref) {
   # cid - номер (идентификатор) договора, customer - комментарий к договору (название клиента)
   my $cid = $r->[0];
   my $customer = $r->[2];

   $sql = "select sid, sum(amount)/$mb_bytes summa from  $ipn_table where cid=$cid group by sid";
   $sth = $dbh->prepare($sql);
   $rc = $sth->execute;
   my $ref1 = $sth->fetchall_arrayref;
   
   # Цикл по услугам (входящий трафик, исходящий и т.д.)
   foreach my $r1 (@$ref1) {
      # sid - идентификатор услуги, summa - суммарный трафик по услуге в мегабайтах
      my $sid = $r1->[0];
      my $summa = $r1->[1];
   
      # В delta - разница до округления (в байтах)
      my $rounded = sprintf("%.0f", $summa);
      my $delta = ($rounded - $summa)*$mb_bytes;
   
      # Выберем последнюю запись в таблице по данному клиенту и данной услуге
      $sql = "select max(id) from $ipn_table where cid=$cid and sid=$sid";
      $sth = $dbh->prepare($sql);
      $sth->execute;
      my @arr = $sth->fetchrow_array;
      my $max_id = $arr[0];
      $sth->finish;
   
      # Изменим количество трафика в этой записи на величину delta
      $sql = "update $ipn_table set amount=amount+$delta where id=$max_id";
      $sth = $dbh->do($sql);
   
      # Выведем данные в отчет
      printf "%4s |%34s |%4s |%12.2f |%12d |%8d |%8d\n", $cid, $customer, $sid, $summa, $rounded, $delta, $max_id;
   }
}

$dbh->disconnect;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.040s | 24 Queries | GZIP : On ]