# Добавление звонка в несколько сущностей

По умолчанию при регистрации звонка, amoCRM записывает его **только в одну сущность** (контакте/компании/сделке)**,** которую определяет [по своему алгоритму](https://www.amocrm.ru/developers/content/crm_platform/calls-api).

Задача от клиента: в базе CRM на один номер телефона было сохранено несколько контактов с разными ответственными. Нужно сохранить звонок во все сущности с таким номером.

Звонок в сущности отображается как **"примечание** **о звонке"** в списке событий:

![](/files/6DPDJSfPvxcx5KukmrYS)

На данный момент в amoCRM звонок фигурирует только в виде "примечания о звонке" в карточке сущности (контакта/компании/сделки).\
Поэтому можно вместо регистрации звонка через [API-метод calls](https://www.amocrm.ru/developers/content/crm_platform/calls-api) добавить примечание о звонке с помощью [API-метода notes](http://web.archive.org/web/20210623091710/https://www.amocrm.com/developers/content/api/notes/). Таким образом, чтобы добавить звонок в несколько сущностей, нужно добавить одинаковые примечания о звонке.

Для этого нужно в кастомизации [process\_call\_params](/custom_amo.md#2-process_call_params) воспользоваться функцией `Amo::addNoteToEntities`, которая уже присутствует в поставке модуля (файл `/opt/itgrix_amo/customizer/lib/crm.php`).

{% hint style="warning" %}
При добавлении примечания о звонке в несколько сущностей нужно НЕ регистрировать звонок стандартным методом, чтобы избежать дублирования примечания в одной из сущностей.

Для этого в текущей версии модуля нужно "сломать" регистрацию, вернув из кастомизации пустые параметры (см. пример).
{% endhint %}

### Пример

Пример кода для добавления примечания о звонке во все контакты с данным телефоном (файл `/opt/itgrix_amo/customizer/actions/process_call_params.php`):

```php
//
// Подготовка данных примечания о звонке
//
$callInfo = array(
    'responsible_user_id' => $params['responsible_user_id'],
    'created_by'          => $params['created_by'],
    'params' => array(
        'UNIQ' => $params['call']['id'],
        'LINK' => Utils::makeRecordingUrl(
            $params['call']['id'],
            $params['call']['from'],
            $params['call']['to']),
        'DURATION' => $params['duration'],
        'SRC' => 'Itgrix',
        'call_status' => $params['call_status'],
        'call_result' => $params['call_result'],
    ),
    'created_at' => date_create($params['call']['end_time'])->getTimestamp(),
);
if ($params['direction'] === 'inbound') {
    $callInfo['note_type'] = 10; // входящий
    $callInfo['params']['PHONE'] = $params['call']['from'];
} else if ($params['direction'] === 'outbound') {
    $callInfo['note_type'] = 11; // исходящий
    $callInfo['params']['PHONE'] = $params['call']['to'];
}
$this->logDebug("call info: ".json_encode($callInfo));

//
// Добавляем примечания о звонках в контакты с данным телефоном
//
$phone = $callInfo['params']['PHONE'];
$contacts = Amo::getContactsList(array(
    'query' => $phone,
    'limit' => 250,
));
if ($contacts === false) {
    return array(
        'state' => 'error',
        'data'  => "Failed to get contacts with phone '$phone'",
    );
} else if (empty($contacts)) {
    $this->logDebug('No contacts. Do nothing, return original params');
    return array(
        'state' => 'success',
        'data'  => $params,
    );
}

$contactIds = array();
foreach ($contacts['_embedded']['items'] as $contact) {
    array_push($contactIds, $contact['id']);
}
$this->logDebug(sprintf("Found contacts with phone '%s': %s", $phone, json_encode($contactIds)));
$res = Amo::addNoteToEntities($callInfo, 'contact', $contactIds);
if ($res === false) {
    return array(
        'state' => 'error',
        'data'  => "Failed to add notes to contacts",
    );
}

//
// Ломаем регистрацию звонка во избежание дублирования примечаний о звонке в сущностях
//
$this->logDebug('Return EMPTY params to avoid duplicate call notes (breaks AddCall)');
$params = array();
return array(
    'state' => 'success',
    'data'  => $params,
);

```


---

# 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/custom_amo/dobavlenie-zvonka-v-neskolko-sushnostei.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.
