Name

sn_grc.GRCAjaxWS

Description

General AJAX utilities for GRC for workspace

Script

var GRCAjaxWS = Class.create();
GRCAjaxWS.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {

  getItemsDocToProfType: function(tableName, sysparm_ids) {
      if (!gs.hasRole('sn_grc.user'))
          return "{}";
      var sysIds = sysparm_ids.split(',');
      var contentToProfileTypeTable = '';
      var result = {};
      if (tableName == 'sn_risk_m2m_framework_profile_type')
          contentToProfileTypeTable = 'sn_risk_m2m_risk_definition_profile_type';
      else if (tableName == 'sn_compliance_m2m_policy_profile_type')
          contentToProfileTypeTable = 'sn_compliance_m2m_statement_profile_type';
      var documentIds = {};
      var profileTypeIds = {};
      var docToProfileType;
      // Get the content to profile type associations
      for (var index in sysIds) {
          docToProfileType = new GlideRecord(tableName);
          docToProfileType.get(sysIds[index]);
          documentIds[docToProfileType.sn_grc_document + ''] = true;
          profileTypeIds[docToProfileType.sn_grc_profile_type + ''] = true;
      }
      // Get contents associated to the documents
      var contents = this.getContentIds(tableName, Object.keys(documentIds));
      var contentToProfileType = new GlideRecord(contentToProfileTypeTable);
      contentToProfileType.addQuery('sn_grc_content', 'IN', contents);
      contentToProfileType.addQuery('sn_grc_profile_type', 'IN', Object.keys(profileTypeIds));
      contentToProfileType.addQuery('created_one_off', 'false');
      contentToProfileType.query();
      var contentIds = [];
      var count = 0;
      while (contentToProfileType.next()) {
          contentIds.push(contentToProfileType.sn_grc_content + '');
          count++;
      }
      result[contentToProfileTypeTable] = {
          'label': this._getPluralFromRecord(contentToProfileTypeTable + ''),
          'number': gs.getMessage('{0} record(s)', String(count)),
          'operation': 'delete'
      };
      result[contentToProfileTypeTable].link = 'now/risk/common/list-view/' + contentToProfileTypeTable + '/params/list-title/' + result[contentToProfileTypeTable].label + '/query/' + contentToProfileType.getEncodedQuery();

      result = this._getItems(result, 'content', contentIds, Object.keys(profileTypeIds));
      return result;
  },

  isGeneratingForProfileType: function(sysparm_table_name, sysparm_ids) {
      var tableName = sysparm_table_name;
      var ids = sysparm_ids;
      var methodName;
      var fieldName;
      if (tableName == 'sn_compliance_m2m_policy_profile_type' || tableName == 'sn_risk_m2m_framework_profile_type') {
          methodName = 'getItemsDocToProfType';
          fieldName = 'sn_grc_profile_type';
      } else if (tableName == 'sn_compliance_m2m_statement_profile_type' || tableName == 'sn_risk_m2m_risk_definition_profile_type') {
          methodName = 'getItemsContentToProfileType';
          fieldName = 'sn_grc_profile_type';
      } else if (tableName == 'sn_grc_m2m_profile_profile_type') {
          methodName = 'getItemsProfileToProfileType';
          fieldName = 'profile_type';
      }

      switch (methodName) {
          case 'getItemsProfileToProfileType':
              return this.getItemsProfileToProfileType(tableName, sysparm_ids);
          case 'getItemsContentToProfileType':
              return this.getItemsContentToProfileType(tableName, sysparm_ids);
          case 'getItemsDocToProfType':
              return this.getItemsDocToProfType(tableName, sysparm_ids);
      }
  },

  getContentIds: function(tableName, documentIds) {
      var content;
      var contentIds = [];
      if (tableName.match("sn_risk")) {
          content = new GlideRecord('sn_risk_definition');
          content.addQuery('document', 'IN', documentIds);
          content.query();
          while (content.next())
              contentIds.push(content.sys_id + '');
      } else if (tableName.match("sn_compliance")) {
          var contentToDoc = new GlideRecord('sn_compliance_m2m_policy_policy_statement');
          contentToDoc.addQuery('document', 'IN', documentIds);
          contentToDoc.query();
          while (contentToDoc.next())
              contentIds.push(contentToDoc.content + '');
      }
      return contentIds;
  },

  _getItems: function(result, field, ids, profileTypeIds) {
      var item = new GlideAggregate('sn_grc_item');
      item.addQuery(field, 'IN', ids);
      var qc = item.addQuery('source', profileTypeIds[0] + ','); // Checking that the item was generated only for this profile type
      if (profileTypeIds.length > 1) {
          for (var i = 1; i < profileTypeIds.length; i++)
              qc.addOrCondition('source', 'CONTAINS', profileTypeIds[i]);
      }
      item.addQuery('state', '!=', 'retired');
      item.addAggregate('COUNT', 'sys_class_name');
      item.query();
      while (item.next()) {
          var className = item.sys_class_name;
          var classNameCount = item.getAggregate('COUNT', 'sys_class_name');
          var l10nRecords = gs.getMessage('{0} record(s)', classNameCount);
          if (classNameCount > 0) {
              result[className] = {
                  'label': this._getPluralFromRecord(item.sys_class_name + ''),
                  'number': l10nRecords,
                  'operation': 'deactivate',
              };
              result[className].link = 'now/risk/common/list-view/' + className + '/params/list-title/' + result[className].label + '/query/' + item.getEncodedQuery();
          }
      }
      return result;
  },

  _getPluralFromRecord: function(tableName) {
      var now_GR = new GlideRecord(tableName);
      now_GR.query();
      var ed = now_GR.getED();
      return ed.getPlural();
  },

  getItemsContentToProfileType: function(sysparm_table_name, sysparm_ids) {
      if (!gs.hasRole('sn_grc.user'))
          return "{}";
      var ids = sysparm_ids;
      var tableName = sysparm_table_name;
      var contentToProfileTypeIds = ids.split(',');
      var result = {};
      var contentIds = {};
      var profileTypeIds = {};
      var contentToProfileType;
      var query = "contentIN";
      for (var index in contentToProfileTypeIds) {
          contentToProfileType = new GlideRecord(tableName);
          contentToProfileType.get(contentToProfileTypeIds[index]);
          contentIds[contentToProfileType.sn_grc_content + ''] = true;
          profileTypeIds[contentToProfileType.sn_grc_profile_type + ''] = true;
      }
      result = this._getItems(result, 'content', Object.keys(contentIds), Object.keys(profileTypeIds));
      return result;
  },

  getItemsProfileToProfileType: function(sysparm_table_name, sysparm_ids) {
      if (!gs.hasRole('sn_grc.user'))
          return "{}";
      var ids = sysparm_ids;
      var profileToProfileTypeIds = ids.split(',');
      var result = {};
      var profileIds = {};
      var profileTypeIds = {};
      var profileToProfileType;
      for (var index in profileToProfileTypeIds) {
          profileToProfileType = new GlideRecord(sysparm_table_name);
          profileToProfileType.get(profileToProfileTypeIds[index]);
          profileIds[profileToProfileType.profile + ''] = true;
          profileTypeIds[profileToProfileType.profile_type + ''] = true;
      }
      result = this._getItems(result, 'profile', Object.keys(profileIds), Object.keys(profileTypeIds));
      return result;
  },
  
  getDisplayValue: function() {
  	var tableName = this.getParameter('sysparm_table_name');
  	var sys_id = this.getParameter('sysparm_sys_id');
  	var gr = new GlideRecord(tableName);
  	gr.get(sys_id);
  	if(gr.canRead())
  		return gr.getDisplayValue();
  	else
  		return '';
  },
  
  updateItemFunction: function() {
      var itemId = this.getParameter('sysparm_recordId');
      var item = new GlideRecord('sn_grc_item');
      var itemFunction = this.getParameter('sysparm_itemFunction');
      var isUpdateSuccessful = false;
      if (item.get(itemId)) {
          item.setValue('item_function', itemFunction);
          isUpdateSuccessful = item.update();
      }

      return isUpdateSuccessful;
  },
  
  type: 'GRCAjaxWS'
});

Sys ID

436fdc8f07a020102bb2f4ce0ad300e1

Offical Documentation

Official Docs: