BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 21 июн 2025, 22:15

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
СообщениеДобавлено: 10 янв 2013, 10:45 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Продолжаю ковырять BGBilling 5.2 на предмет соответствия нашим требованиям для перехода с другого биллинга. Пока не могу в голове собрать цельную картину того как осуществляется срабатывание тарифных опций и работа тарифов вообще.

Чего нужно в итоге добиться:
  • должны работать гибкие тарифы с изменением скорости на ресурсе в зависимости от времени/дня недели/даты/тарифных опций
  • аккаунтинга нет (разнородные типы подключения, подсчёт объёма трафика исключительно по результатам обработки netflow)
  • события об изменении скорости ресурса должны далее передаваться софтовому шейперу, по сути - внешней программе

Неясны в этой схеме с BGBilling следующие моменты:
  • каким образом обработать событие срабатывания тарифной опции для ресурса? Как я понял создаётся Java-класс, реализующий стандартный интерфейс события для ресурса и уже в нём каким-то образом определяется какая опция включилась. Однако примеров реализации подобного на форуме и в документации не нашёл.
  • сможет ли всё это работать в схеме без аккаунтинга?

Если не сложно, помогите сдвинуться в вопросе, а то что-то я слегка увяз.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 янв 2013, 10:56 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
Похожие темы:
viewtopic.php?f=44&t=7578
viewtopic.php?f=44&t=7559


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 10 янв 2013, 13:51 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
каким образом обработать событие срабатывания тарифной опции для ресурса? Как я понял создаётся Java-класс, реализующий стандартный интерфейс события для ресурса и уже в нём каким-то образом определяется какая опция включилась. Однако примеров реализации подобного на форуме и в документации не нашёл.
В тарифе настраивается, что при наличии тарифной опции включается опция модуля Inet. Опция модуля Inet - абстрактная сущность, которая может означать определенную скорость, параметры доступа и т.п. В классе-обработчике к опциям привязывается (например, через конфигурацию) скорость, т.е. при активации тарифной опции сменится набор опций модуля Inet - вызовется обработчик с этим набором - по набору определится скорость, которую нужно задать, и выполнятся необходимые команды на коммутаторе.
Цитата:
сможет ли всё это работать в схеме без аккаунтинга?
Сейчас отслеживание идет, когда есть сессия. Сессия возникает в двух случаях (тип инициации в типе сервиса) - по сигналу - это RADIUS аккаунтинг, либо DHCP запросы; по трафику - т.е. при появлении трафика netflow (при отсутсвиии трафика какое-то время сессия закрывается).

Т.е. сейчас, если в тарифе будет настроена смена опций по времени или клиент активирует тарифную опцию, а сессии нет (в случае инициации сессии по трафику - по тому что нет трафика), обработчик не вызовется (скорость не изменится) пока не начнется сессия (не появится netflow трафик по этому сервису/диапазону). Те две темы как раз о том, чтобы изменять скорость физически даже если клиент не работает (не подключен) в данный момент.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2013, 12:03 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Amir писал(а):
В тарифе настраивается, что при наличии тарифной опции включается опция модуля Inet.

Нарисовал дерево тарифа. Теоретически правильно?
Amir писал(а):
Опция модуля Inet - абстрактная сущность, которая может означать определенную скорость, параметры доступа и т.п. В классе-обработчике к опциям привязывается (например, через конфигурацию) скорость, т.е. при активации тарифной опции сменится набор опций модуля Inet - вызовется обработчик с этим набором - по набору определится скорость, которую нужно задать, и выполнятся необходимые команды на коммутаторе.

Что обрабатывает класс-обработчик? Активацию сервиса? Каким образом скорость привязать к опции через конфигурацию (конфигурацию чего)?
Извините что вопросы задаю глупые, пока что представление о работе BGBilling у меня весьма смутное.


Вложения:
тариф_с_переключением_скорости.png
тариф_с_переключением_скорости.png [ 56.55 КБ | Просмотров: 11785 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 11 янв 2013, 17:49 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
Нарисовал дерево тарифа. Теоретически правильно?
Да, только ветки тарифные опции можно вынести выше, в корень, т.к. внутри их ничто от внешнего трафика не зависит.

Цитата:
Что обрабатывает класс-обработчик? Активацию сервиса? Каким образом скорость привязать к опции через конфигурацию (конфигурацию чего)?
Извините что вопросы задаю глупые, пока что представление о работе BGBilling у меня весьма смутное.
Да, т.е. выполняет команды на коммутаторе.
http://bgbilling.ru/v5.2/javadoc/index.html

Если посмотрите динамические классы, что поставляются с модулем, там сначала вызывается метод init( Setup setup, int moduleId, InetDevice device, InetDeviceType deviceType, ParameterMap deviceConfig ) - deviceConfig это полная конфигурация устройства. Например, AbstractRadiusServiceActivator парсит конфиг устройства вида radius.inetOption.x.attributes=, чтобы создать мап наборов атрибутов по ключу-id опции.
Посмотрите так же, как простой пример, динамический класс (не до конца рабочий), у него привязка скоростей прямо в коде:
ru.bitel.bgbilling.inet.dyn.device.des3200.DES320028ServiceActivator

Как вариат - параметры брать из конфига опции, как здесь:
http://wiki.bgbilling.ru/index.php/Обработчик_активации_сервисов_для_Mikrotik_c_изменениями_скорости
InetOptionRuntime option = InetOptionRuntimeMap.getInstance().get( ruleId );
long speed = option.config.getLong( "speed", 100L );


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2013, 07:44 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Всё-таки создание сессии post factum по появлению netflow - не совсем идеологически правильно. А можно ли создавать постоянно действующие сессии? Например у нас много клиентов, подключенных статикой. Для таких клиентов можно было бы определить состояние "сессии" таким образом:
* баланс на счету положительный - сессия поднята
* баланс на счету отрицательный - сессия прервана
Можно ли реализовать такую схему в BgBilling? Что для этого нужно сделать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 янв 2013, 08:02 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
А зачем им сессия, если скорость можно менять и без неё?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 янв 2013, 08:54 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Cromeshnic писал(а):
А зачем им сессия, если скорость можно менять и без неё?


На сколько я понимаю скорость без сессии можно менять только если запускать задание по cron'у, в котором проверять даты/время и производить в зависимости от них какие-то действия с ресурсами.

Мне же хотелось бы чтобы все действия по клиентским подключениям происходили как реакция на событие на договоре или ресурсе и делалось для каждого ресурса отдельно. Это гораздо более гибкое и менее затратное по ресурсам решение.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 17 янв 2013, 13:38 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
В ISG же есть инициация аккаунтинга по IP (т.е. клиент стучится в интернет - ISG посылает авторизацию и аккаунтинг). Здесь похожая схема появления сессии.
Тарифы бывают разные - как определить без тарификации, во сколько нужно менять скорость, если там, например, зависимость от количества потребленного трафика?
А если в тарифе стоит переключении скорости по времени в 16:00 и тариф у 100000 абонентов - одновременно такое количество все равно не обработается.
Разницы по ресурсам не вижу, даже наоборот - например, у клиента выключен компьютер днем (или ночью) - ему на свиче лишний раз скорость не меняется, а поменяется как только он включит компьютер.

По той схеме, которую планируем добавить, получится, что для активных (по которым идет Netflow) в данный момент клиентов скорость будет меняться с бОльшим приоритетом, чем для неактивных.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 фев 2013, 13:02 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Создал класс для устройства, с которого идёт Netflow.
Код класса:

package ru.technodesign.bgbilling.inet.dyn.device.softrouter;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivator;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorAdapter;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;

public class SoftrouterServiceActivator
extends ServiceActivatorAdapter
implements ServiceActivator
{
/*private static final Logger log = Logger.getLogger( SoftrouterServiceActivator.class );*/
private static final Logger log = Logger.getLogger( "script.myscript" );

@Override
public Object connect()
throws Exception
{
log.debug("SoftrouterServiceActivator connect event");
return null;
}

@Override
public Object onAccountingStart( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator onAccountingStart event");
return null;
}

@Override
public Object serviceModify( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator serviceModify event");
return null;
}

@Override
public Object destroy()
throws Exception
{
return null;
}

@Override
public Object onAccountingStop( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator onAccountingStop event");
return null;
}

@Override
public Object connectionClose( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator connectionClose event");
return null;
}

@Override
public Object serviceCreate( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator serviceCreate event");
return null;
}

@Override
public Object disconnect()
throws Exception
{
log.debug("SoftrouterServiceActivator disconnect event");
return null;
}

@Override
public Object serviceCancel( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator serviceCancel event");
return null;
}

@Override
public Object connectionModify( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
log.debug("SoftrouterServiceActivator connectionModify event");
return null;
}

@Override
public Object init( Setup setup1, int int2, InetDevice inetDevice3, InetDeviceType inetDeviceType4, ParameterMap parameterMap5 )
throws Exception
{
log.debug("SoftrouterServiceActivator init event");
return null;
}

}


Т.е. к автоматически сформированному коду добавил только вывод в лог для всех возможных событий объекта класса.
Добавил в BGBillingServer/data/log4j.xml конфигурацию для обработки логов.
<appender name="MYSCRIPT" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="${log.dir.path}myscript.log" />
<param name="MaxFileSize" value="10MB" />
<param name="MaxBackupIndex" value="2" />
<param name="Append" value="false" />

<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%X{nestedContext} %d{MM-dd/HH:mm:ss} %5p [%t] %c{1} - %m%n" />
</layout>
</appender>


<category name="script.myscript" additivity="false">
<priority value="DEBUG" />
<appender-ref ref="MYSCRIPT" />
</category>


В результате создаётся файл BGBillingServer/log/myscript.log, однако при любых действиях с сервисом (создание, синхронизация, поднятие/опускание сессии) никакого выхлопа в myscript.log нет. В чём может быть дело?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 22 фев 2013, 16:17 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
Добавил в BGBillingServer/data/log4j.xml конфигурацию для обработки логов.
Этим InetAccess занимается, т.е. его log4j.xml нужно изменять, в его логах нужно смотреть.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 фев 2013, 08:15 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Amir писал(а):
Цитата:
Добавил в BGBillingServer/data/log4j.xml конфигурацию для обработки логов.
Этим InetAccess занимается, т.е. его log4j.xml нужно изменять, в его логах нужно смотреть.


Аналогично. Никаких записей в логе не появилось.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 фев 2013, 14:10 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
А в стандартных логах при этом все есть как обычно?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 фев 2013, 14:33 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
InetAccess рестартили?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 фев 2013, 10:44 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Разобрался. В BGInetAccess/inet-access.xml было неправильное значение у параметра rootDeviceId.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 мар 2013, 12:38 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
В /usr/local/BGInetAccess/log/all.log каждые полминуты стало появляться сообщение:
Код:
access 03-12/17:16:20  WARN [access-p-5-t-1] SessionCountManager - inetServRuntime:19 is null

Что это и что с этим делать?

И ещё. При просмотре отчёта по сессиям видно что время отстаёт на 1 час. При этом во все журналы на диск все компоненты биллинга пишут правильное время. См. рис. BGBilling работает внутри контейнера OpenVZ.


Вложения:
bad_report_time.png
bad_report_time.png [ 71.87 КБ | Просмотров: 11572 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 12 мар 2013, 14:04 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
Что это и что с этим делать?
Похоже пока тестили осталась открытая сессия, а сервис удалили. Нужно удалить сессию из inet_connection и inet_session с этим servId.
Код:
И ещё. При просмотре отчёта по сессиям видно что время отстаёт на 1 час. При этом во все журналы на диск все компоненты биллинга пишут правильное время. См. рис. BGBilling работает внутри контейнера OpenVZ.
Где-то java старая, без обновленных timezone, где учитывается что переход на зимнее время отменили.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 мар 2013, 10:30 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Ошибку в логах BGInetAccess, по java непонятно - обновлял Oracle'овским патчем, Java в системе одна. Как может так получиться что часть процессов патч затронул, часть нет? Все сервисы биллинга, конечно же, перезапускал.

Ещё ошибка. Стандартная процедура изменения состояний сервисов не работает. В scheduler.log валится следующее:

Код:
03-13/15:22:02  INFO [Thread-12] TaskRunProcessor - Running Task: ru.bitel.bgbilling.modules.inet.task.InetServPeriodT
ask
03-13/15:22:02  INFO [pool-1-thread-4] InetServPeriodTask - start task id => 5 at time 13.03.2013 15
03-13/15:22:02 ERROR [pool-1-thread-4] InetServPeriodTask - Table 'bgbilling.inet_serv' doesn't exist [42S02, 1146]
ru.bitel.bgbilling.common.BGException: Table 'bgbilling.inet_serv' doesn't exist [42S02, 1146]
        at ru.bitel.common.model.AbstractDao.processException(AbstractDao.java:98)
        at ru.bitel.common.model.AbstractDao.list(AbstractDao.java:243)
        at ru.bitel.bgbilling.modules.inet.api.server.bean.InetServDao.listToCancel(InetServDao.java:574)
        at ru.bitel.bgbilling.modules.inet.task.InetServPeriodTask.executeTaskImpl(InetServPeriodTask.java:82)
        at ru.bitel.bgbilling.modules.inet.task.InetServPeriodTask.executeTask(InetServPeriodTask.java:53)
        at ru.bitel.bgbilling.kernel.task.server.TaskBase.run(TaskBase.java:74)
        at ru.bitel.bgbilling.kernel.task.server.TaskBase.startTask(TaskBase.java:135)
        at bitel.billing.server.task.TaskBaseRunner.executeTask(TaskBaseRunner.java:72)
        at bitel.billing.server.task.bean.RunTask.run(RunTask.java:41)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'bgbilling.inet_serv' doesn't exist
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.Util.getInstance(Util.java:386)
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
        at ru.bitel.common.model.AbstractDao.listImpl(AbstractDao.java:218)
        at ru.bitel.common.model.AbstractDao.listImpl(AbstractDao.java:231)
        at ru.bitel.common.model.AbstractDao.list(AbstractDao.java:239)
        ... 10 more
03-13/15:22:02  INFO [pool-1-thread-4] InetServPeriodTask - Task finished time=4 ms.
03-13/15:22:02  INFO [pool-1-thread-4] InetServPeriodTask - task time : 0 d 00:00:00
03-13/15:22:02  INFO [pool-1-thread-4] InetServPeriodTask - RunTask finished time=5 ms.


Это понятно, потому что:

mysql> show tables like '%inet_serv%';
+------------------------------------+
| Tables_in_bgbilling (%inet_serv%) |
+------------------------------------+
| inet_serv_1 |
| inet_serv_option_1 |
| inet_serv_type_1 |
| inet_serv_type_device_group_link_1 |
| inet_serv_type_device_type_link_1 |
+------------------------------------+
5 rows in set (0.01 sec)


Как поправить?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 13 мар 2013, 19:33 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Цитата:
Ошибку в логах BGInetAccess, по java непонятно - обновлял Oracle'овским патчем, Java в системе одна. Как может так получиться что часть процессов патч затронул, часть нет? Все сервисы биллинга, конечно же, перезапускал.
Т.е. клиент на той же машине запущен? Может быть он под другой JRE/JDK запускается? С часовым поясом/часами проблема - сразу не заметил - часы в клиенте тоже не правильное время показывают - а должны серверное, т.к. с учетом серверного часового пояса.
Цитата:
Ещё ошибка. Стандартная процедура изменения состояний сервисов не работает. В scheduler.log валится следующее:
В задаче нужно прописать mid=<код модуля>, также как и для задач других модулей.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 19 мар 2013, 08:29 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Amir писал(а):
Т.е. клиент на той же машине запущен? Может быть он под другой JRE/JDK запускается? С часовым поясом/часами проблема - сразу не заметил - часы в клиенте тоже не правильное время показывают - а должны серверное, т.к. с учетом серверного часового пояса.

На клиентской машине с Debian'ом стояли параллельно OpenJDK и Sun JDK (из репозитория Debian). Как я понял по умолчанию работал JVM из OpenJDK. Обновлялка от Oracle видимо проверяла соответствие зон и, не находя проблем (или не находя "свою" версию Java?), считала что всё нормально.
Удалил OpenJDK, перезапустил обновлялку таймзон от Oracle - время починилось.

Amir писал(а):
В задаче нужно прописать mid=<код модуля>, также как и для задач других модулей.

Прописал, судя по логам scheduler'а - работает. Момент с mid хорошо бы как-нибудь выделить в документации. Специально перечитал доки - не нашёл в настройке Scheduler'а или модуля Inet упоминания о необходимости прописывания этого параметра.

Теперь другая проблема: не срабатывает по времени изменение опции на тарифе. Никаких ошибок в логах, задание "Активация/деактивация сервисов по периоду" отрабатывает раз в минуту.
Тариф см. на картинке


Вложения:
tariff1.png
tariff1.png [ 71 КБ | Просмотров: 11505 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 21 мар 2013, 03:20 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
up

Уважаемые разработчики могут чем-то помочь?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 мар 2013, 13:10 
Не в сети

Зарегистрирован: 20 ноя 2012, 12:31
Сообщения: 43
Откуда: Комсомольск-на-Амуре
Карма: 5
Помог sintezwh1te с jabber-конференции bgbilling (conference.jabber.ru, комната bgbilling). Всё-таки дерево опций нужно строить, основываясь на типе трафика.
Итоговое работающее дерево:


Вложения:
nice_tree.png
nice_tree.png [ 36.71 КБ | Просмотров: 11448 ]
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 мар 2013, 13:15 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
помог лайк э босс Изображение

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 мар 2013, 16:06 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Опции можно добавлять и в корень. Но тариф должен быть правильным - в нем должна быть цена и установка услуги для каждого использующегося типа трафика, т.е. как минимум - Время.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.059s | 67 Queries | GZIP : On ]