Создание задачи и смена ответственного в сделке на конкретного сотрудника

При пропущенном звонке: Есть контакт найденный стандартной интеграцией.

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

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
        }
    }
};