Name

sn_risk_advanced.GrcARAIntegrationUtilsBase

Description

No description available

Script

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

  getRiskFromSourceRecord: function(table, sysId, handler) {
      return this._getRiskFromSourceRecord(table, sysId, handler);
  },

  addRollupResultToEntity: function(rollUpResult) {
      this._addRollupResultToEntity(rollUpResult);
  },

  getAssessmentInfo: function(ramId) {
      return this._getAssessmentInfo(ramId);
  },

  setRollupResultToEntity: function(entity) {
      this._setRollupResultToEntity(entity);
  },

  getRAMsToDisplayOnEnityForm: function(entity) {
      return this._getRAMsToDisplayOnEnityForm(entity);
  },

  getRAMsToDisplayOnEnityClassForm: function(entityClass) {
      return this._getRAMsToDisplayOnEnityClassForm(entityClass);
  },

  updateEntitiesRiskOnPrimaryChange: function(entityClassRef) {
      this._updateEntitiesRiskOnPrimaryChange(entityClassRef);
  },

  populateControlScoreOnRisk: function(risk) {
      this._populateControlScoreOnRisk(risk);
  },

  updateMitigationEffectiveness: function(factorChoice) {
      this._updateMitigationEffectiveness(factorChoice);
  },

  getCurrencyValue: function(currencyRefValue) {
      return this._getCurrencyValue(currencyRefValue);
  },

  getPrimaryRAMofEntity: function(riskRef) {
      return this._getPrimaryRAMofEntity(riskRef);
  },

  _getPrimaryRAMofEntity: function(riskRef) {
      var profileClass = riskRef.profile.profile_class;
      if (profileClass != '') {
          var profileClassGr = new GlideRecord("sn_grc_profile_class");
          profileClassGr.get(profileClass);
          return profileClassGr.primary_risk_assessment_methodology;
      }
      return '';
  },

  _updateMitigationEffectiveness: function(factorChoice) {
      var controlIds = [];

      var entityClassesArr = [];
      var entityClasses = new GlideRecord('sn_grc_profile_class');
      entityClasses.addQuery('primary_risk_assessment_methodology', factorChoice.factor.risk_assessment_methodology);
      entityClasses.query();
      while (entityClasses.next()) {
          entityClassesArr.push(entityClasses.getUniqueValue());
      }
      var responses = new GlideRecord('sn_risk_advanced_risk_assessment_instance_response');
      responses.addNotNullQuery('control');
      responses.addQuery('assessment_instance_id.entity_1.profile_class', 'IN', entityClassesArr);
      responses.addQuery('factor', factorChoice.factor);
      responses.addQuery('factor_response', factorChoice.score);
      responses.query();
      while (responses.next()) {
          controlIds.push(responses.getValue('control'));
      }

      var riskContrlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskContrlm2m.addQuery('sn_compliance_controlIN' + controlIds);
      riskContrlm2m.addNotNullQuery('sn_risk_advanced_mitigation_effectiveness');
      riskContrlm2m.query();

      while (riskContrlm2m.next()) {
          var newString = this._getNewMitigationEffectivenessStr(riskContrlm2m.sn_risk_advanced_mitigation_effectiveness, factorChoice.display_value);
          riskContrlm2m.setValue('sn_risk_advanced_mitigation_effectiveness', newString);
          riskContrlm2m.update();
      }
  },

  _getNewMitigationEffectivenessStr: function(oldEffectiveness, newChoiceString) {
      if (oldEffectiveness == '')
          return;
      var oldChoiceString = oldEffectiveness.substring(0, oldEffectiveness.indexOf('( Score'));
      var newEffectiveness = oldEffectiveness.replace(oldChoiceString, newChoiceString);
      return newEffectiveness;
  },

  _populateControlScoreOnRisk: function(risk) {
      var controlIds = [];
      var responseObjs = [];
      var responses = new GlideRecord('sn_risk_advanced_risk_assessment_instance_response');
      responses.addQuery('assessment_instance_id', risk.assessment_instance);
      responses.addNotNullQuery('control');
      responses.query();
      while (responses.next()) {
          var obj = {};
          controlIds.push(responses.control + '');
          obj.controlId = responses.control + '';
          obj.mitigationScore = responses.qualitative_response + '';
          obj.mitigationEffectiveness = this._constructMitigationEffectiveness(responses);
          responseObjs[responses.control] = obj;
      }

      var riskContrlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskContrlm2m.addQuery('sn_compliance_controlIN' + controlIds);
      riskContrlm2m.query();
      while (riskContrlm2m.next()) {
          var mitigationScores = responseObjs[riskContrlm2m.sn_compliance_control];
          riskContrlm2m.setValue('sn_risk_advanced_mitigation_score', mitigationScores.mitigationScore);
          riskContrlm2m.setValue('sn_risk_advanced_mitigation_effectiveness', mitigationScores.mitigationEffectiveness);
          riskContrlm2m.update();
      }

      //Remove stale values from other controls - for example, if control c1, c2 were assessed in R1.1 and in R1.2 only C1 was assessed, where R1.2 is reassessment for R1.1, the remove stale mitigation values
      this._clearStaleControlScores(risk, controlIds);
  },

  _clearStaleControlScores: function(risk, controlIds) {
      var riskContrlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskContrlm2m.addQuery('sn_risk_risk', risk.getUniqueValue());
      riskContrlm2m.addQuery('sn_compliance_control', 'NOT IN', controlIds);
      riskContrlm2m.query();
      riskContrlm2m.setValue('sn_risk_advanced_mitigation_score', '');
      riskContrlm2m.setValue('sn_risk_advanced_mitigation_effectiveness', '');
      riskContrlm2m.updateMultiple();
  },

  _constructMitigationEffectiveness: function(factorResponse) {
      var responseString = factorResponse.factor_response;
      if (factorResponse.factor.user_response == '1') {
          responseString = this._getChoiceString(factorResponse.factor, factorResponse.factor_response);
      }
      if (factorResponse.factor.user_response == '4') {
          responseString = this._getCurrencyValue(responseString);
      }
      var effectiveness = responseString + '( Score: ' + factorResponse.qualitative_response + ')';
      return effectiveness;
  },

  _getCurrencyValue: function(currencyRefValue) {
      var currencyStr = currencyRefValue.substring(0, currencyRefValue.indexOf(';'));
      var gr = new GlideRecord('fx_currency');
      gr.addQuery('code', currencyStr);
      gr.query();
      if (gr.next()) {
          return currencyRefValue.replace(currencyStr + ';', gr.getValue('symbol'));
      }
      return currencyRefValue;
  },

  _getChoiceString: function(factorId, response) {
      var factorChoice = new GlideRecord('sn_risk_advanced_factor_choice');
      factorChoice.addQuery('factor', factorId);
      factorChoice.addQuery('score', response);
      factorChoice.query();
      if (factorChoice.next())
          return factorChoice.getValue('display_value');
      return '';
  },

  _updateEntitiesRiskOnPrimaryChange: function(entityClassRef) {
      var primaryRAM = "NULL";
      if (entityClassRef.primary_risk_assessment_methodology != "") {
          primaryRAM = entityClassRef.primary_risk_assessment_methodology;
      }
      var entity = new GlideRecord('sn_grc_profile');
      entity.addQuery('profile_class', entityClassRef.getUniqueValue());
      entity.query();
      entity.setValue('sn_risk_advanced_primary_risk_assessment_methodology', primaryRAM);
      entity.updateMultiple();
  },

  _getRAMsToDisplayOnEnityForm: function(entity) {
      var sysids = [];
      var assessmentResult = new GlideRecord('sn_risk_advanced_risk_assessment_result');
      assessmentResult.addQuery('entity', entity.getUniqueValue());
      assessmentResult.orderBy('sys_created_on');
      assessmentResult.query();
      while (assessmentResult.next()) {
          sysids.push(assessmentResult.risk_assessment_methodology + '');
      }
      return sysids;
  },

  _getRAMsToDisplayOnEnityClassForm: function(entityClass) {
      var sysids = [];
      var rams = new GlideRecord('sn_risk_advanced_risk_assessment_methodology');
      rams.addEncodedQuery('entity_classesLIKE' + entityClass.getUniqueValue());
      rams.addQuery('state', '2');
      rams.query();
      while (rams.next()) {
          sysids.push(rams.getUniqueValue());
      }
      return sysids;
  },

  _setRollupResultToEntity: function(entity) {
      var assessmentResult = new GlideRecord('sn_risk_advanced_risk_assessment_result');
      assessmentResult.addQuery('entity', entity.getUniqueValue());
      assessmentResult.addQuery('risk_assessment_methodology', entity.sn_risk_advanced_primary_risk_assessment_methodology);
      assessmentResult.addQuery('statement', '');
      assessmentResult.query();

      if (assessmentResult.next())
          entity.sn_risk_advanced_rollup_result = assessmentResult.getUniqueValue();
      else
          entity.sn_risk_advanced_rollup_result = '';
  },

  _getAssessmentInfo: function(ramId) {
      var assessmentInfo = {};
      var assessmentTypeReference = new GlideRecord('sn_risk_advanced_assessment_type');
      assessmentTypeReference.addQuery('risk_assessment_methodology', ramId);
      assessmentTypeReference.query();
      assessmentInfo.isInherentAsmtEnabled = false;
      assessmentInfo.isControlAsmtEnabled = false;
      assessmentInfo.isResidualAsmtEnabled = false;
      assessmentInfo.isTargetAsmtEnabled = false;
      while (assessmentTypeReference.next()) {
          if (assessmentTypeReference.name == "Inherent Assessment") {
              assessmentInfo.isInherentAsmtEnabled = true;
              assessmentInfo.inherentAssessmentContribution = assessmentTypeReference.getValue('assessment_contribution');
          } else if (assessmentTypeReference.name == "Residual Assessment") {
              assessmentInfo.isResidualAsmtEnabled = true;
              assessmentInfo.residualAssessmentContribution = assessmentTypeReference.getValue('assessment_contribution');
          } else if (assessmentTypeReference.name == "Target Assessment") {
              assessmentInfo.isTargetAsmtEnabled = true;
              assessmentInfo.targetAssessmentContribution = assessmentTypeReference.getValue('assessment_contribution');
          } else {
              assessmentInfo.isControlAsmtEnabled = true;
          }
      }
      return assessmentInfo;
  },

  _addRollupResultToEntity: function(rollUpResult) {
      var entity = new GlideRecord('sn_grc_profile');
      entity.get(rollUpResult.entity);
      if (gs.nil(entity.getValue('sn_risk_advanced_primary_risk_assessment_methodology'))) {
          entity.setValue('sn_risk_advanced_primary_risk_assessment_methodology', rollUpResult.risk_assessment_methodology);
      }
      if (entity.getValue('sn_risk_advanced_primary_risk_assessment_methodology') == rollUpResult.risk_assessment_methodology) {
          entity.setValue('sn_risk_advanced_rollup_result', rollUpResult.getUniqueValue());
          entity.update();
      }
  },

  _getRiskFromSourceRecord: function(table, sysId, handler) {
      var result = {};

      if (sysId.split(',').length > 1) {
          result.status = 0;
          result.errorMsg = gs.getMessage("Please select only one record at a time.");
          return result;
      }

      var hooks = new GlideScriptedExtensionPoint().getExtensions('sn_risk_advanced.GetRiskFromSourceRecord');
      var visited = false;
      hooks.forEach(function(hook) {
          if (hook.handles(handler)) {
              result = hook.getRiskInfo(table, sysId);
              visited = true;
          }
      });
      if (!visited) {
          result.status = 0;
          result.errorMsg = gs.getMessage("Error fetching the risk details. Please contact your system administrator.");
      }

      return result;
  },

  type: 'GrcARAIntegrationUtilsBase'
};

Sys ID

77121e6b0f491010bad14bb768767e44

Offical Documentation

Official Docs: