Дмитрий Барышников
20.02.2019
288

Редактирование полей CDR при помощи скриптов

Довольно часто мы сталкиваемся с моментами, когда необходимо интегрировать телефонию с CRM системами или системами статистики. Эти сервисы зачастую берут данные из CDR. Но бывают случаи, когда CDR может заполняться некорректно. Это может быть связано с неверным настройками диалплана или даже вынужденная мера. Сегодня мы поговорим как раз о вынужденной мере. Представим себе ситуацию, когда […]

Довольно часто мы сталкиваемся с моментами, когда необходимо интегрировать телефонию с CRM системами или системами статистики. Эти сервисы зачастую берут данные из CDR. Но бывают случаи, когда CDR может заполняться некорректно. Это может быть связано с неверным настройками диалплана или даже вынужденная мера. Сегодня мы поговорим как раз о вынужденной мере.

Настройки проводились на Asterisk 13 и FreePBX 13.

Представим себе ситуацию, когда у нас недобросовестный оператор предоставляет транк с регистрацией, но не умеет самостоятельно подставлять А номер и это приходится делать на стороне FreePBX. Это повлечет за собой нежелательные последствия, а именно, в поле src в Mysql будет записываться не внутренний номер, а наш городской номер.

В MySql мы увидим следующее

Некорректное заполнение полей

На скриншоте мы видим, что некорректно  заполняется поле src, а интегрированная система salesman считает этот вызов входящим, хотя сам вызов был исходящий.
Данная проблема возникнет тогда, когда на FreePBX выполнены следующие настройки:

Когда вы создаете транк с регистрацией и в строке Outbound CallerID указан ваш городской номер

Пример настройки

Чтобы в дальнейшем нам спокойно работать, нам как-то необходимо редактировать нашу CDR. Из диалплана в явном виде это сделать невозможно, т.к. данные поля предназначены только для чтения.

Существуют 2 способа решения данной задачи.

1 способ. Использовать ODBC коннектор и alias в нём, но нам понадобиться создавать много переменных в диалплане для корректной записи необходимых полей.

2 способ. Использовать скрипт, который будет с определенной периодичностью подключать к базе и менять необходимые поля.

Мы будем использовать второй способ.

Будьте крайне внимательны при использовании данного метода, т.к. скрипт проходит по всей базе и в текущей конфигурации может внести нежелательные изменения.

Напишем скрипт следующего вида:

<?php
        $ip = "127.0.0.1";
        $db_user = "имя пользователя";
        $db_pass = "пароль";
        $db_name = "asteriskcdrdb";
        $db_con = mysqli_connect($ip,$db_user,$db_pass,$db_name);
        mysqli_query($db_con,"set names 'utf8'");
        $i=0;
        //вытаскиваем исходящие
        $cdr_sql = "select * from asteriskcdrdb.cdr where  LENGTH(cnum)=3 and src in(select outcid from asterisk.trunks where disabled = 'off')";
        //$cdr_sql="select * from cdr where recordingfile like 'out-%'";
        $cdr_rs= mysqli_query($db_con,$cdr_sql);
        while($cdr_row= mysqli_fetch_array($cdr_rs)) {
            $uniqueid = $cdr_row["uniqueid"];
            $cnum = $cdr_row["cnum"];
            //проверяем есть ли запись в БД SALESMAN
            $is_sm_exists = false;
            $is_sm_exists_sql = "select id from salesman.salesman_callhistory where uid=".$uniqueid;
            $is_sm_exists_rs= mysqli_query($db_con,$is_sm_exists_sql);
            while($is_sm_exists_row= mysqli_fetch_array($is_sm_exists_rs)) {
                $is_sm_exists = true;
            }
      //если есть тогда апдейтим CDR и SALESMAN
            if($is_sm_exists){
                $i++;
                //CDR UPDATE
                mysqli_query($db_con, "update cdr set src = '" . $cnum . "' where uniqueid=" . $uniqueid);
                //SALESMAN UPDATE
                $iduser="0";
                $salesman_sql = "select iduser from salesman.salesman_user where phone_in = '".$cnum."'";
                $salesman_rs = mysqli_query($db_con, $salesman_sql);
                $salesman_row = mysqli_fetch_array($salesman_rs);
                $iduser=$salesman_row['iduser'];
                mysqli_query($db_con, "update salesman.salesman_callhistory set src = '".$cnum."' , direct='outcome',iduser = '".$iduser."' where uid=". $uniqueid);
                echo $i.")".$uniqueid." UPDATED \n";
            }
        }
        echo "total ".$i." rows updated\n";
Скрипт обновления значений переменных
Необходимое значение мы берем из поля cnum

Делаем скрипт исполняемым

Chmod +x /usr/local/bin/updatesrc.php

Теперь делаем вспомогательный скрипт на bash, чтобы запустить из cron.

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
php /usr/local/bin/updatesrc.php

Вспомогательный скрипт updatesrc.sh, тоже сделаем исполняемым

Chmod +x /usr/local/bin/updatesrc.sh

Выполняем crontab –e и вносим туда наш вспомогательный скрипт:

*/1 * * * * /usr/local/bin/updatesrc.sh
Если у ваш сервер со слабыми характеристиками, то в дальнейшем прогон всей базы может занимать длительное время и вызывать подвисания.
Исполнение скрипта по расписанию

Теперь данные в MySQL будут отображаться корректно

Правильное отображение данных
 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices