Организация семейства UNLIMIT тарифов на базе FreeBSD MPD
Материал из BiTel WiKi
Ставиться задача дополнительно к основному договору создать дополнительный сервис по активации UNLIMIT доступа на определенный период за фиксированную плату. При этом оплаченный UNLIMIT не должен блокироваться даже если основной сервис заблокирован.
Услуга называется Свобода, создаваемые субдоговора имеют префикс FREEDOM. Предлагается несколько тарифов в серии, различаются скоростью и ценой активации.
В скрипте поведения, который сопоставляется договорам физ. лиц добавляем обработчик события Получение списка доп. действий для 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 ); }
В скрипте приведена ссылка на код шаблона субдоговора. В шаблоне должны быть определены настройки:
- лимита (очень низкий, чтобы не блокировало по низкому балансу)
- любая из услуг VPN модуля (чтобы договор) соотносился с ним
- прописан скрипт поведения, отдельный для FREEDOM договоров
- прописана отдельная для FREEDOM договоров группа тарифов Свобода