Владислав Авдеев
24.06.2019
1756

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

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

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

  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,)
Демонстрация работы.
 
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