Top.Mail.Ru

Динамические агенты для очередей

Периодически возникает необходимость добавлять и удалять сотрудников из очереди. До сих пор это было возможно сделать только через web интерфейс телефонной станции.

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

  1. Создайте новую очередь с четырехзначным внутренним номером. К примеру 2001. (см. документацию «Очереди вызовов»)
  2. Опишите новое «Приложение диалплан»

statuses_pt1c_5.jpg

  1. Назначьте «Номер для вызова приложения» - 999[0-1]XXXX первые три цифры можете переопределись своей комбинацией
  2. Тип кода - «PHP AGI скрипт»

q_statuses_pt1c_1.jpg

  1. На вкладке «Программный код» вставьте следующее содержимое:
<?php
require_once 'globals.php';
require_once 'phpagi.php';

$agi = new AGI();
$agi->answer();

$extension = $agi->get_variable("CHANNEL(peername)", true);
$q_exten   = substr($agi->request['agi_extension'], 4);
$add_agent = substr($agi->request['agi_extension'], 3, 1);

$agi->noop("$extension $q_exten $add_agent");

$res = Models\Extensions::findFirst("number='{$extension}'");
if(!$res){
    // Ошибка, такого внутреннего номера не существует.
    $agi->hangup();
}
/** @var Models\CallQueues $res */
$res = Models\CallQueues::findFirst("extension='{$q_exten}'");
if(!$res){
    // Ошибка, такой очереди не существует.
    $agi->hangup();
}
/** @var Models\CallQueueMembers $res */
$a_count = Models\CallQueueMembers::maximum([ "queue='{$res->uniqid}'", 'column' => 'priority'] ) + 1;
$member  = Models\CallQueueMembers::findFirst("queue='{$res->uniqid}' AND extension='{$extension}'");

if($add_agent == true && !$member){
    $member = new Models\CallQueueMembers();
    $member->extension  = $extension;
    $member->queue      = $res->uniqid;
    $member->priority   = $a_count;
    $member->save();
    $result = p_Queue::queue_reload();
}

if($add_agent == false && $member){
    $member->delete();
    $result = p_Queue::queue_reload();
}

$linkedid = $agi->get_variable("CDR(linkedid)", true);
$res = Models\CallDetailRecordsTmp::find("linkedid='{$linkedid}'");
foreach ($res as $data){
    $data->delete();
}
sleep(2);
$agi->hangup();
  1. Сохраните приложение
  2. Наберите комбинацию 99912001 чтобы присоединиться к очереди 2001
  3. Наберите комбинацию 99902001 чтобы отключиться от очереди 2001