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

Offical Documentation

Official Docs: