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

По умолчанию при регистрации звонка, amoCRM записывает его только в одну сущность (контакте/компании/сделке), которую определяет по своему алгоритму.

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

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

На данный момент в amoCRM звонок фигурирует только в виде "примечания о звонке" в карточке сущности (контакта/компании/сделки). Поэтому можно вместо регистрации звонка через API-метод calls добавить примечание о звонке с помощью API-метода notes. Таким образом, чтобы добавить звонок в несколько сущностей, нужно добавить одинаковые примечания о звонке.

Для этого нужно в кастомизации process_call_params воспользоваться функцией Amo::addNoteToEntities, которая уже присутствует в поставке модуля (файл /opt/itgrix_amo/customizer/lib/crm.php).

При добавлении примечания о звонке в несколько сущностей нужно НЕ регистрировать звонок стандартным методом, чтобы избежать дублирования примечания в одной из сущностей.

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

Пример

Пример кода для добавления примечания о звонке во все контакты с данным телефоном (файл /opt/itgrix_amo/customizer/actions/process_call_params.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,
);

Last updated