Пример автоматизации подключения новых клиентов

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
Строка 17: Строка 17:
'''Событие "Договор создан" (Создание персонального тарифа на подключение)'''
'''Событие "Договор создан" (Создание персонального тарифа на подключение)'''
<source lang="java">
<source lang="java">
-
+
import java.sql.*;
-
import java.sql.*;
+
import java.util.*;
-
import java.util.*;
+
import java.util.regex.Matcher;
-
import java.util.regex.Matcher;
+
import java.util.regex.Pattern;
-
import java.util.regex.Pattern;
+
-
+
-
import bitel.billing.server.contract.bean.*;
+
-
import bitel.billing.server.tariff.*;
+
-
import bitel.billing.server.util.*;
+
-
import bitel.billing.server.script.bean.event.*;
+
-
import bitel.billing.server.service.bean.*;
+
-
import bitel.billing.server.contract.bean.*;
+
-
RSCM_ID = 9; // код модуля RSCM
+
import bitel.billing.server.contract.bean.*;
-
VPN_ID = 1; // код модуля VPN
+
import bitel.billing.server.tariff.*;
-
IPN_ID = 4; // код модуля IPN
+
import bitel.billing.server.util.*;
-
PHONE_ID = 5; // код модуля Телефония
+
import bitel.billing.server.script.bean.event.*;
 +
import bitel.billing.server.service.bean.*;
 +
import bitel.billing.server.contract.bean.*;
-
INTERNET_COST_NODE = 12293;// код узла, где хранится цена за подключение Интернета
+
RSCM_ID = 9; // код модуля RSCM
-
PHONE_COST_NODE = 12295; // код узла, где хранится цена за подключение Телефона
+
VPN_ID = 1; // код модуля VPN
-
INTERNET_SERVICE_ID = 17; // код услуги "Подключение - Интернет"
+
IPN_ID = 4; // код модуля IPN
-
PHONE_SERVICE_ID = 29; // код услуги "Подключение - Телефон"
+
PHONE_ID = 5; // код модуля Телефония
-
PID_CONNECT_COST = 46; // код параметра договора "Стоимость подключения"
+
-
createPT(title, cost_node, service_id)
+
INTERNET_COST_NODE = 12293;// код узла, где хранится цена за подключение Интернета
-
{
+
PHONE_COST_NODE = 12295; // код узла, где хранится цена за подключение Телефона
-
print("Start creating tariff [" + title + "]");
+
INTERNET_SERVICE_ID = 17; // код услуги "Подключение - Интернет"
-
+
PHONE_SERVICE_ID = 29; // код услуги "Подключение - Телефон"
-
// создать ПТ
+
PID_CONNECT_COST = 46; // код параметра договора "Стоимость подключения"
-
pt = new PersonalTariff();
+
-
pt.setContractId(cid);
+
-
pt.setTitle(title);
+
-
ptm.updatePersonalTariff(pt);
+
-
// получить treeID
+
createPT(title, cost_node, service_id)
-
tid = pt.getId();
+
{
-
pt = ptm.getPersonalTariff(tid);  
+
print("Start creating tariff [" + title + "]");
-
treeId = pt.getTreeId();
+
-
print("Tariff created. TreeId: " + String.valueOf(treeId) );
+
// создать ПТ
 +
pt = new PersonalTariff();
 +
pt.setContractId(cid);
 +
pt.setTitle(title);
 +
ptm.updatePersonalTariff(pt);
 +
// получить treeID
 +
tid = pt.getId();
 +
pt = ptm.getPersonalTariff(tid);  
 +
treeId = pt.getTreeId();
 +
print("Tariff created. TreeId: " + String.valueOf(treeId) );
-
// сгенерировать lm
+
// сгенерировать lm
-
lm = new Date().getTime();
+
lm = new Date().getTime();
-
 
+
// добавить запись в module_tariff_tree и получить ее Id
-
// добавить запись в module_tariff_tree и получить ее Id
+
ps = con.prepareStatement( "INSERT INTO module_tariff_tree (mid, tree_id, lm) VALUES (?, ?, ?)" );
-
ps = con.prepareStatement( "INSERT INTO module_tariff_tree (mid, tree_id, lm) VALUES (?, ?, ?)" );
+
ps.setInt( 1, RSCM_ID );
-
ps.setInt( 1, RSCM_ID );
+
ps.setInt( 2, treeId );
-
ps.setInt( 2, treeId );
+
ps.setLong( 3, lm );
-
ps.setLong( 3, lm );
+
rs = ps.executeUpdate();
-
rs = ps.executeUpdate();
+
print("INSERT INTO module_tariff_tree (mid, tree_id)" +  
-
print("INSERT INTO module_tariff_tree (mid, tree_id)" +  
+
          "VALUES (" + String.valueOf(RSCM_ID) + "," + String.valueOf(treeId) +")");
-
          "VALUES (" + String.valueOf(RSCM_ID) + "," + String.valueOf(treeId) +")");
+
rs = con.prepareStatement( "select LAST_INSERT_ID()" ).executeQuery();
-
rs = con.prepareStatement( "select LAST_INSERT_ID()" ).executeQuery();
+
rs.next();
-
rs.next();
+
mttId = rs.getInt(1);
-
mttId = rs.getInt(1);
+
print("mtree_id: " +  String.valueOf(mttId));
-
print("mtree_id: " +  String.valueOf(mttId));
+
-
// получить максимальное значение pos из mtree_node
+
// получить максимальное значение pos из mtree_node
-
    ps = con.prepareStatement( "SELECT MAX(pos) FROM mtree_node" );
+
ps = con.prepareStatement( "SELECT MAX(pos) FROM mtree_node" );
-
    rs = ps.executeQuery();
+
rs = ps.executeQuery();
-
rs.next();
+
rs.next();
-
newpos = rs.getInt(1) + 1;
+
newpos = rs.getInt(1) + 1;
-
print("mtree_node.pos: " +  String.valueOf(newpos));
+
print("mtree_node.pos: " +  String.valueOf(newpos));
-
// корневая запись запись в mtree_node
+
// корневая запись запись в mtree_node
-
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, pos) values (0, ?, 'root', ?)" );
+
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, pos) values (0, ?, 'root', ?)" );
-
ps.setInt( 1, mttId );
+
ps.setInt( 1, mttId );
-
ps.setInt( 2, newpos );
+
ps.setInt( 2, newpos );
-
    rs = ps.executeUpdate();
+
rs = ps.executeUpdate();
-
print("insert into mtree_node (parent_node, mtree_id, type, pos)" +  
+
print("insert into mtree_node (parent_node, mtree_id, type, pos)" +  
           "VALUES (0," + String.valueOf(mttId) + ",'root'," + String.valueOf(newpos) +")");
           "VALUES (0," + String.valueOf(mttId) + ",'root'," + String.valueOf(newpos) +")");
-
// услуга
+
// услуга
-
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'service', ?)" );
+
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'service', ?)" );
-
ps.setInt( 1, mttId );
+
ps.setInt( 1, mttId );
-
ps.setInt( 2, service_id );
+
ps.setInt( 2, service_id );
-
    rs = ps.executeUpdate();
+
rs = ps.executeUpdate();
-
print("insert into mtree_node (parent_node, mtree_id, type, data)" +  
+
print("insert into mtree_node (parent_node, mtree_id, type, data)" +  
           "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'service'," + String.valueOf(INTERNET_SERVICE_ID) +")");
           "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'service'," + String.valueOf(INTERNET_SERVICE_ID) +")");
-
cid = event.getContractID();
+
cid = event.getContractID();
-
cm = new ContractManager(con);
+
cm = new ContractManager(con);
-
contract = cm.getContractByID(cid);
+
contract = cm.getContractByID(cid);
-
cpu = new ContractParamUtils( con );
+
cpu = new ContractParamUtils( con );
 +
// Получить стоимость из глобального тарифного плана "_Подключение", если физик
 +
if (contract.getFc() == 0)
 +
{
 +
ps = con.prepareStatement( "SELECT data FROM mtree_node WHERE id=?" );
 +
ps.setInt( 1, cost_node );
 +
  rs = ps.executeQuery();
 +
rs.next();
 +
cost = rs.getString(1);
 +
}
 +
// стоимость равна нулю, если юрик
 +
else
 +
{
 +
cost = "cost&0.0%col&1";
 +
}
-
// Получить стоимость из глобального тарифного плана "_Подключение", если физик
+
// Установить стоимость
-
if (contract.getFc() == 0)
+
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'cost', ?)" );
 +
ps.setInt( 1, mttId );
 +
ps.setString( 2, cost );
 +
rs = ps.executeUpdate();
 +
print("insert into mtree_node (parent_node, mtree_id, type, data)" +
 +
        "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'cost','" + String.valueOf(cost) +"')");
 +
 
 +
// Прописать стоимость в параметре договора
 +
Pattern pattern = Pattern.compile("cost&(\\d+)\\.\\d+%");
 +
Matcher matcher = pattern.matcher(cost);
 +
try{
 +
if (matcher.find())
{
{
-
    ps = con.prepareStatement( "SELECT data FROM mtree_node WHERE id=?" );
+
costValue = matcher.group(1);
-
ps.setInt( 1, cost_node );
+
cpu.setStringParam( cid, PID_CONNECT_COST, costValue );
-
  rs = ps.executeQuery();
+
-
rs.next();
+
-
cost = rs.getString(1);
+
}
}
-
// стоимость равна нулю, если юрик
+
} catch (Exception exception) {
-
else
+
error("Get connection cost:" + exception.getMessage());
-
{
+
-
cost = "cost&0.0%col&1";
+
-
}
+
-
 
+
-
// Установить стоимость
+
-
ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 'cost', ?)" );
+
-
ps.setInt( 1, mttId );
+
-
ps.setString( 2, cost );
+
-
    rs = ps.executeUpdate();
+
-
print("insert into mtree_node (parent_node, mtree_id, type, data)" +
+
-
          "values (LAST_INSERT_ID()," + String.valueOf(mttId) + ",'cost','" + String.valueOf(cost) +"')");
+
-
 
+
-
  // Прописать стоимость в параметре договора
+
-
      Pattern pattern = Pattern.compile("cost&(\\d+)\\.\\d+%");
+
-
      Matcher matcher = pattern.matcher(cost);
+
-
  try{
+
-
if (matcher.find())
+
-
{
+
-
costValue = matcher.group(1);
+
-
cpu.setStringParam( cid, PID_CONNECT_COST, costValue );
+
-
}
+
-
      } catch (Exception exception) {
+
-
            error("Get connection cost:" + exception.getMessage());
+
-
      }
+
}
}
 +
}
-
// проверить, подключена ли указанная услуга
 
-
isServicePresent(sid)
 
-
{
 
-
found = false;
 
-
serviceList  = csm.getContractServiceList( cid, null );
 
-
for( Iterator it = serviceList.iterator(); it.hasNext() && (found == false); )
 
-
{
 
-
service = (ContractService)it.next();
 
-
id = service.getServiceID();
 
-
 
-
if(  id == sid )
 
-
{   
 
-
found = true;
 
-
    }
 
-
}
 
-
 
-
return found;
 
-
}
 
//_________________________________________________________________________________________________________
//_________________________________________________________________________________________________________
-
cid = event.getContractID();
+
cid = event.getContractID();
-
 
+
-
ptm =  new PersonalTariffManager( con );
 
-
csm = new ContractServiceManager( con );
 
-
msu = new ModuleAndServiceUtils( con );
 
-
// ищем услуги в модуле RSCM
+
ptm =  new PersonalTariffManager( con );
-
inetConnect = false;     
+
csm = new ContractServiceManager( con );
-
phoneConnect = false;     
+
msu = new ModuleAndServiceUtils( con );
-
services = msu.getContractService(cid, RSCM_ID);
+
// ищем услуги в модуле RSCM
-
for ( int i = 0; i < services.size() ; i++ )
+
inetConnect = false;     
 +
phoneConnect = false;     
 +
services = msu.getContractService(cid, RSCM_ID);
 +
for ( int i = 0; i < services.size() ; i++ )
 +
{
 +
service = services.get(i);
 +
if (service.getId() == INTERNET_SERVICE_ID)  
{
{
-
    service = services.get(i);
+
inetConnect = true;
-
if (service.getId() == INTERNET_SERVICE_ID)
+
}
-
{
+
if (service.getId() == PHONE_SERVICE_ID)  
-
inetConnect = true;
+
-
}
+
-
if (service.getId() == PHONE_SERVICE_ID)
+
-
{
+
-
phoneConnect = true;
+
-
}
+
-
    }
+
-
 
+
-
// Интернет
+
-
if (inetConnect)
+
{
{
-
createPT("Подключение - Интернет", INTERNET_COST_NODE, INTERNET_SERVICE_ID);
+
phoneConnect = true;
}
}
 +
}
-
// Телефон
+
// Интернет
-
if (phoneConnect)
+
if (inetConnect)
-
{
+
{
-
createPT("Подключение - Телефон", PHONE_COST_NODE, PHONE_SERVICE_ID);
+
createPT("Подключение - Интернет", INTERNET_COST_NODE, INTERNET_SERVICE_ID);
-
}
+
}
 +
// Телефон
 +
if (phoneConnect)
 +
{
 +
createPT("Подключение - Телефон", PHONE_COST_NODE, PHONE_SERVICE_ID);
 +
}
-
print("executed");
 
</source>
</source>

Версия 14:00, 20 апреля 2009

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

Общая схема работы.

Оператор заключает договора на интернет или телефонию.

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

Для физических лиц, стоимость подключения берется из глобального тарифа для услуг RSCM с кодами 17("Подключение - Интернет") и 29 ("Подключение - Телефонии"). А для юридических лиц всегда 0 р. Оператор, при необходимости, может изменить стоимость подключения.

При создании статус договора переводится с состояние "Приостановлен".



Событие "Договор создан" (Создание персонального тарифа на подключение)

import java.sql.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.server.util.*;
import bitel.billing.server.script.bean.event.*;
import bitel.billing.server.service.bean.*;
import bitel.billing.server.contract.bean.*;
 
RSCM_ID = 9;				// код модуля RSCM
VPN_ID = 1;					// код модуля VPN
IPN_ID = 4;					// код модуля IPN
PHONE_ID = 5;				// код модуля Телефония
 
INTERNET_COST_NODE = 12293;// код узла, где хранится цена за подключение Интернета
PHONE_COST_NODE = 12295;	// код узла, где хранится цена за подключение Телефона
INTERNET_SERVICE_ID = 17;	// код услуги "Подключение - Интернет"
PHONE_SERVICE_ID = 29;		// код услуги "Подключение - Телефон"
PID_CONNECT_COST = 46;		// код параметра договора "Стоимость подключения"		
 
createPT(title, cost_node, service_id)
{
	print("Start creating tariff [" + title + "]");
 
	// создать ПТ
	pt = new PersonalTariff();
	pt.setContractId(cid);
	pt.setTitle(title);
	ptm.updatePersonalTariff(pt);
	// получить treeID
	tid = pt.getId();
	pt = ptm.getPersonalTariff(tid); 
	treeId = pt.getTreeId();
	print("Tariff created. TreeId: " + String.valueOf(treeId) );
 
	// сгенерировать lm
	lm = new Date().getTime();
	// добавить запись в module_tariff_tree и получить ее Id
	ps = con.prepareStatement( "INSERT INTO module_tariff_tree (mid, tree_id, lm) VALUES (?, ?, ?)" );
	ps.setInt( 1, RSCM_ID );
	ps.setInt( 2, treeId );
	ps.setLong( 3, lm );
	rs = ps.executeUpdate();
	print("INSERT INTO module_tariff_tree (mid, tree_id)" + 
          "VALUES (" + String.valueOf(RSCM_ID) +	"," + String.valueOf(treeId) +")");
	rs = con.prepareStatement( "select LAST_INSERT_ID()" ).executeQuery();
	rs.next();
	mttId = rs.getInt(1);
	print("mtree_id: " +  String.valueOf(mttId));
 
	// получить максимальное значение pos из mtree_node
	ps = con.prepareStatement( "SELECT MAX(pos) FROM mtree_node" );
	rs = ps.executeQuery();
	rs.next();
	newpos = rs.getInt(1) + 1;
	print("mtree_node.pos: " +  String.valueOf(newpos));
 
	// корневая запись запись в mtree_node
	ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, pos) values (0, ?, 'root', ?)" );
	ps.setInt( 1, mttId );
	ps.setInt( 2, newpos );
	rs = ps.executeUpdate();
	print("insert into mtree_node (parent_node, mtree_id, type, pos)" + 
          "VALUES (0," + String.valueOf(mttId) +	",'root'," + String.valueOf(newpos) +")");
 
	// услуга
	ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 	'service', ?)" );
	ps.setInt( 1, mttId );
	ps.setInt( 2, service_id );
	rs = ps.executeUpdate();
	print("insert into mtree_node (parent_node, mtree_id, type, data)" + 
          "values (LAST_INSERT_ID()," + String.valueOf(mttId) +	",'service'," + String.valueOf(INTERNET_SERVICE_ID) +")");
 
	cid = event.getContractID();
	cm = new ContractManager(con);
	contract = cm.getContractByID(cid);
	cpu = new ContractParamUtils( con );
	// Получить стоимость из глобального тарифного плана "_Подключение", если физик
	if (contract.getFc() == 0)
	{
		ps = con.prepareStatement( "SELECT data FROM mtree_node WHERE id=?" );
		ps.setInt( 1, cost_node );
  	 	rs = ps.executeQuery();
		rs.next();
		cost = rs.getString(1);
	}
	// стоимость равна нулю, если юрик
	else
	{
		cost = "cost&0.0%col&1";
	}
 
	// Установить стоимость
	ps = con.prepareStatement( "insert into mtree_node (parent_node, mtree_id, type, data) values (LAST_INSERT_ID(), ?, 	'cost', ?)" );
	ps.setInt( 1, mttId );
	ps.setString( 2, cost );
	rs = ps.executeUpdate();
	print("insert into mtree_node (parent_node, mtree_id, type, data)" + 
         "values (LAST_INSERT_ID()," + String.valueOf(mttId) +	",'cost','" + String.valueOf(cost) +"')");
 
	// Прописать стоимость в параметре договора
	Pattern pattern = Pattern.compile("cost&(\\d+)\\.\\d+%");
	Matcher matcher = pattern.matcher(cost);
	try{
		if (matcher.find())
		{
			costValue = matcher.group(1);
			cpu.setStringParam( cid, PID_CONNECT_COST, costValue );
		}
	} catch (Exception exception) {
		error("Get connection cost:" + exception.getMessage());
	}
}
 
 
//_________________________________________________________________________________________________________
 
 
cid = event.getContractID();
 
 
ptm =  new PersonalTariffManager( con );
csm = new ContractServiceManager( con );
msu = new ModuleAndServiceUtils( con );
// ищем услуги в модуле RSCM
inetConnect = false;    
phoneConnect = false;    
services = msu.getContractService(cid, RSCM_ID);
for ( int i = 0; i < services.size() ; i++ )
{
	service = services.get(i);
	if (service.getId() == INTERNET_SERVICE_ID) 
	{
		inetConnect = true;
	}
	if (service.getId() == PHONE_SERVICE_ID) 
	{
		phoneConnect = true;
	}
}
 
// Интернет
if (inetConnect)
{
	createPT("Подключение - Интернет", INTERNET_COST_NODE, INTERNET_SERVICE_ID);
}
 
// Телефон
if (phoneConnect)
{
	createPT("Подключение - Телефон", PHONE_COST_NODE, PHONE_SERVICE_ID);
}

Событие "Договор создан" (Приостановка договора)

import bitel.billing.server.script.bean.event.*;
import bitel.billing.server.contract.bean.*; 
 
cid = event.getContractID();
contract = event.getContract();
print(contract);
 
csm = new ContractStatusManager(con);
 
cs = new ContractStatus();
cs.setContractId(cid); 
cs.setDate1(contract.getDate1());
cs.setStatus(4); 
 
csm.changeStatus(cs);

Продолжение следует...

Личные инструменты