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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: Приведу пример автоматизации работ, связанных с подключением новых абонентов. '''Общая схема работы.''...)
Строка 12: Строка 12:
 +
 +
 +
Событие "Договор создан" (Создание персонального тарифа на подключение)
 +
<source lang="java">
 +
 +
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());
 +
      }
 +
}
 +
 +
// проверить, подключена ли указанная услуга
 +
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();
 +
 +
 +
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);
 +
}
 +
 +
 +
print("executed");
 +
 +
</source>
Продолжение следует...
Продолжение следует...

Версия 13:49, 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());
       }
	}
 
	// проверить, подключена ли указанная услуга
	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();
 
 
	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);
	}
 
 
	print("executed");


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

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