Общие характеристики процедур
Каждая процедура принимает на вход 3 аргумента:
· $1 timestamp without time zone - начало периода выборки данных
· $2 timestamp without time zone - окончание периода выборки данных
· $3 integer - длительность интервала агрегации в минутах (в некоторых процедурах не используется, но для унификации запроса оставили)
Каждая процедура возвращает таблицу данных. Значения в таблице не могут быть пустыми (null), если в описании обратное не указано явно. Каждый столбец, обозначающий длительность, возвращает длительность в виде целого числа (количество секунд), если в описании обратное не указано явно. Значение каждого столбца, обозначающего длительность, не должно превышать количество секунд в интервале агрегации (например, в интервал с 10:00 до 10:15 оператор не может быть в состоянии "недоступен" более 900 секунд).
Порядок столбцов таблицы фиксированный.
Для процедур tffe* и tffc* определены 5 дополнительных столбцов (optional_column_[1-5]). По спецификации Teleopti, в них могут быть добавлены опциональные данные по согласованию с заказчиком. На текущий момент таких данных нет, все подобные столбцы возвращают null.
tffv_agent_statistics
Процедура возвращает статистику по состояниям операторов и количеству голосовых вызовов операторов.
Выходные данные
Имя столбца
| Тип данных
| Описание
| Описание из спецификации Teleopti
|
interval_
| integer
| Длительность интервала агрегации в минутах (просто выводится значение аргумента $3).
| Integer for aggregation depth (in minutes), should be the same for all the rows in the file. Preferable 15 minutes.
|
date_from
| char(8)
| Дата YYYYMMDD.
| Logging date
|
time_
| char(5)
| Время HH24:MI. Начало интервала агрегации.
| Start time for the logging interval
|
agent_id
| text
| Логин оператора (mv_employee.login).
| Unique agent identifier in CTI
|
agent_name
| text
| ФИО оператора (mv_employee.title).
| Agent name in CTI
|
avail_dur
| integer
| Суммарная длительность пребывания в состоянии available.
| Total available time (if not defined in the CTI platform, then tot_work_dur - pause_dur) (in seconds)
|
tot_work_dur
| integer
| Суммарная длительность пребывания оператора в состояниях available и notavailable.
| Total time logged in during an interval (in seconds)
|
pause_dur
| integer
| Суммарная длительность пребывания оператора в pause mode. На данный момент не существует конкретного определения pause mode. В это понятие мы включили состояния away, accident, dnd, custom[1-3], standoff, *#email, *sms, *#xmpp. То есть, все состояния, в которых оператор явно не обрабатывает голосовые вызовы.
| Total time in pause mode (in seconds) exclusive wrap_up_dur
|
wait_dur
| integer
| Суммарная длительность пребывания оператора в состоянии normal.
| Total wait time for an agent waiting for calls (in seconds)
|
admin_dur
| integer
| Со стороны Teleopti даны устные комментарии касательно "administrative" time. Это длительность интервала, когда оператор был занят рабочими процессами, но не занимался обработкой голосовых вызовов. В спцеификациях нет конкретного определения. В "administrative" time мы включили состояния accident, custom[1-3], standoff, *#email, *sms, *#xmpp.
| Total “administrative“ time during the interval (in seconds). Time when the agent is not working with (or not available for) queue calls, i.e. part of the pause duration.
|
direct_out_call_cnt
| integer
| Количество вызовов, инициированных оператором вне каких-либо проектов.
| Number of outbound calls that are NOT queue calls
|
direct_out_call_dur
| integer
| Суммарная длительность разговора по вызовам, инициированнным оператором вне проектов.
| Total talking time for outbound calls (inclusive parking time) for non queue calls
|
direct_in_call_cnt
| integer
| Количество вызовов, поступивших оператору вне каких-либо проектов.
| Direct inbound calls for each agent that are not queue calls
|
direct_in_call_dur
| integer
| Суммарная длительность разговора по вызовам, инициированнным оператором вне проектов.
| Total talking time for direct inbound calls (for non queue calls)
|
tffv_queue_statistics
Процедура возвращает статистику по очередям голосовых вызовов (входящих и автоматических исходящих). Обзвоны preview не включены в выборку.
Выходные данные
Имя столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
interval_
| integer
| Длительность интервала агрегации в минутах (просто выводится значение аргумента $3).
| Integer for aggregation depth (in minutes), should be the same for all the rows in the file. Preferable 15 minutes.
|
date_from
| char(8)
| Дата YYYYMMDD.
| Logging date
|
time_
| char(5)
| Время начала интервала агрегации HH24:MI.
| Start time for the logging interval
|
queue
| text
| dnis/aon/uuid проекта.
| The queue’s unique numeric identifier
|
queue_name
| text
| Название (title) проекта.
| Original queue name or definition in the CTI platform
|
offd_direct_call_cnt
| integer
| Количество входящих вызовов. В спецификации Teleopti указано, что в данном столбце должны быть учтены вызовы, изначально адресованные в целевую очередь. Тем не менее, специфика СТД "Петрович" такова, что вызовы часто перенаправляются с одной очереди на другую. Клиент, видя в отчётах 0 прямых входящих вызовов, потребовал изменить выборку. Так что в данном столбце считаются все вызовы, поступившие на целевую очередь: как прямые, так и перенаправленные.
| Inbound calls to this ACD queue, this queue being the original receiver
|
overflow_in_call_cnt
| integer
| Количество вызовов, перенаправленных из других очередей в целевую.
| Number of calls to this ACD queue with another queue as orignial receiver (overflow in)
|
aband_call_cnt
| integer
| Количество потерянных вызовов.
| Number of lost/abandoned calls
|
overflow_out_call_cnt
| integer
| Количество вызовов, перенаправленных в другую очередь из целевой (с IVR). CHANGECALLPROJECT не учитывается, только TRANSFER.
| Number of calls tranfered to another queue (overflow out)
|
answ_call_cnt
| integer
| Количество вызовов, соединённых с оператором.
| Number of answered calls on queue
|
queued_and_answ_call_dur
| integer
| Суммарная длительность ожидания в очереди для вызовов, соединённых с оператором.
| Total queue time for all queued calls that were answered (in seconds)
|
queued_and_aband_call_dur
| integer
| Суммарная длительность ожидания в очереди для потерянных вызовов.
| Total queue time for all queued calls that were abandoned (in seconds)
|
talking_call_dur
| integer
| Суммарная длительность разговора по всем соединённым с операторами вызовам.
| Total talking time for all answered calls (in seconds)
|
wrap_up_dur
| integer
| Суммарная длительность постобработки.
| Total wrap-up time/after call work, associated with queue calls, within the interval
|
queued_answ_longest_que_dur
| integer
| Максимальная длительность ожидания в очереди из всех соединённых с операторами вызовов.
| Longest queue time for answered calls within the interval (in seconds)
|
queued_aband_longest_que_dur
| integer
| Максимальная длительность ожидания в очереди из всех потерянных вызовов.
| Longest queue time for abandoned (or lost) calls within the interval (in seconds)
|
avg_avail_member_cnt
| integer
| Магическое число. Не спрашивайте.
| Average number of agents that were available during the interval ((logged in time minus pause)/interval length)
|
ans_servicelevel_cnt
| integer
| Количество вызовов, у которых соединение с оператором не превысило значение параметра уровня сервиса для проекта.
| Number of calls answered within servicelevel
|
wait_dur
| integer
| Суммарная длительность пребывания в состоянии normal для всех операторов проекта.
| Total waiting time for agents ready and waiting on calls (in seconds)
|
aband_short_call_cnt
| integer
| Количество вызовов, которые были потеряны и ждали в очереди не более 5 секунд.
| Number of abandoned short calls, e.g. calls with a queue time less than 5 seconds.
|
aband_within_sl_cnt
| integer
| Количество вызовов, которые были потеряны и длительность ожидания в очереди у которых не превысила значение параметра уровня сервиса для проекта.
| Number of abandoned calls within service level. Any abandoned calls reported in Field20 should not be included.
|
tffv_agent_queue_statistics
Процедура возвращает статистику в разрезе голосовых проектов (входящих и автоматических исходящих, preview не учитываются) и операторов одновременно.
Выходные данные
Имя столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
interval_
| integer
| Длительность интервала агрегации в минутах (просто выводится значение аргумента $3).
| Integer for aggregation depth (in minutes), should be the same for all the rows in the file. Preferable 15 minutes.
|
date_from
| char(8)
| Дата YYYYMMDD
| Logging date
|
time_
| char(5)
| Время начала интервала агрегации HH24:MI.
| Start time for the logging interval
|
agent_id
| text
| Логин оператора
| Unique agent identifier in CTI
|
agent_name
| text
| ФИО оператора
| Agent name in CTI
|
queue
| text
| dnis/aon/uuid проекта
| The queue’s unique numeric identifier
|
queue_name
| text
| Название проекта
| Original queue name or definition in the CTI platform
|
talking_call_dur
| integer
| Суммарная длительность разговора оператора по вызовам проекта.
| Total talking time (in seconds) on ACD calls
|
wrap_up_dur
| integer
| Суммарная длительность постобработки оператора по вызовам проекта.
| Total wrap-up time/after call work (in seconds), associated with queue calls answered by the agent
|
answ_call_cnt
| integer
| Количество принятых оператором вызовов по проекту.
| Number of answered calls (only calls through an ACD queue)
|
transfer_out_call_cnt
| integer
| Количество вызовов, которые были приняты оператором, а затем перенаправлены на другой dnis.
| Calls answered and thereafter transferred to queue or extension
|
tffe_agent_statistics
Процедура возвращает статистику по состояниям операторов.
Выходные данные
Название столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
aggregation_length_in_m
| integer
| Длительность интервала агрегации в минутах (просто выводится значение аргумента $3).
| The aggregation depth in minutes (for informational use). Should be the same for all the rows. Preferable 15 minutes.
|
date_and_start_time
| timestamp without time zone
| Время начала интервала агрегации.
| Date and start time for the interval, e.g. “2015-01-01 16:15:00” (for 16:15 to 16:30 if aggregation length is 15 minutes).
|
agent_id
| integer
| Уникальный идентификатор пользователя. В Teleopti должно передаваться целочисленное значение, а в NCC логины и uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| Unique agent identifier.
|
agent_name
| varchar(50)
| ФИО оператора.
| Agent name in the e-mail system.
|
logged_in_time_in_s
| integer
| Суммарная длительность пребывания оператора в состояниях available и notavailable.
| Total time logged on during this interval (in seconds)
|
not_ready_time_in_s
| integer
| Суммарная длительность пребывания оператора в состояниях away, accident, dnd, custom*, standoff.
| Total time in pause mode (in seconds) excluding any ACW time related to e-mails/errands.
|
ready_time_in_s
| integer
| logged_in_time_in_s - not_ready_time_in_s
| Total ready/available time in seconds for this interval (if not defined in the CTI platform, then logged_in_time_in_sec - not_ready_time_in_sec). This is time available out of an e-mail perspective, i.e. ready time waiting for an e-mail/errand, handling time and any related after call work duration. This condition should be true: tot_work_dur = avail_dur + pause_dur
|
idle_time_in_s
| integer
| Суммарная длительность пребывания в состоянии normal.
| Total wait time for an agent waiting to handle an email (in seconds). Time when the agent is logged in and the agent is not in pause or handling an email. This duration is also included in “ready_time_in_sec”.
|
tffe_queue_statistics
Процедура возвращает детальную (неагрегированную) статистику по обработке e-mail.
Выходные данные
Название столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
queue_id
| integer
| Уникальный идентификатор очереди. В Teleopti должно передаваться целочисленное значение, а в NCC uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| The queue’s or errand type’s unique numeric identifier
|
queue_name
| char(50)
| Название проекта.
| Original queue/errand name or definition in the e-mail system.
|
task_id
| char(50)
| Идентификатор сессии message box.
В Teleopti передаваемый идентификатор должен быть уникален. Поэтому к каждому идентификатору добавляется порядковый номер (например, '37221#1', '37221#2').
| The identifier of this single e-mail or errand.
|
offered_date_and_time
| timestamp without time zone
| Время поступления письма в очередь.
| Date and time when the e-mail/errand entered the queue/skill. The e-mail/errand is reported based on this date and time in Teleopti forecasts.
|
first_handled_date_and_time
| timestamp without time zone
| Время поступления письма оператору.
| Date and time when the e-mail was first handled by an agent. If it has been agreed to export e-mails or errands which are not completed yet, this shall be set to the offered_date_and_time if it has not yet been handled.
|
completed_date_and_time
| timestamp without time zone
| Время завершения обработки письма.
| Date and time when the e-mail was fully completed. If it has been agreed to export e-mails or errands which are not completed yet, this shall be set to the first_handled_date_and_time or offered_date_and_time if it has not yet been completed.
|
task_work_time_in_s
| integer
| Длительность обработки обращения (от момента поступления оператору до момента завершения).
| Total time the e-mail was handled by agents in this queue (in seconds). If this do not reflect the time the agent actively handled the email, i.e. if the agent can work with other tasks while time is being accounted for this email, then Teleopti shall be informed. The users of Teleopti WFM can then choose to work with average handling times instead, but this needs to be communicated.
|
after_task_work_time_in_s
| integer
| Длительность постобработки обращения (от момента ответа оператора на письмо до момента завершения).
| If applicable, the wrap-up/ACW time for this task in this queue (in seconds).
|
queuing_time_in_s
| integer
| Длительность ожидания в очереди (от момента поступления письма в очередь до момента поступления письма оператору). Нарушает спецификацию Teleopti по согласованию с заказчиком.
| Queue time for a queued and handled e-mail (in seconds). Should reflect the total time from an email entering the queue to being answered, i.e. including handling time and parked time. For errands consisting of several sub- activities, this should be the time until the first answer. If this is not provided, Teleopti will default the queing time to be the difference between offered_date_and_time and first_handled_date_and_time.
|
is_handled_within_service_level
| integer
| Индикатор превышения целевого времени ожидания (значение параметра "Уровень сервиса" для проекта").
| Reported as 1 if the email was handled within the service level for this queue. Reported as 0 if not.
|
task_status_description
| char(50)
| 'Offered' если письмо не было отвечено, в противном случае 'Completed'.
| For informational use or as agreed upon. Could be any text or one of the below: “Completed” “Transferred” “Offered” (not completed yet)
|
tffe_agent_queue_statistics
Процедура возвращает детальную (неагрегированную) статистику по письмам с указанием оператора, обработавшего письмо.
Выходные данные
Название столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
agent_id
| integer
| Уникальный идентификатор пользователя. В Teleopti должно передаваться целочисленное значение, а в NCC логины и uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| Unique agent identifier.
|
agent_name
| char(50)
| ФИО оператора.
| Agent name in the e-mail system.
|
queue_id
| integer
| Уникальный идентификатор очереди. В Teleopti должно передаваться целочисленное значение, а в NCC uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| The queue’s or errand type’s unique numeric identifier.
|
queue_name
| char(50)
| Название проекта.
| Original queue/errand name or definition in the e-mail system.
|
task_id
| char(50)
| Идентификатор сессии message box.
В Teleopti передаваемый идентификатор должен быть уникален. Поэтому к каждому идентификатору добавляется порядковый номер (например, '37221#1', '37221#2').
| The identifier of this single e-mail or errand.
|
first_handled_date_and_time
| timestamp without time zone
| Время поступления письма оператору.
| Date and time when the e-mail wasfirst handled by the agent.
|
completed_date_and_time
| timestamp without time zone
| Время завершения обработки письма.
| Date and time when the e-mail was fully completed.
|
task_work_time_in_s
| integer
| Длительность обработки обращения (от момента поступления оператору до момента завершения).
| Total time the e-mail was handled by the agent (in seconds).
|
after_task_work_time_in_s
| integer
| Длительность постобработки обращения (от момента ответа оператора на письмо до момента завершения).
| If applicable, the wrap-up/ACW time for this task in this queue (in seconds).
|
tffc_agent_statistics
Процедура должна возвращать данные по статистике операторов в разрезе чатов. Её описание полностью повторяет описание процедуры tffe_agent_statistics. Поэтому внутри делается селект из tffe_agent_statistics.
tffc_queue_statistics
Процедура возвращает детальную (неагрегированную) статистику по сессиям чатов и SMS.
Выходные данные
Название столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
queue_id
| integer
| Уникальный идентификатор очереди. В Teleopti должно передаваться целочисленное значение, а в NCC uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| The queue’s unique numeric identifier
|
queue_name
| char(50)
| Название проекта
| Original queue name or definition in the chat system.
|
task_id
| char(50)
| Идентификатор сессии message box.
В Teleopti передаваемый идентификатор должен быть уникален. Поэтому к каждому идентификатору добавляется порядковый номер (например, '37221#1', '37221#2').
| The identifier of this single chat.
|
is_answered
| integer
| Индикатор наличия ответа оператора в сессии чата.
| Reported as 1 if the chat was answered/handled. Reported as 0 if it was abandoned.
|
offered_date_and_time
| timestamp without time zone
| Время поступления первого сообщения чат-сессии в очередь.
| Date and time when the chat entered the queue/skill. The chat is reported based on this date and time in Teleopti forecasts.
|
first_handled_date_and_time
| timestamp without time zone
| Время поступления первого сообщения чат-сессии на оператора.
| Date and time when the chat was first handled by an agent.
|
completed_date_and_time
| timestamp without time zone
| Время завершения обработки чат-сессии оператором.
| Date and time when the chat was completed or abandoned.
|
task_work_time_in_s
| integer
| Длительность обработки чат-сессии (от момента поступления первого сообщения до момента завершения)
| Total chat time for this task in this queue (in seconds). If this do not reflect the time the agent actively handled the chat, i.e. if the agent can work with other tasks while time is being accounted for this chat, then Teleopti shall be informed. The users of Teleopti WFM can then choose to work with average handling times instead, but this needs to be communicated.
|
after_task_work_time_in_s
| integer
| Длительность постобработки част-сессии. В Naumen Contact Center понятие постобработки для чата отсутствует, поэтому всегда возвращаем 0.
| If applicable, the wrap-up/ACW time for this task in this queue (in seconds).
|
queuing_time_for_answerd_chats_in_s
| integer
| Длительность ожидания в очереди (от момента поступления в очередь до момента поступления оператору). Если is_answered = 0, то значение этого столбца 0.
| Total queue time for a queued and handled chat (in seconds). If this is not provided, Teleopti will default the queing time to be the difference between offered_date_and_time and first_handled_date_and_time (if provided).
|
queuing_time_for_abandoned_chats_in_s
| integer
| Длительность ожидания в очереди (от момента поступления в очередь до момента поступления оператору). Если is_answered = 1, то значение этого столбца 0.
| Total queue time for a queued and abandoned chat (in seconds). If this is not provided, Teleopti will default the queing time to be the difference between offered_date_and_time and completed_date_and_time.
|
is_handled_within_service_level
| integer
| Флаг превышения целевого времени ожидания (значения параметра "Уровень сервиса" для проекта) для отвеченных чат-сессий.
| Reported as 1 if the chat was handled within the service level for this queue. Reported as 0 if not.
|
is_abandoned_within_se rvice_level
| integer
| Флаг превышения целевого времени ожидания (значения параметра "Уровень сервиса" для проекта) для неотвеченных чат-сессий.
| Reported as 1 if the chat was abandoned within the service level for this queue. Reported as 0 if not.
|
task_status_description
| char(50)
| Всегда 'Completed'.
| For informational use or as agreed upon.
Could be any text or one of the below: “Completed” “Transferred”
|
tffc_agent_queue_statistics
Процедура выводит детальные (неагрегированные) данные по чат-сессиям, обработанным операторами.
Выходные данные
Название столбца
| Тип данных
| Описание
| Описание по спецификации Teleopti
|
agent_id
| integer
| Уникальный идентификатор пользователя. В Teleopti должно передаваться целочисленное значение, а в NCC логины и uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| Unique agent identifier.
|
agent_name
| char(50)
| ФИО оператора.
| Agent name in the chat system.
|
queue_id
| integer
| Уникальный идентификатор очереди. В Teleopti должно передаваться целочисленное значение, а в NCC uuid строковые. Поэтому в БД создана процедура integerhash, которая получает целое число из uuid.
| The queue’s unique numeric identifier.
|
queue_name
| char(50)
| Название проекта.
| Original queu name or definition in the chat system.
|
task_id
| char(50)
| Идентификатор сессии message box.
В Teleopti передаваемый идентификатор должен быть уникален. Поэтому к каждому идентификатору добавляется порядковый номер (например, '37221#1', '37221#2').
| The identifier of this single chat.
|
is_answered
| integer
| Флаг наличия ответа. Спецификация Teleopti нарушена по согласованию с заказчиком.
| Always reported as 1. Only answered/handled chats are to be reported.
|
first_handled_date_and_time
| timestamp without time zone
| Время поступления чат-сессии оператору.
| Date and time when the chat was first handled by the agent.
|
completed_date_and_time
| timestamp without time zone
| Время завершения обработки сессии оператором.
| Date and time when the chat was completed.
|
task_work_time_in_s
| integer
| Длительность обработки сессии оператором.
| Total time the chat was handled by the agent (in seconds).
|
after_task_work_time_in_s
| integer
| Постобработка для чата. Всегда 0.
| If applicable, the wrap-up/ACW time for this task in this queue (in seconds).
|
Приложение 1. Полное описание файла petrovich.js
Файл petrovich.js содержит описание синглтона petrovich, синглтон используется в качестве пространства имен.
Зависимости
- jQuery
- jquery-observe
- RequireJS
- ion.sound
- nauphone.js
Как внедрить на форму
Скрипт необходимо разместить в каталоге /opt/naucrm/server/webapps/fx/UserFiles/js на сервере PMS
При редактировании представления формы нажать изменить скрипт, в конец тега <fields-table /> добавить:
<fields-holder align="top" autoFitcols="100" height="1px;display:block;overflow:hidden;visibility:hidden" order="custom" rows="1" splitWidth="30%"
> <frame-view height="1" uri="javascript:window.parent.jQuery.data(window.parent.document.body,'agent.login','{agent}');window.parent.jQuery.getScript('/fx/UserFiles/js/petrovich.js')"
> <item type="expr" value="agent"
>${user.login}
</item> </frame-view> </fields-holder>
Конфигурация
Файл petrovich_conf.js добавлен в .gitignore, подгружается при выполнении petrovich.main, ожидается, что в этом файле описан объект, оформленный в виде RequireJS модуля. Атрибуты этого объекта переопределяют атрибуты petrovich.
Например:
define({ eds: { url: 'http://172.16.90.26:8008' }});
petrovich
petrovich.eds
Интеграция с Enquiry Data Store
petrovich.eds.url
Корневой URL сервиса
petrovich.eds.post_enquiry_handling(agent, client)
jQuery.ajax POST /enquiry_handling
petrovich.eds.delete_enquiry_handling(agent)
jQuery.ajax DELETE /enquiry_handling
Выполняется синхронно, т.к. предназначено для использования на кнопке "Завершить" (см. petrovich.action_finish)
petrovich.ws
Интеграция с WS API SoftPhone. Инициализируется в petrovich.main.
petrovich.ws.nauphone
Объект класса NauPhone. см. petrovich.main
petrovich.ws.getcall
Текущий вызов. см. petrovich.main
petrovich.ws.setCallParam(key, value)
Метод для установки параметра вызова с помощью WS API SoftPhone
petrovich.init()
Метод для инициализации плагина, вызывается по событию jQuery(document).ready
Подгружает библиотеку /fx/UserFiles/js/3rdparty/require.js, с помощью нее подгружает остальные необходимые библиотеки
После загрузки библиотек выполняет petrovich.main
petrovich.main(RequireJS modules ...)
Подгружает petrovich_conf.js
Сохраняет логин оператора в petrovich.agent (важно правильно внедрить на форму, см. Как внедрить на форму)
Подключается к WS API SoftPhone:
Создает объект класса NauPhone, присваивает атрибуту petrovich.ws.nauphone
После успешного подключения присваивает Promise NauPhone.getCall атрибуту petrovich.ws.getcall
Устанавливает обработчик на событие jQuery('#acf_cp1').parent().observe('childlist subtree'), при изменении расширения Информация о клиенте обработчик вызывает
petrovich.ui_fix_cp
petrovich.action_cp
Вызывает petrovich.ui_fix
Вызывает petrovich.action_cp
Устанавливает обработчик на событие jQuery('#finish').click, при нажатии на кнопку Завершить (до отправки формы) будет вызван petrovich.action_finish, petrovich.action_finish может препятствовать завершению формы.
Проигрывает звук для текстовых обращений
Если тип обращения xmpp, добавляет callback для atmosphere, чтобы звук проигрывался на каждое новое сообщение. (Потенциально может привести к проблемам с чатами, но маловероятно.)
petrovich.agent
Атрибут хранит логин оператора.
petrovich.debug_refresh()
Переход по адресу /fx/npi/callmanager?session_id=fake&caller=89001234567&called=0000&direction=in&seance_id=seanceId&project_id=<uuid проекта>&case_uuid=&service_mode=&citycall=MSK.
Для удобства отладки в браузере.
petrovich.ui_fix()
Прячет последний <fields-holder />, который используется для внедрния скрипта на анкету (см. Как внедрить на форму)
Вызывает petrovich.ui_fix_cp
petrovich.ui_fix_cp()
Прячет табы (нам не нужны Юридические лица)
Прячет поле Идентификатор (оператор не должен его видеть и изменять)
petrovich.action_cp()
Вызывается при каждом изменении в расширении Информация о клиенте (см. petrovich.init)
Копирует Мобильный телефон в Идентификатор
Если обрабатывается почта, вызывает petrovich.eds.post_enquiry_handling(petrovich.agent, <uuid выбранного клиента>)
Если выбран пункт Новый клиент для голосовых вызовов копирует phoneControllerService.caller в Мобильный телефон, для почты - в Email
petrovich.action_finish()
Вызывается при нажатии Завершить (см. petrovich.init)
Важно все дополнительные действия выполнять синхронно
Если обрабатывается почта, вызывает petrovich.eds.delete_enquiry_handling(petrovich.agent)
Если в Информации о клиенте выбран пункт Новый клиент, препятствует закрытию анкеты
petrovich.action_citycall()
deprecated
petrovich.action_open1c(useraction = 'openNewOrderForm')
С помощтю WS API устанавливает параметры вызова citycall (из флекса citycall) и customerID (из Отображения списков с идентификатором rest1c_customers).
Устанавливает параметр вызова useraction.
После успешнго установления параметра useraction сбасывает его значение на 'none', что позволяет нажимать кнопку несколько раз.
Приложение 2. Описание интеграционного шлюза Enquiry Data Store
HTTP-сервис, разработан для проекта СТД Петрович.
Назначение
Временное хранение данных, связанных с обращением
Интеграционный шлюз
Окружение (необходимо для работы)
Redis (собственный)
Отчетная база PMS (PostgreSQL)
REST API PMS
Настройки
Конфигурационные файлы: conf/config.ini, conf/acl.ini, conf/passwd.ini.
Приложение поддерживает перечитывание конфига при получении сигнала SIGHUP.
config.ini
[pg] требует перезапуска
conString URL отчетной базы PMS формат
[pg.options] Опции подключения к PostgreSQL
[redis] требует перезапуска
conString URL Redis формат
[redis.options] Опции подключения к Redis
[app]
port требует перезапуска TCP-порт, который будет слушать приложение
unix_sock требует перезапуска Unix domain socket, потенциально можно увеличить производительность при обращении из IVR
mask_status_code_for[] Список логинов, для которых вместо реального кода ответа нужно отправлять 200 (при этом аутентификация может не требоваться)
[app.pms_api] PMS RESTful API
url
username
password
timeout
[app.minify_flex_attributes] Описание того, какие поля mv_flex_attribute необходимо возвращать в зависимости от typecode при получении клиента из БД
Примеры:
FlexType.Something = stringcontent - строковое значение
FlexType.Something[] = stringcontent - список строк
FlexType.Something = [ "stringcontent" ] - список строк
FlexType.Something = {"value": "stringcontent", "somethingelse": "stringcontent2"} - сложные типы
FlexType.Something[] = {"value": "stringcontent", "somethingelse": "stringcontent2"}
FlexType.Something = [ {"value": "stringcontent", "somethingelse": "stringcontent2"} ]
[app.client_catalog]
catalog_uuid Клиент-каталог, в котором будет производиться поиск клиентов
partner_uuid Идентификатор партнера, в котором создан клиент-каталог
[app.outsource_comment]
expire Время жизни комментария, установленного с помощью POST /outsource_comment
[app.smart_routing]
catalog_uuid UUID каталога, который устанавливает связь кода категории обращения (код элемента) и UUID проекта (название элемента)
flex Флекс-атрибут формы, хранящий категорию обращения
X Количество последних обращений клиента, которые нужно учесть при интеллектуальной маршрутизации
Y Минимальное количество одинаковых категорий обращения среди последних X для принятия решения по интеллектуальной маршрутизации
[app.rest1c_gethistory] 1С RESTful API
url
timeout
acl.ini
Содержит описание прав доступа.
Формат
[<method> <path>]
ip[] = <CIDR net>
user[] = <login>
Например:
[GET /something]
ip[] = 10.0.0.0/8
ip[] = 172.16.0.0/12
ip[] = 192.168.0.0/16
[POST /something]
user[] = user1
[* /something]
ip[] = 127.0.0.0/8
[GET *]
user[] = user1
[* *]
user[] = superuser
Типы правил
[<method> <path>]
[* <path>]
[<method> *]
[* *]
Логика работы правил
Если запрос не попадает ни под одно правило, он будет отклонен.
Если запрос осуществляется из подсети, указанной в списке ip, он разрешается, успешная аутентификация при этом не требуется.
Если запрос осуществляется не из подсети, указанной в списке ip, пользователь обязан успешно пройти аутентификацию (Basic Auth) (см. passwd.ini).
passwd.ini
Формат
[<login>]
md5 = <хеш пароля>
Логирование
В файле conf/logger.js можно описать особый модуль логирования.
Если файл отсутствует, используется console.
Установка и запуск
git clone https://callcenter.naumen.ru/gerrit/petrovich/enquiry_datastore
cd ./enquiry_datastore
make redis # если еще нет подготовленного Redis
Make install
service eds start
HTTP запросы
Ответ на HTTP-запросы возвращается в формате JSON.
Атрибут status дублирует код ответа HTTP для возможности использования компонентом Индикатор на форме (например: {status:404}). Для возможности использования кодов ответа в компоненте Индикатор реальный код ответа HTTP необходимо маскировать (см. config[app].mask_status_code_for).
POST-запросы в качестве тела принимают параметры формы (application/x-www-form-urlencoded, multipart/form-data).
Для удобства использования в контроллере Внешний сервис запрос возможно указывать в GET- или POST-параметре query вместо пути.
Для удобства использования в контроллере Внешний сервис при использовании метода POST возможно переопределить метод в параметом method.
GET /?query=make_something¶m1=somedata --> GET /make_something?param1=somedata
POST /?query=make_something {param1: somedata} --> POST /make_something {param1: somedata}
Также при использовании метода GET возможно переопределить метод указанием параметра method.
GET /make_something?param1=somedata&method=DELETE --> DELETE /make_something?param1=somedata
Поддерживается CORS, сервер отправляет заголоки:
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS
Access-Control-Max-Age: 86400
Коды ответа
Код
| Описание
|
404
| Неизвестный запрос, см. список допустимых запросов ниже
|
400
| Отсутствуют обязательные параметры запроса
|
500
| Ошибка
|
200
| Запрос выполнен успешно
|
201
| Запрос на запись выполнен успешно
|
enquiry_handling
Назначение
Обеспечить возможность докинуть звонок оператору, который сейчас обрабатывает письмо этого же клиента.
POST /enquiry_handling {agent: ..., client: ...}
POST /enquiry_handling/:agent {client: ...}
Назначение
Сохранить связь логина оператора (agent) и UUID клиента (client).
При этом удаляются или перезаписываются старые связи данного оператора и старые связи данного клиента.
Формат ответа
{status:201, data:['MULTI', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
На анкете обработки текстовых обращений (по ТЗ - писем) в момент выбора клиента в расширении Информация о клиенте.
см. GET /magic_routing
Как работает
Redis:
get eh:agent:<agent> --> <старый UUID клиента>
get eh:client:<client> --> <старый логин оператора>
del eh:agent:<старый логин оператора>
del eh:client:<старый UUID клиента>
set eh:agent:<agent> <client>
set eh:client:<client> <agent>
DELETE /enquiry_handling?agent=...
DELETE /enquiry_handling/:agent
Назначение
Удалить связь логина оператора (agent) и UUID клиента.
Формат ответа
{status:200, data:['MULTI', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
На анкете обработки текстовых обращений (по ТЗ - писем) в момент нажатия Завершить (фактически - на удачу, при закрытии анкеты может срабатывать не всегда, но проблем это вызывать не должно).
Как работает
Redis:
get eh:agent:<agent> --> <UUID клиента>
del eh:agent:<agent>
del eh:client:<UUID клиента>
GET /enquiry_handlings
Назначение
Получить все ключи Redis eh:*.
Формат ответа
{status:200, data:['KEYS', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Тесты, ручная отладка.
Как работает
Redis:
keys eh:*
DELETE /enquiry_handlings
Назначение
Удалить все свзяи (ключи eh:*).
Формат ответа
{status:200, data:['DEL', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Тесты, ручная отладка.
Как работает
Redis:
del eh:*
outsource_comment
Назначение
Передать комментарий оператора АКЦ на анкету оператора "домашнего" КЦ.
Текущими средствами NCC невозможно связать звонок АКЦ со звонком "домашнего" КЦ (если не обращаться к CallsList'ам).
Поэтому комментарий идентифицируется номером телефона абонента.
У каждого комментария есть время жизни, см. конфигурационный параметр [app.outsource_comment].expire.
POST /outsource_comment {caller: ..., comment: ...}
POST /outsource_comment/:caller {comment: ...}
Назначение
Сохранить комментарий (comment) для данного CallerID (caller).
Формат ответа
{status:201, data:['SET', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Анкета АКЦ (Внешний сервис) до совершения трансфера.
Как работает
Redis:
set outc:<caller> <comment> ex <config[app.outsource_comment].expire>
GET /outsource_comment?caller=...
GET /outsource_comment/:caller
Назначение
Получить комментарий для данного CallerID (caller).
Формат ответа
{status:200, data:['GET', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Анкета "домашнего" КЦ (Внешний сервис).
Как работает
Redis:
get outc:<caller>
GET /outsource_comments
Назначение
Получить все ключи Redis outc:*.
Формат ответа
{status:200, data:['KEYS', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Тесты, ручная отладка.
Как работает
Redis:
keys outc:*
DELETE /outsource_comments
Назначение
Удалить все свзяи (ключи outc:*).
Формат ответа
{status:200, data:['DEL', <ответы Redis>]}
{status:500, err:<ошибка>}
Где используется
Тесты, ручная отладка.
Как работает
Redis:
del outc:*
search_client_by_phone
GET /search_client_by_phone?phone=...[&count=...]
GET /search_client_by_phone/:phone[?count=...]
Назначение
Получить UUID и title клиента (Физическое лицо) по номеру телефона (phone).
Клиент ищется в клиент-каталоге, указанном в config[app.client_catalog].
Если задан параметр count, и количество найденных результатов не равно параметру, будет возвращен пустой результат.
Формат ответа
{status:200, data:<строки результата SQL запроса>}
{status:200, data:[{client:{uuid:<UUID клиента>, title:<Название клиента>, ...}, flex_attributes:{...}}]
{status:500, err:<ошибка>}
Где используется
Поглощено magic_routing.
Тесты, ручная отладка.
Как работает
см. sql/search_client_by_phone.sql
GET /outsource_client_by_phone?phone=...
GET /outsource_client_by_phone/:phone
Нет автотестов
Аналогично GET /search_client_by_phone, зафиксирован параметр count=1, не возвращает флекс-атрибуты.
Формат ответа
{status:200, data:{client:{uuid:<UUID клиента>, title:<Название клиента>, ...}}]
{status:500, err:<ошибка>}
Где используется
Анкета АКЦ (Внешний сервис)
Как работает
см. GET /search_client_by_phone
smart_routing
Нет автотестов
GET /smart_routing?clientid=...[&citycall=...]
GET /smart_routing/:clientid[?citycall=...]
Назначение
Проанализировать последние config[app.smart_routing].X обращений клиента (по UUID (clientid)) на предмет наличия минимум config[app.smart_routing].Y одинаковых категорий обращения.
Если среди последних X обращений одна категория встречается чаще других, при этом указана >=Y раз, запрос вернет Назваие элемента справочника config[app.smart_routing].catalog_uuid, Код которого формируется как код категории:citycall или код категории, если подходящих элементов с :citycall нет.
Формат ответа
{status:200, data:null}
{status:200, data:{category:<код категории>, projectid:<UUID проекта>, count:<количество одинаковых категорий>}
{status:500, err:<ошибка>}
Где используется
Поглощено magic_routing.
Как работает
см. sql/smart_routing.sql
magic_routing
Нет автотестов
GET /magic_routing?phone=...[&citycall=...]
GET /magic_routing/:phone[&citycall=...]
Назначение
Попытка собрать всю магию IVR в один запрос.
Формат ответа
{status:200, data:null}
{status:200, data:{client:{uuid:<UUID клиента>, title:<Название клиента>, ...}, flex_attributes:{...}, eh_agent:['GET', <ответы Redis>], smart_routing:{category:<код категории>, projectid:<UUID проекта или DNIS>, count:<количество одинаковых категорий>}, phone_category:{vip:0, blacklist:1,...}}
{status:500, err:<ошибка>}
Где используется
IVR
Как работает
search_client_by_phone + Redis get eh:client:<client> + smart_routing + sql/phone_categorization.sql
При категоризации номера используются все клиент-каталоги партнера [app.client_catalog].partner_uuid кроме [app.client_catalog].catalog_uuid.
rest1c_gethistory
Нет автотестов
GET /rest1c_gethistory?clientextid=...
GET /rest1c_gethistory?clientid=...
GET /rest1c_gethistory/:clientextid
Назначение
Получение истории заказов. Интеграционная прослойка между PMS и 1С.
Формат ответа
{status:200_<статус получения данных клиента>_<статус обращения к 1C>, data:<тело ответа от 1С>}
{status:500, err:<ошибка>}
Примеры статусов:
200_200_200 - OK
200_200_500 - ошибка обращения к 1С (1С вернула что-то отличное от 200)
200_200_504 - не удалось подключиться к 1С
200_504_undefined - не удалось подключиться к REST API PMS
Где используется
Анкета "домашнего" КЦ (Внешний сервис).
Как работает
Если определен параметр clientextid, получаем по этому идентификатору клиента через REST API PMS.
Если определен параметр clientid, получаем данные клиента из БД (sql/get_client_by_uuid.sql).
По просьбе Виктора Вересоа [email protected] удаляем из JSON атрибут @type.
Данные клиента в виде JSON отправляем сервису 1С POST-запросом.