Инструменты пользователя

Инструменты сайта


faq:queue_dynamic_agents

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

Обратно, к основному разделу...

Актуально для версии 2021.1.38+

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

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

  1. Создайте новую очередь с четырехзначным внутренним номером. К примеру 2001. (см. документацию «Очереди вызовов»)
  2. Опишите новое «Приложение диалплан»
  3. Назначьте «Номер для вызова приложения» - 999XXXXX первые три цифры можете переопределись своей комбинацией
  4. Тип кода - «PHP AGI скрипт»
  5. На вкладке «Программный код» вставьте следующее содержимое:
    <?php
    
    use MikoPBX\Common\Models\CallDetailRecordsTmp;
    use MikoPBX\Common\Models\CallQueueMembers;
    use MikoPBX\Common\Models\CallQueues;
    use MikoPBX\Common\Models\Extensions;
    use MikoPBX\Core\Asterisk\AGI;
    use MikoPBX\Core\Asterisk\Configs\QueueConf;
    
    require_once 'Globals.php';
    
    $agi = new AGI();
    $agi->answer();
    
    $extension = $agi->get_variable("CHANNEL(peername)", true);
    if(empty($extension)){
        $extension = $agi->get_variable("CALLERID(num)", 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 = Extensions::findFirst("number='{$extension}'");
    if(!$res){
        // Ошибка, такого внутреннего номера не существует.
        $agi->hangup();
    }
    $res = CallQueues::findFirst("extension='{$q_exten}'");
    if(!$res){
        // Ошибка, такой очереди не существует.
        $agi->hangup();
    }
    $a_count = CallQueueMembers::maximum([ "queue='{$res->uniqid}'", 'column' => 'priority'] ) + 1;
    $member  = CallQueueMembers::findFirst("queue='{$res->uniqid}' AND extension='{$extension}'");
    
    if($add_agent === '1' && !$member){
        $member = new CallQueueMembers();
        $member->extension  = $extension;
        $member->queue      = $res->uniqid;
        $member->priority   = $a_count;
        $member->save();
        QueueConf::queueReload();
    }
    
    if($add_agent == false && $member){
        $member->delete();
        QueueConf::queueReload();
    }
    
    $linkedid = $agi->get_variable("CDR(linkedid)", true);
    $res = CallDetailRecordsTmp::find("linkedid='{$linkedid}'");
    foreach ($res as $data){
        $data->delete();
    }
    sleep(2);
    $agi->hangup();
  6. Сохраните приложение
  7. Наберите комбинацию 99912001 чтобы присоединиться к очереди 2001
  8. Наберите комбинацию 99902001 чтобы отключиться от очереди 2001

Обратно, к основному разделу...

faq/queue_dynamic_agents.txt · Последние изменения: 2021/02/26 13:15 — apor