Name

sn_risk_advanced.RiskAssessmentMethodologyUtilsBase

Description

Utility function for risk assessment methodologytable(Not for customizations)

Script

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

  getDomainFromParams: function(options) {
      return this._getDomainFromParams(options);
  },

  performEntitlementCheck: function(ramId) {
      return this._performEntitlementCheck(ramId);
  },

  hasARALimitedLicense: function() {
      return this._hasARALimitedLicense();
  },

  hasIRMEnterpriseLicense: function() {
      return this._hasIRMEnterpriseLicense();
  },

  hasIRMProfessional: function() {
      return this._hasIRMProfessional();
  },

  canCreateNewRAM: function() {
      return this._canCreateNewRAM();
  },

  validateLicense: function(ram) {
      return this._validateLicense(ram);
  },

  copyRAM: function(ram) {
      return this._copyRAM(ram);
  },

  getRAMChoices: function(search) {
      return this._getRAMChoices(search);
  },

  getRiskChoices: function(search) {
      return this._getRiskChoices(search);
  },

  getAssigneeGroups: function(search, type, options) {
      return this._getAssigneeGroups(search, type, options);
  },

  getRAMChoicesForRisk: function(riskId, search) {
      return this._getRAMChoicesForRisk(riskId, search);
  },

  //Overridable functions
  deleteRecord: function(tableName, methodologyId) {
      return this._deleteRecord(tableName, methodologyId);
  },

  insertRecord: function(tableName, methodologyId, assessmentTypeName, displayOrder) {
      return this._insertRecord(tableName, methodologyId, assessmentTypeName, displayOrder);
  },

  insertOrDeleteRecord: function(tableName, assessmentTypeName, methodologyId, isFieldChanged, field, displayOrder) {
      return this._insertOrDeleteRecord(tableName, assessmentTypeName, methodologyId, isFieldChanged, field, displayOrder);
  },

  getEntityClasses: function() {
      return this._getEntityClasses();
  },

  getAssessmentTypeCount: function(assessmentType) {
      return this._getAssessmentTypeCount(assessmentType);
  },

  addIfEntityClassPointsOneOrZeroTable: function(ramReference) {
      return this._addIfEntityClassPointsOneOrZeroTable(ramReference);
  },

  validateRAM: function(ramReference) {
      return this._validateRAM(ramReference);
  },

  validateRiskResponseMandatoryScript: function(ramReference) {
      return this._validateRiskResponseMandatoryScript(ramReference);
  },

  validateScript: function(glideRecord, fieldName) {
      return this._validateScript(glideRecord, fieldName);
  },

  checkIfActiveAssessmentExists: function(ramReference) {
      return this._checkIfActiveAssessmentExists(ramReference);
  },

  updateAsmtTypes: function(ramReference) {
      this._updateAsmtTypes(ramReference);
  },

  deleteScopeObjects: function(ramReference) {
      this._deleteScopeObjects(ramReference);
  },

  retireAsmtType: function(ramID) {
      this._retireAsmtType(ramID);
  },

  setAsmtScopeToInActive: function(ramID) {
      this._setAsmtScopeToInActive(ramID);
  },

  retireScheduler: function(ramId) {
      this._retireScheduler(ramId);
  },

  // To be called when assessment type(for eg. inherent risk) checkbox is selected/unselected in RAM form to create or delete assessment type records
  assessmentTypeRecordCreationOrDeletion: function(ramRecord) {
      return this._assessmentTypeRecordCreationOrDeletion(ramRecord);
  },

  getDefaultRAMForAnEntity: function(entityId) {
      return this._getDefaultRAMForAnEntity(entityId);
  },

  getAssessmentInstance: function(ramId, entityId, riskId) {
      return this._getAssessmentInstance(ramId, entityId, riskId);
  },

  getAssessmentScope: function(ramId, entityId) {
      return this._getAssessmentScope(ramId, entityId);
  },

  updateARAInfoForEntities: function() {
      this._updateARAInfoForEntities();
  },

  clearARAInfoFromEntities: function() {
      this._clearARAInfoFromEntities();
  },

  getPrimaryRAMForEntityClass: function(entityClass, isPrimary) {
      return this._getPrimaryRAMForEntityClass(entityClass, isPrimary);
  },

  setAlternateRAMPrimary: function(ram) {
      this._setAlternateRAMPrimary(ram);
  },

  updatePrimary: function(ram) {
      this._updatePrimary(ram);
  },

  canRAMBeDraft: function(ramId) {
      return this._canRAMBeDraft(ramId);
  },

  getOldestRAMWithRollupResult: function(entity) {
      return this._getOldestRAMWithRollupResult(entity);
  },

  deleteSchedulers: function(ramID) {
      this._deleteSchedulers(ramID);
  },

  showNavigationLink: function(entity) {
      return this._showNavigationLink(entity);
  },

  getHighResidualRiskRating: function(ramId) {
      return this._getHighResidualRiskRating(ramId);
  },

  checkIfAssessmentTypesPublished: function(ramReference) {
      return this._checkIfAssessmentTypesPublished(ramReference);
  },

  canWriteTargetRisk: function(ramReference) {
      return this._canWriteTargetRisk(ramReference);
  },

  getValidateScriptUIActionConditionForAsmtType: function(asmtType) {
      return this._getValidateScriptUIActionConditionForAsmtType(asmtType);
  },

  _getValidateScriptUIActionConditionForAsmtType: function(asmtType) {
      return ((asmtType.qualitative_scoring_logic == 'SCRIPT' || asmtType.quantitative_scoring_logic == 'SCRIPT') && asmtType.state != '2') || asmtType.make_assessment_mandatory == '3' || (asmtType.calculate_based_on == "inherent_control" && asmtType.qualitative_scoring_type == 'script');
  },

  _canWriteTargetRisk: function(ramReference) {
      if (!ramReference.target_risk)
          return true;
      if (ramReference.state == "1")
          return true;
      var asmt = new GlideRecord("sn_risk_advanced_target_assessment");
      asmt.addQuery('risk_assessment_methodology', ramReference.getUniqueValue());
      asmt.query();
      if (asmt.next())
          return asmt.state != "2";
      return true;
  },

  _updatePrimary: function(ram) {
      var entityClasses = ram.entity_classes.split(",");
      for (index in entityClasses) {
          var entityClassGr = new GlideRecord("sn_grc_profile_class");
          entityClassGr.get(entityClasses[index]);
          if (entityClassGr.primary_risk_assessment_methodology == '') {
              entityClassGr.primary_risk_assessment_methodology = ram.getUniqueValue();
              entityClassGr.update();
          }
      }
  },

  _showNavigationLink: function(entity) {
      return gs.hasRole('sn_risk.user') && gs.getProperty('sn_risk_advanced.hide_risk_legacy_lifecycle', 'false') == 'true' && !gs.nil(entity.sn_risk_advanced_primary_risk_assessment_methodology) && this._checkIfEntityClassApplicable(entity.sn_risk_advanced_primary_risk_assessment_methodology, entity.profile_class);
  },

  _checkIfEntityClassApplicable: function(ram, entityClass) {
      var ramGr = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      ramGr.get(ram);
      return entityClass != '' && ramGr.entity_classes.includes(entityClass);
  },

  _retireScheduler: function(ramId) {
      var scheduler = new GlideRecord('sn_risk_advanced_assessment_scheduler');
      scheduler.addQuery('risk_assessment_methodology', ramId);
      scheduler.query();
      scheduler.setValue('state', '7');
      scheduler.updateMultiple();
  },

  _getEntityClasses: function() {
      var allEntityClassSysIds = [];
      var notReqdEntityClassSysIds = {};
      var filteredEntityClassSysIds = [];
      var allEntityClasses = new GlideRecord('sn_grc_profile_class');
      allEntityClasses.query();
      while (allEntityClasses.next()) {
          allEntityClassSysIds.push(allEntityClasses.getUniqueValue());
      }
      var entityClassRuleReference = new GlideAggregate('sn_grc_profile_class_rules');
      entityClassRuleReference.groupBy('profile_class');
      entityClassRuleReference.addAggregate('count');
      entityClassRuleReference.query();
      while (entityClassRuleReference.next()) {
          if (parseInt(entityClassRuleReference.getAggregate('count')) > 1) {
              notReqdEntityClassSysIds[(entityClassRuleReference.profile_class + '')] = 1;
          }
      }
      for (var i = 0; i < allEntityClassSysIds.length; ++i) {
          if (notReqdEntityClassSysIds[allEntityClassSysIds[i]] === undefined) {
              filteredEntityClassSysIds.push(allEntityClassSysIds[i]);
          }
      }
      return 'sys_idIN' + filteredEntityClassSysIds;
  },

  _copyRAM: function(ram) {
      var resultObj = {
          'error': false,
          'errorMsg': ''
      };
      var ramDataCopySuccess = false;
      var columns_to_exclude = 'state,risk_assessment_methodology,number, primary_ram';
      var predefObj = {};
      predefObj['name'] = 'Copy of ' + ram.name;
      var newRAMId = new sn_risk_advanced.FactorUtils().copyRecord(ram, columns_to_exclude, predefObj);
      resultObj.newRAMId = newRAMId;
      if (newRAMId != null)
          ramDataCopySuccess = this._copyRAMRelatedData(ram, newRAMId);
      if (ramDataCopySuccess == false) {
          this._deleteCopiedRAMWithRelevantData(newRAMId);
          resultObj.error = true;
          resultObj.errorMsg = gs.getMessage('Error while copying Risk Assessment Methodology');
          resultObj.newRAMId = null;
      }
      return resultObj;

  },

  _deleteCopiedRAMWithRelevantData: function(newRAMId) {
      var factors = [];
      var gr = new GlideRecord("sn_risk_advanced_factor");
      gr.addQuery("risk_assessment_methodology", newRAMId);
      gr.query();
      while (gr.next()) {
          factors.push(gr.getUniqueValue());
      }

      var gr1 = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      gr1.get(newRAMId);
      if (gr1.deleteRecord()) {
          var groupFactor = new GlideRecord('sn_risk_advanced_group_factor');
          groupFactor.addQuery('sys_id', 'IN', factors);
          groupFactor.query();
          groupFactor.deleteMultiple();

          var factor = new GlideRecord('sn_risk_advanced_factor');
          factor.addQuery('sys_id', 'IN', factors);
          factor.query();
          factor.deleteMultiple();
      }
  },

  _copyRAMRelatedData: function(ram, newRAMId) {
      var ramDataCopySuccess = true;
      var columnsToExclude = 'state,risk_assessment_methodology, y_axis_factor, x_axis_factor, overall_effectiveness_factor, qualitative_script_variables, quantitative_script_variables';
      if (ram.inherent_risk == true)
          ramDataCopySuccess = this._copyAssessmentTypes(ram, newRAMId, "sn_risk_advanced_inherent_assessment", columnsToExclude);

      if (ramDataCopySuccess && ram.getValue("control_effectiveness") == true)
          ramDataCopySuccess = this._copyAssessmentTypes(ram, newRAMId, "sn_risk_advanced_control_assessment", columnsToExclude);

      if (ramDataCopySuccess && ram.getValue("residual_risk") == true)
          ramDataCopySuccess = this._copyAssessmentTypes(ram, newRAMId, "sn_risk_advanced_residual_assessment", columnsToExclude);

      if (ramDataCopySuccess && ram.getValue("target_risk") == true)
          ramDataCopySuccess = this._copyAssessmentTypes(ram, newRAMId, "sn_risk_advanced_target_assessment", columnsToExclude);

      return ramDataCopySuccess;
  },

  _copyAssessmentTypes: function(ram, newRAMId, table, columnsToExclude) {
      var ramDataCopySuccess = true;
      var oldAssessmentTypeRecord = new GlideRecord(table);
      oldAssessmentTypeRecord.addQuery("risk_assessment_methodology", ram.getUniqueValue());
      oldAssessmentTypeRecord.query();
      oldAssessmentTypeRecord.next();

      var newAssessmentTypeRecord = new GlideRecord(table);
      newAssessmentTypeRecord.addQuery("risk_assessment_methodology", newRAMId);
      newAssessmentTypeRecord.query();
      newAssessmentTypeRecord.next();

      var fields = oldAssessmentTypeRecord.getElements();
      for (var i = 0; i < fields.length; i++) {
          var glideElement = fields[i];
          if (!columnsToExclude.contains(glideElement.getName()) && glideElement.getTableName() != 'sys_metadata') {
              newAssessmentTypeRecord.setValue(glideElement.getName(), oldAssessmentTypeRecord.getValue(glideElement.getName()));
          }
      }
      newAssessmentTypeRecord.update();

      if (this._shouldCopyAssessmentRelevantData(newAssessmentTypeRecord)) {
          ramDataCopySuccess = this._copyAssessmentRelevantData(oldAssessmentTypeRecord, newAssessmentTypeRecord);
      }

      //Copy rating criteria from original RAM in case if residual assessment is same as inherent/ target assessment is same as inherent or residual
      if (ramDataCopySuccess && this._shouldCopyRatingCriteria(newAssessmentTypeRecord)) {
          ramDataCopySuccess = new sn_risk_advanced.FactorUtils().copyData(oldAssessmentTypeRecord, newAssessmentTypeRecord.getUniqueValue(), {
              'sn_risk_advanced_rating_criteria': 'assessment_type'
          });
      }

      newAssessmentTypeRecord.enable_heatmap = true;
      newAssessmentTypeRecord.update();
      if (ramDataCopySuccess == true && table == "sn_risk_advanced_residual_assessment" && newAssessmentTypeRecord.calculate_based_on == "inherent_control" && newAssessmentTypeRecord.qualitative_scoring_type == "lookup_matrix") {
          this._copyMatrixTable(oldAssessmentTypeRecord, newAssessmentTypeRecord);
      }

      if (ramDataCopySuccess == true && oldAssessmentTypeRecord.enable_heatmap == true) {
          this._copyHeatMapTable(oldAssessmentTypeRecord, newAssessmentTypeRecord);
      } else {
          newAssessmentTypeRecord.enable_heatmap = false;
          newAssessmentTypeRecord.update();
      }

      if (ramDataCopySuccess == true) {
          if (oldAssessmentTypeRecord.state == "2")
              newAssessmentTypeRecord.state = "2";

          newAssessmentTypeRecord.update();

          // After the update and the BR - Create qualitative risk criteria rating executes update the risk appetite scale for the Residual assessment whose calculation is based on inherent_control
          if (ramDataCopySuccess == true && table == "sn_risk_advanced_residual_assessment" && newAssessmentTypeRecord.calculate_based_on == "inherent_control" && newAssessmentTypeRecord.qualitative_scoring_type == "lookup_matrix") {
              this._copyAppetiteScale(oldAssessmentTypeRecord, newAssessmentTypeRecord);
          }
      }
      return ramDataCopySuccess;
  },

  _shouldCopyAssessmentRelevantData: function(asmtTypeRecord) {
      if (asmtTypeRecord.sys_class_name == "sn_risk_advanced_residual_assessment") {
          return !((asmtTypeRecord.calculate_based_on == 'factor_responses' && asmtTypeRecord.factors_same_as_inherent) || (asmtTypeRecord.calculate_based_on == 'inherent_control' && asmtTypeRecord.qualitative_scoring_type == 'lookup_matrix'));
      } else if (asmtTypeRecord.sys_class_name == "sn_risk_advanced_target_assessment") {
          return asmtTypeRecord.calculate_based_on != 'factor_same_as_inherent' && asmtTypeRecord.calculate_based_on != 'factor_same_as_residual';
      }
      return true;
  },

  _shouldCopyRatingCriteria: function(asmtTypeRecord) {
      if (asmtTypeRecord.sys_class_name == "sn_risk_advanced_residual_assessment") {
          return asmtTypeRecord.calculate_based_on == 'factor_responses' && asmtTypeRecord.factors_same_as_inherent;
      } else if (asmtTypeRecord.sys_class_name == "sn_risk_advanced_target_assessment") {
          return asmtTypeRecord.calculate_based_on == 'factor_same_as_inherent' || asmtTypeRecord.calculate_based_on == 'factor_same_as_residual';
      }
      return false;
  },

  _copyAppetiteScale: function(oldAssesment, newAssessment) {

      var oldRatingCriteria = new GlideRecord('sn_risk_advanced_rating_criteria');
      oldRatingCriteria.addQuery("assessment_type", oldAssesment.getUniqueValue());
      oldRatingCriteria.orderBy("lower_interval");
      oldRatingCriteria.query();

      var newRatingCriteria = new GlideRecord('sn_risk_advanced_rating_criteria');
      newRatingCriteria.addQuery("assessment_type", newAssessment.getUniqueValue());
      newRatingCriteria.orderBy("lower_interval");
      newRatingCriteria.query();

      if (oldRatingCriteria.getRowCount() != newRatingCriteria.getRowCount()) {
          gs.addErrorMessage(gs.getMessage("Both the assessment types has unequal number of rating criteria"));
          return;
      }

      while (oldRatingCriteria.next() && newRatingCriteria.next()) {
          newRatingCriteria.setValue("risk_appetite_scale", oldRatingCriteria.getValue("risk_appetite_scale"));
          newRatingCriteria.update();
      }

  },

  _copyHeatMapTable: function(oldAssessmentTypeRecord, newAssessmentTypeRecord) {
      var map = new GlideRecord("sn_risk_advanced_heatmap_color_matrix");
      map.addQuery("assessment_type", oldAssessmentTypeRecord.getUniqueValue());
      map.query();

      while (map.next()) {
          var copymap = new GlideRecord("sn_risk_advanced_heatmap_color_matrix");
          copymap.addQuery("x_axis_factor_score", map.x_axis_factor_score + '');
          copymap.addQuery("y_axis_factor_score", map.y_axis_factor_score + '');
          copymap.addQuery("assessment_type", newAssessmentTypeRecord.getUniqueValue());
          copymap.query();
          if (copymap.next()) {
              copymap.setValue("risk_color_style", map.getValue("risk_color_style"));
              copymap.update();
          }
      }
  },

  _copyAssessmentRelevantData: function(oldAssessmentTypeRecord, newAssessmentTypeRecord) {
      var ramDataCopySuccess = true;
      //copy Factor
      ramDataCopySuccess = this._copyFactorForAssessmentType(oldAssessmentTypeRecord, newAssessmentTypeRecord);

      if (ramDataCopySuccess == false) {
          return ramDataCopySuccess;
      }

      //copy risk rating criteria.
      var tables = {};
      if (oldAssessmentTypeRecord.assessment_contribution == "2" || oldAssessmentTypeRecord.assessment_contribution == "3") {
          tables['sn_risk_advanced_rating_criteria'] = 'assessment_type';
      }

      return new sn_risk_advanced.FactorUtils().copyData(oldAssessmentTypeRecord, newAssessmentTypeRecord.getUniqueValue(), tables);
  },

  _copyFactorForAssessmentType: function(oldAssessmentTypeRecord, newAssessmentTypeRecord) {
      var ramDataCopySuccess = true;
      if (oldAssessmentTypeRecord.enable_heatmap == true) {
          newAssessmentTypeRecord.enable_heatmap = oldAssessmentTypeRecord.enable_heatmap;
      }

      if (oldAssessmentTypeRecord.sys_class_name == "sn_risk_advanced_control_assessment" && oldAssessmentTypeRecord.getValue("control_assessment_methodology") == "individual_control_assessment") {
          if (!gs.nil(oldAssessmentTypeRecord.getValue("overall_effectiveness_factor"))) {
              var effectiveFactor = new sn_risk_advanced.FactorUtils().copyFactor(oldAssessmentTypeRecord.getValue("overall_effectiveness_factor"));
              new sn_risk_advanced.FactorUtils().publishFactor(effectiveFactor.newFactorID);
              newAssessmentTypeRecord.setValue("overall_effectiveness_factor", effectiveFactor.newFactorID);
          }
      }

      var gr = new GlideRecord("sn_risk_advanced_asmt_type_m2m_factor");
      gr.query("sn_risk_advanced_assessment_type", oldAssessmentTypeRecord.getUniqueValue());
      gr.query();

      while (gr.next()) {
          var result = new sn_risk_advanced.FactorUtils().copyFactor(gr.getValue("sn_risk_advanced_factor"));
          if (!gs.nil(result.newFactorID)) {
              var factor = new GlideRecord("sn_risk_advanced_factor");
              factor.get(gr.getValue("sn_risk_advanced_factor"));
              var newfactor = new GlideRecord(factor.sys_class_name);
              newfactor.get(result.newFactorID + '');
              newfactor.state = "2";
              newfactor.update();

              var gr1 = new GlideRecord("sn_risk_advanced_asmt_type_m2m_factor");
              gr1.initialize();
              gr1.setValue("sn_risk_advanced_assessment_type", newAssessmentTypeRecord.getUniqueValue());
              gr1.setValue("sn_risk_advanced_factor", result.newFactorID);
              gr1.insert();

              if (oldAssessmentTypeRecord.getValue("qualitative_scoring_logic") == "SCRIPT" || oldAssessmentTypeRecord.getValue("quantitative_scoring_logic") == "SCRIPT") {
                  this._correctScriptwithValidFactor(oldAssessmentTypeRecord, newAssessmentTypeRecord, gr.getValue("sn_risk_advanced_factor"), newfactor);
              }

              if (oldAssessmentTypeRecord.enable_heatmap == true) {
                  if (oldAssessmentTypeRecord.getValue("x_axis_factor") == gr.getValue("sn_risk_advanced_factor")) {
                      newAssessmentTypeRecord.setValue("x_axis_factor", result.newFactorID);
                  } else if (oldAssessmentTypeRecord.getValue("y_axis_factor") == gr.getValue("sn_risk_advanced_factor")) {
                      newAssessmentTypeRecord.setValue("y_axis_factor", result.newFactorID);
                  }
              }
          } else {
              ramDataCopySuccess = false;
              break;
          }
      }
      return ramDataCopySuccess;
  },

  _correctScriptwithValidFactor: function(oldAssessmentTypeRecord, newAssessmentTypeRecord, oldFactorId, newfactor) {
      var oldFactor = new GlideRecord("sn_risk_advanced_factor");
      oldFactor.get(oldFactorId);

      if (new sn_risk_advanced.FactorUtils().checkScriptContainsFactor(oldAssessmentTypeRecord, oldFactor)) {
          newAssessmentTypeRecord.setValue("qualitative_script", newAssessmentTypeRecord.getValue("qualitative_script").replace(new RegExp(oldFactor.getValue("number"), 'g'), newfactor.getValue("number")));
          newAssessmentTypeRecord.setValue("quantitative_script", newAssessmentTypeRecord.getValue("quantitative_script").replace(new RegExp(oldFactor.getValue("number"), 'g'), newfactor.getValue("number")));
          newAssessmentTypeRecord.update();
      }
  },

  _copyMatrixTable: function(oldAssessmentTypeRecord, newAssessmentTypeRecord) {
      var orignalInherent = [];
      var orignalControl = [];
      var astType = new GlideRecord("sn_risk_advanced_assessment_type");
      astType.addQuery("risk_assessment_methodology", oldAssessmentTypeRecord.risk_assessment_methodology);
      astType.query();

      while (astType.next()) {

          if (astType.sys_class_name == "sn_risk_advanced_inherent_assessment") {
              var inqual = new GlideRecord("sn_risk_advanced_rating_criteria");
              inqual.addQuery("assessment_type", astType.getUniqueValue());
              inqual.orderBy("lower_interval");
              inqual.query();
              while (inqual.next()) {
                  orignalInherent.push(inqual.getUniqueValue());
              }
          } else if (astType.sys_class_name == "sn_risk_advanced_control_assessment") {

              var cqual = new GlideRecord("sn_risk_advanced_rating_criteria");
              cqual.addQuery("assessment_type", astType.getUniqueValue());
              cqual.orderBy("lower_interval");
              cqual.query();
              while (cqual.next()) {
                  orignalControl.push(cqual.getUniqueValue());
              }
          }
      }

      var dupInherent = [];
      var dupControl = [];

      astType = new GlideRecord("sn_risk_advanced_assessment_type");
      astType.addQuery("risk_assessment_methodology", newAssessmentTypeRecord.risk_assessment_methodology);
      astType.query();

      while (astType.next()) {
          if (astType.sys_class_name == "sn_risk_advanced_inherent_assessment") {

              var inqual1 = new GlideRecord("sn_risk_advanced_rating_criteria");
              inqual1.addQuery("assessment_type", astType.getUniqueValue());
              inqual1.orderBy("lower_interval");
              inqual1.query();
              while (inqual1.next()) {
                  dupInherent.push(inqual1.getUniqueValue());
              }
          } else if (astType.sys_class_name == "sn_risk_advanced_control_assessment") {

              var cqual1 = new GlideRecord("sn_risk_advanced_rating_criteria");
              cqual1.addQuery("assessment_type", astType.getUniqueValue());
              cqual1.orderBy("lower_interval");
              cqual1.query();
              while (cqual1.next()) {
                  dupControl.push(cqual1.getUniqueValue());
              }
          }
      }
      for (var a = 0; a < orignalInherent.length; a++) {
          for (var j = 0; j < orignalControl.length; j++) {
              var oldmatrix = new GlideRecord("sn_risk_advanced_residual_assessment_matrix");
              oldmatrix.addQuery("sn_risk_advanced_assessment_type", oldAssessmentTypeRecord.getUniqueValue());
              oldmatrix.addQuery("inherent_risk", orignalInherent[a] + '');
              oldmatrix.addQuery("control_effectiveness", orignalControl[j] + '');
              oldmatrix.query();
              var newmatrix = new GlideRecord("sn_risk_advanced_residual_assessment_matrix");
              newmatrix.addQuery("sn_risk_advanced_assessment_type", newAssessmentTypeRecord.getUniqueValue());
              newmatrix.addQuery("inherent_risk", dupInherent[a] + '');
              newmatrix.addQuery("control_effectiveness", dupControl[j] + '');
              newmatrix.query();
              if (oldmatrix.next() && newmatrix.next()) {
                  var columnsToExclude1 = 'sn_risk_advanced_assessment_type,inherent_risk, control_effectiveness';
                  var fields1 = oldmatrix.getElements();
                  for (var i = 0; i < fields1.length; i++) {
                      var glideElement = fields1[i];
                      if (!columnsToExclude1.contains(glideElement.getName()) && glideElement.getTableName() != 'sys_metadata') {
                          newmatrix.setValue(glideElement.getName(), oldmatrix.getValue(glideElement.getName()));
                      }
                  }
                  newmatrix.update();
              }
          }
      }
  },

  _setAlternateRAMPrimary: function(ram) {
      var entityClasses = ram.entity_classes.split(",");
      for (index in entityClasses) {
          if (this._getPrimaryRAMForEntityClass(entityClasses[index], true) == ram.getUniqueValue()) {
              var alternateRam = this._getPrimaryRAMForEntityClass(entityClasses[index], false);
              var entityClassGr = new GlideRecord("sn_grc_profile_class");
              entityClassGr.get(entityClasses[index]);
              entityClassGr.primary_risk_assessment_methodology = alternateRam;
              entityClassGr.update();
          }
      }
  },

  _getPrimaryRAMForEntityClass: function(entityClass, primary) {
      if (entityClass == '')
          return '';
      if (primary) {
          var entityClassGr = new GlideRecord("sn_grc_profile_class");
          entityClassGr.get(entityClass + '');
          return entityClassGr.primary_risk_assessment_methodology;
      }
      var gr = new GlideRecord('sn_risk_advanced_risk_assessment_methodology');
      gr.addQuery('state', '2');
      gr.addQuery('assessed_on', '0');
      gr.addQuery('entity_classesLIKE' + entityClass);
      gr.orderBy('sys_created_on');
      gr.setLimit(1);
      gr.query();
      if (gr.next())
          return gr.getUniqueValue();
      return '';
  },

  _canRAMBeDraft: function(ramId) {
      var canBeDraft = true;
      if (new sn_risk_advanced.RiskAssessmentMethodologyUtils().checkIfActiveAssessmentExists(ramId.getUniqueValue())) {
          gs.addErrorMessage(gs.getMessage('This risk assessment methodology has active risk assessment instances and cannot be moved back to the draft state'));
          canBeDraft = false;
      }
      return canBeDraft;
  },

  _getDefaultRAMForAnEntity: function(entityId) {
      if (gs.nil(entityId))
          return '';

      var entity = new GlideRecord('sn_grc_profile');
      entity.get(entityId);

      var entityClassId = entity.getValue('profile_class');
      if (gs.nil(entityClassId))
          return this._getOldestRAMWithRollupResult(entity);
      else {
          var primary_ram = this._getPrimaryRAMForEntityClass(entityClassId, true);
          if (primary_ram == '')
              return this._getOldestRAMWithRollupResult(entity);
          return primary_ram;
      }
  },

  _getOldestRAMWithRollupResult: function(entity) {
      var oldestRAM = '';
      var aggregatedRiskRams = new sn_risk_advanced.GrcARAIntegrationUtils().getRAMsToDisplayOnEnityForm(entity);
      if (aggregatedRiskRams.length > 0) {
          oldestRAM = aggregatedRiskRams[0];
      }
      return oldestRAM;
  },

  _getAssessmentInstance: function(ramId, entityId, riskId) {
      var assessmentInstance = new GlideRecord('sn_risk_advanced_risk_assessment_instance');
      assessmentInstance.addQuery('risk_assessment_methodology', ramId);
      assessmentInstance.addQuery('entity_1', entityId);
      assessmentInstance.addQuery('risk', riskId);
      assessmentInstance.addQuery('state', '7');
      assessmentInstance.query();
      if (assessmentInstance.next())
          return assessmentInstance.getUniqueValue();
      return '';
  },

  _getAssessmentScope: function(ramId, entityId) {
      var assessmentScope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      assessmentScope.addQuery('risk_assessment_methodology', ramId);
      assessmentScope.addQuery('entity', entityId);
      assessmentScope.query();
      if (assessmentScope.next())
          return assessmentScope.getUniqueValue();
      else
          return null;
  },

  _updateARAInfoForEntities: function() {
      var entityClass = new GlideRecord("sn_grc_profile_class");
      entityClass.addNotNullQuery("primary_risk_assessment_methodology");
      entityClass.query();
      while (entityClass.next()) {
          this._updateEntitiesWithPRAM(entityClass.getUniqueValue(), entityClass.primary_risk_assessment_methodology);
      }
  },

  _updateEntitiesWithPRAM: function(entityClass, primaryRAM) {
      var entities = new GlideRecord('sn_grc_profile');
      entities.addQuery('profile_class', entityClass);
      entities.query();
      while (entities.next()) {
          entities.setValue('sn_risk_advanced_primary_risk_assessment_methodology', primaryRAM);
          entities.update();
      }
  },

  _clearARAInfoFromEntities: function() {
      var entityClass = new GlideRecord("sn_grc_profile_class");
      entityClass.addNotNullQuery("primary_risk_assessment_methodology");
      entityClass.query();
      while (entityClass.next()) {
          this._clearPrimaryRAMInfo(entityClass.getUniqueValue());
      }
  },

  _clearPrimaryRAMInfo: function(entityClassID) {
      var entity = new GlideRecord('sn_grc_profile');
      entity.addQuery('profile_class', entityClassID);
      entity.query();
      entity.setValue('sn_risk_advanced_primary_risk_assessment_methodology', 'NULL');
      entity.setValue('sn_risk_advanced_rollup_result', 'NULL');
      entity.updateMultiple();

      var risks = new GlideRecord('sn_risk_risk');
      risks.addQuery('profile.profile_class', entityClassID);
      risks.query();
      risks.setValue('primary_risk_assessment_methodology', 'NULL');
      risks.setValue('assessment_instance', 'NULL');
      risks.updateMultiple();

      //clear mitigation score from riskControl m2m
      var riskContrlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskContrlm2m.addQuery('sn_risk_risk.profile.profile_class', entityClassID);
      riskContrlm2m.query();
      riskContrlm2m.setValue('sn_risk_advanced_mitigation_score', '');
      riskContrlm2m.setValue('sn_risk_advanced_mitigation_effectiveness', '');
      riskContrlm2m.updateMultiple();
  },

  _updateAsmtTypes: function(ramReference) {
      var asmtType = new GlideRecord('sn_risk_advanced_assessment_type');
      asmtType.addQuery('risk_assessment_methodology', ramReference);
      asmtType.query();
      asmtType.state = '1';
      asmtType.updateMultiple();
  },

  _deleteScopeObjects: function(ramReference) {
      var asmtScope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      asmtScope.get('risk_assessment_methodology', ramReference);
      asmtScope.deleteMultiple();
  },

  _deleteSchedulers: function(ramReference) {
      var schedulerObj = new GlideRecord('sn_risk_advanced_assessment_scheduler');
      schedulerObj.get('risk_assessment_methodology', ramReference);
      schedulerObj.deleteMultiple();
  },

  _checkIfActiveAssessmentExists: function(ramReference) {
      var instances = new GlideRecord('sn_risk_advanced_risk_assessment_instance');
      instances.addQuery('risk_assessment_methodology', ramReference);
      instances.addQuery('state', 'NOT IN', '0,9');
      instances.setLimit(1);
      instances.query();
      return instances.hasNext();
  },


  //Base functions
  _insertRecord: function(tableName, methodologyId, assessmentTypeName, displayOrder) {
      var record = new GlideRecord(tableName);
      record.risk_assessment_methodology = methodologyId;
      record.name = assessmentTypeName;
      record.sys_class_name = tableName;
      record.display_order = displayOrder;
      record.insert();
  },

  _deleteRecord: function(tableName, methodologyId) {
      var record = new GlideRecord(tableName);
      record.addQuery('risk_assessment_methodology', methodologyId);
      record.query();
      if (record.next()) {
          record.deleteRecord();
      }
  },

  _insertOrDeleteRecord: function(tableName, assessmentTypeName, methodologyId, isFieldChanged, field, displayOrder) {
      if (isFieldChanged) {
          if (field == true) {
              this.insertRecord(tableName, methodologyId, assessmentTypeName, displayOrder);
              this._clearAppetiteScaleForAssessment(methodologyId, assessmentTypeName);
          } else {
              this.deleteRecord(tableName, methodologyId);
          }
      }
  },

  _clearAppetiteScaleForAssessment: function(methodologyId, assessmentTypeName) {
      var utils = new sn_risk_advanced.RiskAppetiteUtils();
      if (assessmentTypeName == "Residual Assessment") {
          utils.clearAppetiteFromAssessmentType('sn_risk_advanced_control_assessment', methodologyId);
          utils.clearAppetiteFromAssessmentType('sn_risk_advanced_inherent_assessment', methodologyId);
      } else if (assessmentTypeName == "Control Assessment") {
          utils.clearAppetiteFromAssessmentType('sn_risk_advanced_inherent_assessment', methodologyId);
      }
  },

  _assessmentTypeRecordCreationOrDeletion: function(ramRecord) {
      //If inherent risk checkbox changes, we need to insert asmt type record if selected, else delete existing record.
      this.insertOrDeleteRecord('sn_risk_advanced_control_assessment', "Control Assessment", ramRecord.getUniqueValue(), ramRecord.control_effectiveness.changes(), ramRecord.control_effectiveness, '2');
      this.insertOrDeleteRecord('sn_risk_advanced_inherent_assessment', "Inherent Assessment", ramRecord.getUniqueValue(), ramRecord.inherent_risk.changes(), ramRecord.inherent_risk, '1');
      this.insertOrDeleteRecord('sn_risk_advanced_residual_assessment', "Residual Assessment", ramRecord.getUniqueValue(), ramRecord.residual_risk.changes(), ramRecord.residual_risk, '3');
      this.insertOrDeleteRecord('sn_risk_advanced_target_assessment', "Target Assessment", ramRecord.getUniqueValue(), ramRecord.target_risk.changes(), ramRecord.target_risk, '4');
  },

  _getAssessmentTypeCount: function(assessmentType) {

      var gr = new GlideAggregate(assessmentType.getTableName());
      gr.addAggregate('COUNT');
      gr.addQuery('risk_assessment_methodology', assessmentType.risk_assessment_methodology);
      gr.addQuery('sys_class_name', assessmentType.sys_class_name);
      gr.query();

      if (gr.next())
          return gr.getAggregate('COUNT');
      else
          return 0;
  },

  _addIfEntityClassPointsOneOrZeroTable: function(ramReference) {
      var entityClassRuleReference = new GlideAggregate('sn_grc_profile_class_rules');
      entityClassRuleReference.addQuery('profile_class', (ramReference.entity_class_1 + ''));
      entityClassRuleReference.addAggregate('COUNT');
      entityClassRuleReference.query();
      if (entityClassRuleReference.next()) {
          if (parseInt(entityClassRuleReference.getAggregate('COUNT')) > 1) {
              gs.addErrorMessage(new sn_grc.GRCUtils().getMessage("profile_class_already_exists"));
              ramReference.setAbortAction(true);
          }
      }
  },

  _validateRAM: function(ramReference) {
      var result = {};
      var tableAlreadyPresent = this._checkPublishedRAMWithSameTablePresent(ramReference);
      if (tableAlreadyPresent) {
          result.errorMsg = gs.getMessage('Risk assessment methodology is already present on this table');
          return result;
      }
      var asmtTypesPresent = this._checkIfAssessmentTypesarePresent(ramReference.getUniqueValue());
      if (!asmtTypesPresent) {
          result.errorMsg = gs.getMessage('Add at least one assessment type to publish the Risk assessment methodology.');
      } else {
          var inherent = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_inherent_assessment');
          var control = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_control_assessment');
          var residual = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_residual_assessment');
          var target = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_target_assessment');
          result = inherent && control && residual && target;
      }
      return result;
  },

  _validateRiskResponseMandatoryScript: function(ramReference) {
      if (gs.hasRole('sn_risk_advanced.ara_admin') || gs.hasRole('sn_grc.developer')) {
          var evaluator = new GlideScopedEvaluator();
          evaluator.putVariable('result', {});
          evaluator.putVariable('asmtId', '');
          evaluator.evaluateScript(ramReference, 'risk_response_mandatory_script', null);
          var result = evaluator.getVariable('result');
          if (result.error && result.error.message)
              result.error = result.error.message;
          return result;
      } else {
          return gs.getMessage("Insufficient privileges to perform this action");
      }
  },

  _validateScript: function(glideRecord, fieldName) {
      var evaluator = new GlideScopedEvaluator();
      evaluator.putVariable('result', {});
      evaluator.putVariable('asmtId', '');
      evaluator.evaluateScript(glideRecord, fieldName, null);
      var result = evaluator.getVariable('result');
      if (result.error && result.error.message)
          result.error = result.error.message;
      return result;
  },

  _validateAssessmentType: function(ramReference, className) {
      var asmtType = new GlideRecord('sn_risk_advanced_assessment_type');
      asmtType.addQuery('risk_assessment_methodology', ramReference);
      asmtType.addQuery('sys_class_name', className);
      asmtType.query();

      if (!asmtType.next()) {
          return true;
      } else {
          if (asmtType.state == '2')
              return true;
          else
              return false;
      }
  },

  _checkIfAssessmentTypesarePresent: function(ramReference) {
      var asmtType = new GlideRecord('sn_risk_advanced_assessment_type');
      asmtType.addQuery('risk_assessment_methodology', ramReference);
      asmtType.query();
      return asmtType.hasNext();
  },

  _checkPublishedRAMWithSameTablePresent: function(ramReference) {
      var ram = new GlideRecord('sn_risk_advanced_risk_assessment_methodology');
      ram.addQuery('assessed_on', '1');
      ram.addQuery('table_name', ramReference.getValue('table_name'));
      ram.addQuery('state', '2');
      ram.query();
      return ram.hasNext();
  },

  _retireAsmtType: function(ramID) {
      var asmtType = new GlideRecord('sn_risk_advanced_assessment_type');
      asmtType.addQuery('risk_assessment_methodology', ramID);
      asmtType.query();
      asmtType.setValue('state', '3');
      asmtType.updateMultiple();
  },

  _setAsmtScopeToInActive: function(ramID) {
      var asmtScope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      asmtScope.addQuery('risk_assessment_methodology', ramID);
      asmtScope.query();
      asmtScope.setValue('active', false);
      asmtScope.updateMultiple();
  },

  _getHighResidualRiskRating: function(ramId) {
      var highRating = "";
      var resiudalAssessment = new GlideRecord("sn_risk_advanced_residual_assessment");
      resiudalAssessment.addQuery('risk_assessment_methodology', ramId);
      resiudalAssessment.query();
      if (resiudalAssessment.next()) {
          var rating = new GlideRecord("sn_risk_advanced_rating_criteria");
          rating.addQuery('assessment_type', resiudalAssessment.getUniqueValue());
          rating.orderByDesc('lower_interval');
          rating.setLimit(1);
          rating.query();
          highRating = rating.next() ? rating.getUniqueValue() : "";
      }
      return highRating;
  },

  _getEntityForRisk: function(risk) {
      var riskRecord = new GlideRecord("sn_risk_risk");
      riskRecord.get(risk);
      return riskRecord.getValue('profile');
  },

  _getRAMChoicesForRisk: function(riskId, search) {
      var result = {};
      var itemParent = {};
      var totalRams = 0;
      var heading = "";
      var ramChoices = [];
      var rams = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      var entityId = this._getEntityForRisk(riskId);
      if (entityId) {
          var entityRecord = new GlideRecord("sn_grc_profile");
          entityRecord.get(entityId);
          if (entityRecord.getValue("active")) {
              var entityClass = entityRecord.getValue("profile_class");
              if (entityClass) {
                  //Get count of total no. of RAMs for risk
                  var countRams = new GlideAggregate('sn_risk_advanced_risk_assessment_methodology');
                  countRams.addQuery("assessed_on", "0");
                  countRams.addQuery("entity_classesLIKE" + entityClass);
                  countRams.addQuery("state", "2");
                  if (search) {
                      countRams.addEncodedQuery("nameSTARTSWITH" + search);
                  }
                  countRams.addAggregate('COUNT');
                  countRams.query();
                  if (countRams.next()) {
                      totalRams = countRams.getAggregate('COUNT');
                  }

                  rams.addQuery("assessed_on", "0");
                  rams.addQuery("entity_classesLIKE" + entityClass);
                  rams.addQuery("state", "2");
                  if (search) {
                      rams.addEncodedQuery("nameSTARTSWITH" + search);
                  }
                  rams.orderBy("name");
                  rams.setLimit(25);
                  rams.query();
                  if (totalRams > 25) {
                      heading = gs.getMessage("Showing 1-25 out of {0} risk assessment methodologies", [totalRams]);
                  } else {
                      if (totalRams == 0) {
                          heading = gs.getMessage("No risk assessment methodology found");
                      } else {
                          heading = gs.getMessage("Showing 1-{0} out of {0} risk assessment methodologies", [totalRams]);
                      }
                  }
                  itemParent.label = heading;
                  while (rams.next()) {
                      var item = {};
                      item.id = rams.getUniqueValue();
                      item.label = rams.getValue("name");
                      ramChoices.push(item);
                  }
                  itemParent.children = ramChoices;
                  result.ramChoices = [itemParent];
              }
          }
      }
      return result;
  },

  _getRAMChoices: function(search) {
      var result = {};
      var itemParent = {};
      var totalRams = 0;
      var heading = "";
      var ramChoices = [];
      var rams = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      if (search) {
          rams.addEncodedQuery("assessed_on=0^state=2^nameSTARTSWITH" + search);
      } else {
          rams.addEncodedQuery("assessed_on=0^state=2");
      }
      rams.orderBy("name");
      rams.setLimit(25);
      rams.query();
      totalRams = rams.getRowCount();
      if (totalRams > 25) {
          heading = gs.getMessage("Showing 1-25 out of {0} risk assessment methodologies", [totalRams]);
      } else {
          if (totalRams == 0) {
              heading = gs.getMessage("No risk assessment methodology found");
          } else {
              heading = gs.getMessage("Showing 1-{0} out of {0} risk assessment methodologies", [totalRams]);
          }
      }
      itemParent.label = heading;
      while (rams.next()) {
          var item = {};
          item.id = rams.getUniqueValue();
          item.label = rams.getValue("name");
          ramChoices.push(item);
      }
      itemParent.children = ramChoices;
      result.ramChoices = [itemParent];
      return result;
  },

  _getRiskChoices: function(search) {
      var result = {};
      var itemParent = {};
      //Get count of total no. of risks
      var totalRisks = 0;
      var riskCount = new GlideAggregate('sn_risk_risk');
      if (search) {
          riskCount.addEncodedQuery("state!=retired^nameSTARTSWITH" + search);
      } else {
          riskCount.addEncodedQuery("state!=retired");
      }
      riskCount.addAggregate('COUNT');
      riskCount.query();
      if (riskCount.next()) {
          totalRisks = riskCount.getAggregate('COUNT');
      }

      var heading = "";
      var riskChoices = [];
      var risks = new GlideRecord("sn_risk_risk");
      if (search) {
          risks.addEncodedQuery("state!=retired^nameSTARTSWITH" + search);
      } else {
          risks.addEncodedQuery("state!=retired");
      }
      risks.orderBy("name");
      risks.setLimit(25);
      risks.query();
      if (totalRisks > 25) {
          heading = gs.getMessage("Showing 1-25 out of {0} risks", [totalRisks]);
      } else {
          if (totalRisks == 0) {
              heading = gs.getMessage("No risk found");
          } else {
              heading = gs.getMessage("Showing 1-{0} out of {0} risks", [totalRisks]);
          }
      }
      itemParent.label = heading;
      while (risks.next()) {
          var item = {};
          var entity = new GlideRecord("sn_grc_profile");
          item.id = risks.getUniqueValue();
          item.label = risks.getValue("name");
          entity.get(risks.getValue("profile"));
          item.sublabel = entity.getValue("name");
          riskChoices.push(item);
      }
      itemParent.children = riskChoices;
      result.riskChoices = [itemParent];
      return result;
  },

  _getAssigneeGroups: function(search, type, options) {
      var result = {};
      var resultFound = false;
      //Condition to check for domain or RAMs which can access extension points
      if (options.domain != 0 || gs.getProperty('sn_risk_advanced.rams_with_extension_points').includes(options.ramId)) {
          var hooks = new GlideScriptedExtensionPoint().getExtensions('sn_risk_advanced.getAssigneeGroupsToReassign');
          hooks.forEach(function(hook) {
              if (hook.handles(options)) {
                  result = hook.getUserGroupsObject(search, type, options);
              }
              //If result object returned not empty
              if (!(Object.keys(result).length === 0 && result.constructor === Object)) {
                  resultFound = true;
                  return;
              }
          });
      }
      if (resultFound) {
          return result;
      }
      var itemParent = {};

      //Get count of total no. of groups matching the filter
      var totalGroups = 0;
      var groupCount = new GlideAggregate('sys_user_group');
      if (type == 'assessor') groupCount.addEncodedQuery("roles=sn_risk.reader^ORroles=sn_risk.manager^ORroles=sn_risk.admin^ORroles=sn_risk.user^ORroles=sn_risk_advanced.ara_assessor^ORroles=sn_grc.business_user_lite^active=true");
      else groupCount.addEncodedQuery("roles=sn_risk.reader^ORroles=sn_risk.manager^ORroles=sn_risk.admin^ORroles=sn_risk.user^ORroles=sn_risk_advanced.ara_approver^active=true");
      if (search)
          groupCount.addEncodedQuery("^nameSTARTSWITH" + search);
      groupCount.addAggregate('COUNT');
      groupCount.query();
      if (groupCount.next()) {
          totalGroups = groupCount.getAggregate('COUNT');
      }

      var heading = "";
      var groupChoices = [];
      var groups = new GlideRecord("sys_user_group");
      if (type == 'assessor') groups.addEncodedQuery("roles=sn_risk.reader^ORroles=sn_risk.manager^ORroles=sn_risk.admin^ORroles=sn_risk.user^ORroles=sn_risk_advanced.ara_assessor^ORroles=sn_grc.business_user_lite^active=true");
      else groups.addEncodedQuery("roles=sn_risk.reader^ORroles=sn_risk.manager^ORroles=sn_risk.admin^ORroles=sn_risk.user^ORroles=sn_risk_advanced.ara_approver^active=true");
      if (search)
          groups.addEncodedQuery("^nameSTARTSWITH" + search);
      groups.orderBy("name");
      groups.setLimit(25);
      groups.query();
      if (totalGroups > 25) {
          heading = gs.getMessage("Showing 1-25 out of {0} groups", [totalGroups]);
      } else {
          if (totalGroups == 0) {
              heading = gs.getMessage("No groups found");
          } else {
              heading = gs.getMessage("Showing 1-{0} out of {0} groups", [totalGroups]);
          }
      }
      itemParent.label = heading;
      while (groups.next()) {
          var item = {};
          item.id = groups.getUniqueValue();
          item.label = groups.getValue("name");
          groupChoices.push(item);
      }
      itemParent.children = groupChoices;
      result.groupChoices = [itemParent];
      return result;
  },

  _validateLicense: function(ram) {
      var result = {};

      var license = ram.getValue("license");

      //If its a domain RAM, check exisiting no. of active and published RAMs
      if (license != 0) {
          var ram_record = new GlideAggregate("sn_risk_advanced_risk_assessment_methodology");
          ram_record.addQuery("license", license);
          ram_record.addQuery("state", "2");
          // Add Aggregate  
          ram_record.addAggregate('COUNT');
          ram_record.query();
          ram_record.next();
          if (ram_record.getAggregate('COUNT') >= 2) {
              result.isValid = false;
              result.errorMsg = gs.getMessage("You cannot publish more than two risk assessment methodologies for a domain. Please contact your system administrator.");
          } else {
              result.isValid = true;
          }
      } else {
          if (!this._canCreateNewRAM()) {
              result.isValid = false;
              result.errorMsg = gs.getMessage("You cannot publish more than two risk assessment methodologies for a domain. Please contact your system administrator.");
          } else {
              result.isValid = true;
          }
      }

      return result;
  },

  _canCreateNewRAM: function() {

      if (this._hasARALimitedLicense()) {
          if (this._hasIRMEnterpriseLicense() || this._hasIRMProfessional()) {
              return true;
          }
          return false;
      }
      return true;
  },

  _hasARALimitedLicense: function() {
      var hasLicense = new sn_risk_advanced.LicensingUtils().hasEntitlement("ara_limited_access");
      return hasLicense;
  },

  _hasIRMEnterpriseLicense: function() {
      var hasLicense = new sn_risk_advanced.LicensingUtils().hasEntitlement("irm_enterprise_access");
      return hasLicense;
  },

  _hasIRMProfessional: function() {
      var hasLicense = new sn_risk_advanced.LicensingUtils().hasEntitlement("irm_professional_access");
      return hasLicense;
  },

  _getDomainFromParams: function(options) {
      //if RAM is present
      if (options.ramId) {
          var domain = this._getDomainFromRAM(options.ramId);
          options.domain = domain ? domain : 0;
      }
      // if Risk assessment id is present
      else if (options.assessmentId) {
          var asmt = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
          asmt.get(options.assessmentId);
          var ramId = asmt.getValue("risk_assessment_methodology");
          domain = this._getDomainFromRAM(options.ramId);
          options.domain = domain ? domain : 0;
          options.ramId = ramId;
      }
      return options;
  },

  _getDomainFromRAM: function(ramId) {
      var ram = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      ram.addQuery("sys_id", ramId);
      ram.query();
      if (ram.next()) {
          return ram.getValue("license");
      }
  },

  _checkIfAssessmentTypesPublished: function(ramReference) {
      var inherent = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_inherent_assessment');
      var control = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_control_assessment');
      var residual = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_residual_assessment');
      var target = this._validateAssessmentType(ramReference.getUniqueValue(), 'sn_risk_advanced_target_assessment');
      return inherent && control && residual && target;
  },

  _performEntitlementCheck: function(ramId) {
      var msg;
      //Check RAM id passed
      if (ramId) {
          var ram = new GlideRecord('sn_risk_advanced_risk_assessment_methodology');
          ram.get(ramId);
          //Check domain of RAM id is IRM, also the user has atleast ara limited license
          if (ram.getValue('license') == 0 && this._hasARALimitedLicense()) {
              //Check if neither IRM professional nor IRM enterprise entitlement present, throw message
              if (!(this._hasIRMProfessional() || this._hasIRMEnterpriseLicense())) {
                  msg = gs.getMessage('Your current product license does not authorise you to use advanced risk assessments. Contact your system administrator for details.');
              }
          }
      }
      return msg;
  },

  type: 'RiskAssessmentMethodologyUtilsBase'
};

Sys ID

c42c8260b7910010bded618dce11a9ff

Offical Documentation

Official Docs: