artem
20.11.2018
5867

Счетчик нажатий в ИВР с указанием времени на каждое направление

В данной статье рассмотрим дополнение предыдущей, в которой был написан счетчик нажатий в голосовом меню. Помимо этого добавим к каждому пункту подсчет времени на каждое направление.

О счетчике нажатия в ИВР

Считать будем общее время звонка клиента без изменений в диалплане. Для подсчета времени непосредственно разговора, необходимы правки диалплана.

Для начала внесем правки в ранее написанный скрипт подсчета, поскольку он был ориентирован на «идеальную» систему, в подписи ИВР не учитывалась возможность удаления и создание нового голосового меню. Следовательно, поскольку при удалении и последующем создании нового голосового меню их id не заменяет предыдущий, то статистика сбивается. Для избавления от этой проблемы внесем изменения в имеющийся скрипт, а точнее в цикл создания массива имен ИВР:

После удаления и создания нового голосового меню

#Массив имен ИВР для соотнесения с массивом количества наборов
mysqlscript=»Select id from asterisk.ivr_details order by id;»
ivr_id=$( mysql —user=freepbxuser —password=»$mysqlpass» -N  asteriskcdrdb <<< «$mysqlscript» )
#Создаем массив с именами ИВР
for it in $ivr_id; do
#Запрашиваем имя ИВР из базы
mysqlscript=»Select name from asterisk.ivr_details where id=$it;»
ivr_descr=$( mysql —user=freepbxuser —password=»$mysqlpass» -N  asteriskcdrdb <<< «$mysqlscript» )
#Записываем в массив с индексом равным id IVR
arrs[$it]=$ivr_descr
done;
datenow=$(date +%Y-%m-%d -d «1 day ago»)

Как видим, для каждого элемента массива будет осуществлен запрос в базу данных, что увеличивает время обработки скрипта.

Старая статистика по нажатиям.

Подсчет полного времени

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

В цикле получения данных из лога добавляем:

Получаем дату из строки:

dt=`expr «$fn» : ‘[([0-9]*-[0-9]*-[0-9]*)’

Получаем канал из строки:

                ch=`expr «$fn» : ‘.*»([A-Z]*/[0-9]*-[a-z0-9]*)’`

Получив эти данные, осуществим запрос в базу данных:
mysqlscript=»Select billsec from asteriskcdrdb.cdr where calldate>’$dt’ and channel=’$ch’ order by channel desc limit 1;»
billsec=$( mysql —user=freepbxuser —password=»$mysqlpass» -N  asteriskcdrdb <<< «$mysqlscript» )

И добавим новый массив, с ключем в виде нажатой клавиши:

arrv[$ext]=`expr ${arrv[$ext]} + $billsec`

Далее правим цикл сборки статистики в файл:

До цикла

echo «IVR, Клавиша/Добавочный, Количество наборов, Время» >> temp.csv

В цикле:

Получаем имя ИВР

ivr_descr=${arrs[$ivr]}

Получаем время

tm=${arrv[$ext]}

Записываем в файл

echo «$ivr_descr, $ext, ${arr[$ivr,$ext]}, $tm» >> temp.csv

За циклом:

Сортируем записи в файле и добавляем подпись о дате выборки:

sort temp.csv > /tmp/stat.csv
sed -i -e «1 s/^/,Дата: $datenow,n/;» /tmp/stat.csv

Статистика со временем

Далее можно добавить отправку на почту и закрепить скрипт в крон на выполнение каждое утро в 9 часов.

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

Подсчет времени непосредственного разговора

Далее рассмотрим возможность подсчета времени непосредственно разговора.

Для этого потребуется внести изменения в существующий диалплан.

Соответственно при добавлении каждого нового голосового меню, следует вносить правки в диалплан.

В диалплан необходимо добавить следующее:

[ivr-1] ; Main
exten => 4,1(ivrsel-4),NoOp(=${CDR(linkedid)}=)
same => n,Goto(ext-queues,601,1)

Поскольку диалплан у каждого может отличаться, то [ivr-1] (или другую) можно взять в файле extensions_additional.conf

Следовательно каждый набор в ИВР будет помечен переменной Linkedid, для того чтобы иметь возможность отследить этот звонок в базе более точно.

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

Следовательно запрос в базу примет вид:

select calldate, duration, billsec from cdr where linkedid=’1541505132.499′ order by calldate desc limit 1;

Запрос в БД за данными звонка.

Где в качестве linkedid мы будем указывать идентификатор полученный из строки.

Рассмотрим дополнение в скрипт:

Получим идентификатор канала из строки:

lid=`expr «$fn» : ‘.*=([0-9]*.[0-9]*)=’`

Если он пуст, то подсчет не будет вестись и тогда необходимо либо считать на основе идентификатора канала, либо не считать вовсе, пометив, что на данном направлении отключен счетчик:

      • 1)Не считаем время, тогда помечаем: arrv[$ext]=»No data»
      • 2)Считаем время, тогда меняем запрос на подсчет с идентификатором канала (полное время)

По первому случаю условие в цикле будет выглядеть следующим образом:

#Получаем идентификатор звонка из строки
lid=`expr «$fn» : ‘.*=([0-9]*.[0-9]*)=’`
if [[ -z $lid ]]
then
arrv[$ext]=»No data»
else
mysqlscript=»Select billsec from asteriskcdrdb.cdr where linkedid=’$lid’ order by calldate desc limit 1;»
billsec=$( mysql —user=freepbxuser —password=»$mysqlpass» -N  asteriskcdrdb <<< «$mysqlscript» )

if [[ ${arrv[$ext]} != «No data» ]]

then
arrv[$ext]=`expr ${arrv[$ext]} + $billsec`
else
arrv[$ext]=0
arrv[$ext]=`expr ${arrv[$ext]} + $billsec`
fi

fi

По второму:

#Получаем идентификатор звонка из строки
lid=`expr «$fn» : ‘.*=([0-9]*.[0-9]*)=’`
if [[ -z $lid ]]
then
mysqlscript=»Select billsec from asteriskcdrdb.cdr where calldate>’$dt’ and channel=’$ch’ order by channel desc limit 1;»
else

               mysqlscript=»Select billsec from asteriskcdrdb.cdr where linkedid=’$lid’ order by calldate desc limit 1;»
fi
billsec=$( mysql —user=freepbxuser —password=»$mysqlpass» -N  asteriskcdrdb <<< «$mysqlscript» )
arrv[$ext]=`expr ${arrv[$ext]} + $billsec`

Далее полученный результат необходимо поместить в файл, также как и в версии с полным временем, в цикле сборки:

echo «$ivr_descr, $ext, ${arr[$ivr,$ext]}, $tm» >> temp.csv

Первый способ

Второй способ

Демонстрация и изменения в скрипте

Кейсы внедрения
Asterisk от VoxLink
Узнайте, какие крупные компании уже используют Asterisk в работе.
Скачать
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

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

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

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


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

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

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

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.