Написание простого prepaid биллинга (принципы построения)

Всё о биллингах.

Модераторы: Admins, Модераторы

Ответить
asterm
Сообщения: 21
Зарегистрирован: 25 окт 2009, 09:10

Написание простого prepaid биллинга (принципы построения)

Сообщение asterm » 25 окт 2009, 09:27

Пробую написать простой prepaid биллинг для *. Клиенты, которых нужно тарифицировать-это sip-телефоны (возможно, в будущем будет еще карточная платформа...).
Данные беру из cdr, которые складываются в БД Postgres по окончанию звонка.
Перед началом звонка беру состояние счета из БД, рассчитываю максимальную продолжительность разговора, исходя из цены направления, подставляю эту продолжительность в Dial с помощью опции S. Вроде бы все хорошо, если запретить более одного одновременного звонка с одного логина...но для предприятий это не подходит.
В связи с этим планирую писать в таблицу базы данных текущие звонки и раз в x секунд рассчитывать стоимость этих звонков скриптом (данные буду брать, парся вывод core show channels concise). Если сумма по логину больше состояния счета, то делаю сброс звонка.
Есть еще одна проблема, когда клиент пополняет счет во время звонка, а длительность уже расчитана, но это для меня не критично...

Правильный ли это алгоритм и есть ли более красивые решения, может даже средствами asterisk (использую последнюю версию 1.6.1.6)? Кто как решает задачу prepaid биллинга.
Заранее спасибо.
PS: Готовый биллинг не хочу использовать, так как задача у меня пока маленькая, а в своем биллинге проще искать ошибки и понять его логику. При выходе на большие объемы поставлю a2billing.

bird_of_Luck
Модератор
Сообщения: 485
Зарегистрирован: 30 авг 2008, 13:46

Сообщение bird_of_Luck » 25 окт 2009, 12:40

Вообще для этого придуман radius
ну и func_odbc/AMI вместо cdr

asterm
Сообщения: 21
Зарегистрирован: 25 окт 2009, 09:10

Сообщение asterm » 25 окт 2009, 12:59

Работаю с модулем cdr_pgsql.so, который кладет информацию о звонках в базу данных. В радиусе, вроде бы, есть возможность получать информацию до завершения звонка, но с ним никогда не работал, если не найду альтернативы, буду разбираться.

Ответить