Задача

  • Сделать интеграцию звонков с 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} &)