> For the complete documentation index, see [llms.txt](https://docs.itgrix.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.itgrix.ru/settings/autodistribution.md).

# Автораспределение звонка на ответственного менеджера

Модуль может определять ответственного за клиента сотрудника и переводить звонок на него.\
\
Для автоматического направления входящего звонка на менеджера, ответственного за сущность (контакт/компания/лид) в CRM, нужно настроить дополнительный контекст, куда направить все звонки на входящем маршруте. Либо можно включить этот контекст в любую точку вашей логики входящего звонка, например после выбора определенного маршрута на IVR.

### Порядок работы

1. Входящий звонок в Asterisk поступает на специальный контекст, в котором вызывается запрос ответственного через модуль.
2. Имея номер телефона клиента, модуль обращается в CRM (Битрикс24 либо amoCRM),\
   CRM возвращает название компании, и внутренний номер ответственного сотрудника. Если не нашел, то ответ будет пустой.
3. Контекст в Asterisk задает имя клиента и перевод на полученный внутренний номер.\
   Если придет пустое значение, то уведет звонок по стандартному маршруту.

Чтобы запрос сработал, в Asterisk должен быть включен CURL.\
Проверить можно так: `$ asterisk -rx 'core show function CURL'` В результате должны получить описание функции `CURL`. Если функция `CURL` отсутствует, то ее нужно установить на сервер Asterisk.

Далее в диалплане создаем кастомный контекст, на который звонок будет приходить ДО голосового приветствия (подходящий кейс – распределить звонок до того, как клиент услышит IVR).

### Настройка контекста в Asterisk

В файле **/etc/asterisk/extensions\_custom.conf** прописываем контекст.\
Пример контекста (*обратите внимание на код – его нужно изменить*):

```
[itgrix-transfer]
exten => _.,1,Noop(Itgrix transfer)
same  => n,Set(CURLOPT(hashcompat)=yes)
same  => n,Set(CURLOPT(httptimeout)=5)
same  => n,Set(CURLOPT(conntimeout)=5)
same  => n,Set(HASH(forwardHash)=${CURL(http://localhost:8077/forward?phone=${CALLERID(num)}&trunk=${EXTEN}&callid=${CHANNEL(linkedid)})})
same  => n,Set(CALLERID(name)=${HASH(forwardHash,name)})
same  => n,GotoIf($[${HASH(forwardHash,number)}]?from-internal,${HASH(forwardHash,number)},1:ivr-1,s,1)
```

где\
`localhost:8077` – IP-адрес и порт сервера, на котором установлен модуль, 8077 – дефолтное значение порта, на котором слушает модуль.\
`ivr-1,s,1` – контекст с IVR, куда уходит вызов в том случае если не удалось найти ответственного в CRM. [Как найти нужный контекст](/settings/autodistribution/default-context.md).\
`CURLOPT(conntimeout)=5` – таймаут 5 сек для выполнения запроса. Если на запрос не будут получен ответ, то звонок уйдет дальше по стандартному маршруту.

**Логика работы:**

1. Через модуль выполняется запрос в CRM с поиском ответственного за сущность по полученному номеру: `http://localhost:8077/forward?phone=${CALLERID(num)}&trunk=${EXTEN}&callid=${CHANNEL(linkedid)}`.\
   В ответ приходит внутренний номер и имя сущности.
2. `HASH(forwardHash)` – разделяет ответ на два параметра – `name` и `number`.
3. Если внутренний номер найдет – звонок переведется на ответственного `GotoIf`.
4. Если номер не найден – звонок пойдет по второму пути (в данном примере `ivr-1,s,1`).

{% hint style="info" %}
В запрос `/forward`также передаются параметры `trunk` и `callid`, которые могут понадобиться для [кастомизации автораспределения](/custom_bx.md#11-customize_autodistribution).
{% endhint %}

{% hint style="success" %}
Проверка выполнения запроса модулем на поиск сущности и внутреннего номера сотрудника, ответственного за нее:\
`curl http://localhost:8077/forward?phone=$81112223334`\
`number=164`\
В ответе видим 164 внутренний номер, который будет передан в диалплан Asterisk. (в примере запроса - тестовый номер)
{% endhint %}

### Включение контекста во FreePBX

Чтобы все заработало, необходимо включить наш кастомный контекст в диалплан FreePBX.\
Для этого воспользуемся модулем Custom Destinations. [Подробнее о Custom Destinations](http://wiki.merionet.ru/ip-telephoniya/19/rabotaem-s-modulem-custom-destinations-v-freepbx-13/).

1. Переходим по пути ***Admin** (Администратор) → **Custom Destinations** (Дополнительные назначения)* и нажимаем **Add Destination**:

![](/files/i4uTIRqPu6WXofNE7PYM)

В поле Target указываем `itgrix-transfer,${EXTEN},1`. Нажимаем **Submit** и **Apply Config**.\
Контекст добавлен.

{% hint style="warning" %}
Важно передать в контекст `${EXTEN}`, чтобы в дальнейшем можно было в запрос `/forward` передать транк (параметр `trunk=${EXTEN}`).
{% endhint %}

2\. Переходим в ***Connectivity** (Подключения) → **Inbound Routes** (Входящая маршрутизация)* выбираем входящий маршрут, для которого настраивается автораспределение, и в блоке **Set Destination** указываем **Custom Destinations** (Дополнительные назначения), выбираем `itgrix-transfer`.

![](/files/5Li0m6T0q8GM4wuCWiVf)

{% hint style="success" %}
Автораспределение настроено. Можно перейти к [тестированию работы](/settings/test.md).
{% endhint %}
