Написано и работает в версии биллинга 4.6На кого рассчитан этот скриптНа тех, кому не пофигу, кто администрирует АТС, на тех, у кого строго разграничены права доступа(кому куда можно, а кому нельзя), на тех, кто считает что доступ к интерфейсу управления АТС должны иметь только специалисты, умеющие администрировать АТС
ИнструкцияДля начала нужно создать новый скрипт поведения, и обозвать его как ваешй душе угодно, сделать его обработчиком события "Изменение статуса договора". Привязать этот скрипт к желаемому договору, номерами которого хотите рулить из биллинга.
Для работы этого скрипта не требуется tune, скрипт подклчюается сразу к scomm, и через него рулит АТСНам нужно было отключать МГ, МН, зоновую связь при задолженности абонента. Если Вам нужны дополнительные функции - доработать скрипт не составит проблем.
Код:
// generated by xternalx at 10-11.06x2010
// visit http://xternalx.com
// or icq: 444 121 808
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.util.*;
import java.sql.*;
import java.util.*;
import java.lang.*;
import java.util.regex.*;
import java.util.regex.Pattern.*;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.phone.bean.*;
import bitel.billing.server.util.telnet.*;
public HashMap loadOptions(String opts)
{
options = new HashMap();
String[] lines = opts.replaceAll(",","").split("\n");
for(i=0; i < lines.length; i++)
{
if(!lines[i].equals("") && !lines[i].equals(" "))
if(!lines[i].substring(0,1).equals("#") || !lines[i].substring(0,1).equals(";"))
{
String[] kv = lines[i].split(" ");
svc_type = new ArrayList();
for(j=1; j < kv.length; j++)
{
svc_type.add(kv[j]);
//print(" "+kv[j]);
}
options.put(kv[0], svc_type);
}
}
return options;
}
public void performAction(actionCode)
{
}
public void onEvent( event, setup, con, conSlave )
{
cid = event.getContractID();
contract = new ContractManager(con).getContractByID(cid);
clStatus = event.getStatus().getStatus();
print("status changed for contract "+cid+" to state: "+clStatus );
//cintract,getStatus() == 3 - закрыт
//contract.getStatus() == 2 - отключен
//contract.getStatus() == 0 - подключен
clItemManager = new ClientItemManager(con,1);
clPointsInBill = clItemManager.getItemList(cid);
for(i=0; i< clPointsInBill.size(); i++)
{
pointItem = clPointsInBill.get(i);
portNumber = 10001;
scommHost = "192.168.1.15";
pointNumber = pointItem.getClientNumbers().get(0);
options = loadOptions(clPointsInBill.get(i).getComment());
haveVnums = false;
// если номер в федеральном формате
// приводим его к обычному 7ми значному виду
if(pointNumber.length()==11)
{
pointNumber = pointNumber.substring(4);
}
//print(" getting options for point: "+pointNumber);
// у абонента виртуальный номер?
if(options.containsKey("vnum"))
{
haveVnums = true;
print(pointNumber+" is alias for some virtual numbers");
//pointNumber = (String)options.get("vnum").get(0);
}
// на каком порту подключена АТС к SCOMM
if(options.containsKey("port"))
{
print(pointNumber+" allocated to SCOMM port"+options.get("port").get(0));
portNumber = Integer.parseInt(options.get("port").get(0));
}
t = new TelnetSession(scommHost, portNumber);
t.connect();
switch(clStatus)
{
case 0:
{
if(options.get("svc_stopped") != null)
{
if(!haveVnums)
{
print(t.doCommand("settune "+pointNumber+" USE ON"));
}
else
{
for(j=0; j< options.get("svc_stopped").size(); j++)
{
for(x=0; x<options.get("vnum").size();x++)
{
print(" take point "+options.get("vnum").get(x)+" online");
print(t.doCommand("settune "+options.get("vnum").get(x)+" "+(String)options.get("svc_stopped").get(j)+" ON"));
}
}
}
}
else
{
print("no options defined for point: "+pointNumber);
}
break;
}
case 2:
{
print(" take point "+pointNumber+" offline");
if(options.get("svc_stopped") != null)
{
if(!haveVnums)
{
print(t.doCommand("settune "+pointNumber+" USE OFF"));
}
else
{
for(j=0; j< options.get("svc_stopped").size(); j++)
{
for(x=0; x<options.get("vnum").size();x++)
{
print(" take point "+options.get("vnum").get(x)+" online");
print(t.doCommand("settune "+options.get("vnum").get(x)+" "+(String)options.get("svc_stopped").get(j)+" OFF"));
}
}
}
}
else
{
print("no options defined for point: "+pointNumber);
}
break;
}
case 3:
{
print(" take point "+pointNumber+" down");
if(options.get("svc_closed") != null)
{
if(!haveVnums)
{
print(t.doCommand("settune "+pointNumber+" USE OFF"));
}
else
{
for(j=0; j< options.get("svc_closed").size(); j++)
{
for(x=0; x<options.get("vnum").size();x++)
{
print(" take point "+options.get("vnum").get(x)+" online");
print(t.doCommand("settune "+options.get("vnum").get(x)+" "+(String)options.get("svc_closed").get(j)+" OFF"));
}
}
}
}
else
{
print("no options defined for point: "+pointNumber);
}
break;
}
}
t.disconnect();
}
}
При добавлении нового поинта для договора в биллинге, в его поле "Комментарий" необходимо записать следующий текст:
Код:
port 10001
vnum 304
svc_stopped CMN_8xxx, CMN_10xxx, CMN_82xxx
svc_closed USE
Разберем подробнее.
port - здесь указываем порт на котором висит АТС, подключенная к SCOMM.
Возможные значения портов по географическому расположению абонентов можете узнать у администратора АТС
vnum - необязательный параметр. Если абоненту был присвоен виртуальный номер, то его нужно указать здесь. Допустим, у нас в офисе номер телефона 2529050 является виртуальным. На АТС он записан под номером 304. *Если номер телефона реальный, этот параметр указывать не нужно*
svc_stopped - указываются сервисы, которые необходимо отключать, или включать у абонента при изменении статуса его договора("Подключить" - включает сервисы, "Отключить" - отключает)
svc_closed - указываются сервисы, которые необходимо выключать, когда договор закрывается(статус "Закрыт")
В примере выше говорится что необходимо
Список доступных параметров:
CMN_TOME - тональный набор
CMN_OUTCOME - исходящая связь
CMN_INCOME - входящая связь
CMN_EXTERNAL - внешние номера
CMN_PAYSERVICE - платные службы
CMN_8xxx - выход на 8
CMN_10xxx - выход на 810
CMN_AON - выдача АОНа
CMN_82xxx - выход на 82
_________________
using billingClient.BGB 4.6;
using server.Ubuntu server 9.10;
using server.Java "1.6.0_15";
using client.Ubuntu 10.04;