Изменение параметров договора из личного кабинета

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

Перейти к: навигация, поиск

Определение нужных параметров.

Создать нужные параметры -- в справочнике «Параметры договоров». Для обращения к ним из скриптов и action'а достаточно знать код параметра (pid). Однако, для удобства, решено было использовать мнемонические обозначения параметров, попросту говоря, имена.

Связь (map) между кодом параметра и именем задается в конфигурации биллинга. Нам будут нужны следующие map'ы (в скобках - префикс):

  • по имени параметра, полученного из объекта request (т.е. из POST-запроса) определить его код (pid);
  • по имени параметра определить его описание, которое будет отображаться в личном кабинете (desc);
  • по коду параметра определить его имя - для обработки событий и отсылки сообщения (name).

Для того, чтобы имена наших переменных не пересекались с другими (стандартными) параметрами конфигурации BGBilling, разумно использовать префикс, например, название компании.

# Имя параметра -> ID параметра
my.pid.email=19
my.pid.login=33
#
# Имя параметра -> Описание параметра
my.desc.email=Email
my.desc.login=Логин
#
# ID параметра -> Имя параметра
my.name.19=email
my.name.33=login


Обработка событий в BGBilling.

Введенные пользователем данные необходимо проверить - провести валидацию. В моем случае - еще и отослать email с уведомлением об изменении. В принципе, эти действия можно выполнить в теле action'а, но грамотнее будет воспользоваться механизмом обработки событий BGBilling'а. В этом случае значения параметров будут проверяться и обрабатываться как при изменении пользователем через личный кабинет, так и администратором/оператором через клиент BGBilling.

  1. Создать новый скрипт поведения "Параметры".
  2. Создать обработчик для события "Перед изменением параметра договора" (как в Валидация текстового параметра)
import ru.bitel.bgbilling.server.util.Setup;
import bitel.billing.server.contract.bean.*;
import java.util.*;
 
// Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр
paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." );
 
cid = event.getContractID();
pid = event.getParamId();
paramValue = event.getValue();
paramName = paramNames.get( String.valueOf( pid ));
//print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName );
 
if( paramName != null )
{
    // Проверка значения параметра типа Email
    if( paramName.equals( "email" ))
    {
        // Email - http://regexlib.com/REDetails.aspx?regexp_id=21
        // Выражение расширено для проверки списка адресов, разделенных ";" и опциональными пробелами
        REGEX = "^([\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}(\\n|;\\s*|))+$";
 
        paramValue = paramValue.getEmail();
 
        if( !paramValue.matches( REGEX )) {
            event.setError( "Неверный формат Email" );
        return;
    }
    }
 
    // Проверка значения для телефонного номера
    if( paramName.equals( "vfaxnumber" ))
    {
        // Телефонный номер - (495) 44-2221-1
        REGEX1 = "^\\(\\d+\\)\\s*[\\d\\-]+$";
        // Телефонный номер - 8-903-44-2221-1 или 890311
        REGEX2 = "^\\d[\\d\\-]+$";
        // Телефонный номер - +79034422211
        REGEX3 = "^\\+\\d+$";
 
        if( !paramValue.matches(REGEX1) && !paramValue.matches(REGEX2) && !paramValue.matches(REGEX3) ) {
        event.setError( "Неверный формат телефонного номера" );
        return;
        }
    }
}
  1. Создать обработчик для события "Измененен параметр договора".
import ru.bitel.bgbilling.server.util.Setup;
import bitel.billing.server.contract.bean.*;
import bitel.billing.server.util.MailMsg;
 
// Имя получателя email'а
emailAddr = "my@email.com";
 
// Соответствие ID параметра договора и ключевого слова, обозначающего этот параметр
paramNames = Setup.getSetup().getHashValuesWithPrefix( "my.name." );
 
cid = event.getContractID();
pid = event.getParamId();
paramValue = event.getValue();
paramName = paramNames.get( String.valueOf( pid ));
//print( "cid: " + cid + ", pid: " + pid + ", paramValue: " + paramValue + ", paramName: " + paramName );
 
// Если измененный параметр есть в массиве paramNames, то провести процедуру коррекции
// и отправить в теле письма на application server
if( paramName != null )
{
    // Обработка значение параметра типа Email
    // При изменении через клиент BGBilling'а адреса разделяются "\n"
    if( paramName.equals( "email" )) {
        paramValue = paramValue.getEmail();
        paramValue = paramValue.replaceAll( "\n", "; ");
    }
 
    // Отправка письма, текст сообщения - "параметр:значение"
    if( paramValue != null ) {
        txt = paramName + ":" + paramValue + "\n";
        cpm = new ContractParameterManager( con );
        recp = emailAddr;
        new MailMsg( setup ).sendMessage( recp, "Parameters changed", txt );
    }
}


Action.

Алгоритм работы action'а:

  1. Определить ID клиента (см. Получение текущего пользователя биллинга).
  2. Просканировать список всех параметров, и, если, было задано новое значение (через POST-запрос), то:
  3. Сгенерировать событие ContractParamBeforeChangeEvent - для валидации параметра.
  4. Если параметр прошел валидацию, то установить новое значение и сгенеририровать событие ContractParamChangedEvent (для выполнения нужных действий с новым значением параметра)
  5. По результатам выполнения заполнить XML-отчет, который пригодится для отображения результатов в ЛК.


[Код action'а|Action для дополнительных параметров].

Шаблон личного кабинета.

Внести необходимые изменения в шаблон ЛК, а именно, [common.xsl] и [main.xsl].

Личные инструменты