Name

sn_risk_advanced.RiskAssessmentScopeUtilsBase

Description

No description available

Script

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

  checkIfAnyAssessments: function(asmtScope) {
      return this._checkIfAnyAssessments(asmtScope);
  },

  filterEntitiesByClass: function(ramId) {
      return this._filterEntitiesByClass(ramId);
  },

  getEntitiesAssociatedToRAM: function(asmtMethodology) {
      return this._getEntitiesAssociatedToRAM(asmtMethodology);
  },

  createRiskAssessmentScope: function(asmtMethodology, entityIds, schedulerId) {
      return this._createRiskAssessmentScope(asmtMethodology, entityIds, schedulerId);
  },

  bulkTriggerAssessments: function(schedulerId) {
      this._bulkTriggerAssessments(schedulerId);
  },

  deleteAssessableEntities: function(schedulerId) {
      this._deleteAssessableEntities(schedulerId);
  },

  validateScheduler: function(schedulerId) {
      return this._validateScheduler(schedulerId);
  },

  executeFutureDatedSchedulers: function() {
      this._executeFutureDatedSchedulers();
  },

  bulkTriggerAssessmentsFromPlaybook: function(schedulerId) {
      return this._bulkTriggerAssessmentsFromPlaybook(schedulerId);
  },

  getDaysToInitiate: function(scheduler) {
      return this._getDaysToInitiate(scheduler);
  },

  _bulkTriggerAssessmentsFromPlaybook: function(scheduler) {
      var message = "";
      scheduler.state = '3';
      scheduler.update();
      var initiationLaterEnabled = scheduler.getValue('initiate_later');
      if (initiationLaterEnabled == '1') {
          var daysToInitiate = this._getDaysToInitiate(scheduler);
          var initiatedDate = scheduler.getDisplayValue('initiation_date');
          var daysMessage = daysToInitiate > 1 ? gs.getMessage('days from now on {0}', initiatedDate) : gs.getMessage('day from now on {0}', initiatedDate);
          message = gs.getMessage('The assessments will bescheduled to initiate {0} {1}', [daysToInitiate, daysMessage]);
      } else {
          message = gs.getMessage('Risk assessments are being initiated for all mapped risks of the selected entities. This may take a while.');
          gs.eventQueue('sn_risk_advanced.bulk_initiate_asmts', null, scheduler.getUniqueValue());
      }
      return message;
  },

  _getDaysToInitiate: function(scheduler) {
      var today = new GlideDateTime();
      var initiationDate = new GlideDateTime(scheduler.initiation_date);
      var dur = new GlideDuration(GlideDateTime.subtract(today, initiationDate));
      return dur.getRoundedDayPart();
  },

  _executeFutureDatedSchedulers: function() {
      var today = new GlideDate();
      var schedulers = new GlideRecord('sn_risk_advanced_assessment_scheduler');
      schedulers.addQuery('initiate_later', 'true');
      schedulers.addQuery('initiation_date', '<=', today);
      schedulers.addQuery('state', '3');
      schedulers.query();
      while (schedulers.next()) {
          this._bulkTriggerAssessments(schedulers.getUniqueValue());
      }
  },

  _validateScheduler: function(schedulerId) {
      var scope = new GlideAggregate('sn_risk_advanced_risk_assessment_scope');
      scope.addQuery('risk_assessment_scheduler', schedulerId);
      scope.addAggregate('COUNT');
      scope.query();
      if (scope.next()) {
          if (scope.getAggregate('COUNT') > 0)
              return true;
      }
      gs.addErrorMessage(gs.getMessage('Associate at least one entity to finalise the scheduler.'));
      return false;
  },

  _deleteAssessableEntities: function(schedulerId) {
      var scope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      scope.addQuery('risk_assessment_scheduler', schedulerId);
      scope.query();
      while (scope.next()) {
          if (this._hasActiveAssessments(scope)) {
              scope.setValue('risk_assessment_scheduler', '');
              scope.update();
          } else {
              scope.deleteRecord();
          }
      }
  },

  _hasActiveAssessments: function(asmtScope) {
      var instances = new GlideRecord('sn_risk_advanced_risk_assessment_instance');
      instances.addQuery('state', 'NOT IN', '0');
      instances.addQuery('assessment_scope', asmtScope.getUniqueValue());
      instances.setLimit(1);
      instances.query();
      return instances.hasNext();
  },

  _bulkTriggerAssessments: function(schedulerId) {
      this._copySchedulerSettingsToScope(schedulerId);
      var scope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      scope.addQuery('risk_assessment_scheduler', schedulerId);
      scope.query();
      while (scope.next()) {
          var riskIds = this._getRiskAssociatedToEntity(scope.getValue('entity'));
          new sn_risk_advanced.RiskAssessmentUtils().createAssessmentInstanceFromRisks(riskIds, scope.getUniqueValue(), scope.getValue('entity'));
          new sn_risk_advanced.RiskAssessmentUtils().markAssess(null, scope.getUniqueValue());
      }
      this._updateSchedulerState(schedulerId, '5');
  },

  _updateSchedulerState: function(schedulerId, state) {
      var scheduler = new GlideRecord('sn_risk_advanced_assessment_scheduler');
      if (scheduler.get(schedulerId)) {
          scheduler.setValue('state', state);
          scheduler.update();
      }
  },

  _getRiskAssociatedToEntity: function(entity) {
      var riskIds = [];
      var risks = new GlideRecord('sn_risk_risk');
      risks.addQuery('profile', entity);
      risks.addQuery('state', '!=', 'retired');
      risks.query();
      while (risks.next()) {
          riskIds.push(risks.getUniqueValue());
      }
      return riskIds;
  },

  _copySchedulerSettingsToScope: function(schedulerId) {
      var columnsToCopy = ['assessor_type', 'assessor', 'assessor_group', 'approver_type', 'approver', 'approver_group', 'days_to_overdue', 'reassessment_frequency'];
      var schedulerRec = new GlideRecord('sn_risk_advanced_assessment_scheduler');
      if (schedulerRec.get(schedulerId)) {
          var scope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
          scope.addQuery('risk_assessment_scheduler', schedulerId);
          scope.query();
          for (var i = 0; i < columnsToCopy.length; i++) {
              scope.setValue(columnsToCopy[i], schedulerRec.getValue(columnsToCopy[i]));
          }
          scope.setValue("state", "5");
          scope.updateMultiple();
      }
  },

  _createRiskAssessmentScope: function(asmtMethodology, entityIds, schedulerId) {
      var responseObj = {
          scopesCreated: 0,
          failedScopeCount: 0
      };
      var entities = entityIds.split(',');
      if (entities.length == 0) {
          return responseObj;
      }
      for (var i = 0; i < entities.length; i++) {
          if (entities[i] != '') {
              this._createScopeObject(entities[i], asmtMethodology, schedulerId, responseObj);
          }
      }
      return responseObj;
  },

  _createScopeObject: function(entity, asmtMethodology, asmtScheduler, responseObj) {
      var scope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      scope.setValue('risk_assessment_methodology', asmtMethodology);
      scope.setValue('risk_assessment_scheduler', asmtScheduler);
      scope.setValue('entity', entity);
      if (gs.nil(scope.insert())) {
          responseObj.failedScopeCount++;
      } else {
          responseObj.scopesCreated++;
      }
  },

  _getEntitiesAssociatedToRAM: function(asmtMethodology) {
      var entities = [];
      var riskAsmtScope = new GlideRecord('sn_risk_advanced_risk_assessment_scope');
      riskAsmtScope.addQuery('risk_assessment_methodology', asmtMethodology);
      riskAsmtScope.query();
      while (riskAsmtScope.next()) {
          entities.push(riskAsmtScope.getValue('entity'));
      }
      return JSON.stringify(entities);
  },

  _checkIfAnyAssessments: function(asmtScope) {
      // To delete assessment scope, it should not have any assessment instances not in draft 
      var gr = new GlideRecord("sn_risk_advanced_risk_assessment_instance");
      gr.addQuery('assessment_scope', asmtScope);
      gr.addQuery('state', '!=', '0');
      gr.setLimit(1);
      gr.query();
      gr.next();
      if (gr.getRowCount() == 1) {
          return false;
      } else {
          return true;
      }
  },

  _filterEntitiesByClass: function(ramId) {

      var ram = new GlideRecord("sn_risk_advanced_risk_assessment_methodology");
      ram.get(ramId);
      var entityClasses = ram.getValue("entity_classes");

      var scope = new GlideRecord("sn_risk_advanced_risk_assessment_scope");
      scope.addQuery("risk_assessment_methodology", ramId);
      scope.query();

      var profileList = [];
      while (scope.next()) {
          profileList.push(scope.getValue("entity"));
      }
      profileList = profileList.join(",");
      var gr = new GlideRecord('sn_grc_profile');
      gr.addQuery('profile_class', 'IN', entityClasses);
      gr.addQuery('sys_id', "NOT IN", profileList);
      if (!gs.getUser().hasRole("sn_risk.manager"))
          gr.addQuery('owned_by', gs.getUserID());
      gr.addActiveQuery();
      gr.addQuery();
      return gr.getEncodedQuery();
  },




  type: 'RiskAssessmentScopeUtilsBase'
};

Sys ID

57bd13ac776100102a272f589a106161

Offical Documentation

Official Docs: