Организация семейства UNLIMIT тарифов на базе FreeBSD MPD
Материал из BiTel WiKi
Admin (Обсуждение | вклад) |
Admin (Обсуждение | вклад) |
||
| Строка 2: | Строка 2: | ||
При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован. | При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован. | ||
| - | + | В скрипте поведения, который сопоставляется договорам физ. лиц добавляем обработчик события '''Получение списка доп. действий для Web-статистики''' и '''Получение списка доп. действий для договора'''. | |
{| | {| | ||
|- valign=top | |- valign=top | ||
| Строка 32: | Строка 32: | ||
Функция добавляет в список единственное событие с кодом 1. | Функция добавляет в список единственное событие с кодом 1. | ||
| - | + | Теперь зайдя на страницу статистики клиент видит следующую картину при переходе в меню '''Дополнительные действия'''. | |
{| | {| | ||
|- valign=top | |- valign=top | ||
| [[Изображение:Unlim_stat_page.png|thumb|300px|Страница статистики пользователя]] | | [[Изображение:Unlim_stat_page.png|thumb|300px|Страница статистики пользователя]] | ||
|} | |} | ||
| + | |||
| + | Вызов дополнительного действия передает в скрипт поведения событие '''Обработка доп. действия для договора''', на которое также должна быть реализована функция-обработчик. | ||
| + | {| | ||
| + | |- valign=top | ||
| + | | [[Изображение:Unlim_script_create_unlim.png|thumb|300px|Скрипт создания FREEDOM субдоговора]] | ||
| + | |} | ||
| + | |||
| + | Код скрипта приведен ниже. | ||
| + | <pre> | ||
| + | import bitel.billing.server.contract.bean.*; | ||
| + | import bitel.billing.server.util.*; | ||
| + | import java.sql.*; | ||
| + | import java.util.*; | ||
| + | |||
| + | // сколько безлимитных субдоговоров можно повесить на основной договор | ||
| + | MAX_FREEDOM_COUNT = 1; | ||
| + | // код шаблона безлимитного договора | ||
| + | PATTERN_ID = 53; | ||
| + | // граница некарточных логинов | ||
| + | TOP_NOCARD_LOGIN = 100000; | ||
| + | // код экземпляра DialUP модуля | ||
| + | MID = 16; | ||
| + | |||
| + | cm = new ContractManager( con ); | ||
| + | |||
| + | contract = cm.getContractByID( event.getContractID() ); | ||
| + | if( contract == null ) | ||
| + | { | ||
| + | error( "Contract not found!" ); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | if( event.getActionId() == 1 ) | ||
| + | { | ||
| + | if( contract.isSub() ) | ||
| + | { | ||
| + | event.addReport( "Это субдоговор!" ); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | subList = contract.getSubList(); | ||
| + | count = 0; | ||
| + | |||
| + | print( "count=" + count ); | ||
| + | |||
| + | // есть субдоговора | ||
| + | if( Utils.notBlankString( subList ) ) | ||
| + | { | ||
| + | String query = "SELECT COUNT(*) FROM contract WHERE id IN (" + subList + " ) AND title LIKE 'FREEDOM%'"; | ||
| + | ResultSet rs = con.createStatement().executeQuery( query ); | ||
| + | |||
| + | if( rs.next() ) | ||
| + | { | ||
| + | count = rs.getInt( 1 ); | ||
| + | |||
| + | if( count >= MAX_FREEDOM_COUNT ) | ||
| + | { | ||
| + | event.addReport( "Больше активировать договора Свобода нельзя" ); | ||
| + | return; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | mainLoginPswd = ""; | ||
| + | mainLogin = ""; | ||
| + | |||
| + | // выбор пароля основного логина | ||
| + | query = "SELECT login, pswd FROM user_login_" + MID + | ||
| + | " WHERE (date1 IS NULL OR date1<=CURDATE()) AND (date2 IS NULL OR date2>=CURDATE()) AND cid=" + contract.getID(); | ||
| + | rs = con.createStatement().executeQuery( query ); | ||
| + | if( rs.next() ) | ||
| + | { | ||
| + | mainLogin = rs.getString( 1 ); | ||
| + | mainLoginPswd = rs.getString( 2 ); | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | event.addReport( "Не найдено активных логинов в основном договоре!" ); | ||
| + | print( "no active login" ); | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | // создаем новый договор и добавляем его субдоговором | ||
| + | subContract = cm.createFromPattern( PATTERN_ID, "FREEDOM_" + count + "/" + contract.getTitle(), new GregorianCalendar(), "" ); | ||
| + | cm.addSub( contract.getID(), subContract.getID() ); | ||
| + | |||
| + | for( i=0; i<3; i++ ) { | ||
| + | print("Trying to create a login. Try N " + i); | ||
| + | // выбор номера логина | ||
| + | login = 0; | ||
| + | query = "SELECT * FROM user_login_" + MID + " ORDER BY login"; | ||
| + | ps = con.prepareStatement( query ); | ||
| + | |||
| + | rs = ps.executeQuery(); | ||
| + | while ( rs.next() ) | ||
| + | { | ||
| + | if ( login != rs.getInt( "login" ) ) | ||
| + | { | ||
| + | break; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | login++; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // создание логина | ||
| + | query = "INSERT INTO user_login_" + MID + " ( cid, login, date1, status, session, pswd, realm_group ) VALUES ( ?, ?, ?, ?, ?, ?, ? )"; | ||
| + | ps = con.prepareStatement( query ); | ||
| + | ps.setInt( 1, subContract.getID() ); | ||
| + | ps.setInt( 2, login ); | ||
| + | ps.setDate( 3, TimeUtils.convertCalendarToSqlDate( subContract.getDate1() ) ); | ||
| + | ps.setInt( 4, 0 ); | ||
| + | ps.setInt( 5, 1 ); | ||
| + | ps.setString( 6, mainLoginPswd ); | ||
| + | ps.setString( 7, "freedom" ); | ||
| + | try { | ||
| + | ps.executeUpdate(); | ||
| + | break; | ||
| + | } catch (e) { | ||
| + | print("Couldn't set login " + login + " due to an exception " + e); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | event.addReport( "Активирован безлимитный договор " + subContract.getTitle() + | ||
| + | ", Вы можете найти ссылку на него в верхней области окна.\n" ); | ||
| + | event.addReport( "Ваш безлимитный логин " + login + ", пароль совпадает с паролем на логин " + mainLogin + "\n\n" ); | ||
| + | event.addReport( "Вам необходимо перейти в статистику договорa " + subContract.getTitle() + "(ссылка в левой верхней области экрана) и выбрать тариф в меню 'Смена тарифных планов'\n" ); | ||
| + | event.addReport( "Добавьте задание на смену с текущей или любой другой даты. Проконтролировать смену тарифа Вы можете, выбрав повторно пункт 'Смена тарифных планов'.\n\n" ); | ||
| + | event.addReport( "ВНИМАНИЕ! После активации тарифа Вы можете воспользоваться 'безлимитным' логином только в том случае, если на счету основного договора достаточно средств\n" ); | ||
| + | |||
| + | |||
| + | print( "UNLIM activated! Login=" + login + ", pswd=" + mainLoginPswd ); | ||
| + | } | ||
| + | </pre> | ||
Версия 10:07, 21 апреля 2008
Ставиться задача дополнительно к основному договору создать дополнительный сервис по активации UNLIMIT доступа на определенный период за фиксированную плату. При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован.
В скрипте поведения, который сопоставляется договорам физ. лиц добавляем обработчик события Получение списка доп. действий для Web-статистики и Получение списка доп. действий для договора.
Задача скрипта - вывод дополнительных действий, доступных через Web-статистику и вкладку карточки договора Доп. действия. В данном случае список действий совпадает.
Код функции:
import bitel.billing.server.contract.bean.*;
cid = event.getContractID();
cm = new ContractManager( con );
contract = cm.getContractByID( cid );
if( contract == null )
{
error( "Contract not found!" );
return;
}
if( contract.getTitle().startsWith( "NK" ) )
{
event.addAction( 1, "Активация UNLIM" );
}
Функция добавляет в список единственное событие с кодом 1.
Теперь зайдя на страницу статистики клиент видит следующую картину при переходе в меню Дополнительные действия.
Вызов дополнительного действия передает в скрипт поведения событие Обработка доп. действия для договора, на которое также должна быть реализована функция-обработчик.
Код скрипта приведен ниже.
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.util.*;
import java.sql.*;
import java.util.*;
// сколько безлимитных субдоговоров можно повесить на основной договор
MAX_FREEDOM_COUNT = 1;
// код шаблона безлимитного договора
PATTERN_ID = 53;
// граница некарточных логинов
TOP_NOCARD_LOGIN = 100000;
// код экземпляра DialUP модуля
MID = 16;
cm = new ContractManager( con );
contract = cm.getContractByID( event.getContractID() );
if( contract == null )
{
error( "Contract not found!" );
return;
}
if( event.getActionId() == 1 )
{
if( contract.isSub() )
{
event.addReport( "Это субдоговор!" );
return;
}
subList = contract.getSubList();
count = 0;
print( "count=" + count );
// есть субдоговора
if( Utils.notBlankString( subList ) )
{
String query = "SELECT COUNT(*) FROM contract WHERE id IN (" + subList + " ) AND title LIKE 'FREEDOM%'";
ResultSet rs = con.createStatement().executeQuery( query );
if( rs.next() )
{
count = rs.getInt( 1 );
if( count >= MAX_FREEDOM_COUNT )
{
event.addReport( "Больше активировать договора Свобода нельзя" );
return;
}
}
}
mainLoginPswd = "";
mainLogin = "";
// выбор пароля основного логина
query = "SELECT login, pswd FROM user_login_" + MID +
" WHERE (date1 IS NULL OR date1<=CURDATE()) AND (date2 IS NULL OR date2>=CURDATE()) AND cid=" + contract.getID();
rs = con.createStatement().executeQuery( query );
if( rs.next() )
{
mainLogin = rs.getString( 1 );
mainLoginPswd = rs.getString( 2 );
}
else
{
event.addReport( "Не найдено активных логинов в основном договоре!" );
print( "no active login" );
return;
}
// создаем новый договор и добавляем его субдоговором
subContract = cm.createFromPattern( PATTERN_ID, "FREEDOM_" + count + "/" + contract.getTitle(), new GregorianCalendar(), "" );
cm.addSub( contract.getID(), subContract.getID() );
for( i=0; i<3; i++ ) {
print("Trying to create a login. Try N " + i);
// выбор номера логина
login = 0;
query = "SELECT * FROM user_login_" + MID + " ORDER BY login";
ps = con.prepareStatement( query );
rs = ps.executeQuery();
while ( rs.next() )
{
if ( login != rs.getInt( "login" ) )
{
break;
}
else
{
login++;
}
}
// создание логина
query = "INSERT INTO user_login_" + MID + " ( cid, login, date1, status, session, pswd, realm_group ) VALUES ( ?, ?, ?, ?, ?, ?, ? )";
ps = con.prepareStatement( query );
ps.setInt( 1, subContract.getID() );
ps.setInt( 2, login );
ps.setDate( 3, TimeUtils.convertCalendarToSqlDate( subContract.getDate1() ) );
ps.setInt( 4, 0 );
ps.setInt( 5, 1 );
ps.setString( 6, mainLoginPswd );
ps.setString( 7, "freedom" );
try {
ps.executeUpdate();
break;
} catch (e) {
print("Couldn't set login " + login + " due to an exception " + e);
}
}
event.addReport( "Активирован безлимитный договор " + subContract.getTitle() +
", Вы можете найти ссылку на него в верхней области окна.\n" );
event.addReport( "Ваш безлимитный логин " + login + ", пароль совпадает с паролем на логин " + mainLogin + "\n\n" );
event.addReport( "Вам необходимо перейти в статистику договорa " + subContract.getTitle() + "(ссылка в левой верхней области экрана) и выбрать тариф в меню 'Смена тарифных планов'\n" );
event.addReport( "Добавьте задание на смену с текущей или любой другой даты. Проконтролировать смену тарифа Вы можете, выбрав повторно пункт 'Смена тарифных планов'.\n\n" );
event.addReport( "ВНИМАНИЕ! После активации тарифа Вы можете воспользоваться 'безлимитным' логином только в том случае, если на счету основного договора достаточно средств\n" );
print( "UNLIM activated! Login=" + login + ", pswd=" + mainLoginPswd );
}
