Skip to content

Commit

Permalink
Rest API more options for chat's export
Browse files Browse the repository at this point in the history
  • Loading branch information
remdex committed Nov 22, 2021
1 parent 99edd21 commit c9e89f9
Show file tree
Hide file tree
Showing 3 changed files with 162 additions and 4 deletions.
125 changes: 122 additions & 3 deletions lhc_web/lib/core/lhchat/lhchatexport.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,123 @@ public static function exportDepartmentStats($departments) {
// Write file to the browser
$objWriter->save('php://output');
}


public static function messagesStatistic(& $itemData, $item)
{
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('chat_id' => $item->id))); // Total messages
$visitorMessagesCount = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('user_id' => 0, 'chat_id' => $item->id)));
$itemData[] = $visitorMessagesCount; // Visitor messages
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('user_id' => -2, 'chat_id' => $item->id))); // Bot messages
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filtergt' => array('user_id' => 0),'filter' => array('chat_id' => $item->id))); // Operator messages
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('user_id' => -1,'chat_id' => $item->id))); // System messages
// We have a bot assigned
// Chat does not have an operator OR it has operator and message time is less than chat become pending
$visitorMessagesBotCount = 0;
$botMessages = [];
$agentMessages = [];

if ($item->gbot_id > 0) {
// All visitor messages were interactions with bot
if ($item->user_id == 0) {
$visitorMessagesBotCount = $visitorMessagesCount;
$itemData[] = $visitorMessagesBotCount;
// All interactions were with a bot
$botMessages = erLhcoreClassModelmsg::getList(array('limit' => false, 'filter' => array('chat_id' => $item->id)));
} else {
$botMessages = erLhcoreClassModelmsg::getList(array('limit' => false, 'filterlte' => array('time' => $item->pnd_time),'filter' => array('chat_id' => $item->id)));
$agentMessages = erLhcoreClassModelmsg::getList(array('limit' => false, 'filtergt' => array('time' => $item->pnd_time),'filter' => array('chat_id' => $item->id)));
$visitorMessagesBotCount = erLhcoreClassModelmsg::getCount(array('limit' => false, 'filterlte' => array('time' => $item->pnd_time),'filter' => array('user_id' => 0, 'chat_id' => $item->id)));
$itemData[] = $visitorMessagesBotCount;
}
} else { // There was no bot assigned
$itemData[] = 0;
$agentMessages = erLhcoreClassModelmsg::getList(array('limit' => false, 'filter' => array('chat_id' => $item->id)));
}

$itemData[] = $visitorMessagesCount - $visitorMessagesBotCount;

$timesResponse = [];
$startTime = 0;
$firstBotResponseTime = 'None';

foreach ($botMessages as $messageWithABot) {
if ($messageWithABot->user_id == 0) {
if ($startTime == 0) {
$startTime = $messageWithABot->time;
}
} elseif ($messageWithABot->user_id == -2) {
if ($startTime > 0) {
if (empty($timesResponse)){
$firstBotResponseTime = $messageWithABot->time - $startTime;
$timesResponse[] = $firstBotResponseTime;
} else {
$timesResponse[] = $messageWithABot->time - $startTime;
}

$startTime = 0;
}
}
}

$tillFirstOperatorMessage = 'None';
$firstAgentResponseTime = 'None';
$timesResponseAgent = [];
$startTime = $item->pnd_time;

foreach ($agentMessages as $agentMessage) {
if ($agentMessage->user_id == 0) {
if ($startTime == 0) {
$startTime = $agentMessage->time;
}
} elseif ($agentMessage->user_id > 0) {
if ($tillFirstOperatorMessage == 'None') {
$tillFirstOperatorMessage = $agentMessage->time - $item->pnd_time;
if ($tillFirstOperatorMessage < 0) { // It was operator who first send a message
$tillFirstOperatorMessage = 0;
}
}

if ($startTime > 0) {
// It's first agent response
if (empty($timesResponseAgent)) {
$responseTime = $agentMessage->time - ($item->wait_time + $item->pnd_time);
if ($responseTime > 0) {
$firstAgentResponseTime = $responseTime;
$timesResponseAgent[] = $firstAgentResponseTime;
} else {
$responseTime = $agentMessage->time - $item->pnd_time;
if ($responseTime > 0) {
$firstAgentResponseTime = $responseTime;
$timesResponseAgent[] = $firstAgentResponseTime;
} else {

$firstAgentResponseTime = $agentMessage->time - $item->time;

// Happens for old proactive chat invitations
if ($firstAgentResponseTime < 0) {
$firstAgentResponseTime = 0;
}

$timesResponseAgent[] = $firstAgentResponseTime;
}
}
} else {
$timesResponseAgent[] = $agentMessage->time - $startTime;
}
$startTime = 0;
}
}
}

$itemData[] = !empty($timesResponseAgent) ? max($timesResponseAgent) : 'None';
$itemData[] = !empty($timesResponse) ? max($timesResponse) : 'None';
$itemData[] = !empty($timesResponseAgent) ? (array_sum($timesResponseAgent)/count($timesResponseAgent)) : 'None';
$itemData[] = !empty($timesResponse) ? array_sum($timesResponse)/count($timesResponse) : 'None';
$itemData[] = $firstAgentResponseTime;
$itemData[] = $firstBotResponseTime;
$itemData[] = $tillFirstOperatorMessage;
}

public static function chatListExportXLS($chats, $params = array()) {

include 'lib/core/lhform/PHPExcel.php';
Expand Down Expand Up @@ -425,7 +541,10 @@ public static function chatListExportXLS($chats, $params = array()) {
}

if (isset($params['type']) && in_array(4,$params['type'])) {
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('chat_id' => $item->id))); // Total messages

self::messagesStatistic($itemData, $item);

/*$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('chat_id' => $item->id))); // Total messages
$visitorMessagesCount = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('user_id' => 0, 'chat_id' => $item->id)));
$itemData[] = $visitorMessagesCount; // Visitor messages
$itemData[] = erLhcoreClassModelmsg::getCount(array('limit' => false,'filter' => array('user_id' => -2, 'chat_id' => $item->id))); // Bot messages
Expand Down Expand Up @@ -536,7 +655,7 @@ public static function chatListExportXLS($chats, $params = array()) {
$itemData[] = !empty($timesResponse) ? array_sum($timesResponse)/count($timesResponse) : 'None';
$itemData[] = $firstAgentResponseTime;
$itemData[] = $firstBotResponseTime;
$itemData[] = $tillFirstOperatorMessage;
$itemData[] = $tillFirstOperatorMessage;*/
}

if (isset($params['type']) && in_array(5,$params['type'])) {
Expand Down
39 changes: 39 additions & 0 deletions lhc_web/lib/core/lhrestapi/lhrestapivalidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,45 @@ public static function validateChatList()
));
}

if (in_array('link',$prefillFields)) {
foreach ($chats as $index => $chat) {
$chats[$index]->link = erLhcoreClassXMP::getBaseHost() . $_SERVER['HTTP_HOST'] . erLhcoreClassDesign::baseurl('user/login').'/(r)/'.rawurlencode(base64_encode('chat/single/'.$chat->id));
}
}

if (!empty($chats) && in_array('subject',$prefillFields)) {
$assignedSubjects = erLhAbstractModelSubjectChat::getList(['limite' => false,'filterin' => ['chat_id' => array_keys($chats)]]);
foreach ($assignedSubjects as $chatSubject) {
if (!isset($chats[$chatSubject->chat_id]->subjects)){
$chats[$chatSubject->chat_id]->subject = [];
}
$chats[$chatSubject->chat_id]->subject[] = $chatSubject->subject;
}
}

if (!empty($chats) && in_array('messages_statistic',$prefillFields)) {
foreach ($chats as $index => $chat) {
$messages_statistic = [];
erLhcoreClassChatExport::messagesStatistic($messages_statistic, $chat);
$chats[$index]->messages_statistic = [
'total_messages' => ($messages_statistic[0] == 'None' ? null : (float)$messages_statistic[0]),
'visitor_messages' => ($messages_statistic[1] == 'None' ? null : (float)$messages_statistic[1]),
'bot_messages' => ($messages_statistic[2] == 'None' ? null : (float)$messages_statistic[2]),
'operator_messages' => ($messages_statistic[3] == 'None' ? null : (float)$messages_statistic[3]),
'system_messages' => ($messages_statistic[4] == 'None' ? null : (float)$messages_statistic[4]),
'visitor_messages_to_bot' => ($messages_statistic[5] == 'None' ? null : (float)$messages_statistic[5]),
'visitor_messages_to_operator' => ($messages_statistic[6] == 'None' ? null : (float)$messages_statistic[6]),
'max_agent_response_time' => ($messages_statistic[7] == 'None' ? null : (float)$messages_statistic[7]),
'max_bot_response_time' => ($messages_statistic[8] == 'None' ? null : (float)$messages_statistic[8]),
'avg_agent_response_time' => ($messages_statistic[9] == 'None' ? null : (float)$messages_statistic[9]),
'avg_bot_response_time' => ($messages_statistic[10] == 'None' ? null : (float)$messages_statistic[10]),
'first_agent_response_time' => ($messages_statistic[11] == 'None' ? null : (float)$messages_statistic[11]),
'first_bot_response_time' => ($messages_statistic[12] == 'None' ? null : (float)$messages_statistic[12]),
'wait_time_till_first_operator_msg' => ($messages_statistic[13] == 'None' ? null : (float)$messages_statistic[13]),
];
}
}

if (!empty($prefillFields) || !empty($ignoreFields)) {
erLhcoreClassChat::prefillGetAttributes($chats, $prefillFields, $ignoreFields, array('clean_ignore' => true, 'do_not_clean' => true));
}
Expand Down
2 changes: 1 addition & 1 deletion lhc_web/modules/lhrestapi/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@
},
{
"name": "prefill_fields",
"description": "What fields to prefill E.g time_created_front, department_name, plain_user_name, product_name, n_official, n_off_full, wait_time_pending, wait_time_seconds, cls_time_front, tatus_sub_sub, can_edit_chat, unread_time",
"description": "What fields to prefill E.g messages_statistic,subject, link, time_created_front, department_name, plain_user_name, product_name, n_official, n_off_full, wait_time_pending, wait_time_seconds, cls_time_front, tatus_sub_sub, can_edit_chat, unread_time",
"required": false,
"type": "string",
"in": "query"
Expand Down

0 comments on commit c9e89f9

Please sign in to comment.