Создание задачи и смена ответственного в сделке на конкретного сотрудника
При пропущенном звонке: Есть контакт найденный стандартной интеграцией.
Далее, кодом реализуем следующее: Проверяем наличие активной сделки и незакрытых задачи с нужным ответственным. обновляем сделку меняя ответственного на конкретного сотрудника. Создаем задачу. Если задача существует повторную не создаем.
const SipuniAmoCrm = require('@sipuni/amocrm');
const AMO_USER_ID = 1910649;//id
const TASK_DUE = 60 * 60 * 2; // 1 час в секундах * количество часов (2)
const LEAD_CLOSED_STATUSES = [142 /*успешная*/, 143 /*неуспешная*/];
// запрос информации о сделке по айди, проверка статуса сделки
async function findOpenLead(api, lead_id) {
const lead = await api.leads.get(lead_id);
if (lead && !LEAD_CLOSED_STATUSES.includes(lead.status_id)) {
return lead_id;
}
return 0;
}
module.exports = async (args) => {
const amoApi = new SipuniAmoCrm({
domain: args.settings.domain, accessToken: args.crm_auth
});
// Если найден/создан контакт при поступлении звонка,
// его ID находится в args.context.contact_id
const contact = await amoApi.request('GET', `/contacts/${args.context.contact_id}`, { 'with': 'leads' });
let lead;
let existing;
let task;
let deal;
const promises = [];
const leads = contact._embedded.leads;
for (let leadIndex = 0; leadIndex < leads.length; leadIndex++) {
promises.push(findOpenLead(amoApi, leads[leadIndex].id));
}
const results = await Promise.all(promises);
for (let rIndex = 0; rIndex < results.length; rIndex++) {
if (results[rIndex]) {
lead = results[rIndex];
break;
}
}
if (lead) {
//обновляем ответственного у сделки
deal = amoApi.leads.update({
id: lead,
responsible_user_id: AMO_USER_ID
});
//есть задачи на эту сделку?
existing = await amoApi.tasks.list({
'filter[responsible_user_id]': AMO_USER_ID,
'filter[is_completed]': 0,
'filter[entity_type]': 'leads',
'filter[entity_id]': lead,
});
if (!existing) {
const timestamp = Math.ceil((new Date()).getTime() / 1000);
task = await amoApi.tasks.create({
entity_id: lead,
entity_type: 'leads',
text: 'Перезвонить',
complete_till: timestamp + TASK_DUE,
responsible_user_id: AMO_USER_ID,
});
}
}
else {
return { reason: 'Нет сделки в контексте звонка' }
}
if (existing) {
return {
contact,
lead,
task: 'задача уже есть'
}
}
else {
return {
contact,
lead,
task
}
}
};