Name

sn_grc.ManualIndicatorStrategyBase

Description

Manual indicator strategy

Script

var ManualIndicatorStrategyBase = Class.create();
ManualIndicatorStrategyBase.prototype = Object.extendsObject(IndicatorStrategy, {

  addExceedsErrorMessage: function() {
      this._addExceedsErrorMessage();
  },

  addResult: function(passed, valueType, value, taskId, target_type, target) {
      this._addResult(passed, valueType, value, taskId, target_type, target);
  },

  maxNumIndicatorTasksExceeded: function() {
      return this._maxNumIndicatorTasksExceeded();
  },

  notifyMaxNumIndicatorTasksExceeded: function() {
      this._notifyMaxNumIndicatorTasksExceeded();
  },

  run: function() {
      return this._run();
  },

  _addExceedsErrorMessage: function() {
      gs.addErrorMessage(gs.getMessage('There are too many open indicator tasks. No task was created.'));
  },

  _addResult: function(passed, valueType, value, taskId, target_type, target) {
      var resultId = IndicatorStrategy.prototype.addResult.apply(this, arguments);
      this._attachSupportingDataToResult(resultId, taskId);
  },

  _attachSupportingDataToResult: function(resultId, taskId) {
      var supportingData = new GlideRecord('sn_grc_indicator_supporting_data');
      supportingData.addQuery('task', taskId);
      supportingData.result = resultId;
      supportingData.updateMultiple();
  },

  _maxNumIndicatorTasksExceeded: function() {
      var maxNumberOfIndicatorTasks = parseInt(gs.getProperty('sn_grc.max_open_indicator_tasks', '1000'));
      if (isNaN(maxNumberOfIndicatorTasks))
          maxNumberOfIndicatorTasks = 1000;
  	
  	var indTasks = new GlideAggregate('sn_grc_indicator_task');
  	indTasks.addAggregate('COUNT');
  	indTasks.addEncodedQuery('state=1^ORstate=2');
  	indTasks.query();
  	indTasks.next();
  	return indTasks.getAggregate('COUNT') >= maxNumberOfIndicatorTasks;
  },

  _notifyMaxNumIndicatorTasksExceeded: function() {
      var users = [];
      var grUserRoles = new GlideRecord('sys_user_has_role');
      grUserRoles.addQuery('role', '93e2b4c2cb200200829cf865734c9cac'); //GRC manager
      grUserRoles.query();
      while (grUserRoles.next())
          users.push(grUserRoles.getValue('user'));

      gs.eventQueue("sn_grc.max_tasks_exceeded", null, users + '');
  },

  _run: function() {
      var taskId = '';
      if (this.maxNumIndicatorTasksExceeded()) {
          this.addExceedsErrorMessage();
          return 'exceed';
      }

      var indicatorTask = new GlideRecord('sn_grc_indicator_task');
      indicatorTask.assigned_to = this.indicatorRecord.item.owner;
      indicatorTask.short_description = gs.getMessage("Task for {0}", this.indicatorRecord.name);
      indicatorTask.instructions = this._formatInstructions(this.indicatorRecord.instructions + '');
      indicatorTask.indicator = this.indicatorRecord.sys_id + '';
      taskId = indicatorTask.insert();
      if (taskId) {
          gs.addInfoMessage(gs.getMessage('An indicator task has been created.'));
          if (this.indicatorRecord.supporting_data)
              this.collectSupportingData(null, taskId);
      }
  	
      return taskId;
  },

  _formatInstructions: function(input) {

      if (!input)
          return "";

      var arr = input.split("\n");
      var output = "";
      for (var i = 0; i < arr.length; i++) {
          var spaces = "";
          for (var j = arr[i].search(/\S/); j > 0; j--) {
              spaces = spaces + '&nbsp;';
          }
          output = output + spaces + arr[i].trim() + '<br>';
      }
      return output.slice(0, -4);
  },

  type: 'ManualIndicatorStrategyBase'
});

Sys ID

3d012e92d7320200bbc783e80e6103a5

Offical Documentation

Official Docs: