diff --git a/resources/asterisk/CalcAgi.php b/resources/asterisk/CalcAgi.php index bc5de46fd..0a1235b9f 100755 --- a/resources/asterisk/CalcAgi.php +++ b/resources/asterisk/CalcAgi.php @@ -576,7 +576,10 @@ public function sendCall($agi, $destination, &$MAGNUS, $typecall = 0) $sql = "SELECT * FROM pkg_trunk_group_trunk WHERE id_trunk_group = " . $this->tariffObj[0]['id_trunk_group'] . " ORDER BY RAND() "; } else if ($this->tariffObj[0]['trunk_group_type'] == 3) { - $sql = "SELECT *, (SELECT buyrate FROM pkg_rate_provider WHERE id_provider = tr.id_provider AND id_prefix = " . $this->tariffObj[0]['id_prefix'] . " LIMIT 1) AS buyrate FROM pkg_trunk_group_trunk t JOIN pkg_trunk tr ON t.id_trunk = tr.id WHERE id_trunk_group = " . $this->tariffObj[0]['id_trunk_group'] . " ORDER BY buyrate IS NULL , buyrate "; + // $sql = "SELECT *, (SELECT buyrate FROM pkg_rate_provider WHERE id_provider = tr.id_provider AND id_prefix = " . $this->tariffObj[0]['id_prefix'] . " LIMIT 1) AS buyrate FROM pkg_trunk_group_trunk t JOIN pkg_trunk tr ON t.id_trunk = tr.id WHERE id_trunk_group = " . $this->tariffObj[0]['id_trunk_group'] . " ORDER BY buyrate IS NULL , buyrate "; + + $sql = "SELECT *, (SELECT buyrate FROM pkg_rate_provider rp LEFT JOIN pkg_prefix pf1 ON pf1.id = rp.id_prefix WHERE id_provider = tr.id_provider AND '$destination' LIKE CONCAT(pf1.prefix, '%') ORDER BY LENGTH(pf1.prefix) DESC LIMIT 1 ) AS buyrate FROM pkg_trunk_group_trunk t JOIN pkg_trunk tr ON t.id_trunk = tr.id WHERE id_trunk_group = '".$this->tariffObj[0]['id_trunk_group']."' ORDER BY buyrate IS NULL , buyrate"; + $agi->verbose("AMIN-FIX DEST $destination, SQL : $sql", 3); } $modelTrunks = $agi->query($sql)->fetchAll(PDO::FETCH_OBJ); @@ -625,14 +628,28 @@ public function sendCall($agi, $destination, &$MAGNUS, $typecall = 0) } if ($modelTrunk->credit_control == 1 && $provider_credit <= 0) { - $agi->verbose("Provider not have credit", 3); + $agi->verbose("AMIN-FIX: Provider [iD: ".$this->id_provider."] $trunkcode not have credit", 3); continue; } if ($status == 0) { - $agi->verbose("Trunk is inactive", 3); + $agi->verbose("AMIN-FIX: Provider [iD: ".$this->id_provider."] $trunkcode Trunk is inactive", 3); continue; } + else { // AMIN-FIX Start + $agi->verbose("AMIN-FIX LossPrevent, NUM $destination, PREF ".$this->tariffObj[0]['dialprefix'].", ClientCost: ".$this->tariffObj[0]['rateinitial'].", ProviderCost: ".$trunk->buyrate.", Prov-iD ".$this->id_provider."; $trunkcode", 3); + if ( $this->tariffObj[0]['rateinitial'] < $trunk->buyrate ) { + $agi->verbose("AMIN-FIX: Client cost for prefix ".$this->tariffObj[0]['dialprefix'].", = ".$this->tariffObj[0]['rateinitial']." less then ProviderCost: ".$trunk->buyrate.", Prov-iD ".$this->id_provider." $trunkcode; HANGUP!!", 3); + $MAGNUS->hangup($agi, 21); // Hangup and return 403 (see Magnus.php) to caller + } + if ( ! ($trunk->buyrate) or $trunk->buyrate == null or $trunk->buyrate == '') { + $agi->verbose("AMIN-FIX: ProviderCost IS NULL : HANGUP!!", 3); + $MAGNUS->hangup($agi, 21); // Hangup and return 403 (see Magnus.php) to caller + } + + + // AMIN-FIX End + } if (strncmp($MAGNUS->CallerID, $modelTrunk->cid_remove, strlen($modelTrunk->cid_remove)) == 0) { $MAGNUS->CallerID = substr($MAGNUS->CallerID, strlen($modelTrunk->cid_remove)); diff --git a/resources/locale/ru.js b/resources/locale/ru.js index f82401593..c58cb1f39 100755 --- a/resources/locale/ru.js +++ b/resources/locale/ru.js @@ -951,15 +951,15 @@ Locale.load({ 'Success: The SipTrace file was deleted': 'Успех: файл Siptraca был удален', 'Sum to pay': 'Сумма для оплаты', 'Summary Day Agent': 'Сводный день агента', - 'Summary Day Trunk': 'Сводный день ствол', - 'Summary Day User': 'Сводный пол пользователя', - 'Summary Month DID': 'Сводный месяц сделал месяц', - 'Summary Month Trunk': 'Суммарный месяц багажника', - 'Summary Month User': 'Сводный месяц пользователя', - 'Summary per Day': 'Резюме в день', - 'Summary per Month': 'Краткое изложение в месяц', - 'Summary per Trunk': 'Сводка на багажник', - 'Summary per User': 'Резюме на пользователя', + 'Summary Day Trunk': 'Сводный день по шлюзу', + 'Summary Day User': 'Сводный день по пользователю', + 'Summary Month DID': 'Сводный месяц по DID', + 'Summary Month Trunk': 'Сводный месяц по шлюзу', + 'Summary Month User': 'Сводный месяц по пользователю', + 'Summary per Day': 'Суммарно за день', + 'Summary per Month': 'Суммарно за месяц', + 'Summary per Trunk': 'Суммарно по шлюзам', + 'Summary per User': 'Суммарно по пользователям', 'Sun': 'солнце', 'Sunday': 'Воскресенье', 'Sunday intervals': 'Воскресные интервалы', @@ -1009,41 +1009,41 @@ Locale.load({ 'Title': 'Заголовок', 'To day': 'Сегодня', 'Today': 'Сегодня', - 'Today peak': 'Сегодня пик', + 'Today peak': 'Пик на сегодня', 'Toggle max completed calls': 'Toggle Max Завершенные звонки', 'Torture': 'Пытка', - 'Total': 'Общее', + 'Total': 'Всего', 'Total / Min': 'Всего / мин', 'Total AMD': 'Общий AMD', 'Total Price': 'Итоговая цена', - 'Total answered': 'Всего ответа', + 'Total answered': 'Всего отвечено', 'Total buy price': 'Общая цена покупки', - 'Total calls': 'Общие звонки', + 'Total calls': 'Всего звонков', 'Total cost': 'Общая стоимость', - 'Total dialed': 'Всего набрана', + 'Total dialed': 'Всего набрано', 'Total failed': 'Всего не удалось', 'Total generated': 'Всего генерируется', - 'Total numbers': 'Общее количество', - 'Total per trunk': 'Всего на ствол', + 'Total numbers': 'Всего номеров', + 'Total per trunk': 'Всего на шлюз', 'Total profit': 'Общая прибыль', 'Total sale': 'Общая продажа', 'Total sell price': 'Общая цена продажи', - 'Total to pay': 'Всего платить', + 'Total to pay': 'Всего к оплате', 'Transfer': 'Перевод', 'Transferred': 'Переведен', - 'Trunk': 'Сундук', + 'Trunk': 'Шлюз (транки)', 'Trunk Errors': '', - 'Trunk Groups': 'Группы ствола', - 'Trunk chart': 'Губальная диаграмма', - 'Trunk erros': 'Ошибка багажника', - 'Trunk groups': 'Группы ствола', - 'Trunks': 'Сундуки', + 'Trunk Groups': 'Группы шлюзов', + 'Trunk chart': 'диаграмма шлюзов', + 'Trunk erros': 'Ошибки шлюзов', + 'Trunk groups': 'Группы шлюзов', + 'Trunks': 'Шлюзы', 'Tuesday': 'вторник', 'Type': 'Тип', - 'Type number': 'Тип номер', - 'Type paid': 'Тип оплачен', + 'Type number': 'Тип номера', + 'Type paid': 'Тип оплаты', 'URL': 'Урл', - 'URL events notify': 'Уведомление URL Сообщения', + 'URL events notify': 'URL уведомления о событиях', 'URL to cancel email credit notification': 'URL отменить уведомление по электронной почте', 'Unallocated': 'Нераспределенный', 'Unavailable': 'Недоступен', @@ -1054,14 +1054,14 @@ Locale.load({ 'Unlimited calls': 'Неограниченные звонки', 'Update': 'Обновлять', 'Uptime': 'Временное время', - 'Use': '', + 'Use': 'Использовать', 'Use audio': 'Используйте аудио', 'Use date': 'Использовать дату', 'Use filters': 'Используйте фильтры', 'Use holidays': 'Использовать праздники', 'Use on signup': 'Используйте на регистрацию', 'Use that': 'Использовать это', - 'Use_Pref_Codec': 'Use_pref_codec.', + 'Use_Pref_Codec': 'Использовать приоритетные кодеки', 'User': 'Пользователь', 'User Custom Rates': 'Пользовательская таможенная ставка', 'User History': '', @@ -1080,20 +1080,20 @@ Locale.load({ 'VAT': 'НДС', 'Value': 'Значение', 'Variables': 'Переменные', - 'Verify code': 'Подтвердить код', + 'Verify code': 'Код подтверждения', 'Version': 'Версия', - 'Videosupport': 'Видеопорт', + 'Videosupport': 'поддержка видео', 'Voice': 'Голос', 'Voice Broadcasting': 'Голосовое вещание', 'VoiceMail': 'Голосовая почта', 'Voted': 'Проголосовал', 'Votes': 'Голоса', 'Voucher': 'Ваучер', - 'Voucher inexistente or already used': 'Voucher Onlystleente или уже используется', + 'Voucher inexistente or already used': 'Ваучер не существует или уже был использован', 'WHMCS': '', 'Wait time': 'Время ожидания', 'Wait, your phone ring in few seconds': 'Подождите, ваше телефонное кольцо за несколько секунд', - 'Wait...': 'Ждать...', + 'Wait...': 'Ждём...', 'Waiting': 'Ожидающий', 'Wallpaper': 'Обои', 'Want to reload the system to apply the theme?': 'Хотите перезагрузить систему, чтобы применить тему?', @@ -1134,8 +1134,8 @@ Locale.load({ 'Your session has expired. Log in again.': '', 'Your username is': 'Ваше имя пользователя', 'Zip code': 'Индекс', - 'Zone': '', - 'and': '', + 'Zone': 'Область', + 'and': 'и', 'cannot be blank': 'не может быть пустым', 'date': 'Дата', 'days': 'дни', @@ -1146,9 +1146,9 @@ Locale.load({ 'is optional': 'не является обязательным', 'm/d/Y': 'M / D / Y', 'must belong to the IVR owner': 'должен принадлежать владельцу IVR', - 'name': '', + 'name': 'имя', 'success': 'успех', 'to refill': 'пополнить', 'week': 'неделя', -}); \ No newline at end of file +});