Name
global.WorkItemStatsProvider
Description
Implements extension point global.AWAStatsStore Extension point to store stats in AWAQueueStats,AWAChannelStats and AWAInstranceStats tables
Script
var WorkItemStatsProvider = Class.create();
WorkItemStatsProvider.prototype = {
initialize: function() {},
_addValueToKey: function(map, key, property, value) {
map[key] = map[key] || {};
map[key][property] = value;
},
_query: function(table, encodedQuery, query, groupBy, aggr) {
var ga = new GlideAggregate(table);
if (encodedQuery) ga.addEncodedQuery(encodedQuery);
if (query) ga.addQuery(query);
if (aggr) ga.addAggregate(aggr);
if (groupBy) ga.groupBy(groupBy);
ga.query();
return ga;
},
_queryAndPopulate: function(table, encodedQuery, query, groupBy, aggr, map, column) {
var ga = this._query(table, encodedQuery, query, groupBy, aggr);
while (ga.next())
this._addValueToKey(map, ga.getValue(groupBy), column, ga.getAggregate(aggr));
},
getQueueStats: function(queueVsGroups, windowStartTime, windowEndTime) {
var map = {};
var queueStats = {};
var statDefaultValue = {
agents_available: 0,
work_items_queued: 0,
work_items_pending: 0,
work_items_offered_in_last_five_minutes: 0,
work_items_created: 0,
work_items_accepted: 0,
work_items_cancelled: 0,
average_wait_time_accepted: 0,
average_wait_time: 0,
service_channel_name: ""
};
for (var queue in queueVsGroups) {
var ga = new GlideRecord('sys_user_grmember');
ga.addQuery('group', "IN", queueVsGroups[queue]);
var grSQ = ga.addJoinQuery('awa_agent_presence', 'user', 'agent');
grSQ.addCondition('current_presence_state.active', true);
grSQ.addCondition('current_presence_state.available_to_receive_work_items', true);
ga.query();
var agents = [];
while (ga.next()) {
var agent = ga.getValue('user');
if (agents.indexOf(agent) == -1)
agents.push(agent);
}
queueStats[queue] = {
"agents_available": agents.length
};
}
var queueGr = new GlideRecord('awa_queue');
queueGr.addActiveQuery();
queueGr.addQuery('service_channel.active', true);
queueGr.query();
while (queueGr.next()) {
this._addValueToKey(queueStats, queueGr.getValue('sys_id'), "service_channel_name", queueGr.service_channel.name.toString());
this._addValueToKey(queueStats, queueGr.getValue('sys_id'), "average_wait_time", queueGr.average_wait_time.getGlideObject().getNumericValue() / 1000);
}
this._queryAndPopulate('awa_work_item', 'state=queued^sys_created_onRELATIVEGE@hour@ago@24', null, 'queue', 'COUNT', queueStats, 'work_items_queued');
this._queryAndPopulate('awa_work_item', 'state=pending_accept^sys_created_onRELATIVEGE@hour@ago@24', null, 'queue', 'COUNT', queueStats, 'work_items_pending');
this._queryAndPopulate('awa_work_item', 'offered_onRELATIVEGE@minute@ago@5', null, 'queue', 'COUNT', queueStats, 'work_items_offered_in_last_five_minutes');
var dateQuery = "sys_created_on>=" + windowStartTime.getValue() + '^' + 'sys_created_on<=' + windowEndTime.getValue();
this._queryAndPopulate('awa_work_item', null, dateQuery, 'queue', 'COUNT', queueStats, 'work_items_created');
dateQuery = "sys_updated_on>=" + windowStartTime.getValue() + '^' + 'sys_updated_on<=' + windowEndTime.getValue();
var workItemsAccepted = new GlideAggregate('awa_work_item');
workItemsAccepted.addQuery(dateQuery);
workItemsAccepted.addEncodedQuery('state=accepted');
workItemsAccepted.groupBy('queue');
workItemsAccepted.addAggregate('COUNT');
workItemsAccepted.addAggregate('AVG', 'wait_time');
workItemsAccepted.query();
while (workItemsAccepted.next()) {
this._addValueToKey(queueStats, workItemsAccepted.getValue('queue'), "work_items_accepted", workItemsAccepted.getAggregate('COUNT'));
this._addValueToKey(queueStats, workItemsAccepted.getValue('queue'), "average_wait_time_accepted",
new GlideDuration(workItemsAccepted.getAggregate('AVG', 'wait_time')).getNumericValue() / 1000);
}
this._queryAndPopulate('awa_work_item', 'state=cancelled', dateQuery, 'queue', 'COUNT', queueStats, 'work_items_cancelled');
map["queueStats"] = queueStats;
map["statDefaultValue"] = statDefaultValue;
return map;
},
getChannelStats: function(channelVsGroups, windowStartTime, windowEndTime) {
var map = {};
var channelStats = {};
var statDefaultValue = {
agents_available: 0,
agents_available_with_capacity: 0
};
for (var channel in channelVsGroups) {
var userGroupGR = new GlideRecord('sys_user_grmember');
var agentPresenceSQ = userGroupGR.addJoinQuery('awa_agent_presence', 'user', 'agent');
userGroupGR.addQuery('group', "IN", channelVsGroups[channel]);
agentPresenceSQ.addCondition('current_presence_state.active', true);
agentPresenceSQ.addCondition('current_presence_state.available_to_receive_work_items', true);
userGroupGR.query();
var agents = [];
while (userGroupGR.next()) {
var agent = userGroupGR.getValue('user');
if (agents.indexOf(agent) == -1)
agents.push(agent);
}
var agentCapacityGR = new GlideRecord('awa_agent_capacity');
agentCapacityGR.addQuery('channel', channel);
agentCapacityGR.addQuery('user', 'IN', agents);
agentCapacityGR.query();
var usersWithCapacity = 0;
while (agentCapacityGR.next()) {
var capacity = agentCapacityGR.getValue('max_capacity') ? agentCapacityGR.getValue('max_capacity') : agentCapacityGR.getElement('channel.default_capacity').getValue();
var load = agentCapacityGR.getValue('workload') ? agentCapacityGR.getValue('workload') : 0;
if (load < capacity)
usersWithCapacity++;
}
this._addValueToKey(channelStats, channel, "agents_available", agents.length);
this._addValueToKey(channelStats, channel, "agents_available_with_capacity", usersWithCapacity);
}
map["channelStats"] = channelStats;
map["statDefaultValue"] = statDefaultValue;
return map;
},
getInstanceStats: function(windowStartTime, windowEndTime) {
var map = {};
var numberOfAgents = new GlideRecord('awa_agent_presence');
numberOfAgents.addQuery('current_presence_state.active', true);
numberOfAgents.addQuery('current_presence_state.available_to_receive_work_items', true);
numberOfAgents.query();
var agentsCount = numberOfAgents.getRowCount();
var agentCapacity = new GlideRecord('awa_agent_capacity');
agentCapacity.addQuery('channel.active', true);
var agentCapacitySQ = agentCapacity.addJoinQuery('awa_agent_presence', 'user', 'agent');
agentCapacitySQ.addCondition('current_presence_state.active', true);
agentCapacitySQ.addCondition('current_presence_state.available_to_receive_work_items', true);
agentCapacity.query();
var agentsWithCapacity = 0;
while (agentCapacity.next()) {
var maxCapacity = agentCapacity.getValue('max_capacity') ? agentCapacity.getValue('max_capacity') : agentCapacity.getElement('channel.default_capacity').getValue();
var workload = agentCapacity.getValue('workload') ? agentCapacity.getValue('workload') : 0;
if (workload < maxCapacity)
agentsWithCapacity++;
}
map["agents_available"] = agentsCount;
map["agents_available_with_capacity"] = agentsWithCapacity;
return map;
},
type: 'WorkItemStatsProvider'
};
Sys ID
a0e3225408c8e010f87745f2e6bc9ad0