forum.bitel.ru
http://forum.bitel.ru/

Скрипт для отрицательной абонплаты
http://forum.bitel.ru/viewtopic.php?f=16&t=1743
Страница 1 из 3

Автор:  sabriel [ 18 дек 2008, 17:52 ]
Заголовок сообщения:  Скрипт для отрицательной абонплаты

Здравствуйте. Нам необходимо реализовать следующие.
у абонентов есть лимит - (минус) 300р, после которого доступ в интернет закрывается, но абонплата продолжается начисляться, что не нужно.
Вот необходимо что бы скрипт(задача) запущенная скажем каждый час, проверяла баланс меньше -300 р и сменяла статус договора на приостановлен, и так же если баланс больше -300 соответственно ставила статус активен.
Помогите реализовать :)

Автор:  stels [ 18 дек 2008, 18:45 ]
Заголовок сообщения: 

А лучше добавьте данный функционал в модуль npay, не так там много и надо сделать, просто условие добавить что если исх остаток меньше лимита и абоненту запрещен доступ, то абонплату не снимаем
Ну или спец статус наверное лучше для абонплаты, для одних договоров так считаем для других по другому

Автор:  lda [ 19 дек 2008, 16:07 ]
Заголовок сообщения: 

Мы реализовали подобную схему на перле. Первого числа в 0 часов 5 минут запускается скрипт, который отменяет абонплату за прошлый месяц. Если абонент ушел в минус и в плюс не выходил весь месяц, то отменяется вся абонплата, а если он вышел в плюс в середине месяца, то абонплата пересчитывается исходя из того, что абонент работает с момента оплаты.
Могу скинуть скрипт если надо, подправите под свои задачи.

Автор:  stels [ 19 дек 2008, 17:25 ]
Заголовок сообщения: 

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

Автор:  Администратор [ 25 дек 2008, 12:50 ]
Заголовок сообщения: 

Возможно фиксировать дату смены остатка например лимитом и менять статус на _приостановлен_. А по приходу на _активен_ менять.

Автор:  stels [ 25 дек 2008, 13:16 ]
Заголовок сообщения: 

А каким образом это можно осуществить? Скрипт, или ещечасно всех абонентов вручную отслеживать?
Данного автоматического функционала, я не нашел, bgbilling 4.5

Автор:  Администратор [ 25 дек 2008, 13:21 ]
Заголовок сообщения: 

Цитата:
А каким образом это можно осуществить? Скрипт, или ещечасно всех абонентов вручную отслеживать?
Данного автоматического функционала, я не нашел, bgbilling 4.5

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

Автор:  stels [ 25 дек 2008, 14:59 ]
Заголовок сообщения: 

А готового скрипта нет нигде?

Автор:  dsheptalin [ 11 янв 2009, 15:42 ]
Заголовок сообщения: 

Да скриптик неплохоб разработчикам написать... Постоянно с абонплатами заморочки. Желательно чтоб скрипт проверял перед снятием абонплаты достаточно-ли денег на счету. Если недостаточно то менял статус договора на неактивный. Но денег приэтом неснимал.

Автор:  stels [ 16 янв 2009, 19:05 ]
Заголовок сообщения: 

Начал писать скрипт, дошел вот до этого
Код:
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.KernelConst;
import java.util.*;

//ID абонента CID
cid = event.getContractID();

contract = new ContractStatusManager(con);
date = event.getGenerateTime().clone();

//Статус абонента
contract_status = contract.getStatus (cid, date).getStatus();
if (contract_status == null) {contract_status = KernelConst.CONTRACT_STATUS_ACTIVE;};

//Баланс абонента
balance = new BalanceUtils(con);
contract_balance = balance.getBalance (date, cid);

Как получить текущий лимит для контракта, в доках это чтото не указано

Автор:  stels [ 16 янв 2009, 19:12 ]
Заголовок сообщения: 

Прямой запрос к БД как вариант?

Автор:  m2pod [ 16 янв 2009, 20:43 ]
Заголовок сообщения: 

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

Автор:  dsheptalin [ 21 янв 2009, 23:48 ]
Заголовок сообщения: 

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

Автор:  stark [ 26 янв 2009, 19:17 ]
Заголовок сообщения: 

stels писал(а):
Как получить текущий лимит для контракта, в доках это чтото не указано


Код:

contract = new ContractManeger( con ).getContractByID( cid );
limit = contract.getBalanceLimit();

Автор:  stark [ 26 янв 2009, 19:38 ]
Заголовок сообщения: 

Код:
ContractStatusManager statusManager  = new ContractStatusManager( con ) ;
status = statusManager.getStatus(cid, new java.util.Date())


if ( limit.compareTo( new BigDecimal( -300 )  ) < 0  && status.getStatus()  != KernelConst.CONTRACT_STATUS_SUSPENDED )
{
status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED );
}
else if (&& status.getStatus()  != KernelConst.CONTRACT_STATUS_ACTIVE  )
{
status.setStatus( KernelConst.CONTRACT_STATUS_ACTIVE );
}

statusManager.changeStatus( status );


Автор:  stels [ 27 янв 2009, 17:29 ]
Заголовок сообщения: 

Получилось следующее:
Код:
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.KernelConst;
import java.util.*;

//ID абонента CID
cid = event.getContractID();
date = event.getGenerateTime().clone();

contract = new ContractManager(con).getContractByID(cid);
if (contract == null)
   {return;}
//Лимит абонента
contract_limit = contract.getBalanceLimit();
//Баланс абонента
balance = new BalanceUtils(con);
contract_balance = balance.getBalance (date, cid);
//Статус абонента
ContractStatusManager statusManager  = new ContractStatusManager(con);
status = statusManager.getStatus(cid, date);
if (status != null)
   {contract_status = status.getStatus ();}
else
   {contract_status = KernelConst.CONTRACT_STATUS_ACTIVE;};

if (contract_balance < contract_limit && contract_status == KernelConst.CONTRACT_STATUS_ACTIVE)
   {
      status.setStatus(KernelConst.CONTRACT_STATUS_SUSPENDED);
      statusManager.changeStatus(status);
   };
if (contract_balance > contract_limit && contract_status == KernelConst.CONTRACT_STATUS_SUSPENDED)
   {
      status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
      statusManager.changeStatus(status);
   };

Только на смену статусов ругается, посмотрите поправьте меня где неправ. Я в java сижу уже с начала написания скрипта такчто не ругайтесь сильно )))

Автор:  aardvark [ 29 янв 2009, 16:34 ]
Заголовок сообщения: 

А на какое событие подвешен скрипт?
Просто у меня на смену статусов не ругается. Вобще скрипт полезный. Еще бы заставить его делать пометки в истории о том, что он делал.

Автор:  stels [ 29 янв 2009, 18:19 ]
Заголовок сообщения: 

Ну собственно смену статусов я поставил как должно оно быть, но это у меня не работает.
А у вас получается работает?

Автор:  stark [ 29 янв 2009, 20:32 ]
Заголовок сообщения: 

что значит на смену статусов ругается ? нужны логи с руганью

Автор:  stels [ 29 янв 2009, 20:48 ]
Заголовок сообщения: 

Код:
ERROR  29.01.2009 19:47:58  Eval error: Sourced file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : null
Sourced file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : null : at Line: 30 : in file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : status .setStatus ( KernelConst .CONTRACT_STATUS_SUSPENDED )

Target exception: java.lang.NullPointerException: Null Pointer in Method Invocation

        at bsh.UtilTargetError.toEvalError(Unknown Source)
        at bsh.UtilEvalError.toEvalError(Unknown Source)
        at bsh.BSHMethodInvocation.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHIfStatement.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:62)
        at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:320)
        at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:187)
        at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:106)
        at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:120)
        at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
INFO   29.01.2009 19:47:58  Process time => 33

Автор:  aardvark [ 29 янв 2009, 21:30 ]
Заголовок сообщения: 

У меня работает. Единственное что, не удалось пока привязать этот скрипт чтобы срабатывал по таймеру. Пришлось привязывать к другим параметрам.

Автор:  stark [ 03 фев 2009, 18:44 ]
Заголовок сообщения: 

stels писал(а):
Код:
ERROR  29.01.2009 19:47:58  Eval error: Sourced file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : null
Sourced file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : null : at Line: 30 : in file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : status .setStatus ( KernelConst .CONTRACT_STATUS_SUSPENDED )

Target exception: java.lang.NullPointerException: Null Pointer in Method Invocation

        at bsh.UtilTargetError.toEvalError(Unknown Source)
        at bsh.UtilEvalError.toEvalError(Unknown Source)
        at bsh.BSHMethodInvocation.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHPrimaryExpression.eval(Unknown Source)
        at bsh.BSHBlock.evalBlock(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHBlock.eval(Unknown Source)
        at bsh.BSHIfStatement.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bsh.Interpreter.eval(Unknown Source)
        at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:62)
        at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:320)
        at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:187)
        at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:106)
        at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:120)
        at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
INFO   29.01.2009 19:47:58  Process time => 33


у вас в этом блоке ошибка(в 30-ой строке судя по логу):
Код:

if (contract_balance < contract_limit && contract_status == KernelConst.CONTRACT_STATUS_ACTIVE)
   {
      //Тут падает !! у вас status -  null .. его тут надо не обновлять , а создавать этом случае
      status.setStatus(KernelConst.CONTRACT_STATUS_SUSPENDED);
      statusManager.changeStatus(status);
   };
if (contract_balance > contract_limit && contract_status == KernelConst.CONTRACT_STATUS_SUSPENDED)
   {

      status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
      statusManager.changeStatus(status);
   };

Автор:  stark [ 03 фев 2009, 18:51 ]
Заголовок сообщения: 

надо
Код:

if (status == null)
{
   ContractStatus status = new ContractStatus();
        status.setContractId( cid );
        status.setDate1( new java.util.Date() );
        status.setStatus( ... );
        status.setComment( "добавили скриптом");
        //0 - значит сервер
        status.setUserId( 0 );
}



Вначале когда договор только добавили, то статуса нет(null) и он считается активным ..если потом его надо сменить , то надо его создать со значенем равным новому статусу

Автор:  stels [ 05 фев 2009, 17:36 ]
Заголовок сообщения: 

Код:
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.KernelConst;
import java.util.*;

//ID абонента CID
cid = event.getContractID();
date = event.getGenerateTime().clone();

contract = new ContractManager(con).getContractByID(cid);
if (contract == null)
   {return;}
//Лимит абонента
contract_limit = contract.getBalanceLimit();
//Баланс абонента
balance = new BalanceUtils(con);
contract_balance = balance.getBalance (date, cid);
//Статус абонента
ContractStatusManager statusManager  = new ContractStatusManager(con);
status = statusManager.getStatus(cid, date);
if (status != null)
   {contract_status = status.getStatus ();}
else
   {
      ContractStatus status = new ContractStatus();
      status.setContractId(cid);
      status.setDate1(date);
      status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
      status.setComment("Смена статуса сервером");
      status.setUserId(0);
      statusManager.updateStatus(status);
      contract_status = status.getStatus ();
   };
if (contract_balance < contract_limit && contract_status == KernelConst.CONTRACT_STATUS_ACTIVE)
   {
      status.setStatus(KernelConst.CONTRACT_STATUS_SUSPENDED);
      statusManager.updateStatus(status);
   };
if (contract_balance > contract_limit && contract_status == KernelConst.CONTRACT_STATUS_SUSPENDED)
   {
      status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
      statusManager.updateStatus(status);
   };

Получилось вот так, даже вроде статусы верно меняет, потестировать только осталось
А changeStatus(status); так и не понял как использовать

Автор:  stels [ 06 фев 2009, 12:57 ]
Заголовок сообщения: 

Код:
      status.setContractId( cid );
      status.setDate1( date );
      status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED );
      status.setComment( "Смена статуса сервером" );
      status.setUserId( 0 );
      statusManager.changeStatus( status );

Рисует
Код:
Sourced file: inline evaluation of: ``import bitel.billing.server.call.bean.Login; import bitel.billing.server.radius. . . . '' : Method Invocation statusManager.changeStatusjava.lang.NoClassDefFoundError: bitel/billing/server/contract/Module
   at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:260)
   at bitel.billing.server.contract.bean.ContractStatusManager.changeStatus(ContractStatusManager.java:343)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at bsh.Reflect.invokeOnMethod(Unknown Source)
   at bsh.Reflect.invokeObjectMethod(Unknown Source)
   at bsh.Name.invokeMethod(Unknown Source)
   at bsh.BSHMethodInvocation.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHPrimaryExpression.eval(Unknown Source)
   at bsh.BSHBlock.evalBlock(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHBlock.eval(Unknown Source)
   at bsh.BSHIfStatement.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bsh.Interpreter.eval(Unknown Source)
   at bitel.billing.server.script.bean.ScriptMachine.runScript(ScriptMachine.java:62)
   at bitel.billing.server.script.bean.event.EventProcessor.processEvent(EventProcessor.java:320)
   at bitel.billing.server.processor.DefaultProcessor.standartAuth(DefaultProcessor.java:187)
   at bitel.billing.server.processor.dialup.DialUpProcessor.authenticationProcess(DialUpProcessor.java:106)
   at bitel.billing.server.radius.RadiusRequestThread.processRequest(RadiusRequestThread.java:120)
   at bitel.billing.server.radius.RadiusRequestThread.run(RadiusRequestThread.java:48)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
   at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: bitel.billing.server.contract.Module
   at java.net.URLClassLoader$1.run(Unknown Source)
   at java.security.AccessController.doPrivileged(Native Method)
   at java.net.URLClassLoader.findClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClassInternal(Unknown Source)
   ... 28 more

Автор:  stels [ 16 фев 2009, 17:45 ]
Заголовок сообщения: 

Код:
import bitel.billing.server.call.bean.Login;
import bitel.billing.server.radius.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.script.event.*;
import bitel.billing.common.KernelConst;
import java.util.*;

//ID абонента CID
cid = event.getContractID();
date = event.getGenerateTime().clone();
date_last = event.getGenerateTime().clone();

date_last.add( Calendar.DAY_OF_YEAR, -1 );

contract = new ContractManager(con).getContractByID(cid);
if (contract == null)
   {return;}
//Лимит абонента
contract_limit = contract.getBalanceLimit();
//Баланс абонента
balance = new BalanceUtils(con);
contract_balance = balance.getBalance (date, cid);
//Статус абонента
ContractStatusManager statusManager  = new ContractStatusManager(con);
status = statusManager.getStatus(cid, date);
if (status != null)
   {contract_status = status.getStatus();}
else
   {
      ContractStatus status = new ContractStatus();
      status.setContractId(cid);
      status.setDate1(date_last);
      status.setDate2( null );
      status.setStatus(KernelConst.CONTRACT_STATUS_ACTIVE);
      status.setComment("Смена статуса сервером");
      status.setUserId(0);
      statusManager.updateStatus(status);
      contract_status = status.getStatus();
   };

if (contract_balance < contract_limit && contract_status == KernelConst.CONTRACT_STATUS_ACTIVE)
   {
      if ( date_last.after(status.getDate1()) )
         {
            status.setContractId( cid );
            status.setDate2( date_last );
            status.setStatus( KernelConst.CONTRACT_STATUS_ACTIVE );
            status.setComment( "Смена статуса сервером - активен" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );

            ContractStatus status = new ContractStatus();
            status.setContractId( cid );
            status.setDate1( date );
            status.setDate2( null );
            status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED );
            status.setComment( "Смена статуса сервером - приостановка" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );
         }
      else
         {
            status.setContractId( cid );
            status.setDate1( date );
            status.setDate2( null );
            status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED );
            status.setComment( "Смена статуса сервером - приостановка" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );
         };
   };
if (contract_balance > contract_limit && contract_status == KernelConst.CONTRACT_STATUS_SUSPENDED)
   {
      if ( date_last.after(status.getDate1()) )
         {
            status.setContractId( cid );
            status.setDate2( date_last );
            status.setStatus( KernelConst.CONTRACT_STATUS_SUSPENDED );
            status.setComment( "Смена статуса сервером - приостановка" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );

            ContractStatus status = new ContractStatus();
            status.setContractId( cid );
            status.setDate1( date );
            status.setStatus( KernelConst.CONTRACT_STATUS_ACTIVE );
            status.setComment( "Смена статуса сервером - активен" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );
         }
      else
         {
            status.setContractId( cid );
            status.setDate1( date );
            status.setDate2( null );
            status.setStatus( KernelConst.CONTRACT_STATUS_ACTIVE );
            status.setComment( "Смена статуса сервером - активен" );
            status.setUserId( 0 );
            statusManager.updateStatus( status );
         };
   };

Вообщем получилось так, но это криво и с костылями. Разработчики ну сделайте нормально этот скрипт. В таком виде он работает, но если какие нестандартные ситуации будут, невозможно предсказать что будет.

Автор:  stark [ 17 фев 2009, 17:11 ]
Заголовок сообщения: 

stels писал(а):
Вообщем получилось так, но это криво и с костылями. Разработчики ну сделайте нормально этот скрипт. В таком виде он работает, но если какие нестандартные ситуации будут, невозможно предсказать что будет.


Что значит нормально ? что вы понимаеет под нестандартными ситуациями? можете обратится в платную поддержку..

Автор:  mikos [ 14 апр 2009, 14:03 ]
Заголовок сообщения: 

Подскажите пожалуйста, а куда привязывать подобную проверку?

Автор:  tiffolk [ 14 апр 2009, 16:48 ]
Заголовок сообщения: 

Видимо как здесь:
http://www.bgbilling.ru/v4.5/doc/ch02s02.html

Автор:  mikos [ 14 апр 2009, 18:16 ]
Заголовок сообщения: 

tiffolk писал(а):
Видимо как здесь:
http://www.bgbilling.ru/v4.5/doc/ch02s02.html

Просто интересно на какое событие это повесить...

Страница 1 из 3 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/