Name

sn_ci_analytics.CAOOBEventProcessor

Description

No description available

Script

var CAOOBEventProcessor = Class.create();
CAOOBEventProcessor.prototype = {
  initialize: function() {
      this.logger = CIAnalyticsLogger.getLogger("CAOOBEventProcessor");
      this.events = [];
      this.nonOverriddenEvents = this.getNonOverriddenOOBEvents();
  },

  getNonOverriddenOOBEvents: function() {
      var oobEvents = OOBEvents.getEvents();
      var rec = new GlideRecord('sn_ci_analytics_event');
      rec.addQuery();
      rec.query();
      while (rec.next()) {
          var eventType = rec.getValue('type');
          var isActive = Number(rec.getValue('active'));
          if (isActive && oobEvents[eventType]) {
              this.logger.info('"{0}" event overridden', eventType);
              delete oobEvents[eventType];
          }
      }
      return oobEvents;
  },

  process: function(payloadBuilder) {
      var conversation = payloadBuilder.getConversation();
      var conversationId = conversation.Id;
      var sharedData = payloadBuilder.getSharedData();
      var nonOverrides = this.nonOverriddenEvents;
      Object.keys(nonOverrides).forEach(function(key) {
          if (nonOverrides[key]) {
              var events = nonOverrides[key].getEvents(conversationId, sharedData) || [];
              events.forEach(function(event) {
                  payloadBuilder.getConversation()['Events'].push(event);
              });
          }
      });
  },

  type: 'CAOOBEventProcessor'
};

var OOBEvents = {
  getEvents: function() {
      return {
          'Bot Output': this.BOT_OUTPUT_EVENT,
          'User Input VA': this.USER_INPUT_EVENT,
          'Agent Zero Usage': this.ISSUE_AUTO_RESOLUTION_EVENT,
          'LA Escalation': this.SWITCH_LIVE_AGENT_MESSAGE_EVENT,
          'LA Message': this.LIVE_AGENT_MESSGE_EVENT,
          'User Input LA': this.USER_LIVE_AGENT_MESSAGE_EVENT,
          'Actionable Notification': this.ACTIONABLE_NOTIFICATION_EVENT,
          'Integration Hub': this.INTEGRATIONHUB_EVENT
      };
  },

  //DEF0179725 If actionable notification created before conversation set time to conversation creation time
  _getTime: function(creationTime, sharedData, params) {
      var time = creationTime - sharedData.conversation_startTime_mills;
      if (time < 0) {
          params.push(time);
          new CAOOBEventProcessor().logger.warn("Conversation Id: {0}, Negative time {2} has been found for {1} event", params);
          return 0;
      }

      return time;
  },

  BOT_OUTPUT_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'Bot Output';
          var rec = new GlideRecord('sys_cs_message');
          rec.addEncodedQuery('conversation=' + conversationId + "^direction=outbound^is_agent=false^message_type!=action^EQ");
          rec.query();
          while (rec.next()) {
              var event = {
                  Properties: {}
              };
              var messageType = rec.message_type;
              var controlType;
              if (messageType == 'text')
                  controlType = messageType;
              else {
                  try {
                      var payload = JSON.parse(rec.payload);
                      controlType = payload.uiType;
                  } catch (err) {
                      // Fallback to text type processing
                      controlType = messageType;
                      var errorMessage = "Processing failed for message: " + rec.sys_id + " " + err.message;
                      CIAnalyticsLogger.getLogger("CAOOBEventProcessor").error(errorMessage);
                  }
              }
              event['Type'] = type;
              event['Name'] = 'Bot Output';
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'Bot Output'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['Control Type'] = CAUtil.toString(controlType);
              events.push(event);
          }
          return events;
      }
  },

  INTEGRATIONHUB_EVENT: {
      getEvents: function(conversationId, sharedData) {
          function filterInternalTopicBlock(rec) {
              var callingTaskTopicType = CAUtil.toString(rec.calling_cs_conversation_task.topic_type.type);
              var callingTaskParentTopicType = CAUtil.toString(rec.calling_cs_conversation_task.calling_task.topic_type.type);
              if (callingTaskTopicType == 'TOPIC_BLOCK' && callingTaskParentTopicType == 'SETUP_TOPIC')
                  return true;
              return false;
          }
          var events = [];
          var type = 'Integration Hub';
          var rec = new GlideRecord('sys_cs_fdih_invocation');
          rec.addEncodedQuery('calling_cs_conversation_task.conversation=' + conversationId);
          rec.query();
          while (rec.next()) {
              if (filterInternalTopicBlock(rec))
                  continue;
              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              var gr = new GlideRecord(rec.api_source);
              gr.get(rec.api);
              var spoke = CAUtil.toString(gr.sys_scope.getDisplayValue());
              event['Name'] = spoke;
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'Integration Hub'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              var name = CAUtil.toString(gr.getValue('name'));
              event['Properties']['Action'] = name;
              event['Properties']['Spoke'] = spoke;
              event['Properties']['Topic Name'] = CAUtil.toString(rec.calling_cs_conversation_task.topic_type.name);
              event['Properties']['Type'] = CAUtil.toString(rec.type);
              events.push(event);
          }
          return events;
      },
  },

  ACTIONABLE_NOTIFICATION_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'Actionable Notification';
          var rec = new GlideRecord('sys_cs_notification');
          rec.addEncodedQuery('conversation=' + conversationId);
          rec.query();
          while (rec.next()) {
              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              event['Name'] = 'Actionable Notification';
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'Actionable Notification'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['State'] = CAUtil.toString(rec.state) == 'completed' ? 'Engaged' : 'Expired';
              events.push(event);
          }
          return events;
      },
  },

  SWITCH_LIVE_AGENT_MESSAGE_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'LA Escalation';
          var rec = new GlideRecord('sys_cs_conversation');
          rec.addEncodedQuery('sys_id=' + conversationId + "^live_agent_transfer_timeISNOTEMPTY^EQ");
          rec.query();
          while (rec.next()) {
              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              event['Name'] = 'Switched To Live Agent';
              var liveAgentTransferTime = new GlideDateTime(rec.getValue('live_agent_transfer_time')).getNumericValue();
              var params = [conversationId, 'LA Escalation'];
              event['Time'] = OOBEvents._getTime(liveAgentTransferTime, sharedData, params);
              events.push(event);
          }
          return events;
      },
  },

  USER_LIVE_AGENT_MESSAGE_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'User Input LA';
          var rec = new GlideRecord('sys_cs_message');
          rec.addEncodedQuery('conversation=' + conversationId + "^direction=outbound^message_type!=action^task.topic_type=ef989365c32013009cbbdccdf3d3ae53^EQ");
          rec.query();
          while (rec.next()) {
              var controlType;
              var selectedType;
              var messageType = rec.message_type;
              if (messageType == 'text') {
                  controlType = messageType;
                  selectedType = rec.payload;
              } else {
                  var payload = JSON.parse(rec.payload);
                  controlType = payload.uiType;
                  if (controlType == "OutputLink")
                      selectedType = payload.uiMetadata.label;
                  else
                      selectedType = payload.value;
              }
              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              event['Name'] = 'User Live Agent Message';
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'User Input LA'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['Control Type'] = CAUtil.toString(controlType);
              event['Properties']['Selected Value'] = CAUtil.toString(selectedType);
              events.push(event);
          }
          return events;
      },
  },

  ISSUE_AUTO_RESOLUTION_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'Agent Zero Usage';
          var rec = new GlideRecord('sys_cs_auto_resolution_context');
          rec.addEncodedQuery('interaction.channel_metadata_document=' + conversationId);
          rec.query();
          while (rec.next()) {
              var event = {
                  Properties: {}
              };
              event['Name'] = 'Issue Auto Resolution';
              event['Type'] = type;
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'Agent Zero Usage'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['Acceptance Rate'] = CAUtil.toString(rec.notification_state);
              event['Properties']['Topic End State'] = sharedData.conversation_end_state;
              event['Properties']['Topic Name'] = CAUtil.toString(rec.matched_topic.name);
              var usage = rec.task_resolved ? "Resolved" : "Unresolved";
              event['Properties']['Usage'] = CAUtil.toString(usage);
              events.push(event);
          }
          return events;
      },
  },

  USER_INPUT_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'User Input VA';
          var rec = new GlideRecord('sys_cs_message');
          rec.addEncodedQuery('conversation=' + conversationId + "^direction=inbound^is_agent=false^message_type!=action^task.topic_type!=ef989365c32013009cbbdccdf3d3ae53^EQ");
          rec.query();
          while (rec.next()) {
              var messageType = rec.message_type;
              var uiType, selectedType;
              if (messageType == 'text') {
                  uiType = messageType;
                  selectedType = rec.payload;
              } else {
                  try {
                      var payload = JSON.parse(rec.payload);
                      uiType = payload.uiType;
                      if (uiType == "TopicPickerControl" && !payload.searchText)
                          continue;

                      if (uiType == "TopicPickerControl") {
                          selectedType = payload.searchText;
                      } else {
                          selectedType = payload.value;
                      }
                  } catch (err) {
                      // Fallback to text type processing
                      uiType = messageType;
                      selectedType = rec.payload;
                      var errorMessage = "Processing failed for message: " + rec.sys_id + " " + err.message;
                      CIAnalyticsLogger.getLogger("CAOOBEventProcessor").error(errorMessage);
                  }
              }

              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              event['Name'] = 'User Input Event';
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'User Input VA'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['Control Type'] = CAUtil.toString(uiType);
              event['Properties']['Selected Value'] = CAUtil.toString(selectedType);
              events.push(event);
          }
          return events;
      },
  },

  LIVE_AGENT_MESSGE_EVENT: {
      getEvents: function(conversationId, sharedData) {
          var events = [];
          var type = 'LA Message';
          var rec = new GlideRecord('sys_cs_message');
          rec.addEncodedQuery('conversation=' + conversationId + "^direction=outbound^is_agent=true^message_type!=action^EQ");
          rec.query();

          function controlType(rec) {
              var messageType = rec.message_type;
              if (messageType == 'text')
                  return messageType;
              var payload = JSON.parse(rec.payload);
              return payload.uiType;
          }
          while (rec.next()) {
              var event = {
                  Properties: {}
              };
              event['Type'] = type;
              event['Name'] = 'Live Agent Message';
              var creationTime = new GlideDateTime(rec.getValue('sys_created_on')).getNumericValue();
              var params = [conversationId, 'LA Message'];
              event['Time'] = OOBEvents._getTime(creationTime, sharedData, params);
              event['Properties']['Control Type'] = CAUtil.toString(controlType(rec));
              events.push(event);
          }
          return events;
      },
  },
};

Sys ID

cd6705d4731120107d804c9885f6a7c0

Offical Documentation

Official Docs: