A2Billing v1.8+ BUGS
Модераторы: Admins, Модераторы
A2Billing v1.8+ BUGS
У кого не работает Dashboard а именно не рисуются графики - достаточно в корень www положить файл .htaccess добавив туда строчку "php_value display_errors Off"
или можно в глобальном конфиге php.ini эту опцию выключить (что не так элегантно по сравнению с первым примером)
ps: если кто знает как это поправить патчем просьба сообщить.
или можно в глобальном конфиге php.ini эту опцию выключить (что не так элегантно по сравнению с первым примером)
ps: если кто знает как это поправить патчем просьба сообщить.
- busc
- Модератор
- Сообщения: 150
- Зарегистрирован: 12 фев 2008, 10:28
- Откуда: Kiev
- Контактная информация:
Не ожидал такого:
в процедуре cid_sanitize (это которая выбирает номер CID или DID для подстановки в CallerID) есть запрос
lib/Class.A2Billing.php
строка 2219
он никогда не отработает потому что там 3 ошибки, контроль по датам как-то странно написан (дата начала больше текущей даты... и истекает срок до текущей даты), оператор ">=" написан "=>", в запросе не делается выборка из cc_callerid а проверка полей из нее делается.
Одним словом CallerID из DID-ов никогда не будет выбран
Там наверное индусы код писать начали )))) чтоб в одном запросе, да 3 ошибки.... явно даже не проверяли.
Рекомендую заменить на
в процедуре cid_sanitize (это которая выбирает номер CID или DID для подстановки в CallerID) есть запрос
lib/Class.A2Billing.php
строка 2219
Код: Выделить всё
$QUERY .= "SELECT cc_did.did ".
" FROM cc_did ".
" JOIN cc_did_destination ON cc_did_destination.id_cc_did=cc_did.id ".
" JOIN cc_card ON cc_did_destination.id_cc_card=cc_card.id ".
" WHERE (cc_callerid.activated=1 OR cc_callerid.activated='t') AND cc_did_destination.activated=1 AND cc_did.startingdate => NOW() AND cc_did.expirationdate <= NOW()".
" AND cc_card.username='".$this->cardnumber."' ";
$QUERY .= "ORDER BY 1";
Одним словом CallerID из DID-ов никогда не будет выбран
Там наверное индусы код писать начали )))) чтоб в одном запросе, да 3 ошибки.... явно даже не проверяли.
Рекомендую заменить на
Код: Выделить всё
$QUERY .= "SELECT cc_did.did ".
" FROM cc_did ".
" JOIN cc_did_destination ON cc_did_destination.id_cc_did=cc_did.id ".
" JOIN cc_card ON cc_did_destination.id_cc_card=cc_card.id ".
" WHERE cc_did_destination.activated=1 AND cc_did.startingdate <= NOW() AND cc_did.expirationdate >= NOW()".
" AND cc_card.username='".$this->cardnumber."' ";
$QUERY .= "ORDER BY 1";
.
..:
..:
- busc
- Модератор
- Сообщения: 150
- Зарегистрирован: 12 фев 2008, 10:28
- Откуда: Kiev
- Контактная информация:
checkout_confirmation.php
Строка 94
Делаем оплату через epayment к примеру 5 евро. После подтверждения платежа для пользователей с русским интерфейсом указанная строка возвращает
значение '5,000' (!с запятой!) и в таком же виде ложит его в базу.
Когда с сервера приходит подтверждение транзакции то срока '5,000' из базы конвертируется из валюты в которой пришел платеж в базовую валюту.
Это делает функция convert_currency, которая находится в Misc.php, так вот она выдает для таких чисел результат 0!!!!!
И получается, что платеж прошел, на счет сумма пришла, а баланс абонента вырос на 0 у.е.
А все из-за того что формат '%.3f' локалезависимый и надо использовать '%.3F' который не зависит от настроек локали.
Надо поменять на
Строка 94
Код: Выделить всё
$amount_string=sprintf("%.3f",$total_amount);
значение '5,000' (!с запятой!) и в таком же виде ложит его в базу.
Когда с сервера приходит подтверждение транзакции то срока '5,000' из базы конвертируется из валюты в которой пришел платеж в базовую валюту.
Это делает функция convert_currency, которая находится в Misc.php, так вот она выдает для таких чисел результат 0!!!!!
И получается, что платеж прошел, на счет сумма пришла, а баланс абонента вырос на 0 у.е.
А все из-за того что формат '%.3f' локалезависимый и надо использовать '%.3F' который не зависит от настроек локали.
Надо поменять на
Код: Выделить всё
$amount_string=sprintf("%.3F",$total_amount);
.
..:
..:
столкнулся сейчас с очень неприятным моментом: заведено порядка 5000 аккаунтов препейд с идентичными настройками и все бы вроде хорошо, но заметил что бывают ситуации, когда с аккаунта производятся звонки, а деньги не списываются. К примеру есть аккаунт у него начальный баланс 3$, смотрю его историю звонков он назвонил уже на 25$, и при мне звонит в данный момент, заканчивает разговор, а у него все равно 3 бакса
и таких случаев отскал уже 5 за посление три дня, из последних таких на балансе 10$ - звонит, поговорил с минуту, остаток такой же, в итоге вручную снял сумму, только после этого звонки этого абонента стали тарифицироваться
даже не знаю, где искать косяк

и таких случаев отскал уже 5 за посление три дня, из последних таких на балансе 10$ - звонит, поговорил с минуту, остаток такой же, в итоге вручную снял сумму, только после этого звонки этого абонента стали тарифицироваться
даже не знаю, где искать косяк

так как в логе постоянно валится ошибка:
в файлы
/var/lib/asterisk/agi-bin/a2billing.php и /var/www/localhost/htdocs/common/lib/Misc.php
строчки
второй строкой, в начале файла, сразу за <?php
после этого ошибки перестали сыпаться в лог апача а также дашбоард заработал. Gentoo.
если кому не лень - просьба добавить в глобальные настройки a2b данную опцию (через базу), если будет патч - постараюсь протолкнуть в транк к арески.
а также перестает отображаться дашборд после апгрейда php до 5.3 - решением было (как описано тут) вставитьYou are *required* to use the date.timezone setting or the date_default_timezone_set() function
в файлы
/var/lib/asterisk/agi-bin/a2billing.php и /var/www/localhost/htdocs/common/lib/Misc.php
строчки
Код: Выделить всё
date_default_timezone_set('Europe/Moscow');
после этого ошибки перестали сыпаться в лог апача а также дашбоард заработал. Gentoo.
если кому не лень - просьба добавить в глобальные настройки a2b данную опцию (через базу), если будет патч - постараюсь протолкнуть в транк к арески.
- busc
- Модератор
- Сообщения: 150
- Зарегистрирован: 12 фев 2008, 10:28
- Откуда: Kiev
- Контактная информация:

Могу ошибаться конечно, доказательств из кода не имею, пока

Временная зона клиента должна быть учтена только при отображении данных у него в кабинете. Хранение данных должно быть в у всех в зоне сервера.
И по времени делится тарифный план на стороне сервера, потому что тарифы по времени дает аплинк, который про часовой пояс звонящего ничего не знает и авторизует звонок по своему часовому поясу.
.
..:
..:
Григорий, ты мыслишь слишком узко (извини если звучит грубо). а ведь ситуации могут быть разные.
именно поэтому я стараюсь, если есть возможность, не менять глобальные настройки сервера. под конкретную апликуху одно надо а под другую может завтра другое понадобится - получится конфликт. поэтому лучше предусматривать такие моменты заранее, тем более что конкретно в этой вот ситуации делов ровно на 15 минут - добавить в биллинг новую опцию и ключик в базе. я думаю я даже сам бы мог такое сделать, (правда у меня это займет уже все 3 часа а не 15 минут но думаю я бы справился).
вот пример для чего может понадобится такое - сервер стоит у более дешевого хостера в германии а клиент в мск и соответственно нужно чтобы биллилось все под клиента в Мск времени. могу еще с пяток причин выдумать.
именно поэтому я стараюсь, если есть возможность, не менять глобальные настройки сервера. под конкретную апликуху одно надо а под другую может завтра другое понадобится - получится конфликт. поэтому лучше предусматривать такие моменты заранее, тем более что конкретно в этой вот ситуации делов ровно на 15 минут - добавить в биллинг новую опцию и ключик в базе. я думаю я даже сам бы мог такое сделать, (правда у меня это займет уже все 3 часа а не 15 минут но думаю я бы справился).
вот пример для чего может понадобится такое - сервер стоит у более дешевого хостера в германии а клиент в мск и соответственно нужно чтобы биллилось все под клиента в Мск времени. могу еще с пяток причин выдумать.
Баг в расчётах статистики
В дашбоарде в REFILLS INFO, не учитывает отрицательные суммы.
Как повторить: Например у клиента на счету $100, добавляем ему еще 70, но потом например передумали (какоето событие не случилось когда должно было бы. или по ошибке положили ему не 70 а 170, ну всякое бывает) и хотим минусовать на эти 70 назад. делаем ему платеж с суммой -70, тотал у клиента меняется назад на $100, как и должно было бы быть. НО. в статистиске дашбоарда REFILLS INFO в нашем случае покажет не 100 а 170 что не соответсвует истине. по логике выходит что этот кусок кода не считает минусовые суммы в статистике откуда он берет данные для расчета. явно баг...
В дашбоарде в REFILLS INFO, не учитывает отрицательные суммы.
Как повторить: Например у клиента на счету $100, добавляем ему еще 70, но потом например передумали (какоето событие не случилось когда должно было бы. или по ошибке положили ему не 70 а 170, ну всякое бывает) и хотим минусовать на эти 70 назад. делаем ему платеж с суммой -70, тотал у клиента меняется назад на $100, как и должно было бы быть. НО. в статистиске дашбоарда REFILLS INFO в нашем случае покажет не 100 а 170 что не соответсвует истине. по логике выходит что этот кусок кода не считает минусовые суммы в статистике откуда он берет данные для расчета. явно баг...
Не знаю, обсуждалось уже или нет, но в a2b версии 1.8.1 имеется следущий баг:
возьмем, к примеру два направления: Бельгия стац. код 32 по цене 0,01 и Бельгия моб код 3248 по цене 0,1
Набираем номер Бельгия моб. в следущем формте: 32__485123456 и наш биллинг определяет его как Бельфия стац. , так как он нашел соответстие в тарифах по коду 32
Добавил строку $phonenumber = preg_replace('(\D+)', '', $phonenumber); в файл lib/Class.RateEngine.php после 88 строки
function rate_engine_findrates (&$A2B, $phonenumber, $tariffgroupid)
{
Строка удалет все нецифровые символы из набранного номера
ps. возможно есть лучшие варианты, но у меня только базовые знания программирования
возьмем, к примеру два направления: Бельгия стац. код 32 по цене 0,01 и Бельгия моб код 3248 по цене 0,1
Набираем номер Бельгия моб. в следущем формте: 32__485123456 и наш биллинг определяет его как Бельфия стац. , так как он нашел соответстие в тарифах по коду 32
Добавил строку $phonenumber = preg_replace('(\D+)', '', $phonenumber); в файл lib/Class.RateEngine.php после 88 строки
function rate_engine_findrates (&$A2B, $phonenumber, $tariffgroupid)
{
Строка удалет все нецифровые символы из набранного номера
ps. возможно есть лучшие варианты, но у меня только базовые знания программирования
рекомендую проапдейтиться. уже 1.9.4 с мая доступна. если не ставили какието свои собственные патчи то будет крайне легко - выполните все .sql апдейты "сверху" своей базы (это безопастно, но сделайте бэкап на всякий случай) а затем просто разверните новые .php файлы вместо старых. все должно заработать со старыми данными из базы без проблем. рекомендую ветку от nixon, это своего рода "расширенная" версия от арески и полностью совместима. к слову сказать он намного активнее работает над a2b чем сам арески в последнее время, за что честь и хвала ему. 

Можно выкусить внесенные изменения скачав оригинальный архив с версией что и у вас и путем сравнения сделать патчи. Это нужно сделать в любом случае если не хотите остаться на бажной версии и через пять лет. Полученные патчи потом можно на любую версию натянуть я думаю если конечно они не меняют кардинально код. По крайней мере попробовать можно и нужно.
Более чем... Продолжая традиции areski, не писать талмуды, а писать подстрочные хелпы, всё должно быть интуитивно понятно. Кроме того, с удовольствием отвечу на вопросы.almor писал(а):К тому же уже сделанная частичная переделка интерфейса под свои нужды останавливает, так как некоторые изменения никак не задокументировал...
Удачи!