Подключение телефонии Sipuni

1. Чтобы подключить телефонию Sipuni к Юздеску, откройте раздел «Каналы» – «API», нажмите «Добавить».

2. Заполните "Название канала" – обязательное поле, которое будет отображаться в общем списке каналов в разделе "Каналы" и при работе с обращениями.

3. Проставьте галочки напротив полей “JSON запрос" и "отправлять в UTF-8" и нажмите "Сохранить".

4. После сохранения канала скопируйте секретный ключ и перенесите созданный канал в отслеживаемые. Нажмите снова "Сохранить".

На стороне Юздеска настройки завершены, переходим в личный кабинет телефонии Sipuni.

ВАЖНО! Интеграция доступна в расширенном тарифе Sipuni.

5. Зайдите в личный кабинет Sipuni > раздел "Интеграции" > Юздеск.

6. В разделе "Авторизация в Usedesk" вставьте сохраненный секретный ключ из п.4 в поле "API-ключ".

7. В разделе "Пользователи" сопоставьте сотрудников, которые будут участвовать в интеграции. Список сотрудников автоматически подтягивается из Юздеска, после сохранения API-ключа.
.

Внутренний номер вы можете создать в разделе "Конструктор" – "Сотрудники".

Тут же вам будет предложено установить расширение или коммуникатор

Если вы устанавливаете расширение, то для входа введите ключ из карточки "Редактирование сотрудника" (пример на предыдущем скрине).



Проверьте еще раз, что все пользователи распределены верно и сохраните настройки конфигурации.


Важно!

Отдел поддержки Sipuni сможет ответить вам по вопросам покупки номера, настройки схем, добавлению сотрудников и т.д. Также некоторые детали по работе телефонии описаны в Базе знаний Sipuni.


а мы продолжим настройку интеграции.

8. Далее нужно настроить сценарий интеграции.

Функции, которые могут могут быть настроены в телефонии:

  • Входящий звонок на внешний номер
  • Входящий звонок на внутренний номер
  • Исходящий звонок
  • Подняли рубку при входящем
  • Пропущен входящий
  • Исходящий не отвечен
  • Завершен входящий разговор
  • Завершен исходящий разговор
  • Вызов CRM

С помощью Функции Sipuni можете воспользоваться уже написанным кодом или написать свой и начать полноценно пользоваться интеграцией.


Пример написанного кода (функции Sipuni) для сценария:

  • Проверка клиента по номеру телефона (если телефона нет, создаётся клиент)
  • Проверка тикета по клиенту (если нет открытого тикета по клиенту – создаем новый)
  • Добавление звонка в тикет с комментарием и ссылкой на запись


Входящий звонок на внешний номер

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Входящий звонок на внешний номер".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:
const SipuniUsedeskApi = require('@sipuni/usedesk');
 
 
<<$1>$1> function findClient(api, phone) {
    const clients = await api.clients.list({
      offset: 0,
      query: phone, // поиск по номеру абонента
      search_type: 'full_match',
    });
    if (clients.length > 0) {
        return clients[0];
    }
    return null;
}
 
<<$1>$1> function createClient(api, phone) {
    const client = await api.clients.create({
      name: phone,
      phone: phone,
    });
    client.id = client.client_id; // добавляем поле id, как у клиента вернувшегося из findClient
    return client;
}
 
<<$1>$1> function findOpenTicket(api, client) {
    const found = await api.tickets.list({
      client_id: client.id,
      fstatus: '1,8', // Запросы со статусами Открыт и Новый
    });
    if (!found.length) {
        return null;
    } else {
        return found[0]; // Берем первый запрос
    }
}
 
<<$1>$1> function createTicket(api, client, phone) {
    const ticket = await api.tickets.create({
      subject: `Входящий звонок от ${phone}`,
      message: 'Входящий запрос',
      client_id: client.id,
    });
    ticket.id = ticket.ticket_id;
    return ticket;
}
 
module.exports = <<$1>$1> (args) => {
    const phone = args.call_args.src_num;
    const token = args.settings.api_key;
    let client = null;
    let isExistingClient = true;
    let ticket = null;
 
    const api = new SipuniUsedeskApi({ token });
 
    // Ищем клиента, создаем если не найден
    client = await findClient(api, phone);
    if (!client) {
        client = await createClient(api, phone);
        isExistingClient = false;
    }
 
    // Ищем открытый или новый запрос, если не найден – создаем
    if (isExistingClient) {
      ticket = await findOpenTicket(api, client);
    }
    if (!ticket) {
        ticket = await createTicket(api, client, phone);
    }
   
    // Возвращаем объект с идентификаторами клиента и запроса,
    // и флаг existing_client - клиент найден или создан
    // Эта информация пригодится в других функциях
    return {
      client_id: client.id,
      ticket_id: ticket.id,
      existing_client: isExistingClient,
    };
};

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.


6. После выполненных действий нажмите "Опубликовать".


Завершен входящий разговор

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Завершен входящий разговор".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:

const SipuniUsedeskApi = require('@sipuni/usedesk');
 
const moment = require('moment');
 
// Возвращает длительность разговора в формате 00:01:34
function getCallDuration(callArgs) {
    // timestamp и call_answer_timestamp приходят как строки, поэтому преобразуем в число
    const conversationStarted = parseInt(callArgs.call_answer_timestamp, 10);
    const conversationEnded = parseInt(callArgs.timestamp, 10);
   
    const seconds = conversationEnded - conversationStarted;
    return moment.utc(seconds * 1000).format('HH:mm:ss');
}
 
<<$1>$1> function createComment(api, ticketId, callArgs) {
    const duration = getCallDuration(callArgs);
    const message = `<a href="">Запись разговора</a> ${duration}`;
    const comment = await api.tickets.createComment({
      ticket_id: ticketId,
      message,
    });
    comment.id = comment.comment_id;
    return comment;
}
 
module.exports = <<$1>$1> (args) => {
    let commentId = null;
    const ticketId = args.context.ticket_id; // получаем id запроса из контекста звонка
   
    if (ticketId) {
        const token = args.settings.api_key;
        const api = new SipuniUsedeskApi({ token });
        const comment = await createComment(api, ticketId, args.call_args);
        commentId = comment.id;
    }
 
    return {
      comment_id: commentId,
    };
};

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.

6. После выполненных действий нажмите "Опубликовать".



Пропущенный входящий

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Пропущенный входящий".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:

const SipuniUsedeskApi = require('@sipuni/usedesk');
const moment = require('moment');
 
<$1 data-verified="redactor"> function createComment(api, ticketId, callArgs) {
    const message = `Пропущен входящий звонок`;
    const comment = await api.tickets.createComment({
      ticket_id: ticketId,
      message,
    });
    comment.id = comment.comment_id;
    return comment;
}
 
module.exports = <$1 data-verified="redactor"> (args) => {
    let commentId = null;
    const ticketId = args.context.ticket_id; // получаем id запроса из контекста звонка
   
    if (ticketId) {
        const token = args.settings.api_key;
        const api = new SipuniUsedeskApi({ token });
        const comment = await createComment(api, ticketId, args.call_args);
        commentId = comment.id;
    }
 
    return {
      comment_id: commentId,
    };
};

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.

6. После выполненных действий нажмите "Опубликовать".


Исходящий звонок

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Исходящий звонок".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:

const SipuniUsedeskApi = require('@sipuni/usedesk');
 
 function findClient(api, phone) {
    const clients = await api.clients.list({
      offset: 0,
      query: phone, // поиск по номеру абонента
      search_type: 'full_match',
    });
    if (clients.length > 0) {
        return clients[0];
    }
    return null;
}
 
 function createClient(api, phone) {
    const client = await api.clients.create({
      name: phone,
      phone: phone,
    });
    client.id = client.client_id; // добавляем поле id, как у клиента вернувшегося из findClient
    return client;
}
 
 function findOpenTicket(api, client) {
    const found = await api.tickets.list({
      client_id: client.id,
      fstatus: '1,8', // Запросы со статусами Открыт и Новый
    });
    if (!found.length) {
        return null;
    } else {
        return found[0]; // Берем первый запрос
    }
}
 
 function createTicket(api, client, phone) {
    const ticket = await api.tickets.create({
      subject: `Исходящий звонок на ${phone}`,
      message: 'Исходящий запрос',
      client_id: client.id,
    });
    ticket.id = ticket.ticket_id;
    return ticket;
}
 
module.exports =  (args) => {
    const phone = args.call_args.dst_num;
    const token = args.settings.api_key;
    let client = null;
    let isExistingClient = true;
    let ticket = null;
 
    const api = new SipuniUsedeskApi({ token });
 
    // Ищем клиента, создаем если не найден
    client = await findClient(api, phone);
    if (!client) {
        client = await createClient(api, phone);
        isExistingClient = false;
    }
 
    // Ищем открытый или новый запрос, если не найден – создаем
    if (isExistingClient) {
      ticket = await findOpenTicket(api, client);
    }
    if (!ticket) {
        ticket = await createTicket(api, client, phone);
    }
   
    // Возвращаем объект с идентификаторами клиента и запроса,
    // и флаг existing_client - клиент найден или создан
    // Эта информация пригодится в других функциях
    return {
      client_id: client.id,
      ticket_id: ticket.id,
      existing_client: isExistingClient,
    };
};
 

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.

6. После выполненных действий нажмите "Опубликовать".


Завершен исходящий разговор

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Завершен исходящий разговор".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:

const SipuniUsedeskApi = require('@sipuni/usedesk');
const moment = require('moment');
 
// Возвращает длительность разговора в формате 00:01:34
function getCallDuration(callArgs) {
    // timestamp и call_answer_timestamp приходят как строки, поэтому преобразуем в число
    const conversationStarted = parseInt(callArgs.call_answer_timestamp, 10);
    const conversationEnded = parseInt(callArgs.timestamp, 10);
   
    const seconds = conversationEnded - conversationStarted;
    return moment.utc(seconds * 1000).format('HH:mm:ss');
}
 
 function createComment(api, ticketId, callArgs) {
    const duration = getCallDuration(callArgs);
    const message = `Запись разговора ${duration}`;
    const comment = await api.tickets.createComment({
      ticket_id: ticketId,
      message,
    });
    comment.id = comment.comment_id;
    return comment;
}
 
module.exports =  (args) => {
    let commentId = null;
    const ticketId = args.context.ticket_id; // получаем id запроса из контекста звонка
   
    if (ticketId) {
        const token = args.settings.api_key;
        const api = new SipuniUsedeskApi({ token });
        const comment = await createComment(api, ticketId, args.call_args);
        commentId = comment.id;
    }
 
    return {
      comment_id: commentId,
    };
};

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.

6. После выполненных действий нажмите "Опубликовать".


Исходящий не отвечен

1. Зайдите в раздел "Настройки" – "Интеграции" и нажмите node.

2. Выберите Usedesk в качестве CRM.

3. Нажмите "Создать функцию" – "Исходящий не отвечен".

4. Перед написанием кода, очистите страницу. Добавьте код ниже:

const SipuniUsedeskApi = require('@sipuni/usedesk');
const moment = require('moment');
 
 function createComment(api, ticketId, callArgs) {
    const message = `Не дозвонились`;
    const comment = await api.tickets.createComment({
      ticket_id: ticketId,
      message,
    });
    comment.id = comment.comment_id;
    return comment;
}
 
module.exports =  (args) => {
    let commentId = null;
    const ticketId = args.context.ticket_id; // получаем id запроса из контекста звонка
   
    if (ticketId) {
        const token = args.settings.api_key;
        const api = new SipuniUsedeskApi({ token });
        const comment = await createComment(api, ticketId, args.call_args);
        commentId = comment.id;
    }
 
    return {
      comment_id: commentId,
    };
};

5. После добавления кода, используйте пробный запуск. Дождитесь в логе "Сохранено" и результата функции.

6. После выполненных действий нажмите "Опубликовать".


Как в Юздеске выглядит настроенный сценарий:

  • Проверка клиента по номеру телефона (если телефона нет, создаётся клиент)
  • Проверка тикета по клиенту (если нет открытого тикета по клиенту – создаем новый)
  • Добавление звонка в тикет с комментарием и ссылкой на запись

– В карточке клиента имя нового клиента будет заполняться номером телефона, вы можете его переименовать при необходимости.

– Тема в карточке запроса будет соответствовать звонку: входящий/ исходящий звонок.

– В карточке запроса будет отображаться время и подпись создания запроса:

  • Исходящий запрос – для исходящих звонков;
  • Входящий запрос – для входящих звонков

– В карточку запроса будет попадать запись о пропущеных входящих звонках.

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

Если вы не дозвонились до клиента, то в карточке запроса записи разговора не будет, только информация об исходящем звонке.

Была ли статья полезна?

Да Нет