Организация семейства UNLIMIT тарифов на базе FreeBSD MPD

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

(Различия между версиями)
Перейти к: навигация, поиск
Строка 2: Строка 2:
При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован.
При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован.
-
1. В скрипте поведения, который сопоставляется договорам физ. лиц добавляем обработчик события '''Получение списка доп. действий для Web-статистики''' и '''Получение списка доп. действий для договора'''.
+
В скрипте поведения, который сопоставляется договорам физ. лиц добавляем обработчик события '''Получение списка доп. действий для Web-статистики''' и '''Получение списка доп. действий для договора'''.
{|
{|
|- valign=top
|- valign=top
Строка 32: Строка 32:
Функция добавляет в список единственное событие с кодом 1.
Функция добавляет в список единственное событие с кодом 1.
-
2.Теперь зайдя на страницу статистики клиент видит следующую картину при переходе в меню '''Дополнительные действия'''.
+
Теперь зайдя на страницу статистики клиент видит следующую картину при переходе в меню '''Дополнительные действия'''.
{|
{|
|- 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.

Теперь зайдя на страницу статистики клиент видит следующую картину при переходе в меню Дополнительные действия.

Страница статистики пользователя

Вызов дополнительного действия передает в скрипт поведения событие Обработка доп. действия для договора, на которое также должна быть реализована функция-обработчик.

Скрипт создания FREEDOM субдоговора

Код скрипта приведен ниже.

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 );
}
Личные инструменты