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

Модуль может определять ответственного за клиента сотрудника и переводить звонок на него.\
\
Для автоматического направления входящего звонка на менеджера, ответственного за сущность (контакт/компания/лид) в 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.itgrix.ru/settings/autodistribution.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
