artem
04.10.2018
1116

Расписание работы операторов

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

1. Способ интервала времени

2. Способ пошаговой смены операторов

Создавать расписание будем с помощью скриптов на языке bash и php, а так же используя БД MYSQL.

Для работы потребуется установленный Asterisk с установленным модулем ODBC.

Нам необходима форма ввода простого интервала, если мы хотим задать соответствие конкретным дням, для этого будем использовать элементы для веб-страницы date и time:

Дни: <input name=date type=’date’> — <input name=date type=’date’><br />
Время: <input name=time type=’time’ value=00:00> — <input name=time type=’time’ value=00:00><br />

Формы ввода дат и времени

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

echo «<table border=1><tr><td>#</td><td>Номер</td><td>Имя</td></tr>»;
$result = bd_bridge(‘asterisk’,’SELECT id, description FROM devices ORDER BY id ASC;’);
while ($row = mysqli_fetch_array($result)) {
echo «<tr><td><input type=’checkbox’ name=’int_arr[]’ id='».$row[0].»‘></td><td>».$row[0].»</td><td>».$row[1].»</td></tr>»;
}

Помимо этого нам необходимо числовое поле, если мы будем использовать механизм чередования операторов, например два дня работают одни операторы, два дня другие:

Ввод для чередования

echo «<br /><br /><br /><input id=’number’ type=’number’ min=’1′ max=’10’>»;

Для ввода операторов, чередующихся через интервал в днях будем использовать два элемента checkbox:

$result = bd_bridge(‘asterisk’,’SELECT id, description FROM devices ORDER BY id ASC;’);
echo «<table border=1><tr><td>Первые</td><td>Номер</td><td>Имя</td><td>Вторые</td></tr>»;
while ($row = mysqli_fetch_array($result)) {
echo «<tr><td><input type=’checkbox’ name=’int_arr[]’ id='».$row[0].»‘></td><td>».$row[0].»</td><td>».$row[1].»</td><td><input type=’checkbox’ name=’step_arr[]’ id=’st».$row[0].»‘></tr>»;
}

Таблицы с операторами

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

Очередь

Для записи в очередь операторов, создадим файл queues_added.conf и добавим его в файл queue_post_custom.conf:

# include queues_added.conf

А также назначим ему пользователя и группу asterisk:

Chown asterisk. /etc/asterisk/queues_added.conf

В этот файл необходимо будет добавлять очередь и агентов для нее, с помощью (+) либо так же включая отдельные файлы, для удобства можем называть их с использованием номера очереди, например, queues_600.conf.

Поскольку очередей может быть несколько, то мы можем как полностью переписывать файл, так и добавлять несколько файлов и включать их в queues_added.conf

Каждый файл должен принадлежать пользователю Asterisk.

В данном примере остановимся на трех очередях, одна для интервала и две для чередования.

Потому создадим три очереди и три файла: queues_800.conf, queues_801.conf и queues_802.conf

Очереди

Файлы

После добавления файлов можем вносить в них изменения.

Стоит помнить, что в файле обязательно должна быть строка вида [номер очереди](+) для того, чтобы Asterisk добавлял изменения в очередь, в нашем случае операторов, а не менял очередь полностью.

Поскольку направление вызова необходимо задавать, мы будем использовать встроенные средства FreePBX, такие как Custom Destination, а также получать направления из Inbound Routes.

Для удобной маршрутизации вынесем отображение направлений в отдельное окно и каждый вариант маршрутизации (интервалом или поочередно) также в отдельный файл.

<?php
include(‘/usr/Allorien/connectdb.php’);
$result = bd_bridge(‘asterisk’,’SELECT id, extension, description, destination FROM incoming ORDER BY id ASC;’);
echo «<table border=1><tr><td>Номер</td><td>Описание</td><td>Действие</td></tr>»;
while ($row = mysqli_fetch_array($result))
{
$str_inc=str_replace(‘,${EXTEN},1’,»,$row[3]);
echo «<tr><td>».$row[1].»</td><td>».$row[2].»</td>»;
if ( $str_inc==»inbound-interval» ) echo «<td><form action=’interval.php’ method=post><input type=’submit’ name=’interval’ value=’interval’></form></td>»;
if ( $str_inc==»inbound-step» ) echo «<td><form action=’step.php’ method=post><input type=’submit’ name=’step’ value=’step’></form></td>»;
if ( ($str_inc != «inbound-step») and ($str_inc != «inbound-interval») ) echo «<td>».$row[3].»</td>»;
echo «</tr>»;
}
echo «</table>»;
?>

В файлы interval.php и step.php вынесем части описанные выше, чтобы при их выборе мы могли изменить маршрутизацию.

Index.php

Способ интервала времени.

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

При выборе даты и времени с помощью input date, данные приходят в числовом виде, для Asterisk необходимо предоставлять месяц в виде трех первых символов на латинице, с маленькой буквы, то есть нам необходимо менять вид.

Для изменения месяца, используем функцию:

function dates(&$row){
$search = array(’01’,’02’,’03’,’04’,’05’,’06’,’07’,’08’,’09’,’10’,’11’,’12’,);
$replace = array(‘jan’,’feb’,’mar’,’apr’,’may’,’jun’,’jul’,’aug’,’sep’,’oct’,’nov’,’fec’,);
$res=str_replace($search,$replace,$row);
return $res;
}

Из функции получаем текстовое значение месяца, также необходимо внести изменение в формировании checkbox, поскольку для формирования списка агентов очереди нам необходимо и его имя.

<input type=’checkbox’ name=’int_arr[]’ id='».$row[0].»‘ value='».$row[0].»:».$row[1].»‘>

Вывод номер:имя

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

if(isset($_POST[‘interval’]))
{

Получаем дату и время из обоих полей.

Все необходимые для заполнения поля необходимо дополнить свойством required, для обязательного заполнения.

$time1=$_POST[‘time1’];
$time2=$_POST[‘time2’];
$date1=$_POST[‘date1’];
$date2=$_POST[‘date2’];

Также для отладки выведем полученный массив данных:

echo «<pre>».print_r($_POST,true).»</pre>»;

Массив передаваемых значений

Необходимо из даты вырезать месяц и число:

$date1place = explode(‘-‘,$date1);
$date2place = explode(‘-‘,$date2);
$month1 = substr($date1place[1],0,2);
$day1 = substr($date1place[2],0,2);
$month2 = substr($date2place[1],0,2);
$day2 = substr($date2place[2],0,2);

И перевести месяцы в понятный для Asterisk формат:

$month1=dates($month1);
$month2=dates($month2);

После подготовки переменных формируем строку, которую поместим в файл globals_interval.conf, а также начало строки для очереди операторов:

$text=»timedate=$time1-$time2ndaydate=$day1-$day2nmonthdate=$month1-$month2n»;
$textqueue='[800](+)’.»n»;

Файл globals_interval.conf необходимо включить в globals_custom.conf. В данном примере очередь используется одна, в дальнейшем можно расширить функционал выбором из существующих очередей, аналогично выбору операторов.

Открываем цикл по переданному списку операторов и формируем строку для внесения в queues_800.conf

foreach ($_POST[‘int_arr’] as $value){
$num=stristr($value,’:’,true);
$name=str_replace(‘:’,»,stristr($value,’:’));
$textqueue.=’member=Local/’.$num.’@from-queue/n,0,»‘.$name.'»,hint:’.$num.’@ext-local’.»n»;
}

После формирования обе строки помещаем в файлы и применяем настройки:

Файл с параметрами

Файл с агентами очереди

file_put_contents(‘/etc/asterisk/queues_800.conf’, $textqueue);
file_put_contents(‘/etc/asterisk/globals_interval.conf’, $text);
$tofile=`asterisk -rx ‘dialplan reload’ && asterisk -rx ‘queue reload all’`;

Для работы интервала, необходимо отправлять входящие вызовы на Custom Context, в котором используются данные переменные (очередь можно просто использовать).

Входящий маршрут

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

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

Пример работы

Демонстрация

Способ пошаговой смены операторов.

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

Вывод операторов описан выше, также необходимо дополнить именем оператора. И для отладки выводить массив данных, при нажатии кнопки:

<input type=’checkbox’ name=’step_arr1[]’ id=’st1″.$row[0].»‘ value='».$row[0].»:».$row[1].»‘>
echo «<pre>».print_r($_POST,true).»</pre>»;

Полученный массив

Для распределения операторов по группам будем использовать вышеописанные файлы queues_801.conf и queues_802.conf, в которые будем вносить изменения аналогично методу интервала.

Помимо этого, нам необходимо передавать данные как в asterisk, так и в скрипт, который будет отвечать за чередование, сделаем это с помощью файла globals_step.conf

При нажатии кнопки в файл помещаем дату смены очереди, количество дней и маркер для смены очереди:

$nextstep = date(«Y-m-d», mktime(0, 0, 0, date(«m») , date(«d»)+$_POST[‘number’], date(«Y»)));
$textstep=»datestep=».$nextstep.»nstep=».$_POST[‘number’].»nnowqueue=1n»;

Nowqueue – отвечает за то, какая очередь будет использоваться, на эту переменную будем опираться из dialplan.

Далее аналогично интервалу открываем цикл, для внесения записей в файлы очередей.

$textqueue1='[801](+)’;
foreach ($_POST[‘step_arr1’] as $value){
$num=stristr($value,’:’,true);
$name=str_replace(‘:’,»,stristr($value,’:’));
$textqueue1.=’member=Local/’.$num.’@from-queue/n,0,»‘.$name.'»,hint:’.$num.’@ext-local’.»n»;
}
$textqueue2='[802](+)’;
foreach ($_POST[‘step_arr2’] as $value){
//echo $value.»<br>»;
$num=stristr($value,’:’,true);
$name=str_replace(‘:’,»,stristr($value,’:’));
$textqueue2.=’member=Local/’.$num.’@from-queue/n,0,»‘.$name.'»,hint:’.$num.’@ext-local’.»n»;
}

Далее все данные вносим в файлы и применяем изменения:

file_put_contents(‘/etc/asterisk/queues_801.conf’, $textqueue1);
file_put_contents(‘/etc/asterisk/queues_802.conf’, $textqueue2);
file_put_contents(‘/etc/asterisk/globals_step.conf’, $textstep);
$tofile=`asterisk -rx ‘dialplan reload’ && asterisk -rx ‘queue reload all’`;

globals_step.conf

queues_801.conf

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

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

function str_to_arr($str){
$piece=array();
$string=array();
$arr=array();
$j=0;
$string = explode («n»,$str);
for($i=0;$i<count($string);$i++){
$piece=explode(«=»,$string[$i],2);
if (isset($piece[1])){
$arr[trim($piece[0])]=trim($piece[1]);
}
}
return $arr;
}

Получаем текущую дату:

$ndate=`date +%Y-%m-%d`;

И переводим данные из файла в массив:

$strvars = file_get_contents(‘/etc/asterisk/globals_step.conf’);
$arrayvars=str_to_arr($strvars);

Далее сравниваем даты, при совпадении вносим изменения:

if ( $ndate == $arrayvars[‘datestep’] ) {
$nowqueue=$arrayvars[‘nowqueue’]*-1;
$nextdate=date(«Y-m-d», mktime(0, 0, 0, date(«m») , date(«d»)+$arrayvars[‘step’], date(«Y»)));
$nextstep=»datestep=».$nextdate.»nstep=».$arrayvars[‘step’].»nnowqueue=».$nowqueue.»n»;
file_put_contents(‘/etc/asterisk/globals_step.conf’, $nextstep);
}

И проверяем работу (для этого можно на время сменить условие или дату):

Проверка скрипта

И помещаем на выполнение в крон, каждый день в 0:15.

Crontab

После этого нужно настроить входящую маршрутизацию, вызовы направляем на Custom Context, в котором проверяем маркер и в зависимости от его значения направляем на очередь:

Входящий маршрут

Контекст

Простая схема реализована, реализацию схемы с возможностью более тонкой настройки каждый может настроить под себя.

Демонстрация

avatar
  Подписаться  
Уведомление о

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

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

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

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

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

ONLINE

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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.