Задача

  • Сделать интеграцию звонков с Bitrix24 всех агентов состоящих в очереди Asterisk.
  • Максимальная интеграция с FreePBX.

Решение

За основу берем статью Оценка работы оператора FreePBX+Asterisk. Здесь мы при входящем звонке запускаем скрипт, который мониторит все события по созданному каналу. По этом же принципу мы и будем делать интеграцию с Bitrix24.

Для начала нужно создать блок-схему процесса разговора по телефону Агента (оператора) очереди. Для входящих звонков у нас следующая схема:

Входящий звонок

Для исходящих звонков схема следующая:

Исходящий звонок

Создаем дополнительный контекст:
nano /etc/asterisk/extensions_custom.conf
добавляем строки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[bitrix-call-in]
exten => s,1,Set(__BitrixCallId=${SHELL(php /var/www/bitrix/bitrix_call.php inCallReg ${CALLERID(num)})}) ; запускаем скрипт, который регистрирует звонок в Bitrix24, и присваивает значение CALLID переменной BitrixCallId
exten => s,n,Set(VQ_OPTIONS=tc) ; хочу оценивать операторов (описано в статье https://adminblog.net.ua/asterisk/ocenka-raboty-operatora-freepbxasterisk.html)
exten => s,n,System(php /var/www/bitrix/bitrix_call.php incall ${UNIQUEID} ${CALLERID(num)} ${CHANNEL} ${BitrixCallId} &) ; запускаем фоновый скрипт слежения за звонком
exten => s,n,Wait(1) ; ждем 1 секунду (на выполнения запросов показ\скрытие окна звонка и прочего в Битрикс24 — нужно время)
exten => s,n,Return ; выходим с контекста
 
[queue-call-end]
exten => s,1,GotoIf($[${QUEUESTATUS}=TIMEOUT]?timeout:answered); очередь по завершению получает переменную QUEUESTATUS, от значения которого мы можем определить был ли принят звонок
exten => s,n(timeout),Goto(app-announcement-18,s,1) ; если звонок не был принят, направим звонок на app-announcement-18,s,1 (это приветствие), в котором говорим что сейчас все операторы заняты и мы перезвоним ему. После, терминируем звонок (hangup) - обязательно.
exten => s,n(answered),Noop(return to queue-call-end) ; если статус звонка отличается от "TIMEOUT", сделаем вывод, что звонок состоялся, и переходим на следующий приоритет
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван
 
[assessment-1]
exten => s,1,Set(__OcenkaOper=1) ;выполняем необходимое действие
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван
 
[assessment-2]
exten => s,1,Set(__OcenkaOper=2) ;выполняем необходимое действие
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван
 
[assessment-3]
exten => s,1,Set(__OcenkaOper=3) ;выполняем необходимое действие
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван
 
[assessment-4]
exten => s,1,Set(__OcenkaOper=4) ;выполняем необходимое действие
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван
 
[assessment-5]
exten => s,1,Set(__OcenkaOper=5) ;выполняем необходимое действие
exten => s,n,Return ;возвращаемся на предыдущий контекст, откуда был вызван

Сохраняем изменения в файле /etc/asterisk/extensions_custom.conf и выходим с редактора nano — Ctrl+O, Ctrl+X.

В FreePBX добавляем новые «Дополнительные назначение».

Заходим в FreePBX → АДМИНИСТРАТОР (Admin) → Дополнительные назначения (Custom Destination) → Добавить специальное назначение (Add Custom Destination):

bitrix-call-in

  • в поле Спецназначение: указываем bitrix-call-in,s,1
  • в поле Описание: указываем bitrix-call-in — название понятное Вам
  • в поле Примечания: указываем описание для назначения понятное Вам
  • Обязательно ставим галочку «Return», после чего появится выпадающий список дальнейших назначений — направляем в очередь (можно в другое место).

queue-call-end

  • в поле Спецназначение: указываем queue-call-end,s,1
  • в поле Описание: указываем queue-call-end — название понятное Вам
  • в поле Примечания: указываем описание для назначения понятное Вам
  • Обязательно ставим галочку «Return», после чего появится выпадающий список дальнейших назначений — направляем на IVR «Оцените работу оператора».

assessment-1

  • в поле Спецназначение: указываем assessment-1,s,1
  • в поле Описание: указываем ocenka_operatoru_1 — название понятное Вам
  • в поле Примечания: указываем описание для назначения понятное Вам
  • Return: Приветствие → «Спасибо за оценку» → Терминовать звонок (Положить трубку).

assessment-2

  • в поле Спецназначение: указываем assessment-2,s,1
  • в поле Описание: указываем ocenka_operatoru_2 — название понятное Вам
  • в поле Примечания: указываем описание для назначения понятное Вам
  • Return: Приветствие → «Спасибо за оценку» → Терминовать звонок (Положить трубку).

Остальные assessment-X по аналогии…

Настройка Очереди:

  • Все настройки делаем на свое усмотрение.
  • В «Назначение при не ответе», устанавливаем «Дополнительные назначения» → «queue-call-end»

Настройка IVR «Оцените работу оператора»:


Для исходящих звонков добавим только две строки в файл «/etc/asterisk/extensions_override_freepbx.conf»
nano /etc/asterisk/extensions_override_freepbx.conf

1
2
[ext-findmefollow]
exten => _0XXXXXXXXX,n(begin),System(php /var/www/bitrix/bitrix_call.php outcall ${CALLERID(num)} ${CHANNEL(LINKEDID)} ${EXTEN} &)

Сохраняем изменения в файле /etc/asterisk/extensions_override_freepbx.conf и выходим с редактора nano — Ctrl+O, Ctrl+X.
Применяем настройки. В терминале сервера можно выполнить
asterisk -rx "dialplan reload"
Что у нас получается на этот момент:
Поступает звонок. Первым делом — направляем его на «Дополнительные назначения» → «bitrix-call-in», где присваиваем переменной BitrixCallId результат запроса на портал Bitrix24 на регистрацию звонка, также присваиваем переменной VQ_OPTIONS значение «tc» (параметр c — продолжение выполнения диалплана после того, как оператор положил трубку). Далее звонок поступает в очередь, где генерируются вызовы агентам (операторам). Оператор поднял трубку → разговор → положил трубку (или не поднял трубку). Звонок попадает в «Назначение при не ответе» → «Дополнительные назначения» → «queue-call-end», где мы проверяем был ли отвечен звонок. Если звонок не был принят (TIMEOUT), направляем его на Приветствие app-announcement-18 (у Вас будет другое, ищите в nano /etc/asterisk/extensions_additional.conf).Если статус звонка (QUEUESTATUS) отличается от «TIMEOUT», продолжаем выполнение диалплана, где попадаем в Return Дополнительного назначения «queue-call-begin» → IVR «Оцените работу оператора». Здесь мы озвучиваем запись «Поставьте оценку от 1-го до 5-ти», ждем ввода. Если клиент ничего не ввел, либо ввел неверно, Терминируем звонок (Положить трубку). Если нажал одну с оценок, переходим в «Дополнительные назначение» → «assessment-X», где присваиваем переменной OcenkaOper определенное значение, и возвращаемся в поле Return Дополнительного назначения «assessment-X» → Приветствие «Спасибо за оценку». Приветствие «Спасибо за оценку» воспроизводит запись о благодарности за оценку и Терминирует звонок (Положить трубку).

Посмотреть логи прохождения звонка можно командой asterisk -rvvvv