BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 20 май 2024, 15:20

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
СообщениеДобавлено: 03 авг 2007, 17:22 
Не в сети

Зарегистрирован: 28 июл 2007, 22:57
Сообщения: 110
Карма: 0
как реализовать с помощью bgbilling безлимитный тарифный план со скоростью, зависящей от потребленного в данном отчетном периоде траффика. я так понимаю что по достижении предела потребленного траффика абоненту меняется шлюз. возникшие вопросы:
1)как отловить событие превышения порогового объема траффика? среди стандартных событий по которым запускаются скрипты нужного события я не нашел;
2)где в тарифном плане хранить информацию о порогах траффика и соответсвющих им шлюзах?

зажатие скорости выполняется PC-роутером, VPN не используется

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

как аналогичную функциональность сделать идеологически правильно в BGBiliing?


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

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
1) Есть событие таймера
2) Хранить можно в скрипте в привязке к тарифам


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 31 авг 2007, 11:51 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Достаточно ли будет в нашем биллинге сделать вызов скрипта? Какие параметры должны быть в него переданы и в каком формате?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 27 окт 2007, 19:42 
Не в сети

Зарегистрирован: 28 июл 2007, 22:57
Сообщения: 110
Карма: 0
Администратор писал(а):
Достаточно ли будет в нашем биллинге сделать вызов скрипта? Какие параметры должны быть в него переданы и в каком формате?


так скрипт и так вызывается по таймеру
алгоритм видимо должен быть такой:
цикл для всех пользователей
begin
-запоминаем текущий тип правила шлюза;
-по тарифу пользователя и потребленному траффику в текущем периоде определяем новое значение типа правила шлюза;
-если новое значение не совпадает со старым значением то
begin
--меняем тип правила шлюза,
--если шлюз открыт
begin
--закрываем шлюз;
--открываем шлюз;
end;
end;
end;

я так понимаю это можно написать на BGBS

ну а если делать правильно то надо делать в тарифе еще одно свойство тип правила шлюза (причем правило должно уметь привязываться к типу шлюза, тк могут использоваться одновременно два шлюза (например manad и IPN_RADIUS)

PS: а где посмотреть лог выполнения скрипта, который запускается по событию таймера?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 14 апр 2008, 01:11 
Не в сети

Зарегистрирован: 28 июл 2007, 22:57
Сообщения: 110
Карма: 0
Администратор писал(а):
1) Есть событие таймера
2) Хранить можно в скрипте в привязке к тарифам

Какой класс в BGBS хранит информацию о потребленном траффике а отчетном периоде?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 апр 2008, 16:35 
Не в сети
Разработчик

Зарегистрирован: 27 ноя 2006, 20:36
Сообщения: 5715
Карма: 93
Класса нет, таблица есть ipn_contract_data_<mid>_yyyyMM. У нас не для всего API есть.


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

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Заранее извиняюсь перед автором темы, что пишу тут: не хотелось плодить новых тем, название подходящее.

В настоящее время мы вводим группу новых безлимитных тарифных планов в которых абоненту выделяется полоса в канале и некоторый объем трафика, после потребления которого полоса изменяется. Стоим перед выбором как оптимальнее осуществить динамическое изменение полосы пропускания для каждого клиента. Весь трафик ходит через cроутер cisco.
Есть мысли по реализации:
Вариант 1: Сервер с биллингом превращаем в шлюз, настраиваем manad. Каким образом управлять шлюзом manad и получится ли так менять полосу?
Вариант 2: Каким-либо образом при превышении лимита потребленного трафика запускать скрипт, изменяющий конфиг роутера cisco. Это менее безопасно, но эффектифнее.

Возможно я вообще иду в неправильном направлении?

Жду комментариев и подсказок. Заранее всем благодарен!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 09 июн 2008, 21:35 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
SPY писал(а):
Заранее извиняюсь перед автором темы, что пишу тут: не хотелось плодить новых тем, название подходящее.

В настоящее время мы вводим группу новых безлимитных тарифных планов в которых абоненту выделяется полоса в канале и некоторый объем трафика, после потребления которого полоса изменяется. Стоим перед выбором как оптимальнее осуществить динамическое изменение полосы пропускания для каждого клиента. Весь трафик ходит через cроутер cisco.
Есть мысли по реализации:
Вариант 1: Сервер с биллингом превращаем в шлюз, настраиваем manad. Каким образом управлять шлюзом manad и получится ли так менять полосу?
Вариант 2: Каким-либо образом при превышении лимита потребленного трафика запускать скрипт, изменяющий конфиг роутера cisco. Это менее безопасно, но эффектифнее.

Возможно я вообще иду в неправильном направлении?

Жду комментариев и подсказок. Заранее всем благодарен!


В текущий момент при тарификации не вызывается ни сихронизация с manad ни какой-либо внешний скрипт . Вообще есть идея реализовать смену правил шлюзов IPN в зависимости от наработки(и других условий) при тарификации , начата работа в этом направлении и мы надеемся успеть это сделать в версии 4.5 . Тогда можно будет это делать для всех шлюзов , в том числе и для Manad


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 09 июн 2008, 23:16 
Не в сети

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Печально. Выходт, что мне не остается больше вариантов как писать свой скрипт(или программу) которая будет переодически вытаскивать из базы значение наработки по трафику и запускать те или иные ограничения?
Есть ли возможность хоть как-то автоматизировать процесс выполнения открытия\закрытия шлюза в зависимости от наработки по трафику?
Кроме всего прочего, я хотел поинтересоваться: не будет ничего страшного если при открытии шлюза будет ограничиваться полоса пропускания трафика до одного значения, а при закрытии шлюза не отрубаться клиент а ограничиваться полоса пропускания до другого значения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 10 июн 2008, 11:34 
Не в сети

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Так, еще есть идея реализовать замысел так:
1. Если при выполнении действия "Проверка шлюзов IPN" в планировщике происходит проверка лимитов пользователя у клиента, в зависимости о того положительный или отрицательный у него баланс, блокируется или разблокируется шлюз.
2. Необходимо сделать фиктивный тарифный план, в котором со счета пользователя за каждую еденицу потребленного трафика будет списываться некая сумма. Соответственно, когда пользователь будет иметь отрицательный баланс шлюз заблокируется.
3. Необходимо предусмотреть, чтобы после превышения барьера по потребленному трафику с пользователя не списывались эти фиктивные ден.средства, чтобы всегда одной и той же суммой делать баланс "положительным".

Остаются вопросы:
- Как ежемесячно автоматически закидывать пользователю на баланс определенную фиктивную сумму?
- Можно ли ограничивать трафик так, как я написал в пред. посте?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 июн 2008, 23:45 
Не в сети

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Все еще жду ответа...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 19 июн 2008, 16:55 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
SPY писал(а):
Печально. Выходт, что мне не остается больше вариантов как писать свой скрипт(или программу) которая будет переодически вытаскивать из базы значение наработки по трафику и запускать те или иные ограничения?
Есть ли возможность хоть как-то автоматизировать процесс выполнения открытия\закрытия шлюза в зависимости от наработки по трафику?
Кроме всего прочего, я хотел поинтересоваться: не будет ничего страшного если при открытии шлюза будет ограничиваться полоса пропускания трафика до одного значения, а при закрытии шлюза не отрубаться клиент а ограничиваться полоса пропускания до другого значения?


Ваш скрипт должен менять не только на шлюзе скорость, но и роставлять новое правило для данного договора в базу .. иначе отработает планировщик (или оператор из интерфейса откроет/закроет шлюз ) и пропадут ваши установки скорости .. Вообще я писал уже что в 4.5 мы планируем(если успеем ) сделать возможность в тарифе ipn менять правила в зависимости от наработки, можно подождать релиз. Покак правда до концка не совсем ясно как это будет выглядить

Скрипт можно сделать и сейчас ..примерный алгорим работы msh написал выше в этой теме ..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 19 июн 2008, 17:07 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
SPY писал(а):
Остаются вопросы:
- Как ежемесячно автоматически закидывать пользователю на баланс


Скриптом по событию таймера


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 02 июл 2008, 02:30 
Не в сети

Зарегистрирован: 28 июл 2007, 22:57
Сообщения: 110
Карма: 0
алгоритм видимо должен быть такой:
цикл для всех пользователей
begin
-запоминаем текущий тип правила шлюза;
-по тарифу пользователя и потребленному траффику в текущем периоде определяем новое значение типа правила шлюза;
-если новое значение не совпадает со старым значением то
begin
--меняем тип правила шлюза,
--если шлюз открыт
begin
--закрываем шлюз;
--открываем шлюз;
end;
end;
end;

событию таймера?[/quote]

вот собственно скрипт
кроме ограничения скорости при усиленном качании он также проставляет скорость пользователям в зависимости от тарифа

Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.ipn.bean.*;
import java.util.*;
import java.text.*;

//номер контракта
cid = event.getContractID();

//получение названия нужной таюлици с траффиком
evdate=event.getGenerateTime();
datefrm = new SimpleDateFormat("yyyyMM");
evyear=datefrm.format(evdate.getTime()).toString();

//получение траффика пользователя в данном отчетном периоде
ps = con.prepareStatement("SELECT SUM(amount) FROM ipn_contract_data_3_"+evyear+" WHERE cid=? AND sid=1");
ps.setInt( 1, cid);
rs = ps.executeQuery();
rs.first();
traffic = rs.getLong(1)/1073741824; //в гигабайтах

//получение текущего тарифа пользователя
//ctm =  new ContractTariffManager(  con );
//currentTariffID = ctm.getContractTariff( cid, evdate).getTariffPlanID();

ctm =  new ContractTariffManager(  con );

// текущий тарифный план
currentTarifList=ctm.getContractTariffList(cid, evdate);

//получение списка тарифов для для группы тарифов пользователя
ctgm=new ContractTariffGroupManager(con);
currentGroup=ctgm.getContractTariffGroup(cid, evdate);
if ( currentGroup == null ){
   error("no tarif group");
   return;
}
currentGroupID=currentGroup.getTariffGroupID();
tgm= new TariffGroupManager(con);
tariflist=tgm.getTariffGroupByID(currentGroupID).getPlanIdList();

for( Iterator it = currentTarifList.iterator(); it.hasNext();){
   currTarif = it.next();
   if (tariflist.contains(currTarif.getTariffPlanID().toString())) {
//      print("found_planID"+currTarif.getTariffPlanID());
      chTariff=currTarif;
      break;      
   }
//   print("check_plan"+currTarif.getTariffPlanID());
}


if( chTariff == null ){
 error( "Current tariff not found" );
 return;
}

currentTariffID=chTariff.getTariffPlanID();


//получение текущего типа шлюза пользователя
ugrm = new UserGateRuleManager( con, 3 );
rules = ugrm.getUserGateRules( cid );
for( Iterator it = rules.iterator(); it.hasNext(); ){
   currule = it.next();
   if (currule.getGateID() == 1){ //gate IPN
      ruletypeID=currule.getRuleTypeId();
      break;
   }
   print("gates="+currule.getGateID());
}


//расчет скорости пользователя в зависимости от тарифа
switch ( currentTariffID ){
   case 7:
      // план Нимбо-1 3мбит/c
      if (traffic < 50){
         newruleTypeID=4;
      }else{
         newruleTypeID=12;
      }
   break;

   case 8:
      // план Нимбо-2 5мбит/c
      if (traffic < 50){
         newruleTypeID=15;
      }else{
         newruleTypeID=12;
      }
   break;

   case 9:
      // план Нимбо-3 7мбит/c
      if (traffic < 100){
         newruleTypeID=16;
      }else{
         newruleTypeID=12;
      }
   break;

   case 10:
      // план Нимбо-4 10мбит/c
      if (traffic < 100){
         newruleTypeID=8;
      }else{
         newruleTypeID=11;
      }
   break;

   case 11:
      // план Нимбо-5 15мбит/c
      if (traffic < 100){
         newruleTypeID=17;
      }else{
         newruleTypeID=11;
      }
   break;

   case 12:
      // план Нимбо-6 20мбит/c
      if (traffic < 100){
         newruleTypeID=9;
      }else{
         newruleTypeID=11;
      }
   break;


   case 15:
      //бесплатный тариф 3Мбит/c
      if (traffic < 100){
         newruleTypeID=4;
      }else{
         newruleTypeID=12;
      }
   break;




   case 4:
      // план траффик 50мбит/c
      newruleTypeID=10;
   break;

   case 3:
      // план почтовый 50мбит/c
      newruleTypeID=10;
   break;

   case 5:
      // план Серфер 50мбит/c
      newruleTypeID=10;
   break;

   default:
      // 64 кбит/с
      newruleTypeID=14;
}



print("traffic="+traffic+" tarif="+currentTariffID+" rule="+ruletypeID+"newrule="+newruleTypeID);

//если новое правило отличается от существующего то обновляем
if (newruleTypeID != ruletypeID){
   currule.setRuleTypeId(newruleTypeID);
   ugrm.updateUserGateRule( String.valueOf( currule.getID() ), currule );

   // обновление правила на манаде
   csm = new IPNContractStatusManager( con, 3 );

   status =  csm.getContractStatus( cid );
   userID=1; //admin
   // открытие и закрытие шлюза (1-шлюз закрыт)
   csm.changeStatus( cid, 1, userID.intValue(), true );
   csm.changeStatus( cid, status, userID.intValue(), true );
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 ноя 2008, 20:45 
Не в сети

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Уважаемые знатоки BeanShell, хочу реализовать скрипт, описанный блок-схемой, прикрепленной ниже. Прошу помощи, ибо я не программист.
Идея такова:
Сприпт должен постоянно проверять статус шлюза и наработку по трафику в случае, если при открытом шлюзе трафик > 2Гб шлюз закрывается, а если при закрытом шлюзе трафик < 2Гб (в начале месяца) то шлюз открывается. Правильно ли я составил блок-схему?
И несколько вопросов.
1. Если я хочу, чтобы проверка производилась непрерывно мне необходимо вставить скрипт в "автоматизация->скрипт поведения->таймер"?
2. Связан ли таймер с шедуллером? (не нашел в документации)


Вложения:
bb-bs.jpg
bb-bs.jpg [ 52.52 КБ | Просмотров: 6943 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 ноя 2008, 19:47 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
SPY писал(а):
И несколько вопросов.
1. Если я хочу, чтобы проверка производилась непрерывно мне необходимо вставить скрипт в "автоматизация->скрипт поведения->таймер"?

да.
SPY писал(а):
2. Связан ли таймер с шедуллером? (не нашел в документации)

[/quote]
да.

У вас какой шлюз используется ? какая версия биллинга сейчас ?


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

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Шлюз cisco, как раз тот вариант, который так размусоливается в соседней теме :)
Версия биллинга 4.5
Цитата:
Цитата:
2. Связан ли таймер с шедуллером? (не нашел в документации)

Да

Шедуллер просто обрабатывает события таймера будучи запущенным или необходимо указывать доп. параметры к этой процедуре в настройках шедуллера?

Я предполагаю, что скрипт будет очень похож на тот, который приводил msh.... Если привести пример именно моей реализации не просто, накидайте пожалуйста хотя бы шаблон с реализацие необходимых циклов, условий и операций на beanshell...


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

Зарегистрирован: 20 фев 2007, 21:44
Сообщения: 132
Откуда: Москва
Карма: 0
Выставляю на суд публики слегка переделаный скрипт, который должен переодически проверять наработку по трафику для всех договоров и выполнять действия, описанные блоксхемой выше.
Код:
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.server.tariff.bean.*;
import bitel.billing.server.ipn.bean.*;
import java.util.*;
import java.text.*;


//номер контракта
cid = event.getContractID();

//получение названия нужной таблици с траффиком
evdate=event.getGenerateTime();
datefrm = new SimpleDateFormat("yyyyMM");
evyear=datefrm.format(evdate.getTime()).toString();

//получение траффика пользователя в данном отчетном периоде
ps = con.prepareStatement("SELECT SUM(amount) FROM ipn_contract_data_3_"+evyear+" WHERE cid=? AND sid=1");
ps.setInt( 1, cid);
rs = ps.executeQuery();
rs.first();
traffic = rs.getLong(1)/1073741824; //в гигабайтах

//получение текущего типа шлюза пользователя
ugrm = new UserGateRuleManager( con, 3 );
rules = ugrm.getUserGateRules( cid );
for( Iterator it = rules.iterator(); it.hasNext(); ){
   currule = it.next();
   if (currule.getGateID() == 1){ //gate IPN
      ruletypeID=currule.getRuleTypeId();
      break;
   }
   print("gates="+currule.getGateID());
}

currentTariffID=chTariff.getTariffPlanID(); // получение id тарифного плана, в которых описаны лимиты по наработке

csm = new IPNContractStatusManager( con, 3 );
status =  csm.getContractStatus( cid );
userID=1; //admin

switch ( currentTariffID ){

case 1:  // id=1 - тариф с наработкой 2 Гб до закрытия шлюза
      if ((traffic>2)&&(status=1)){
        csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
    }else{
        If traffic<2{
   csm.changeStatus( cid, 2, userID.intValue(), true ); //открыт
   }else{
   csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
   }
   }
    break;

case 2:  // id=2 - тариф с наработкой 2 Гб до закрытия шлюза
      if ((traffic>2)&&(status=2)){
        csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
    }else{
        If traffic<2{
   csm.changeStatus( cid, 2, userID.intValue(), true ); //открыт
   }else{
   csm.changeStatus( cid, 1, userID.intValue(), true ); //закрыт
   }
   }
    break;
}

Скрипт пока не опробован, прошу проверить правильность синтаксиса beanshell и еще пара вопросов:
1. При закрытии шлюза необходимо передать в csm.changeStatus параметр "1", а при открытии? "2" или "0"?
2. В параметрах условного оператора if правильно ли я указал "&&" если имелось в виду "логическое И" (AND)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 25 ноя 2008, 02:03 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
1. Для статуса можете использовать константы :
bitel.billing.common.module.ipn.IPNContractStatus:

{
public static final int STATUS_OPEN = 0;
public static final int STATUS_CLOSED = 1;
public static final int STATUS_LOCK = 2;
public static final int STATUS_REMOVED = 3;
public static final int STATUS_HARD_LOCK = 4;
}
2. Да ..логическое - && . Если просто &, то это битовая операция. в случае логических выражений тоже будет работаь, но там ее не принято использовать .

3.Имя таблицы можно получить так :
bitel.billing.server.util.Utils.getModuleMonthTableName( "ipn_contract_data", month, mid );

month - объект типа Calendar.
mid - код модуля.


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

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


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

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


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

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