Name
sn_ci_analytics.VADashboardMetrics
Description
No description available
Script
var VADashboardMetrics = Class.create();
VADashboardMetrics.prototype = {
initialize: function() {},
getTotalUsers: function(fromDate, toDate) {
var _totalUsers = 0;
try {
var response = AnalyticsServiceInvoker.invoke('User', 'getAnalyticsTotalUsers', {
from_date: fromDate,
to_date: toDate,
platform: "chat"
});
if (response && response.TotalUsers)
_totalUsers = response.TotalUsers;
} catch (e) {
var message = "VADashboardMetrics: Exception while fetching total active users : " + e.message;
if (e.stack)
message = message + "\n" + e.stack;
CIAnalyticsLogger.getLogger('VADashboardMetrics').error(message);
}
return _totalUsers;
},
getActiveUsersTrend: function(from_date, to_date) {
var _result = {
totalUsers: 0,
change: '',
chartData: ''
};
// Validate input
var vaUtils = new sn_ci_analytics.VADashboardUtils();
if (!vaUtils.isValidDate(from_date) || !vaUtils.isValidDate(to_date))
return _result;
var previousPeriod = vaUtils.getPreviousPeriod(from_date, to_date);
var currentDurationActiveUsers = this.getTotalUsers(from_date, to_date);
var previousDurationActiveUsers = this.getTotalUsers(previousPeriod.fromDate, previousPeriod.toDate);
_result.totalUsers = currentDurationActiveUsers;
_result.change = vaUtils.getChangeInfoTextForScoreCard(currentDurationActiveUsers, previousDurationActiveUsers);
var requestBody = {
from_date: from_date,
to_date: to_date,
platform: 'chat'
};
requestBody.date_bucket = vaUtils.getBucketType(vaUtils.getDays(requestBody.from_date, requestBody.to_date));
var currentDurationActiveUsersTimeSeries = AnalyticsServiceInvoker.invoke("User", "getAnalyticsTotalUsersByDate", requestBody);
if (vaUtils.isEmpty(currentDurationActiveUsersTimeSeries)) {
return _result;
}
currentDurationActiveUsersTimeSeries = vaUtils.addMissingDates(requestBody.from_date, requestBody.to_date, currentDurationActiveUsersTimeSeries, requestBody.date_bucket);
_result.chartData = vaUtils.transformTimeSeries(currentDurationActiveUsersTimeSeries);
return _result;
},
getSessionsCount: function(from_date, to_date) {
var vaUtils = new sn_ci_analytics.VADashboardUtils();
if (!vaUtils.isValidDate(from_date) || !vaUtils.isValidDate(to_date)) {
var result = {
totalSessions: '0'
};
CIAnalyticsLogger.getLogger('VADashboardMetrics').debugJson('getConversationsCount result - {}', result);
return result;
}
var previousPeriod = vaUtils.getPreviousPeriod(from_date, to_date);
var requestBody = {
from_date: previousPeriod.fromDate,
to_date: previousPeriod.toDate,
platform: 'chat'
};
var results = AnalyticsServiceInvoker.invoke("Session", "getAnalyticsTotalSessions", requestBody);
var result = {
totalSessions: results.TotalSessions
};
CIAnalyticsLogger.getLogger('VADashboardMetrics').debugJson('getConversationsCount - {}', result);
return result;
},
getConversationChartData: function(from_date, to_date) {
var vaUtils = new sn_ci_analytics.VADashboardUtils();
var requestBody = {
from_date: from_date,
to_date: to_date,
platform: 'chat'
};
var result = {
chartData: []
};
if (!vaUtils.isValidDate(from_date) || !vaUtils.isValidDate(to_date)) {
CIAnalyticsLogger.getLogger('VADashboardMetrics').debugJson('getConversationChartData result - {}', result);
return result;
}
requestBody.date_bucket = vaUtils.getBucketType(vaUtils.getDays(from_date, to_date));
var results = AnalyticsServiceInvoker.invoke("Session", "getAnalyticsTotalSessionsByDate", requestBody);
if (vaUtils.isEmpty(results)) {
return result;
}
results = vaUtils.addMissingDates(requestBody.from_date, requestBody.to_date, results, requestBody.date_bucket);
result.chartData = vaUtils.transformTimeSeries(results)
CIAnalyticsLogger.getLogger('VADashboardMetrics').debugJson('getConversationChartData result - {}', result);
return result;
},
getConversationTrend: function(from_date, to_date) {
var vaUtils = new sn_ci_analytics.VADashboardUtils();
var previousSessions = this.getSessionsCount(from_date, to_date).totalSessions;
var timeSeriesData = this.getConversationChartData(from_date, to_date).chartData;
var currentSessions = 0;
if (timeSeriesData.length) {
currentSessions = timeSeriesData.reduce(function(a, b) {
return a + b['y0'];
}, 0);
}
var response = {
totalSessions: currentSessions.toString(),
change: vaUtils.getChangeInfoTextForScoreCard(currentSessions, previousSessions),
chartData: timeSeriesData
};
return response;
},
getVASuccessTrend: function(from_date, to_date) {
var vaUtils = new sn_ci_analytics.VADashboardUtils();
if (!vaUtils.isValidDate(from_date) || !vaUtils.isValidDate(to_date)) {
return {
'selfSolveRate': '0%',
'change': ''
};
}
//Convert string date in format YYYY-MM-DD to a date object
var SELF_SOLVE = 'Self Solve';
var getSelfSolveRate = function(response) {
var selfSolveData = response && response[SELF_SOLVE];
if (selfSolveData) {
var selfSolvedCount = selfSolveData['true'] || 0;
var totalSolvedCount = selfSolveData['false'] ? selfSolvedCount + selfSolveData['false'] : selfSolvedCount;
if (totalSolvedCount === 0) {
return {
totalSolvedCount: totalSolvedCount,
selfSolvedCount: selfSolvedCount,
};
}
return totalSolvedCount ? (selfSolvedCount / totalSolvedCount) : 0;
} else {
return 0;
}
};
var getSelfSolveCount = function(response) {
var selfSolveData = response && response[SELF_SOLVE];
if (selfSolveData) {
var selfSolvedCount = selfSolveData['true'] || 0;
return selfSolvedCount;
} else {
return 0;
}
};
var getRequestBody = function(fromDate, toDate) {
var requestBody = {};
requestBody.from_date = fromDate;
requestBody.to_date = toDate;
requestBody.platform = 'chat';
requestBody.property_name_filter = SELF_SOLVE;
return requestBody;
};
var requestBody = getRequestBody(from_date, to_date);
var response = AnalyticsServiceInvoker.invoke("Session", "getAnalyticsSessionDynamicPropertyValues", requestBody);
response = response || {};
var currentSelfSolveRate = getSelfSolveRate(response);
var currentSelfSolveCount = getSelfSolveCount(response);
var currSelfSolvePercentage = vaUtils.toPercentageDisplayValue(currentSelfSolveRate);
// Get previous stats
var previousPeriod = vaUtils.getPreviousPeriod(from_date, to_date);
requestBody.from_date = previousPeriod.fromDate;
requestBody.to_date = previousPeriod.toDate;
response = AnalyticsServiceInvoker.invoke("Session", "getAnalyticsSessionDynamicPropertyValues", requestBody);
response = response || {};
var previousSelfSolveRate = getSelfSolveRate(response);
var previousSelfSolveCount = getSelfSolveCount(response);
var changeInfo = '';
var difference = Math.abs(currentSelfSolveCount - previousSelfSolveCount);
if (difference > 0) {
changeInfo = vaUtils.numFormatter(difference) + '';
var selfSolveRateDiff = Math.abs(currentSelfSolveRate - previousSelfSolveRate);
if (previousSelfSolveRate > 0 && selfSolveRateDiff > 0) {
var percentageChange = vaUtils.getDiffInPercentage(currentSelfSolveRate, previousSelfSolveRate);
var symbol = percentageChange.includes('-') ? '' : '+';
changeInfo += ' (' + symbol + percentageChange + ')';
}
}
var output = {
'selfSolveRate': currSelfSolvePercentage,
'change': changeInfo
};
CIAnalyticsLogger.getLogger('VADashboardMetrics').debugJson('getVASuccessTrend result - {}', output);
return output;
},
_getMetricCount: function(startDate, endDate) {
var count = 0;
var ga = new GlideAggregate("ssa_deflection_metric");
var query = "deflection_pattern.deflection_configuration.activity_context=7b43fb645383201033cdddeeff7b1246" + "^sys_created_onBETWEENjavascript:gs.dateGenerate('" + startDate + "','00:00:00')@javascript:gs.dateGenerate('" + endDate + "','23:59:59')";
ga.addEncodedQuery(query);
ga.addAggregate('COUNT');
ga.query();
if (ga.next())
count = parseInt(ga.getAggregate('COUNT'));
return count;
},
_getRecordsTrend: function(startDate, endDate) {
var ga = new GlideAggregate("ssa_deflection_metric");
var query = "deflection_pattern.deflection_configuration.activity_context=7b43fb645383201033cdddeeff7b1246" + "^sys_created_onBETWEENjavascript:gs.dateGenerate('" + startDate + "','00:00:00')@javascript:gs.dateGenerate('" + endDate + "','23:59:59')";
ga.addEncodedQuery(query);
ga.addAggregate('COUNT');
ga.addTrend('sys_created_on', 'date');
ga.query();
var recordsTrend = {};
while (ga.next()) {
var date = new GlideDateTime(ga.getValue("timeref")).getDate();
recordsTrend[date] = parseInt(ga.getAggregate('COUNT'));
}
return recordsTrend;
},
_generateChartData: function(startDate, endDate, vaUtils) {
var deflectionTrendSeries = this._getRecordsTrend(startDate, endDate);
if (vaUtils.isEmpty(deflectionTrendSeries)) return [];
var dateBucket = vaUtils.getBucketType(vaUtils.getDays(startDate, endDate));
deflectionTrendSeries = vaUtils.addMissingDates(startDate, endDate, deflectionTrendSeries, dateBucket);
var result = vaUtils.transformTimeSeries(deflectionTrendSeries);
return result || [];
},
getDeflectionTrend: function(startDate, endDate) {
try {
var result = {
total_deflection_metrics_count: 0,
change: '',
chartData: []
};
var vaUtils = new sn_ci_analytics.VADashboardUtils();
if (!vaUtils.isValidDate(startDate) || !vaUtils.isValidDate(endDate)) {
return result;
}
var previousPeriod = vaUtils.getPreviousPeriod(startDate, endDate);
var currentMetricCount = this._getMetricCount(startDate, endDate);
var previousMetricCount = this._getMetricCount(previousPeriod.fromDate, previousPeriod.toDate);
var changeText = vaUtils.getChangeInfoTextForScoreCard(currentMetricCount, previousMetricCount);
result = {
total_deflection_metrics_count: currentMetricCount + '',
change: changeText,
chartData: this._generateChartData(startDate, endDate, vaUtils)
};
return result;
} catch (e) {
var message = "VADashboardMetrics: Exception while fetching deflection metric count " + e.message;
if (e.stack)
message = message + "\n" + e.stack;
CIAnalyticsLogger.getLogger('VADashboardMetrics').error(message);
}
},
sortEachCategoryTopicData: function(refMap, key) {
var occurance = Object.keys(refMap[key]);
var refMapObj = refMap[key];
occurance.sort();
occurance.reverse();
var results = [];
for (var i = 0; i < occurance.length; i++) {
results = results.concat(refMapObj[occurance[i]]);
}
return results;
},
getTopicData: function(startDate, endDate) {
var body = {
from_date: startDate,
to_date: endDate,
event_type_filter: "Topic"
};
var response = AnalyticsServiceInvoker.invoke("Event", "getAnalyticsEventPropertyValues", body);
response = response && response[body.event_type_filter];
var results = {
all: {},
underperformed_topics: {},
not_completed: {},
};
var getOccurrenceCount = function(data) {
for (var i in data) return data[i];
};
for (var topic in response) {
var topicData = response[topic];
var subCategory = topicData && topicData['Sub Category'];
if (subCategory && subCategory['STANDARD']) {
var topicId = topicData['Topic Id'];
var occurrenceCount = topicId && getOccurrenceCount(topicId);
var lastNodeVisited = topicData['Last Node Visited'];
var liveAgentTransfer = topicData['Live Agent Transfer'];
var completedCount = lastNodeVisited && lastNodeVisited['true'];
var notCompletedCount = lastNodeVisited && lastNodeVisited['false'];
var liveAgentTransferCount = liveAgentTransfer && liveAgentTransfer['true'];
var record = {
topic_name: topic,
occurrence: occurrenceCount,
completed: completedCount,
not_completed: notCompletedCount,
live_agent_transferred: liveAgentTransferCount
};
if (results.all[occurrenceCount]) {
results.all[occurrenceCount].push(record)
} else {
results.all[occurrenceCount] = [record];
}
if (liveAgentTransferCount && results.underperformed_topics[liveAgentTransferCount]) {
results.underperformed_topics[liveAgentTransferCount].push(record)
} else if (liveAgentTransferCount) {
results.underperformed_topics[liveAgentTransferCount] = [record];
}
if (notCompletedCount && results.not_completed[notCompletedCount]) {
results.not_completed[notCompletedCount].push(record)
} else if (notCompletedCount) {
results.not_completed[notCompletedCount] = [record];
}
}
};
var result = {
idle_topics: this.sortEachCategoryTopicData(results, 'all'),
underperformed_topics: this.sortEachCategoryTopicData(results, 'underperformed_topics'),
not_completed: this.sortEachCategoryTopicData(results, 'not_completed'),
};
return result;
},
getEventsData: function(startDate, endDate, cardType, limit) {
var result = this.getTopicData(startDate, endDate);
var topItems = [];
if (cardType == "topics_transferred_to_human_agent") {
for (var i = 0; i < limit; i++) {
if (result.underperformed_topics[i] && result.underperformed_topics[i].topic_name && result.underperformed_topics[i].live_agent_transferred) {
var topic = {};
topic.title = result.underperformed_topics[i].topic_name;
topic.count = result.underperformed_topics[i].live_agent_transferred;
topItems.push(topic);
}
}
}
if (cardType == "topics_not_completed_by_user") {
for (var i = 0; i < limit; i++) {
if (result.not_completed[i] && result.not_completed[i].topic_name && result.not_completed[i].not_completed) {
var topic = {};
topic.title = result.not_completed[i].topic_name;
topic.count = result.not_completed[i].not_completed;
topItems.push(topic);
}
}
}
if (cardType == "topics_least_used") {
if (result.idle_topics) {
result.idle_topics.reverse();
for (var i = 0; i < limit; i++) {
if (result.idle_topics[i] && result.idle_topics[i].topic_name) {
var topic = {};
topic.title = result.idle_topics[i].topic_name;
topItems.push(topic);
}
}
}
}
return topItems;
},
type: 'VADashboardMetrics'
};
Sys ID
82fa186153960110d365ddeeff7b12d8