Александр Мисюрин
24.06.2019
4254

Постановка и снятие операторов на паузу, массово

В данной статье рассмотрим пару способов постановки операторов на паузу по набору какого либо номера, отличие от стандартного сервисного кода заключается в том, что на паузу операторы будут ставиться массово, в зависимости от заданного списка. Список реализовать можно несколькими способами. Рассмотрим два из них: Список реализуется напрямую из диалплана. К минусам можно отнести то, что […]

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

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

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

Необходимо указывать оператора именно так, как он указан в очереди, иначе постановка/снятие на/с паузы не сработает. При настройке на данный момент используется система с Asterisk 13 & FreePBX  14.
Очереди Asterisk

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

Local/101@from-queue/n

А сам диалплан будет выглядеть следующим образом:

exten => *101*,1,PauseQueueMember(,Local/101@from-queue/n)
same => n,Macro(hangupcall,)
exten => *0101*,1,UnpauseQueueMember(,Local/101@from-queue/n)
same => n,Macro(hangupcall,)
При настройке проверьте, чтобы используемые комбинации не пересекались с используемыми в вашей системе.

Соответственно для каждого нового оператора добавится строка с приложением Pause/Unpause.

Все просто, однако настройка довольно жесткая и если придется вносить изменения для множества операторов, это может занять много времени.

Рассмотрим второй способ:

Операторы в очередях обычно указываются в базе данных mysql (При настройке с помощью FreePBX), кроме динамических агентов, их можно найти только в базе AstDB.

Для начала нам необходимо собирать данные, статических агентов получать будем из mysql базы asterisk, таблицы queues_details. С динамическими агентами все сложнее, помимо того, что они записываются в базу AstDB, они указываются в ней в одну строку для каждой очереди. Потому для корректного отображения необходимо реализовать обработчик.

Получение списка статических операторов:

echo "<form action='' method=post>
<table border=1>
<tr>
	<td colspan=3>Статические агенты:</td>
</tr>
<tr>
	<td>Очередь</td>
	<td>Оператор</td>
	<td>Добавить</td>
</tr>";
//Статические агенты
	$result = bd_bridge('asterisk','select id,data from queues_details where keyword="member";');
	while ($row = mysqli_fetch_array($result)) 
	{
		$row[1]=str_replace(',0','',$row[1]);
		echo "<tr>
		<td>".$row[0]."</td>
		<td>".$row[1]."</td>
		<td><input type='checkbox' name='temp_arr[]' value='$row[0]|$row[1]' id='$row[1]' class='checkbox' /></td>
		</tr>";
	}
	
echo "
<tr>
<td colspan=3>Динамические агенты:</td>
</tr>
";

Получение списка динамических операторов:

//Динамические агенты
$db = new SQLite3('/var/lib/asterisk/astdb.sqlite3');
$resultd = $db->query("SELECT key,value FROM astdb WHERE key like '/Queue/PersistentMembers/%' ORDER BY key");
while ($row = $resultd->fetchArray())
{

	$row[key]=str_replace('/Queue/PersistentMembers/','',$row[key]);
	$arrayvalue=explode('|',$row[value]);
	if (isset($arrayvalue)) {
			foreach ($arrayvalue as $value) {
				$value=substr($value,0,strpos($value,";"));
			echo "<tr>
		<td>".$row[key]."</td>
		<td>".$value."</td>
		<td><input type='checkbox' name='temp_arr[]' value='$row[key]|$value' id='$value' class='checkbox' /></td>
		</tr>";
			}
		} else {
				$row[value]=substr($row[value],0,strpos($row[value],";"));
				echo "<tr>
		<td>".$row[key]."</td>
		<td>".$row[value]."</td>
		<td><input type='checkbox' name='temp_arr[]' value='$row[key]|$row[value]' id='$row[value]' class='checkbox' /></td>
		</tr>";
			}
}
Список формируем с указанием очереди, чтобы иметь возможность поставить оператора на паузу в конкретной очереди.
Сформированный список, с данными отправляемыми POST запросом

Далее нам необходимо заносить выбранные номера в созданную таблицу.

Удаление можно реализовать по аналогии с добавлением, просто опираться на созданную таблицу.

Создадим таблицу в базе asteriskcdrdb:

Create table operators_pause_custom (queue varchar(10) NOT NULL, operator varchar (50) NOT NULL);

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

Delete from operators_pause_custom;

Реализуем обработчик нажатия:

if(isset($_POST['add']))
{
	$requestdelete = mysqli_fetch_array(bd_bridge("asteriskcdrdb","delete from operators_pause_custom;"));
		foreach ($_POST[temp_arr] as $value){
			$array=explode('|',$value);
			echo $array[0]." - ".$array[1]." - Добавлено <br />";
		
		$request = mysqli_fetch_array(bd_bridge("asteriskcdrdb","insert into operators_pause_custom values ('".$array[0]."','".$array[1]."');"));
		}
	}

Функция bd_bridge:

function bd_bridge($db,$q){
                $link = @mysqli_connect('localhost','freepbxuser','freepbxpass',$db) or die("Error: ".@mysqli_connect_error($link));
                $rs = @mysqli_query($link, $q) or die("Error: ".@mysqli_error($link));
                if($rs){
                        //echo "Qwerty complete: $q <br />";
                        return $rs;
                        @mysqli_free_result($rs);
                }
                else{
                        //echo "Qwerty failure: $q <br />";
                }
                mysqli_close($link);
        }
Заполнение таблицы
Демонстрация интерфейса

Таблица заполняется, теперь необходимо реализовать постановку на паузу, для этого будем использовать другой скрипт, можно использовать через agi либо через System.

<?php
include('/usr/src/test/connectdb.php');
$result = bd_bridge('asteriskcdrdb','select queue,operator from operators_pause_custom;');
	
	while ($row = mysqli_fetch_array($result)) 
		{
			echo "queue $argv[1] member $row[1] queue $row[0]\n";
			$toggle=shell_exec("/usr/sbin/asterisk -rx 'queue ".$argv[1]." member ".$row[1]." queue ".$row[0]."'");
		}
?>

Соответственно при выполнении, в скрипт необходимо передавать параметр либо “pause” либо “unpause”.

Диалплан приведем к такому виду:

exten => *101*,1,System(php -f /usr/src/test/pause_toggle.php pause)
same => n,Macro(hangupcall,)
exten => *0101*,1,System(php -f /usr/src/test/pause_toggle.php unpause)
same => n,Macro(hangupcall,)
Демонстрация работы.
Кейсы внедрения
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.