Name
global.AutoResolutionAPIHelper
Description
No description available
Script
var AutoResolutionAPIHelper = Class.create();
AutoResolutionAPIHelper.HR_AVG_CASE_COST_PROPERTY = "sn_iar_hr.avg_case_cost";
AutoResolutionAPIHelper.HR_AVG_RESOLUTION_TIME_PROPERTY = "sn_iar_hr.avg_agent_resolution_time";
/**
* Validate the passed inputs
* @param tableName
* @param numOfDays
* @returns {boolean}
*/
AutoResolutionAPIHelper.validateInputs = function (tableName, numOfDays) {
if (gs.nil(tableName) ||
!AutoResolutionAPIHelper.validateTaskTable(tableName) ||
gs.nil(AutoResolutionUtil.getConfigurationForTask(tableName)))
return false;
if (gs.nil(numOfDays) || !isNaN(numOfDays) <= 0)
return false;
return true;
};
AutoResolutionAPIHelper.validateTaskTable = function(tableName) {
var list = GlideDBObjectManager.get().getTableExtensions("task");
return (list.indexOf(tableName) >= 0);
};
/**
* Returns Number of context records processed for the given task table and duration
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getCasesProcessedCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns number of IAR context records that are in *processed* state for the given task table and duration
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getDeflectableCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("task_processing_state", AutoResolutionConstants.TASK_PROCESSING_STATE.PROCESSED);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns number of IAR context records that are in processed state and notification state is accepted for the given
* task table and duration
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getReviewedCaseCount = function (tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("task_processing_state", AutoResolutionConstants.TASK_PROCESSING_STATE.PROCESSED);
ga.addQuery("notification_state", "accepted");
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
}
/**
* Returns number of context records that have task_resolved=true for the given task table and duration
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getResolvedCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("task_resolved", true);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns the number of unique topics that were picked as a matched topic for the intents
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getUniqueTopicsCount = function(tableName, days) {
var topicsCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("intent_topic_state", AutoResolutionConstants.INTENT_TOPIC_STATE.FOUND_MATCHED_TOPIC);
ga.addNotNullQuery("matched_topic");
ga.groupBy("matched_topic");
ga.query();
while (ga.next())
topicsCount++;
return topicsCount;
};
/**
* Returns the number of context records that has a matched intent and a corresponding matched topic
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getMatchedIntentsCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addNotNullQuery("nlu_intent");
ga.addQuery("intent_topic_state", AutoResolutionConstants.INTENT_TOPIC_STATE.FOUND_MATCHED_TOPIC);
ga.addQuery("task_processing_state", AutoResolutionConstants.TASK_PROCESSING_STATE.PROCESSED);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns the number of context records that has no matched intent but a corresponding topic (AI Search Display topic)
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getAISearchResultsCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("intent_topic_state", AutoResolutionConstants.INTENT_TOPIC_STATE.NO_INTENT);
ga.addNotNullQuery("matched_topic");
ga.addQuery("task_processing_state", AutoResolutionConstants.TASK_PROCESSING_STATE.PROCESSED);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns the number of context records that has an intent but no matched topic
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getMatchedIntentsWithNoTopicsCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addNotNullQuery("nlu_intent");
ga.addQuery("intent_topic_state", AutoResolutionConstants.INTENT_TOPIC_STATE.NO_MATCHED_TOPIC);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns the number of context records which has a matched topic but notification couldn't be delivered
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getMatchedTopicsWithNotificationsNotDeliveredCaseCount = function(tableName, days) {
var caseCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addQuery("intent_topic_state", AutoResolutionConstants.INTENT_TOPIC_STATE.FOUND_MATCHED_TOPIC);
ga.addNotNullQuery("matched_topic");
ga.addQuery("task_processing_state", AutoResolutionConstants.TASK_PROCESSING_STATE.NOTIFICATION);
ga.addAggregate("COUNT");
ga.query();
if (ga.next())
caseCount = ga.getAggregate("COUNT");
return caseCount;
};
/**
* Returns a json with the count for each feedback type for AI Search results
* @param {string} tableName
* @param {number} days
* @returns {{}}
*/
AutoResolutionAPIHelper.getFeedbackCountForCases = function(tableName, days) {
var results = {};
results.positive = 0;
results.negative = 0;
results.no_feedback = 0;
var feedbackCount = 0;
var ga = new GlideAggregate(AutoResolutionConstants.AI_SEARCH_RESULT_TABLE_NAME);
ga.addNotNullQuery("ar_context");
ga.addQuery("task_table", tableName);
ga.addQuery("sys_created_on", ">=", getDateTime(days));
ga.groupBy("feedback_type");
ga.addAggregate("COUNT");
ga.query();
while (ga.next()) {
feedbackCount = ga.getAggregate("COUNT");
var feedbackType = ga.getValue("feedback_type");
// nil/empty feedback is considered as no_feedback
if (gs.nil(feedbackType))
results.no_feedback = feedbackCount;
else if (feedbackType === "helpful")
results.positive = feedbackCount;
else if(feedbackType === "not_helpful")
results.negative = feedbackCount;
}
return results;
};
/**
* Returns a json with the count for notification delivered on each response channel
* @param {string} tableName
* @param {number} days
* @returns {{}}
*/
AutoResolutionAPIHelper.getNotificationsDeliveredCountForCases = function(tableName, days) {
var results = {};
var emailCount = 0;
var smsCount = 0;
var vaCount = 0;
var ga = initializeContextGA(tableName, days);
ga.addNotNullQuery("response_channels");
ga.groupBy("response_channels");
ga.query();
while (ga.next()) {
var responseChannels = ga.getValue("response_channels");
var respChannelList = responseChannels.split(",");
for (var i = 0; i < respChannelList.length; i++) {
switch (respChannelList[i]) {
case AutoResolutionNotificationHelper.RESPONSE_CHANNEL["EMAIL"]:
emailCount++;
break;
case AutoResolutionNotificationHelper.RESPONSE_CHANNEL["SMS"]:
smsCount++;
break;
case AutoResolutionNotificationHelper.RESPONSE_CHANNEL["VA"]:
vaCount++;
break;
default:
gs.warn("Unsupported response channel for IAR");
break;
}
}
}
results[AutoResolutionNotificationHelper.RESPONSE_CHANNEL["EMAIL"]] = emailCount;
results[AutoResolutionNotificationHelper.RESPONSE_CHANNEL["SMS"]] = smsCount;
results[AutoResolutionNotificationHelper.RESPONSE_CHANNEL["VA"]] = vaCount;
return results;
};
/**
* Returns the total number of hours saved by IAR by multiplying the mean time to resolution (retrieved by the system property)
* with the number of cases processed by IAR
* @param {string}tableName
* @param {number}days
* @returns {number}
*/
AutoResolutionAPIHelper.getHoursSaved = function(tableName, days) {
try {
var avgResolutionTime = Number(gs.getProperty(AutoResolutionAPIHelper.HR_AVG_RESOLUTION_TIME_PROPERTY, 8));
var casesProcessedCount = AutoResolutionAPIHelper.getResolvedCaseCount(tableName, days);
return avgResolutionTime * casesProcessedCount;
} catch (ex) {
gs.warn("Unexpected exception while computing hours saved for IAR: " + ex);
return 0;
}
};
/**
* Returns the total cost saved by multiplying the hours saved and avg case cost retrieved by a system property
* @param {string} tableName
* @param {number} days
* @returns {number}
*/
AutoResolutionAPIHelper.getCostSaved = function(tableName, days) {
var hoursSaved = AutoResolutionAPIHelper.getHoursSaved(tableName, days);
var avgCost = Number(gs.getProperty(AutoResolutionAPIHelper.HR_AVG_CASE_COST_PROPERTY, 15));
try {
return hoursSaved * avgCost;
} catch (ex) {
gs.warn("Unexpected exception while computing cost saved for IAR: " + ex);
return 0;
}
};
/**
*
* @param configSysId
* @returns {*[]}
*/
AutoResolutionAPIHelper.getActiveResponseChannelsByConfiguration = function(configSysId) {
var activeResponseChannels = [];
var responseChannelGr = new GlideRecord(AutoResolutionConstants.RESPONSE_CHANNEL_TABLE_NAME);
responseChannelGr.addQuery("configuration", configSysId);
responseChannelGr.addActiveQuery();
responseChannelGr.query();
while (responseChannelGr.next())
activeResponseChannels.push(responseChannelGr.getValue("response_channel"));
return activeResponseChannels;
};
/**
*
* @param {string}tableName
* @param {number}days
* @returns {GlideAggregate}
*/
function initializeContextGA(tableName, days) {
var ga = new GlideAggregate(AutoResolutionConstants.CONTEXT_TABLE_NAME);
ga.addQuery("sys_class_name", AutoResolutionConstants.CONTEXT_TABLE_NAME);
ga.addNotNullQuery("task"); // in case the task gets deleted by mistake
ga.addQuery("task.sys_class_name", tableName);
ga.addQuery("sys_created_on", ">=", getDateTime(days));
return ga;
}
/**
* Construct the date time for the number of days passed
* @param {number} numOfDays
* @returns {GlideDateTime}
*/
function getDateTime(numOfDays) {
var gdt = new GlideDateTime();
gdt.addDaysUTC(-numOfDays);
return gdt;
}
Sys ID
6da5a1f5773a0110f14a24f1cd5a99ec