Страница 1 из 10

Asternic Call Center Stats Lite - модификация.

Добавлено: 28 авг 2017, 13:11
zzz777z
Модификация приложения статистики очереди Asternic Call Center Stats Lite.

Ключевые изменения:
  • Вместо парсинга текстового лога queue_log, используется нативная БД приложения app_queue в MySQL.

    MySQLi, оптимизированы запросы к БД.

    Отдельные таблицы агентов и очередей с синхронизацией по требованию.

    Новые чарты - Google Charts, вместо flash.

    Детализация принятых и пропущенных вызовов с записью разговора.

    Поиск по Uniqueid, CallerID.
Требования - PHP >= 5.4

Посмотреть полное описание и скачать:

https://asterisk-pbx.ru/wiki/soft/call_ ... nter-stats

Будем благодарны за ваши отзывы и конструктивную критику.

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 10:19
zzz777z
Веб интерфейс статистики Asterisk Call Center Stats lite хорошо служил нам в течении уже 10 лет, но имея ряд существенных недостатков, явно нуждался в обновлении.
За годы использования интерфейс был немного переработан нами, учитывая пожелания клиентов.
Эту версию я и хочу вам предложить.
Далее я, постепенно, выложу скриншоты с краткими пояснениями по делу.
Если вы пользовались Asternic Lite, вы знаете, что данные брались из текстового лога очереди и парсились в БД по расписанию.
Учитывая, что Asterisk сам имеет возможность писать логи очереди в БД, это был явно лишний костыль.
Поэтому это первое, что было переделано.
В данной версии все SQL запросы переписаны под оригинальную БД лога очереди Asterisk.
Главная страница.

В оригинальном Asternic Lite, при открытии главной страницы, производится выборка уникальных агентов и очередей по всей БД.
Если данных много, этот процесс может занимать довольно продолжительное время.
Чтобы избежать этого, агенты и очереди были вынесены в отдельную таблицу с возможностью синхронизации по требованию.
Добавлена, также, почасовая выборка.
Изображение

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 11:34
zzz777z
Принятые вызовы
Ключевая страница отчетов, с прекрасной таблицей статистики по агентам.
При открытии страницы answered.php в оригинальной версии производилось аж 5 sql запросов, что негативно сказывалось на быстродействии.
В нашей версии все базируется на одном sql запросе, что выгодно сказывается при больших объемах данных в БД.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: SQL Query

Код: Выделить всё

SELECT time, queuename, agent, event, data1, data2, data3 FROM $DBTable
WHERE time >= '$start' AND time <= '$end' AND event IN ('COMPLETECALLER', 'COMPLETEAGENT')
AND queuename IN ($queue) AND agent in ($agent)
Flash чарты в оригинальной версии прекрасно работали, но код в swf никак не контролировался и учитывая тот факт, что даже в основном коде были, пусть и безобидные, но закладки, вызывали сильное подозрение.
В данной версии использованы Google Charts.
Изображение
Из скриншота видно, что немного непонятный отчет "Уровень обслуживания" был заменен на отчет "Распределение по периодам ожидания".
Диапазоны легко изменить в коде:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Распределение принятых вызовов по периодам ожидания перед ответом

Код: Выделить всё

if ($row[4]<=15) {
 $hold15["$row[1]"] += count($row[4]);
 } elseif (($row[4] >= 16)&&($row[4] <= 30)) {
 $hold30["$row[1]"] += count($row[4]);
 } elseif (($row[4] >= 31)&&($row[4] <= 45)) {
 $hold45["$row[1]"] += count($row[4]);
 } elseif (($row[4] >= 46)&&($row[4] <= 60)) {
 $hold60["$row[1]"] += count($row[4]);
 } elseif (($row[4] >= 61)&&($row[4] <= 75)) {
 $hold75["$row[1]"] += count($row[4]);
 } elseif (($row[4] >= 76)&&($row[4] <= 90)) {
 $hold90["$row[1]"] += count($row[4]);
 } elseif ($row[4] >= 91) {
 $hold91["$row[1]"] += count($row[4]);
 }
Отчет "Отвеченные вызовы по очередям" тоже был изменен, были добавлены периоды распределения по длительности вызова.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: Распределение продолжительности вызовов по периодам

Код: Выделить всё

if ($row[5]<=5) {
 $dur5["$row[1]"] += count($row[5]);
 } elseif (($row[5] >= 6)&&($row[5] <= 10)) {
 $dur10["$row[1]"] += count($row[5]);
 } elseif (($row[5] >= 11)&&($row[5] <= 15)) {
 $dur15["$row[1]"] += count($row[5]);
 } elseif (($row[5] >= 16)&&($row[5] <= 20)) {
 $dur20["$row[1]"] += count($row[5]);
 } elseif (($row[5] >= 21)&&($row[5] <= 25)) {
 $dur25["$row[1]"] += count($row[5]);
 } 
Отчет "Причина разъединения" в виде чарта:

Изображение

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 11:49
april22
Ещё все бы это работало бы без инет.

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 12:02
zzz777z
В теории можно указать библиотеки Google Charts локально, но у меня возникали проблемы в такой конфигурации.
вместо:

Код: Выделить всё

    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
сделать так:

Код: Выделить всё

    <script type="text/javascript" src="js/loader.js"></script>
    <script type="text/javascript" src="js/jsapi"></script>

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 13:26
zzz777z
Отчет Принятые вызовы по сути детализация входящих вызовов очереди, то чего сильно не хватало в Asternic Lite.

Chrome
Изображение

Присутствует поиск/фильтрация по Агенту и CallerID (ищет по любой части номера).
Изначально использовалась паджинация, но потом отказались от нее в пользу выбора кол-ва отображаемых строк.

Для воспроизведения записей используется HTML 5 audio.
Вид плеера отличается в зависимости от используемого браузера (в Opera не работает):

Воспроизведение записи
Разберем простейший случай, когда все записи хранятся в одной директории, формат имени - uniqueid.mp3.

Страница answered_cdr.php содержит следующий код:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:

Код: Выделить всё

if ( ($row['event'] == "COMPLETEAGENT") || ($row['event'] == "COMPLETECALLER") ) {
        $page_rows2 += count($row['event']);
	    $tmpError =  $row['callid'] ;
	    $tmpRec = '<audio controls preload="none">
	           <source src="dl.php?f=[_file]">
			   </audio>
			   <a href="dl.php?f=[_file]">' . $row['callid'] . '</a>';
	
	    $rec['filename'] = $row['callid'] . '.mp3';	
	    $rec['path'] = '/home/asterisk/monitor/mp3/'.$rec['filename'];
	
	if (file_exists($rec['path']) && preg_match('/(.*)\.mp3$/i', $rec['filename'])) {
		$tmpRes = str_replace('[_file]', base64_encode($rec['filename']), $tmpRec);
	} else { 
		$tmpRes = $tmpError; 
    }
echo "<TR><TD>" . date('Y-m-d H:i:s', $time) . "</TD>
		  <TD>" . $callerid . "</TD>
	      <TD>" . $row['queuename'] . "</TD>
	      <TD>" . $row['agent'] . "</TD>
	      <TD>" . $cause_hangup . "</TD>
	      <TD>" . $holdtime . "</TD>
	      <TD>" . $calltime . "</TD>
	      <TD>" . $tmpRes. "</TD>
	      </TR>\n";
		$linea_pdf = array($time,$callerid,$row['queuename'],$row['agent'],$cause_hangup,$holdtime,$calltime);
        $data_pdf[]=$linea_pdf;
   }
где строки:

Код: Выделить всё

	    $rec['filename'] = $row['callid'] . '.mp3';	
	    $rec['path'] = '/home/asterisk/monitor/mp3/'.$rec['filename'];
указывают на директорию и расширение файла.

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 15:59
zzz777z
Пропущенные вызовы
Старые добрые пропущенные вызовы, добавлен отчет по периодам и детализация.

Изображение

https://asterisk-pbx.ru/wiki/_media/sof ... wered1.png
https://asterisk-pbx.ru/wiki/_media/sof ... ed-cdr.png

Создание кастомизированного отчета

Предположим, перед попаданием в очередь, вызов помещается в IVR.
Вызовы покинувшие IVR не будут зафиксированы в логе очереди, но мы можем добавить их туда.
При помощи приложения Queuelog, добавим в лог очереди событие IVR_ABANDON для вызовов покинувших контекcт [ivr-bla-bla-bla] положив трубку:
extensions_custom.conf

Код: Выделить всё

[ivr-bla-bla-bla]
...
exten => h,1,queuelog(NONE,${UNIQUEID},NONE,IVR_ABANDON,${CALLERID(num)},${DID},${CDR(billsec)})
exten => h,n,hangup
где ${DID} - переменная содержащая вызываемый номер.

Добавим отчет в наше приложение:
Сделаем выборку по событию IVR_ABANDON

Код: Выделить всё

$sql = "SELECT * FROM $DBTable 
WHERE time >= '$start' AND time <= '$end' 
AND event IN ('IVR_ABANDON')";

$resivrabandon = mysqli_query($connection, $sql);
И добавим таблицу:

Код: Выделить всё

<table>
	<thead>
       <tr> 
			<th><?php echo $lang["$language"]['time']?></th>
			<th><?php echo $lang["$language"]['callerid']?></th>
			<th><?php echo $lang["$language"]['did']?></th>										
			<th><?php echo $lang["$language"]['holdtime']?></th>
			<th><?php echo $lang["$language"]['callid']?></th>
       </tr>
	</thead>
	<tbody>

foreach($resivrabandon as $row){
 $ivrabandon = explode(",", $row['data1']);
 $time = explode(".", $row['time']);

         echo "<tr><td>" . $time['0'] . "</td>
	      <td>" . $ivrabandon[0] . "</td>
	      <td>" . $ivrabandon[1] . "</td>	      
	      <td>" . gmdate('i:s', $ivrabandon[2]) . "</td>
	      <td>" . $row['callid'] . "</td>
	      </tr>\n";
}
$resivrabandon->free();
                </tbody>
	       </table>
Изображение

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

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 29 авг 2017, 17:05
april22
Круто. Но допилите до состояния "без нтернета" и я буду готов вам пожертвовать на развитие.

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 30 авг 2017, 07:32
virus_net
zzz777z писал(а):В теории можно указать библиотеки Google Charts локально, но у меня возникали проблемы в такой конфигурации.
Посмотрите в сторону Highcharts

Re: Asternic Call Center Stats Lite - модификация.

Добавлено: 30 авг 2017, 15:12
partonen
Коллективу asterisk-pbx.ru выражаем свои благодарности за проделанную работу, протестировали данный модуль все работает, будем использовать в своей работе.