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

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

Перейти к: навигация, поиск

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

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

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

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

Для физических лиц, стоимость подключения берется из глобального тарифа для услуг 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");

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

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);

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

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