Организация семейства UNLIMIT тарифов на базе FreeBSD MPD
Материал из BiTel WiKi
Ставиться задача дополнительно к основному договору создать дополнительный сервис по активации 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 ); }