Links

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

По умолчанию при регистрации звонка, 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,
);