Пример автоматизации подключения новых клиентов
Материал из BiTel WiKi
Lda (Обсуждение | вклад) |
Lda (Обсуждение | вклад) |
||
Строка 14: | Строка 14: | ||
После создания и заполнения данных договора оператор должен принять решение. Он должен добавить договора в очередь "Ожидание оплаты подключения" или в очередь "Ожидание подключения". Происходит это через доп. действия договора. | После создания и заполнения данных договора оператор должен принять решение. Он должен добавить договора в очередь "Ожидание оплаты подключения" или в очередь "Ожидание подключения". Происходит это через доп. действия договора. | ||
- | При попадании в очередь "Ожидание оплаты подключения" | + | При попадании в очередь "Ожидание оплаты подключения" договор помещается в группу "Ожидание оплаты подключения" с кодом 17. |
- | Для договоров, входящих в группу "Ожидание оплаты подключения" при приходе платежа делается проверка. | + | Для договоров, входящих в группу "Ожидание оплаты подключения" при приходе платежа делается проверка. Если баланс договора (после занесения платежа) больше или равен стоимости подключения, прописанной в параметрах договора, то договора автоматически помещается в очередь "Ожидание подключения". Если баланс договора меньше стоимости подключения, то в CRM->задачи создается задача, в которого говориться что оплата не достаточна и необходимо известить об этом абонента. |
Версия 15:35, 20 апреля 2009
Приведу пример автоматизации работ, связанных с подключением новых абонентов.
Общая схема работы.
Оператор заключает договора на интернет или телефонию.
При создании договора, стоимость подключения автоматически прописывается в параметре договора и в персональном тарифе. Стоимость подключения, указанная в параметре договора, используется при печати договора и при определении определении минимальной суммы оплаты, после которой начнется процедура подключения. Стоимость подключения, указанная в персональном тарифе, списывается со счета абонента после окончания процедуры подключения.
Для физических лиц, стоимость подключения берется из глобального тарифа для услуг RSCM с кодами 17("Подключение - Интернет") и 29 ("Подключение - Телефонии"). А для юридических лиц всегда 0 р. Оператор, при необходимости, может изменить стоимость подключения.
При создании статус договора переводится с состояние "Приостановлен".
После создания и заполнения данных договора оператор должен принять решение. Он должен добавить договора в очередь "Ожидание оплаты подключения" или в очередь "Ожидание подключения". Происходит это через доп. действия договора.
При попадании в очередь "Ожидание оплаты подключения" договор помещается в группу "Ожидание оплаты подключения" с кодом 17. Для договоров, входящих в группу "Ожидание оплаты подключения" при приходе платежа делается проверка. Если баланс договора (после занесения платежа) больше или равен стоимости подключения, прописанной в параметрах договора, то договора автоматически помещается в очередь "Ожидание подключения". Если баланс договора меньше стоимости подключения, то в CRM->задачи создается задача, в которого говориться что оплата не достаточна и необходимо известить об этом абонента.
Событие "Договор создан" (Создание персонального тарифа на подключение)
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);
Событие "Получение списка доп. действий для договора"
import bitel.billing.server.contract.bean.*; //Группа ожидания оплаты подключения GROUP_EP = 17; //Группа ожидания подключения GROUP_EC = 18; //Параметр, в котором прописана дата начала предоставления услуг PARAM_START_DATE = 49; cid = event.getContractID(); contract = new ContractManager(con).getContractByID(cid); contract_groups = contract.getGroups(); contract_param_utils = new ContractParamUtils( con ); contract_is_group_ep = (contract_groups & (1L<<GROUP_EP)) > 0; contract_is_group_ec = (contract_groups & (1L<<GROUP_EC)) > 0; contract_start_date = contract_param_utils.getDateParam( cid, PARAM_START_DATE ); if (contract_start_date == null && !contract_is_group_ep && !contract_is_group_ec) { event.addAction( 15, "Добавить договор в очередь \"ожидание оплаты подключения\"" ); }; if (contract_start_date == null && !contract_is_group_ec) { event.addAction( 16, "Добавить договор в очередь \"ожидание подключения\"" ); };
Событие "Обработка доп. действия для договора" (Добавление договора в очередь "Ожидание оплаты подключения")
import java.sql.*; import java.util.*; import bitel.billing.server.contract.bean.*; if (event.getActionId() != 15) { print("skipped"); return; } //Группа ожидания оплаты подключения GROUP_EP = 17; cid = event.getContractID(); contract = new ContractManager(con).getContractByID(cid); contract_groups = contract.getGroups(); contract_groups = contract_groups | 1L<<GROUP_EP; query = "UPDATE contract SET gr=? WHERE id=?"; psUpdate = con.prepareStatement( query ); psUpdate.setLong( 1, contract_groups ); psUpdate.setInt( 2, cid ); psUpdate.executeUpdate();
Продолжение следует...