Создание задачи в контакт на ответственного за контакт, только если есть активная сделка

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

Поиск контакта осуществляется стандартной интеграцией. Кодом ищем активную сделку. И не закрытые задачи у данного контакта.

const SipuniAmoCrm = require('@sipuni/amocrm');

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


    const contact_responsible_id = parseInt(args.context.contact_responsible_id)

    if (lead) {

        //есть задачи на эту сделку?
        existing = await amoApi.tasks.list({
            'filter[is_completed]': 0,
            'filter[entity_type]': 'contacts',
            'filter[entity_id]': parseInt(args.context.contact_id),
        });
        if (!existing) {
            const timestamp = Math.ceil((new Date()).getTime() / 1000);
            task = await amoApi.tasks.create({
                entity_id: parseInt(args.context.contact_id),
                entity_type: 'contacts',
                text: 'Перезвонить',
                complete_till: timestamp + TASK_DUE,
                responsible_user_id: contact_responsible_id,
            });
        }
    }
    else {
        return { reason: 'Нет сделки в контексте звонка' }
    }


    if (existing) {
        return {
            contact,
            lead,
            task: 'задача уже есть'
        }
    }
    else {
        return {
            contact,
            lead,
            task
        }
    }
};