Name

sn_grc.GRCWorkspaceUtilsBase

Description

General GRC Workspace Utilities

Script

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

  /* Start of Controls Monitoring records insertion during upgrade */
  initializeControlMonitoringOnUpgrade: function() {
      this._initializeControlMonitoringOnUpgrade();
  },

  _initializeControlMonitoringOnUpgrade: function() {
      if (gs.tableExists("sn_compliance_control")) {
          var control = new GlideRecord('sn_compliance_control');
          control.addActiveQuery();
          control.addQuery('state', '!=', 'retired');
          control.addNotNullQuery('content');
          control.query();
          while (control.next()) {
              //indicators
              var item = control.getUniqueValue();
              var indicatorFailureCount = this._getIndicatorFailureCount(item);

              //control attestations
              var controlAttestationFailureCount = this._getAttestationTestFailureCount(item);

              //control Tests
              var controlTestFailureCount = 0;
              if (GlidePluginManager().isActive('com.sn_audit')) {
                  controlTestFailureCount = this._getControlTestFailureCount(item);
              }

              //update control monitoring
              var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
              if (!controlMonitoring.get('item', control.getUniqueValue())) {
                  controlMonitoring.initialize();
                  controlMonitoring.setValue('active', true);
                  controlMonitoring.setValue('item', control.getUniqueValue());
                  controlMonitoring.setValue('content', control.content);

                  controlMonitoring.setValue('failed_indicators', indicatorFailureCount);
                  controlMonitoring.setValue('failed_attestations', controlAttestationFailureCount);
                  controlMonitoring.setValue('failed_control_tests', controlTestFailureCount);

                  controlMonitoring.insert();
              }
          }
      }
  },

  _getIndicatorFailureCount: function(item) {
      var indicatorRecord = new GlideAggregate('sn_grc_indicator');
      indicatorRecord.addAggregate('COUNT');
      indicatorRecord.addQuery('active', true);
      indicatorRecord.addQuery('item', item);
      indicatorRecord.addQuery('status', '2'); //Failed = 2, Passed = 1
      indicatorRecord.query();
      var indicatorCount = 0;
      if (indicatorRecord.next()) {
          indicatorCount = indicatorRecord.getAggregate('COUNT');
      }
      return indicatorCount;
  },

  _getAttestationTestFailureCount: function(item) {
      var m2mIssueItem = new GlideAggregate('sn_grc_m2m_issue_item');
      m2mIssueItem.addAggregate('COUNT');
      m2mIssueItem.addEncodedQuery('sn_grc_issue.issue_sourceLIKE9690c489730323003aebda013ef6a7e7^sn_grc_issue.stateIN1,2,5,0^sn_grc_issue.active=true^is_originator=true^sn_grc_issue.contentISNOTEMPTY^sn_grc_issue.item=' + item);
      m2mIssueItem.query();
      var controlAttestationCount = 0;
      if (m2mIssueItem.next() && m2mIssueItem.getAggregate('COUNT') > 0) {
          controlAttestationCount = m2mIssueItem.getAggregate('COUNT');
      }
      return controlAttestationCount;
  },

  _getControlTestFailureCount: function(item) {
      //control Tests
      var m2mIssueItem = new GlideAggregate('sn_grc_m2m_issue_item');
      m2mIssueItem.addEncodedQuery('sn_grc_issue.issue_sourceLIKEb2a04889730323003aebda013ef6a782^sn_grc_issue.stateIN1,2,5,0^sn_grc_issue.active=true^is_originator=true^sn_grc_issue.contentISNOTEMPTY^sn_grc_issue.item=' + item);
      m2mIssueItem.query();
      var controlTestCount = 0;
      if (m2mIssueItem.next() && m2mIssueItem.getAggregate('COUNT') == 1) {
          var issueId = m2mIssueItem.getValue('sn_grc_issue');
          var controlTest = new GlideAggregate('sn_audit_control_test');
          controlTest.addAggregate('COUNT');
          controlTest.addQuery('issue', issueId);
          controlTest.query();
          if (controlTest.next()) {
              controlTestCount = controlTest.getAggregate('COUNT');
          }
      }
      return controlTestCount;
  },
  /* End of Controls Monitoring records insertion during upgrade */

  /* Start of Controls creation updation and deletion in control monitoring table */
  deleteControlsInControlMonitoringOnDeletion: function(currentControl) {
      this._deleteControlsInControlMonitoringOnDeletion(currentControl);
  },

  _deleteControlsInControlMonitoringOnDeletion: function(currentControl) {

      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      controlMonitoring.addNullQuery('item');
      controlMonitoring.query();
      controlMonitoring.deleteMultiple();
  },

  deleteControlsInControlMonitoringOnRetiring: function(currentControl) {
      this._deleteControlsInControlMonitoringOnRetiring(currentControl);
  },

  _deleteControlsInControlMonitoringOnRetiring: function(currentControl) {
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      controlMonitoring.addQuery('item', currentControl.getUniqueValue() + '');
      controlMonitoring.query();
      controlMonitoring.deleteMultiple();
  },

  updateControlsInControlMonitoring: function(current) {
      this._updateControlsInControlMonitoring(current);
  },

  _updateControlsInControlMonitoring: function(current) {
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      if (!controlMonitoring.get('item', current.getUniqueValue())) {
          controlMonitoring.initialize();
          controlMonitoring.setValue('active', true);
          controlMonitoring.setValue('item', current.getUniqueValue());
          controlMonitoring.setValue('content', current.content);
          controlMonitoring.insert();
      }
  },

  /* End of Controls creation updation and deletion in control monitoring table */

  updateControlMonitoringWhenCOChanges: function(current, previous) {
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      if (previous.content.nil()) {
          if (!controlMonitoring.get('item', current.getUniqueValue())) {
              controlMonitoring.initialize();
              controlMonitoring.setValue('active', true);
              controlMonitoring.setValue('item', current.getUniqueValue());
              controlMonitoring.setValue('content', current.content);
              controlMonitoring.insert();
          }
      } else {
          controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
          if (!controlMonitoring.get('item', previous.getUniqueValue())) {
              if (!current.content.nil()) {
                  controlMonitoring.initialize();
                  controlMonitoring.setValue('active', true);
                  controlMonitoring.setValue('item', current.getUniqueValue());
                  controlMonitoring.setValue('content', current.content);
                  controlMonitoring.insert();
              }
          } else {
              if (!current.content.nil()) {
                  controlMonitoring.setValue('content', current.content);
                  controlMonitoring.update();
              } else {
                  controlMonitoring.deleteRecord();
              }
          }
      }
  },

  /* Start of updating Control Monitoring */

  updateControlTestsCountOnIssueClosure: function(controlId) {
      this._updateControlTestsCountOnIssueClosure(controlId);
  },

  _updateControlTestsCountOnIssueClosure: function(controlId) {
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      if (controlMonitoring.get('item', controlId) && controlMonitoring.active) {
          controlMonitoring.setValue('failed_control_tests', 0);
          controlMonitoring.update();
      }
  },

  updateControlTestsCountOnControlTestClosure: function(current) {
      this._updateControlTestsCountOnControlTestClosure(current);
  },

  _updateControlTestsCountOnControlTestClosure: function(current) {
      var controlTest = new GlideAggregate('sn_audit_control_test');
      controlTest.addQuery('issue', current.issue);
      controlTest.addAggregate('COUNT');
      controlTest.query();
      if (controlTest.next()) {
          var count = controlTest.getAggregate('COUNT');
          var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
          if (controlMonitoring.get('item', current.control) && controlMonitoring.active) {
              controlMonitoring.setValue('failed_control_tests', count);
              controlMonitoring.update();
          }
      }
  },

  generateIndicatorMonitoringResultsForControl: function(currentIndicator) {
      this._generateIndicatorMonitoringResultsForControl(currentIndicator);
  },

  _generateIndicatorMonitoringResultsForControl: function(currentIndicator) {
      var indicatorRecord = new GlideAggregate('sn_grc_indicator');
      indicatorRecord.addAggregate('COUNT');
      indicatorRecord.addQuery('active', 'true');
      indicatorRecord.addQuery('item', currentIndicator.item);
      indicatorRecord.addQuery('status', '2'); //Failed = 2, Passed = 1
      indicatorRecord.query();
      var count = 0;

      if (indicatorRecord.next()) {
          count = indicatorRecord.getAggregate('COUNT');
      }
      //Update the new table (control monitoring) with control indicator details
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      if (controlMonitoring.get('item', currentIndicator.item) && controlMonitoring.active) {
          controlMonitoring.setValue('failed_indicators', count);
          controlMonitoring.update();
      }
  },

  generateAttestationResultsForControl: function(issueId) {
      this._generateAttestationResultsForControl(issueId);
  },

  generateAttestationResultsForSingleControl: function(issueId, itemId) {
      this._generateAttestationResultsForSingleControl(issueId, itemId);
  },

  _generateAttestationResultsForControl: function(issueId) {

      var issue = new GlideRecord('sn_grc_issue');
      if (issue.get(issueId)) {
          var issueExist = true;
          var issueState = issue.getValue('state');
      }

      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');

      var issuesToItemM2M = new GlideRecord('sn_grc_m2m_issue_item');
      issuesToItemM2M.addQuery('sn_grc_issue', issueId);
      issuesToItemM2M.query();
      while (issuesToItemM2M.next()) {
          var item = issuesToItemM2M.getValue('sn_grc_item');
          controlMonitoring.initialize();
          if (controlMonitoring.get('item', item) && controlMonitoring.active) {
              if (issueExist) {
                  if (issueState == '3' || issueState == '4') {
                      controlMonitoring.setValue('failed_attestations', 0);
                  } else {
                      controlMonitoring.setValue('failed_attestations', 1);
                  }
              } else {
                  controlMonitoring.setValue('failed_attestations', 0);
              }
              controlMonitoring.update();
          }
      }
  },

  _generateAttestationResultsForSingleControl: function(issueId, itemId) {
      var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
      if (controlMonitoring.get('item', itemId) && controlMonitoring.active) {
          var issue = new GlideRecord('sn_grc_issue');
          issue.addEncodedQuery('issue_sourceLIKE9690c489730323003aebda013ef6a7e7');
          issue.addQuery('sys_id', issueId);
          issue.query();
          if (issue.next()) {
              if (issue.getValue('state') == '3' || issue.getValue('state') == '4') {
                  controlMonitoring.setValue('failed_attestations', 0);
              } else {
                  controlMonitoring.setValue('failed_attestations', 1);
              }
          } else {
              controlMonitoring.setValue('failed_attestations', 0);
          }
          controlMonitoring.update();
      }
  },

  /* End of updating Control Monitoring */

  getHighlightColorForHierarchyItem: function(table, sysId, highlightedValueField) {
      var highlightedValueCondition = new GlideRecord("sys_highlighted_value_condition");
      highlightedValueCondition.addQuery("highlighted_value.table", table);
      highlightedValueCondition.addQuery("highlighted_value.field", highlightedValueField);
      highlightedValueCondition.query();
      while (highlightedValueCondition.next()) {
          var record = new GlideRecord(table);
          record.addQuery("sys_id", sysId);
          record.addEncodedQuery(highlightedValueCondition.getValue("conditions"));
          record.query();
          if (record.hasNext()) {
              return highlightedValueCondition.getValue("status");
          }

      }
      return "";
  },

  createItemTree: function(currentRecord, highlightedValueField) {
      var tree = {};
      tree.id = currentRecord.getUniqueValue();
      tree.label = currentRecord.getDisplayValue();
      tree.actionable = true;

      if (highlightedValueField) {
          tree.highlightedValueProps = [{
              status: this.getHighlightColorForHierarchyItem(currentRecord.getTableName(), currentRecord.getUniqueValue(), highlightedValueField),
              label: currentRecord.getValue(highlightedValueField)
          }];
      }
      return tree;
  },

  getHierarchyItemsJSON: function(recordTable, recordSysId, parentField, orderByField, highlightedValueField) {
      var items = [];
      var currentRecord = new GlideRecord(recordTable);
      currentRecord.get(recordSysId);

      // Initialize recordTree JSON with current record's item JSON
      var recordTree = this.createItemTree(currentRecord, highlightedValueField);
      recordTree.identifierProps = {
          icon: 'diamond-fill'
      };

      // Add Child records to recordTree
      var childRecords = new GlideRecord(recordTable);
      childRecords.addQuery(parentField, currentRecord.getUniqueValue());
      childRecords.orderBy(orderByField);
      childRecords.query();

      if (childRecords.hasNext()) recordTree.children = [];

      while (childRecords.next()) {
          var childRecordTree = this.createItemTree(childRecords, highlightedValueField);
          recordTree.children.push(childRecordTree);
      }

      // Add parent records to recordTree
      var parent = currentRecord; // Initialize parent to current record
      while (parent.getValue(parentField)) {
          var parentSysId = parent.getValue(parentField);
          parent = new GlideRecord(recordTable);
          parent.get(parentSysId);

          var parentRecordTree = this.createItemTree(parent, highlightedValueField);
          parentRecordTree.children = [];
          parentRecordTree.children.push(recordTree);

          recordTree = parentRecordTree;
      }

      items.push(recordTree);

      // Create expanded items JSON
      var expandedItems = [
          []
      ];
      var node = items;
      while (node[0] && node[0].children) {
          expandedItems.push(expandedItems[expandedItems.length - 1].concat(node[0].id));
          node = node[0].children;
      }
      if (node[0].id == recordSysId) expandedItems.push(expandedItems[expandedItems.length - 1].concat(node[0].id));

      return {
          items: items,
          expandedItems: expandedItems,
          selectedItems: [expandedItems[expandedItems.length - 1]]
      };
  },

  getRelatedRecordsLinks: function(queryTable, query, recordTable, referenceFieldName, maxCount, orderBy) {
      var count = 0;
      var recordLinks = [];
      var recordSysIds = [];

      var relatedRecords = new GlideRecord(queryTable);
      relatedRecords.addEncodedQuery(query);
      if (orderBy) relatedRecords.orderBy(orderBy);
      relatedRecords.query();

      while (relatedRecords.next()) {
          if (count < maxCount)
              recordLinks.push(this.getLinkJSON(recordTable, relatedRecords.getValue(referenceFieldName), relatedRecords[referenceFieldName].getDisplayValue()));
          recordSysIds.push(relatedRecords.getValue(referenceFieldName));
          count++;
      }

      return {
          recordLinks: recordLinks,
          recordSysIds: recordSysIds
      };
  },

  getLinkJSON: function(table, sysId, label) {
      return {
          "label": label,
          "value": {
              "route": "record",
              "fields": {
                  "table": table,
                  "sysId": sysId
              }
          },
          "type": "route",
          "opensWindow": false
      };
  },

  getBrowseAllLinkJSON: function(table, sysIds, linkLabel, title) {
      var fields = {
          "table": table,
      };
      var params = {
          "query": "sys_idIN" + sysIds.join(','),
          "listTitle": title
      };
      var data = {
          "type": "link",
          "label": "",
          "icon": "chevron-right-outline",
          "link": {
              "type": "route",
              "label": linkLabel,
              "value": {
                  "route": "list-view",
                  "fields": fields,
                  "params": params,
                  "title": title
              },
              "opensWindow": false,
          }
      };
      return data;
  },

  validateNewButtonOnAssessmentInstanceRelatedList: function(tableName) {
      var excludeNewButtonMap = {};
      excludeNewButtonMap['sn_privacy_processing_activity'] = 1;
      excludeNewButtonMap['sn_grc_profile'] = 1;
      excludeNewButtonMap['vm_vdr_contact'] = 1;
      excludeNewButtonMap['sn_risk_risk'] = 1;
      excludeNewButtonMap['sn_compliance_control'] = 1;
      excludeNewButtonMap['sn_risk_advanced_risk_identification'] = 1;
      excludeNewButtonMap['sn_oper_res_self_attestation'] = 1;
      excludeNewButtonMap['sn_oper_res_importance_impact_tolerance_assessment'] = 1;
      if (tableName in excludeNewButtonMap) {
          return false;
      }
      return true;
  },

  getLabelValueJSON: function(label, valueText, table, encodedQuery) {
      var data = {
          "label": label,
          "value": {
              "type": "text-link",
              "label": valueText,
              "href": "javascript:void(0)",
              "table": table,
              "encodedQuery": encodedQuery,
              "listTitle": label
          }
      };
      return data;
  },

  type: 'GRCWorkspaceUtilsBase'
};

Sys ID

259346985bb12010c6cf08e53381c70e

Offical Documentation

Official Docs: