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

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


faq:interception_4

Перехват на ответственного в панели телефонии 4.0 как в панели 1.0

Обратно к перечню инструкций

По умолчанию функция «Перехват на ответственного» в панели телефонии 4.0 выполняется параллельно основному маршруту на АТС ( см. документацию). Клиент будет слышать голосовое меню и одновременно вызов будет поступать на ответственного сотрудника.

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

  1. Подключитесь к АТС по SSH по инструкции
  2. Выполните:
    mkdir /storage/usbdisk1/mikopbx/custom_modules/Interception;
    touch /storage/usbdisk1/mikopbx/custom_modules/Interception/resp-redirect.php
    chmod +x /storage/usbdisk1/mikopbx/custom_modules/Interception/resp-redirect.php
    cat > /storage/usbdisk1/mikopbx/custom_modules/Interception/resp-redirect.php
    
  3. Вставьте содержимое скрипта:
    #!/usr/bin/env php
    <?php
    /*
    [from-pstn-custom]
    exten => _X!,1,AGI(/usr/src/miko/resp-redirect.php)
    */
    const DURATION = 10;
    if(file_exists('/etc/freepbx.conf')){
        include '/etc/freepbx.conf';
        $agidir = FreePBX::Config()->get('ASTAGIDIR');
        require_once $agidir.'/phpagi.php';
        $agi         = new \AGI();
        $contextIn   = 'ext-local';
        $stateFunc   = "EXTENSION_STATE(\$extension@ext-local)";
    }else {
        require_once 'Globals.php';
        $agi = new MikoPBX\Core\Asterisk\AGI();
        $contextHint = 'internal-hints';
        $stateFunc   = 'DEVICE_STATE(PJSIP/$extension)';
        $contextIn   = 'internal-incoming';
    }
    
    $agi->exec('Ringing', '');
    $agi->set_variable('__DIRECTION', 'INBOUND');
    if(strlen($agi->request['agi_extension']) === 1){
        exit(0);
    }
    $countTry = $agi->get_variable("MIKO_TRY_INTERCEPTION")['data'];
    if($countTry === '1'){
        exit(0);
    }
    $agi->set_variable('MIKO_TRY_INTERCEPTION', '1');
    
    $agi->set_variable('AGIEXITONHANGUP', 'yes');
    $agi->set_variable('AGISIGHUP', 'yes');
    $agi->set_variable('__ENDCALLONANSWER', 'yes');
    $number = $agi->request['agi_callerid'];
    
    try {
        $curl    = curl_init();
        $url     = 'http://127.0.0.1:8224/getcallerid?number='.$number;
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 3);
        $resultRequest = curl_exec($curl);
        $http_code     = (int)curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        $result = json_decode($resultRequest, true);
    }catch (Exception $e){
        $agi->verbose("MIKO: Error receiving the responsible employee...", 1);
        $resultRequest = null;
    }
    if($result){
        $extension = $result['data']['responsible'][0]['extension']??'';
        if(!empty($extension)){
            $state = $agi->get_variable(str_replace('$extension',$extension, $stateFunc))['data'];
            if('NOT_INUSE' !== $state){
                $agi->verbose("MIKO: Extension $extension is '$state', not 'NOT_INUSE'", 1);
                exit(0);
            }
            $agi->set_variable('MIKO_DST', "Local/$extension@$contextIn,".DURATION.",Kt");
            $agi->verbose("MIKO: Try dial $extension ...", 1);
            $agi->exec_dial('Local', "$extension@$contextIn", DURATION, 'Kt');
            $state = $agi->get_variable("DIALSTATUS")['data'];
            if($state === 'ANSWER'){
                $FROM_CHAN = $agi->get_variable("FROM_CHAN")['data']??'';
                if(!empty($FROM_CHAN)){
                    $agi->set_variable('EXPORT('.$FROM_CHAN.',MASTER_CHANNEL(M_DIALSTATUS))', "ANSWER");
                }
                if(file_exists('/etc/freepbx.conf')){
                    $agi->hangup();
                }else{
                    $agi->exec_goto('internal', 'hangup', '1');
                }
            }
        }else{
            $agi->verbose("MIKO: Empty value of \$extension $url", 1);
        }
    }else{
        $agi->verbose("MIKO: Empty response from 1C", 1);
    }
  4. Нажмите дважды CTRL + D для завершения редактирования файла
  5. Перейдите в раздел «Система» - «Кастомизация системных файлов»
  6. Выберите файл «/etc/asterisk/extensions.conf»
  7. Выберите действие «Добавить в конец файла»
  8. Добавьте следующий код:
    [add-trim-prefix-clid-custom]
    exten => _.X!,1,ExecIf($["${EXTEN}" == "h"]?Hangup())
    	same => n,AGI(/storage/usbdisk1/mikopbx/custom_modules/Interception/resp-redirect.php)
    	same => n,return
  9. Проверьте работу функции на входящих звонках

Проверка

Выполните команду:

 curl 'http://127.0.0.1:8224/getcallerid?number=+79257184200' 

Пример корректного ответа:

{
  "result": "Success",
  "data": {
    "number": " 79257184200",
    "number_format": "+7 (925) 718-42-00",
    "client": "Портнов Алексей Владимирович",
    "contact": "",
    "caller_id": "Портнов Алексей",
    "is_employee": true,
    "extension": "204",
    "ref": "e1cib/data/Справочник.Пользователи?ref=842000505694000611e35e52402ca528",
    "responsible": null
  }
}

Обратно к перечню инструкций

faq/interception_4.txt · Последние изменения: 2023/06/06 11:35 — Портнов Алексей