Данные беру из cdr, которые складываются в БД Postgres по окончанию звонка.
Перед началом звонка беру состояние счета из БД, рассчитываю максимальную продолжительность разговора, исходя из цены направления, подставляю эту продолжительность в Dial с помощью опции S. Вроде бы все хорошо, если запретить более одного одновременного звонка с одного логина...но для предприятий это не подходит.
В связи с этим планирую писать в таблицу базы данных текущие звонки и раз в x секунд рассчитывать стоимость этих звонков скриптом (данные буду брать, парся вывод core show channels concise). Если сумма по логину больше состояния счета, то делаю сброс звонка.
Есть еще одна проблема, когда клиент пополняет счет во время звонка, а длительность уже расчитана, но это для меня не критично...
Правильный ли это алгоритм и есть ли более красивые решения, может даже средствами asterisk (использую последнюю версию 1.6.1.6)? Кто как решает задачу prepaid биллинга.
Заранее спасибо.
PS: Готовый биллинг не хочу использовать, так как задача у меня пока маленькая, а в своем биллинге проще искать ошибки и понять его логику. При выходе на большие объемы поставлю a2billing.
ну и func_odbc/AMI вместо cdr