====== Перехват на ответственного в панели телефонии 4.0 как в панели 1.0 ====== [[:faq|Обратно к перечню инструкций]]\\ \\ По умолчанию функция "**Перехват на ответственного**" в панели телефонии 4.0 выполняется параллельно основному маршруту на АТС ([[https://docs.telefon1c.ru/user-guides/panel/call-pickup/ | см. документацию]]). Клиент будет слышать голосовое меню и одновременно вызов будет поступать на ответственного сотрудника. В ряде случаев, необходимо скорректировать это поведение, вызов должен поступать сразу на ответственного сотрудника (см. описание в [[https://blog.telefon1c.ru/pieriekhvat-vyzova-na-otvietstviennogho-mieniedzhiera/ | блоге]]). - Подключитесь к АТС по SSH [[faq:putty|по инструкции]] - Выполните: 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 - Вставьте содержимое скрипта: #!/usr/bin/env php _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); } - Нажмите дважды **CTRL + D** для завершения редактирования файла - Перейдите в раздел "**Система**" - "**Кастомизация системных файлов**" - Выберите файл "**/etc/asterisk/extensions.conf**" - Выберите действие "**Добавить в конец файла**" - Добавьте следующий код: [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 - Проверьте работу функции на входящих звонках ===== Проверка ===== Выполните команду: 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|Обратно к перечню инструкций]]\\ \\