3itech

Общая информация

Примечание

Интеграция с данным сервисом работает в связке с другими интеграциями.

Сервис 3itech берет необходимые файлы прослушки, cdr-записи и прочее, и забирает оттуда указанные переменные для работы с ними.

../_images/3itech.png

Чтобы успешно использовать интеграцию необходимо уметь самостоятельно настраивать шаблон на Jinja2, который превращает данные звонка в итоговый TXT/XML/JSON файл для выгрузки в 3iTech.

Выберите способ доставки файлов. Задайте минимальное время биллинга для отправки. Выберите когда производить отправку и статус.

Укажите хост, порт и путь до размещения файлов на сервере, а также имя пользователя и и пароль для передачи. Нажмите кнопку для изменения пароля, если нужно добавить новый.

Ниже с помощью кнопки можно добавить условия фильтрации. Нажмите кнопку для удаления условия, если оно не нужно.

Затем заполните шаблон метаданнах в удобном формате (TXT, XML, JSON) с сопоставлением тех полей, которые Вам необходимо передавать.

После настройки интеграции нажмите кнопку для сохранения данных. Кнопка удаляет интеграци. Кнопка сбрасывает все введенные изменения и переводит на основную страницу раздела.

Доступные данные в шаблоне

CDR (основные данные звонка)

cdr.uniqueid

UUID звонка

cdr.dt_iso

Дата/время начала в ISO

cdr.link

Ссылка на запись

cdr.src / cdr.dst

Стороны вызова

cdr.direction

Направление

cdr.duration

Длительность

cdr.billsec

Разговор

cdr.hangup_initiator

Инициатор завершения

cdr.user_vars

Пользовательские переменные

cdr.dpe_vars

Переменные обработчиков

cdr.ig_call_session_data

Данные межинтеграционного контекста (если есть)

Прочие верхнеуровневые переменные

talks

Список участников (агенты/клиент) с временными интервалами

holds

Список удержаний

related

Список связанных вызовов

extra_data

Внешние данные, переданные в интеграцию

domain_user_id, user_id, user_uid, user_full_name

Данные оператора

client_phone_number

Номер клиента

startDate, endDate, startRecordDate

Временные маркеры

operatorChannel

Канал оператора в логике интеграции

hangup_initiator

Строковое значение для шаблона (Agent/Client)

Пример базового XML-шаблона

<?xml version="1.0" encoding="UTF-8"?>
<analysisTask cc-task="{{ cdr.uniqueid }}">
  <timestamp>{{ cdr.dt_iso }}</timestamp>
  <filename>{{ cdr.link }}</filename>

  <talks>
    {% for talk in talks %}
      {% if talk.type == "a" %}
      <talk
        channel="{{ talk.channel }}"
        ccAgentID="{{ talk.phone_number }}"
        on="{{ talk.on }}"
        off="{{ talk.off }}"
        type="a"
        name="{{ talk.name|default('')|e }}"
        login="{{ talk.login|default('')|e }}">

        {% for hold in holds %}
          {% if hold.on >= talk.on and hold.on <= talk.off and hold.uid == talk.phone_number %}
          <hold on="{{ hold.on }}" off="{{ hold.off }}"/>
          {% endif %}
        {% endfor %}

        {% for rel in related %}
          {% if rel.on >= talk.on and rel.on <= talk.off and rel.src == talk.phone_number %}
          <relate on="{{ rel.on }}" off="{{ rel.off }}"/>
          {% endif %}
        {% endfor %}
      </talk>
      {% else %}
      <talk
        channel="{{ talk.channel }}"
        ccAgentID="{{ talk.phone_number }}"
        on="{{ talk.on }}"
        off="{{ talk.off }}"
        type="c" />
      {% endif %}
    {% endfor %}
  </talks>

  <metadata
    recs="{{ cdr.duration }}"
    bils="{{ cdr.billsec }}"
    direction="{{ cdr.direction }}"
    disconnect="{{ cdr.hangup_initiator }}" />
</analysisTask>

Безопасный стиль шаблонов

Рекомендуется использовать:

  • |default(„“) для необязательных полей;

  • |e для строк, которые могут содержать спецсимволы;

  • проверку массивов перед доступом по индексу;

  • явное разделение логики для inbound и outbound, если формат 3iTech требует разного тайминга.

Пример безопасной проверки CRM-данных:

{% if cdr.get("ig_call_session_data", [])|length > 0
      and cdr.ig_call_session_data[0].data.main_crm_entity is not none %}
  client_id="{{ cdr.ig_call_session_data[0].data.main_crm_entity.extra_data.NrbClientSiteCode|default('') }}"
  client_name="{{ cdr.ig_call_session_data[0].data.main_crm_entity.name|default('')|e }}"
{% endif %}

Частые ошибки при рисовании шаблонов

  • Ошибка синтаксиса Jinja ({% if %}, {% for %}, {% endif %} не закрыты).

  • Доступ к отсутствующему полю без default.

  • Несоответствие логики related: ожидание, что это «время агента», а не связанного вызова.

  • Жесткая привязка к одному направлению звонка без ветки if cdr.direction.

  • Невалидный XML из-за неэкранированных символов.

Как проверять перед запуском в прод

Минимальный чеклист:

  • 1 входящий и 1 исходящий звонок проверены;

  • есть кейс с удержанием (hold) и кейс без удержания;

  • есть кейс со связанным вызовом (relate) и без него;

  • итоговый файл проходит XML/JSON валидацию;

  • 3iTech принимает файл без ошибок.

Полезные шаблонные фрагменты

Пустое значение вместо None

{{ talk.department|default('') }}

Условный атрибут

{% if talk.login %}
login="{{ talk.login|e }}"
{% endif %}

Фильтрация элементов по диапазону времени

{% if item.on >= talk.on and item.on <= talk.off %}
...
{% endif %}

Рекомендации по сопровождению

  • Версионируйте шаблоны (храните копии с датой изменения).

  • Изменяйте по одному блоку и проверяйте на тестовых звонках.

  • Если меняете логику relate, согласуйте с аналитиками 3iTech ожидаемую семантику.

  • Для сложных шаблонов держите отдельный «эталонный» пример входящего и исходящего XML.