Автоматизация подключений VPN-клиентов с использованием CRM плагина

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

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: Созданный договор "ожидает" поступления денег на счет. При поступлении денег оценивается достаточно...)
 
(3 промежуточные версии не показаны)
Строка 15: Строка 15:
В шаблоне договора должен быть прописан скрипт поведения. В скрипте опеределяется функция, обрабатывающая событие "Приход платежа".
В шаблоне договора должен быть прописан скрипт поведения. В скрипте опеределяется функция, обрабатывающая событие "Приход платежа".
-
<pre>
+
<source lang="java">
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.contract.bean.*;
import ru.bitel.bgbilling.plugins.crm.server.bean.*;
import ru.bitel.bgbilling.plugins.crm.server.bean.*;
Строка 22: Строка 22:
import java.sql.*;
import java.sql.*;
import java.util.*;
import java.util.*;
 +
import ru.bitel.bgbilling.plugins.crm.server.dao.*;
 +
import ru.bitel.bgbilling.plugins.crm.common.model.*;
payment = event.getPayment();
payment = event.getPayment();
Строка 199: Строка 201:
      
      
rtm.updateTask( "new", task );
rtm.updateTask( "new", task );
-
</pre>
+
</source>
-
После выполнения задачи, производится ее обработка. По событию "Обработка задачи" выполняется следующий скрипт:
+
После выполнения задачи, производится ее обработка. По событию "Обработка задачи" выполняется следующий скрипт.
-
<pre>
+
Скрипт открывает абонплату (услуга с кодом 122) датой подключения договора.
 +
<source lang="java">
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.contract.bean.*;
import ru.bitel.bgbilling.plugins.crm.server.bean.*;
import ru.bitel.bgbilling.plugins.crm.server.bean.*;
Строка 209: Строка 212:
import bitel.billing.server.util.*;
import bitel.billing.server.util.*;
import java.sql.*;
import java.sql.*;
-
 
+
import ru.bitel.bgbilling.plugins.crm.server.dao.*;
-
TASK_ADDRESS_PARAM = 42;
+
import ru.bitel.bgbilling.plugins.crm.common.model.*;
// Типы обрабатываемых задач
// Типы обрабатываемых задач
-
TASK_CONNECT_NA = 44;
 
TASK_CONNECT_NK = 5;
TASK_CONNECT_NK = 5;
-
TASK_SWITCH_NK = 16;
 
-
TASK_CONNECT_NK_WIFI = 43;
 
task = event.getTask();
task = event.getTask();
Строка 226: Строка 226:
report = event.getReport();
report = event.getReport();
-
if( type != TASK_CONNECT_NK && type != TASK_CONNECT_NK_WIFI && type != TASK_CONNECT_NA && type != TASK_SWITCH_NK )
+
if( type != TASK_CONNECT_NK )
{
{
  print( "Can't process tasks of this type." );
  print( "Can't process tasks of this type." );
Строка 235: Строка 235:
csm = new ContractServiceManager( con );
csm = new ContractServiceManager( con );
cu = new ContractUtils( 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;
 
-
}
 
// проверка что абонплата уже стоит
// проверка что абонплата уже стоит
Строка 254: Строка 243:
  sid = service.getServiceID();
  sid = service.getServiceID();
-
  if(  sid == 122 || sid == 123 || sid == 124 || sid == 136 || sid == 125 || sid==215 ) {
+
  if(  sid == 122 ) {  
-
    if ( type == TASK_CONNECT_NK_WIFI ) {
+
-
        isSetPay = true;
+
-
    }
+
-
    else {
+
       report.append( cu.getContractTitle( cid, true ) );
       report.append( cu.getContractTitle( cid, true ) );
       report.append( " => абонплата уже установлена\n" );
       report.append( " => абонплата уже установлена\n" );
Строка 268: Строка 253:
}
}
-
tpid = currentTariff.getTariffPlanID();
+
sid = 122;
-
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 )
+
-
//{
+
// включение абонплаты
// включение абонплаты
Строка 321: Строка 265:
     csm.updateContractService( "new", newPay );
     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 );
task.setProcessed( true );
-
</pre>
+
</source>

Текущая версия на 07:33, 14 августа 2008

Созданный договор "ожидает" поступления денег на счет.

При поступлении денег оценивается достаточность суммы. Сумма подключения равна 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.*;
import ru.bitel.bgbilling.plugins.crm.server.dao.*;
import ru.bitel.bgbilling.plugins.crm.common.model.*;
 
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 );

После выполнения задачи, производится ее обработка. По событию "Обработка задачи" выполняется следующий скрипт. Скрипт открывает абонплату (услуга с кодом 122) датой подключения договора.

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.*;
import ru.bitel.bgbilling.plugins.crm.server.dao.*;
import ru.bitel.bgbilling.plugins.crm.common.model.*;
 
// Типы обрабатываемых задач
TASK_CONNECT_NK = 5;
 
task = event.getTask();
 
cid = event.getContractID();
date = task.getExecuteDate();
type = task.getTypeID();
 
report = event.getReport();
 
if( type != TASK_CONNECT_NK )
{
 print( "Can't process tasks of this type." );
 return;
}
 
ctm =  new ContractTariffManager(  con );
csm = new ContractServiceManager( con );
cu = new ContractUtils( con );
 
// проверка что абонплата уже стоит
isSetPay = false;
serviceList  = csm.getContractServiceList( cid, date );
for( Iterator it = serviceList.iterator(); it.hasNext(); ) {
 service = (ContractService)it.next();
 sid = service.getServiceID();
 
 if(  sid == 122 ) {    
      report.append( cu.getContractTitle( cid, true ) );
      report.append( " => абонплата уже установлена\n" );
 
      error( "Pay already set!" );
      return;
     }
 }
}
 
sid = 122;
 
// включение абонплаты
if( !isSetPay ) {
    newPay = new ContractService();
    newPay.setContractID( cid );
    newPay.setServiceID( sid );
    newPay.setComment( "Установлена скриптом" );
    newPay.setDate1( date );
 
    csm.updateContractService( "new", newPay );
}
 
task.setProcessed( true );
Личные инструменты