Автоматизация подключений VPN-клиентов с использованием CRM плагина
Материал из BiTel WiKi
Созданный договор "ожидает" поступления денег на счет.
При поступлении денег оценивается достаточность суммы. Сумма подключения равна 768 рублей, в случае если клиент оплатил в течении пяти рабочих дней от даты заключения договора, 300 рублей, если у договора стоит тариф с кодом 213 "Студент" и 960 рублей в прочих случаях.
Если баланс договора после поступления платежа не превысил стоимость подключния создается задача с типом 8 "Недостаточный платеж", по которой может быть произведен обзвон для уведомления клиента о недостаточности произведенной оплаты. Если баланс договора превысил стоимость подключения после чего создается задача типа 5 "Подключение NK", одновременно на договор заносится расход за подключение и снимается группа "Неоплачен".
Если в договоре не стоит группа "Неоплачен", либо на договор уже создана задача подключения скриптом либо диспетчером (типы 5 и 63), то повторно задача не создается.
В шаблоне договора должен быть прописан скрипт поведения. В скрипте опеределяется функция, обрабатывающая событие "Приход платежа".
import bitel.billing.server.contract.bean.*; import ru.bitel.bgbilling.plugins.crm.server.bean.*; import javax.text.*; import bitel.billing.server.util.*; import java.sql.*; import java.util.*; payment = event.getPayment(); cid = payment.getContractID(); date = payment.getDate(); cm = new ContractManager( con ); chm = new ChargeManager( con ); bu = new BalanceUtils( con ); rtm = new RegisterTaskManager( con ); pm = new PaymentManager( con ); cpu = new ContractParamUtils( con ); ctm = new ContractTariffManager( con ); DATE_ZAKL = 315; DAYS_DELTA = 5; SUMMA_LARGE = 960f; SUMMA_SMALL = 768f; SUMMA_STUDENT = 300f; TARIFF_STUDENT = 213; SMALL_PAY_TASK_TYPE = 8; SMALL_PAY_TASK_GROUP = 11; CONNECT_NK_TASK_TYPE = 5; CONNECT_NK_DISP_TASK_TYPE = 63; CONNECT_TASK_GROUP = 9; ADDRESS_PARAM = 42; CONNECT_CHARGE_TYPE = 43; long NEOPL = 1<<4; contract = cm.getContractByID( cid ); if( contract == null ) { error( "Contract not found!" ); return; } long groups = contract.getGroups(); if( (groups & NEOPL) == 0 ) { error( "NEOPL group is not set!" ); return; } // дата заключения dateZakl = cpu.getDateParam( cid, DATE_ZAKL ); if( dateZakl == null ) { error( "dateZakl == null" ); return; } if( TimeUtils.dateBefore( date, dateZakl ) ) { error( "Current date precedes the dateZakl." ); return; } // проверка существования в договоре задач типа "Подключение NK (диспетчер)" filter = new RegisterTaskManager.TaskFilter(); filter.types = CONNECT_NK_DISP_TASK_TYPE.toString(); filter.cid = cid; filter.orders = new ArrayList(); filter.processed = -1; taskCount = rtm.getTaskCount( filter ); // если такая задача уже есть, значит, ничего делать не нужно if( taskCount > 0 ) { error( "The contract has been made via the 'NK Dispatcher' scheme." ); return; } // проверка существования в договоре задач типа "Подключение NK" filter.types = CONNECT_NK_TASK_TYPE.toString(); taskCount = rtm.getTaskCount( filter ); // если такая задача уже есть, значит, ничего делать не нужно if( taskCount > 0 ) { error(taskCount + " CONNECT_NK task(s) already exist." ); return; } // сколько дней прошло с момента заключения договора до прихода платежа (текущего момента) delta = 0; dt = (Calendar)dateZakl.clone(); print( "dateZakl: " + TimeUtils.formatDate( dt ) + "; date: " + TimeUtils.formatDate( date ) ); while( TimeUtils.dateBefore( dt, date ) ) { if( dt.get( Calendar.DAY_OF_WEEK ) != Calendar.SUNDAY && dt.get( Calendar.DAY_OF_WEEK ) != Calendar.SATURDAY ) { print( "dt: " + TimeUtils.formatDate( dt ) ); delta++; } dt.add( Calendar.DAY_OF_YEAR, 1 ); } print( "delta = " + delta ); // текущий тарифный план договора tpid = ctm.getContractTariff( cid, date ).getTariffPlanID(); // определение суммы summa = SUMMA_LARGE; if( delta <= DAYS_DELTA ) { summa = SUMMA_SMALL; } if( tpid == TARIFF_STUDENT ) { summa = SUMMA_STUDENT; } print( "summa = " + summa ); // не хватает денег rest = bu.getBalance( event.getGenerateTime(), cid ); if( rest < summa ) { print( "Create call task" ); task = new RegisterTask(); task.setContractID( cid ); task.setTypeID( SMALL_PAY_TASK_TYPE ); task.setGroupID( SMALL_PAY_TASK_GROUP ); task.setOpenUserID( 0 ) ; task.setOpenTime( event.getGenerateTime() ); task.setComment( "Недостаточный платеж за подключение" ); task.setAddressParamID( ADDRESS_PARAM ); rtm.updateTask( "new", task ); return; } // снимаем группу "Неоплачен" long groups = contract.getGroups(); if ( ( groups & NEOPL ) > 0L ) { groups = groups - NEOPL; } query = "UPDATE contract SET gr=? WHERE id=?"; ps = con.prepareStatement( query ); ps.setLong( 1, groups ); ps.setInt( 2, cid ); ps.executeUpdate(); // установка расхода charge = new Charge(); charge.setContractID( cid ); charge.setDate( date ); charge.setChargeTypeID( CONNECT_CHARGE_TYPE ); charge.setComment( "Установлено скриптом" ); charge.setSumma( summa ); chm.updateCharge( "new", charge ); bu.updateBalance( date, cid ); // генерация задания на подключение task = new RegisterTask(); task.setContractID( cid ); task.setTypeID( CONNECT_NK_TASK_TYPE ); task.setGroupID( CONNECT_TASK_GROUP ); task.setOpenUserID( 0 ) ; task.setOpenTime( event.getGenerateTime() ); task.setAddressParamID( ADDRESS_PARAM ); if( contract.getSubList().length() > 0 ) { task.setComment( "+свобода" ); } rtm.updateTask( "new", task );
После выполнения задачи, производится ее обработка. По событию "Обработка задачи" выполняется следующий скрипт:
import bitel.billing.server.contract.bean.*; import ru.bitel.bgbilling.plugins.crm.server.bean.*; import java.util.regexp.*; import javax.text.*; import bitel.billing.server.util.*; import java.sql.*; TASK_ADDRESS_PARAM = 42; // Типы обрабатываемых задач TASK_CONNECT_NA = 44; TASK_CONNECT_NK = 5; TASK_SWITCH_NK = 16; TASK_CONNECT_NK_WIFI = 43; task = event.getTask(); cid = event.getContractID(); date = task.getExecuteDate(); type = task.getTypeID(); report = event.getReport(); if( type != TASK_CONNECT_NK && type != TASK_CONNECT_NK_WIFI && type != TASK_CONNECT_NA && type != TASK_SWITCH_NK ) { print( "Can't process tasks of this type." ); return; } ctm = new ContractTariffManager( con ); csm = new ContractServiceManager( con ); cu = new ContractUtils( con ); // текущий тарифный план currentTariff = ctm.getContractTariff( cid, date ); if( currentTariff == null ) { report.append( cu.getContractTitle( cid, true ) ); report.append( " => у договора нет текущего тарифа\n" ); error( "Current tariff not found" ); return; } // проверка что абонплата уже стоит isSetPay = false; serviceList = csm.getContractServiceList( cid, date ); for( Iterator it = serviceList.iterator(); it.hasNext(); ) { service = (ContractService)it.next(); sid = service.getServiceID(); if( sid == 122 || sid == 123 || sid == 124 || sid == 136 || sid == 125 || sid==215 ) { if ( type == TASK_CONNECT_NK_WIFI ) { isSetPay = true; } else { report.append( cu.getContractTitle( cid, true ) ); report.append( " => абонплата уже установлена\n" ); error( "Pay already set!" ); return; } } } tpid = currentTariff.getTariffPlanID(); if( (tpid > 154 && tpid != 213 && tpid != 247) || tpid < 150 ) { report.append( cu.getContractTitle( cid, true ) ); report.append( " => у договора неверный тариф\n" ); error("Wrong tariff: " + tpid ); return; } sid = -1; if ( tpid == 150 ) sid = 122; else if ( tpid == 151) sid = 123; else if ( tpid == 152 ) sid = 124; else if ( tpid == 153 ) sid = 136; else if ( tpid == 154 ) sid = 125; else if ( tpid == 213 ) sid = 215; else if ( tpid == 247 ) sid = 238; if( sid == -1 ) { report.append( cu.getContractTitle( cid, true ) ); report.append( " => не найден тип абонплаты для тарифа\n" ); error( "Pay not found!!!" ); return; } //query = "SELECT quarter.title FROM contract_parameter_type_2 AS cp " + // " LEFT JOIN address_house AS house ON cp.hid=house.id " + // " LEFT JOIN address_quarter AS quarter ON house.quarterid=quarter.id " + // " WHERE cp.cid=? AND cp.pid=?"; //ps = con.prepareStatement( query ); //ps.setInt( 1, cid ); //ps.setInt( 2, TASK_ADDRESS_PARAM ); //rs = ps.executeQuery(); //result = 0; //result = rs.getString( 1 ); //if ( result != 154 ) //{ // включение абонплаты if( !isSetPay ) { newPay = new ContractService(); newPay.setContractID( cid ); newPay.setServiceID( sid ); newPay.setComment( "Установлена скриптом" ); newPay.setDate1( date ); csm.updateContractService( "new", newPay ); } //} // установка даты подключения и флага об акте // (кроме подключение NK без выезда) int[] addresses = { 42, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81 }; int[] dates = { 84, 85, 92, 93,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288 }; int[] actes = {112,131,164,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290 }; int[] actYesValues = { 19, 50, 53, 76, 99,130,131, 94,127,110,114,112,125,124,121,119,117,103,106,108,207,202,193,210,204,199,196,212,214,216,218,220,222,224,226 }; int paramDate = 0, paramAct = 0, paramActValue = 0, paramActCondValue = 0; // у чесноковских адрес не указывается, поэтому параметры задаем явно if ( type == TASK_CONNECT_NA ) { paramDate = 84; paramAct = 112; paramActValue = 19; } else { for( int i = 0; i < addresses.length; i++ ) { if( addresses[ i ] == task.getAddressParamID() ) { paramDate = dates[ i ] ; paramAct = actes[ i ]; paramActValue = actYesValues[ i ]; break; } } } if (paramAct == 112) { paramActCondValue = 889; } print( "paramDate: " + paramDate + "; paramAct: " + paramAct + "; paramActValue: " + paramActValue + "; paramActCondValue: " + paramActCondValue ); if( paramDate == 0 || paramAct == 0 ) { report.append( cu.getContractTitle( cid, true ) ); report.append( " => не найден параметр акт или дата\n" ); error( "Params date or act not found!" ); return; } cpu = new ContractParamUtils( con ); if (type != TASK_SWITCH_NK) { cpu.setDateParam( cid, paramDate, date ); cpu.setListParam( cid, paramAct, paramActValue ); } else { // для задач подключение NK без выезда не устанавливаем дату подключения, устанавливаем только "Акт о подключении: условный" if (paramActCondValue > 0) { cpu.setListParam( cid, paramAct, paramActCondValue ); } } task.setProcessed( true );