Name

sn_grc.IndicatorGeneratorEngineBase

Description

Base utilities for generating and updating indicators

Script

var IndicatorGeneratorEngineBase = Class.create();
IndicatorGeneratorEngineBase.prototype = {
  initialize: function() {},

  generateIndicatorFromTemplate: function(templateId, itemId) {
      this._createIndicator(templateId, itemId);
  },

  generateBulkIndicatorsFromTemplate: function(templateId, contentId) {
      this._createIndicators(templateId, contentId);
  },

  deactivateIndicatorsFromContent: function(templateId, contentId) {
      this._deactivateIndicatorsFromContent(templateId, contentId);
  },

  deactivateIndicatorsFromItem: function(templateId, itemId) {
      this._deactivateIndicatorsFromItem(templateId, itemId);
  },

  deactivateIndicatorsFromTemplate: function(templateId, operation) {
      this._deactivateIndicatorsFromTemplate(templateId, operation);
  },

  updatingIndicatorsInfoMessage: function(contentId, operation) {
      this._updatingIndicatorsInfoMessage(contentId, operation);
  },

  checkForControlObectiveRiskStatementInRelatedList: function(indicatorTemplate) {
      return this._checkForControlObectiveRiskStatementInRelatedList(indicatorTemplate);
  },

  _deactivateIndicatorsFromContent: function(templateId, contentId) {
      var indi = new GlideRecord('sn_grc_indicator');
      indi.addActiveQuery();
      indi.addQuery('type', '!=', 'config_test');
      indi.addQuery('template', templateId);
      indi.addQuery('item.content', contentId);
      indi.query();

      while (indi.next()) {
          indi.active = false;
          indi.update();
      }
  },

  _deactivateIndicatorsFromItem: function(templateId, itemId) {
      var indi = new GlideRecord('sn_grc_indicator');
      indi.addQuery('template', templateId);
      indi.addQuery('item', itemId);
      indi.query();

      while (indi.next()) {
          indi.active = false;
          indi.update();
      }
  },

  _deactivateIndicatorsFromTemplate: function(templateId, operation) {
      var gr = new GlideRecord('sn_grc_m2m_ind_temp_cont');
      gr.addQuery('indicator_template', templateId);
      gr.query();
      if (operation == 'delete') {
          while (gr.next()) {
              var contentId = gr.getValue('content');
              this._deactivateIndicatorsFromContent(templateId, contentId);
          }
      } else {
          while (gr.next()) {
              var contentId = gr.getValue('content');
              this._updatingIndicatorsInfoMessage(contentId, 'deactivate');
              gs.eventQueue('sn_grc.deactivate_bulk_indicators', null, templateId, contentId);
          }
      }
  },
  
  setIndicatorFields: function(indicator, template) {
  		this._setIndicatorFields(indicator,template);
  },

  updateIndicators: function(template) {
      // Get indicators created from this template with override false;
      var indicator = new GlideRecord('sn_grc_indicator');
      indicator.addQuery('template', template.getUniqueValue());
      indicator.addQuery('override_template', 'false');
      indicator.query();
      while (indicator.next()) {
          indicator = this._setIndicatorFields(indicator, template);
          indicator.update();
      }
  },

  setSchedulingFieldsToDefaultIfErrors: function(record) {
      switch (record.getValue('collection_frequency')) {
          case 'monthly':
              var dayOfMonth = parseInt(record.day_of_month);
              if (dayOfMonth < 0 || dayOfMonth > 31) {
                  gs.addInfoMessage(gs.getMessage('The day of the month has been set to default'));
                  record.setValue('day_of_month', 1);
              }
              break;
          case 'quarterly':
          case 'semi_annually':
              var todayDate = new GlideDateTime().getLocalDate();
              var nextRunDate = new GlideDateTime(record.getValue('next_run_time'));
              if (record.next_run_time.nil() || nextRunDate.getNumericValue() < todayDate.getNumericValue()) {
                  record.next_run_time = todayDate.getDisplayValue();
                  gs.addInfoMessage(gs.getMessage('The next run date has been set to default'));
              }
              break;
          case 'annually':
              if (!this._dayOfMonthInRange(record.month, record.day_of_month)) {
                  record.setValue('day_of_month', 1);
                  gs.addInfoMessage(gs.getMessage('The day of the month has been set to default'));
              }
      }
  },

  _dayOfMonthInRange: function(month, dayOfMonth) {
      var now = new GlideDateTime();
      now.setMonthLocalTime(parseInt(month));
      var daysInMonth = now.getDaysInMonthLocalTime();
      if (dayOfMonth < 0 || parseInt(dayOfMonth) > daysInMonth)
          return false;
      return true;
  },

  _createIndicators: function(templateId, contentId) {
      // Get the tempate
      var template = new GlideRecord('sn_grc_indicator_template');
      template.get(templateId);

      // Get items associated with the content
      var item = new GlideRecord('sn_grc_item');
      item.addQuery('content', contentId);
      item.query();

      // Create item for each item and associate it with the template
      while (item.next()) {
          this._createIndicator(templateId, item.getUniqueValue());
      }
  },

  _createIndicator: function(templateId, itemId) {
      // check if that indicator already exists
      var existingIndicator = new GlideRecord('sn_grc_indicator');
      existingIndicator.addQuery('template', templateId);
      existingIndicator.addQuery('item', itemId);
      existingIndicator.setLimit(1);
      existingIndicator.query();

      if (existingIndicator.next()) {
          if (!existingIndicator.active &&!existingIndicator.retired_manually) {
              existingIndicator.active = true;
              existingIndicator.update();
          }
          return;
      }

      var indicator = new GlideRecord('sn_grc_indicator');
      indicator.item = itemId;
      indicator.template = templateId;
  	indicator.inherit_fm_template = true;
      // Get the template record
     /* var template = new GlideRecord('sn_grc_indicator_template');
      if (!template.get(templateId)) {
          return;
      }*/

      // Get the template fields
     // indicator = this._setIndicatorFields(indicator, template);
      indicator.insert();
  },

  _updatingIndicatorsInfoMessage: function(contentId, operation) {
      var item = new GlideAggregate('sn_grc_item');
      item.addQuery('content', contentId);
      item.setLimit(1);
      item.query();
      if (!item.hasNext())
          return;

      var content = new GlideRecord('sn_grc_content');
      var table = '';
      if (content.get(contentId))
          table = content.sys_class_name + '';

      var GRCUtils = new sn_grc.GRCUtils();
      if (operation === 'deactivate') {
          if (table === 'sn_risk_definition')
              gs.addInfoMessage(GRCUtils.getMessage('indicator_deactivation_msg_rs'));
          else if (table === 'sn_compliance_policy_statement')
              gs.addInfoMessage(GRCUtils.getMessage('indicator_deactivation_msg_ps'));
      } else if (operation === 'activate') {
          if (table === 'sn_risk_definition')
              gs.addInfoMessage(GRCUtils.getMessage('indicator_generation_msg_rs'));
          else if (table === 'sn_compliance_policy_statement')
              gs.addInfoMessage(GRCUtils.getMessage('indicator_generation_msg_ps'));
      }

  },

  _setIndicatorFields: function(indicator, template) {

      var fields = ['name', 'type', 'table', 'reference_table', 'use_reference_field', 'reference_field', 'owner', 'owning_group', 'passed', 'collection_frequency', 'day_of_week', 'next_run_time', 'day_of_month', 'month', 'script', 'value_mandatory', 'short_description', 'instructions', 'supporting_data', 'criteria', 'supporting_data_fields', 'sample_size', 'issue_source', 'target', 'target_type', 'additional_criteria'];

      for (var i = 0; i < fields.length; i++) {
          var value = '';
          if (fields[i] == 'use_reference_field') {
              var gr = new GlideRecord('sn_grc_item');
              gr.get(indicator.item);
              if (!gr.profile.nil() && gr.profile.applies_to.nil()) {
                  indicator.setValue(fields[i], false);
                  indicator.setValue('reference_field', '');
              } else {
                  value = template.getValue(fields[i]);
                  indicator.setValue(fields[i], value ? value : '');
              }
          } else {
              value = template.getValue(fields[i]);
              indicator.setValue(fields[i], value ? value : '');
          }
      }
      return indicator;
  },

  _isInstanceOf: function(gr, tableName) {
      var hierarchy = new GlideTableHierarchy(gr).getHierarchy();
      return new global.ArrayUtil().contains(hierarchy, tableName);
  },

  _checkForControlObectiveRiskStatementInRelatedList: function(indicatorTemplate) {
      var m2mPresent = false;
      var indicatorPresent = false;
      var m2mRecord = new GlideRecord('sn_grc_m2m_ind_temp_cont');
      m2mRecord.addQuery('indicator_template', indicatorTemplate);
      m2mRecord.setLimit(1);
      m2mRecord.query();
      if (m2mRecord.next())
          m2mPresent = true;

      var indicator = new GlideRecord('sn_grc_indicator');
      indicator.addQuery('template', indicatorTemplate);
      indicator.setLimit(1);
      indicator.query();
      if (indicator.next())
          indicatorPresent = true;

      if (m2mPresent || indicatorPresent)
          return true;

      return false;
  },


  type: 'IndicatorGeneratorEngineBase'
};

Sys ID

57e47b52c3130200dd921a4112d3aea6

Offical Documentation

Official Docs: