Счетчик для исходящих звонков

Простая но немаловажная функция подсчета звонков.

Считает все исходящие звонки по клиенту в конкретном поле сделке.

При совершении исходящего звонка, поиск контакта осуществляется стандартной интеграцией.

Кодом запрашиваем сделки этого контакта, если есть несколько сделок берем случайную.

Поле должно быть цифровым при каждом исходящем звонке число увеличивается на 1

Добавить код можно в этап функции

  • Исходящий звонок
const SipuniAmoCrm = require('@sipuni/amocrm');

const LEAD_CLOSED_STATUSES = [142 /*успешная*/, 143 /*неуспешная*/];
const CUSTOM_FIELD_ID = 717345;//id кастомного поля, обязательно должно быть цифровым.

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

module.exports = async (args) => {
    const amoApi = new SipuniAmoCrm({ domain: args.settings.domain, accessToken: args.crm_auth });

    const contactId = parseInt(args.context.contact_id);
    let leadId;
    let updatedLead;
    let cfValue = 1;

    if (args.context.already_created_deal) {
        leadId = args.context.deal_id;
        updatedLead = await amoApi.leads.update({
            id: leadId,
            custom_fields_values: [
                {
                    "field_id": CUSTOM_FIELD_ID,
                    "values": [
                        {
                            "value": cfValue
                        }
                    ]
                }
            ]
        });
    } else {
        const result = await amoApi.contacts.get(`${contactId}?with=leads`);
        if (result) {
            const leads = result._embedded.leads;
            const promises = [];
            for (let leadIndex = 0; leadIndex < leads.length; leadIndex++) {
                promises.push(findOpenLead(amoApi, leads[leadIndex].id));
            }
            const results = await Promise.all(promises);
            if (results) {
                leadId = results[0].id;
                if (results[0].custom_fields_values) {
                    for (let cfIndex = 0; cfIndex < results[0].custom_fields_values.length; cfIndex++) {
                        if (results[0].custom_fields_values[cfIndex].field_id = CUSTOM_FIELD_ID) {
                            cfValue = parseInt(results[0].custom_fields_values[cfIndex].values[0].value) + 1;
                            updatedLead = await amoApi.leads.update({
                                id: leadId,
                                custom_fields_values: [
                                    {
                                        "field_id": CUSTOM_FIELD_ID,
                                        "values": [
                                            {
                                                "value": cfValue
                                            }
                                        ]
                                    }
                                ]
                            });
                        }
                    }
                } else {
                    updatedLead = await amoApi.leads.update({
                        id: leadId,
                        custom_fields_values: [
                            {
                                "field_id": CUSTOM_FIELD_ID,
                                "values": [
                                    {
                                        "value": cfValue
                                    }
                                ]
                            }
                        ]
                    });
                }
            }
        }
    }
    return {
        leadId,
        cfValue
    }
};