Name

sn_risk_advanced.GRCRiskEventBase

Description

No description available

Script

var GRCRiskEventBase = Class.create();
GRCRiskEventBase.prototype = {

  initialize: function() {},

  getUserProfileFilter: function(showMine, profiles) {
      return this._getUserProfileFilter(showMine, profiles);
  },

  eventHasOpenIssues: function(eventID) {
      return this._eventHasOpenIssues(eventID);
  },

  getCurrencyCode: function() {
      return this._getCurrencyCode();
  },

  getCurrencyCodesArray: function() {
      return this._getCurrencyCodesArray();
  },

  eventHasOpenTasks: function(eventID) {
      return this._eventHasOpenTasks(eventID);
  },

  getEventRisks: function(eventID) {
      return this._getEventRisks(eventID);
  },

  getEventProfiles: function(eventID) {
      return this._getEventProfiles(eventID);
  },

  removeEventProfileRisks: function(eventID, profileID) {
      return this._removeEventProfileRisks(eventID, profileID);
  },

  getEventControls: function(eventID) {
      return this._getEventControls(eventID);
  },

  removeEventProfileControls: function(eventID, profileID) {
      return this._removeEventProfileControls(eventID, profileID);
  },

  setEventSummaryLoss: function(event) {
      this._setEventSummaryLoss(event);
  },

  updateEventWhenImpactChanges: function(eventID) {
      this._updateEventWhenImpactChanges(eventID);
  },

  getExchangeValue: function(value, fromCurrency, toCurrency, date) {
      return this._getExchangeValue(value, fromCurrency, toCurrency, date);
  },

  getSingleCurrencyCode: function() {
      return this._getSingleCurrencyCode();
  },

  eventHasFinancialImpacts: function(eventID) {
      return this._eventHasFinancialImpacts(eventID);
  },

  removeFinancialImpacts: function(eventID) {
      return this._removeFinancialImpacts(eventID);
  },

  canEventClose: function(eventID) {
      return this._canEventClose(eventID);
  },

  getContributingEvents: function(eventID) {
      return this._getContributingEvents(eventID);
  },

  calculateGainEvent: function(risk_event) {
      return this._calculateGainEvent(risk_event);
  },

  getMyRiskEvents: function() {
      return this._getMyRiskEvents();
  },

  clearBaselReportsTable: function() {
      this._clearBaselReportsTable();
  },

  updateBaselReportsTable: function() {
      this._updateBaselReportsTable();
  },

  addRiskControlToRiskEvent: function(riskId, riskEventId) {
      this._addRiskControlToRiskEvent(riskId, riskEventId);
  },

  deleteRiskControlFromRiskEvent: function(riskId, riskEventId) {
      this._deleteRiskControlFromRiskEvent(riskId, riskEventId);
  },

  getEntitiesQuery: function(riskEventId) {
      return this._getEntitiesQuery(riskEventId);
  },

  getCurrencyCodesSymbolArray: function() {
      return this._getCurrencyCodesSymbolArray();
  },

  getCurrencySymbol: function(currencyCode) {
      return this._getCurrencySymbol(currencyCode);
  },

  _getEntitiesQuery: function(riskEventId) {
      var gr = new GlideRecord('sn_risk_advanced_m2m_event_profile');
      gr.addQuery('event', riskEventId);
      gr.query();
      var query = "active=true^";
      while (gr.next()) {
          query = query + "profile=" + gr.getValue('profile') + "^OR";
      }
      query = query.substring(0, query.length - 3);
      return query;
  },

  _addRiskControlToRiskEvent: function(riskId, riskEventId) {
      var riskControlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskControlm2m.addQuery('sn_risk_risk', riskId);
      riskControlm2m.query();
      var eventControlm2m = new GlideRecord('sn_risk_advanced_m2m_event_control');
      while (riskControlm2m.next()) {
          eventControlm2m.initialize();
          eventControlm2m.setValue('risk_event', riskEventId);
          eventControlm2m.setValue('control', riskControlm2m.getValue('sn_compliance_control'));
          eventControlm2m.insert();
      }
  },

  _deleteRiskControlFromRiskEvent: function(riskId, riskEventId) {
      var controls = this._getControlsForRisk(riskId);
      var eventControlm2m = new GlideRecord('sn_risk_advanced_m2m_event_control');
      eventControlm2m.initialize();
      eventControlm2m.addQuery('risk_event', riskEventId);
      eventControlm2m.addQuery('control', 'IN', controls);
      eventControlm2m.deleteMultiple();
  },

  _getControlsForRisk: function(riskId) {
      var riskControlm2m = new GlideRecord('sn_risk_m2m_risk_control');
      riskControlm2m.addQuery('sn_risk_risk', riskId);
      riskControlm2m.query();
      var controls = [];
      while (riskControlm2m.next()) {
          controls.push(riskControlm2m.getValue('sn_compliance_control'));
      }
      return controls;
  },

  _getMyRiskEvents: function() {
      var gr = new GlideRecordSecure('sn_risk_advanced_event');
      gr.addQuery('opened_by', gs.getUserID());
      gr.query();
      var pas = [];
      while (gr.next()) {
          var pa = {};
          pa.sys_id = gr.sys_id + '';
          pa.number = gr.number + '';
          pa.assigned_to = gr.getDisplayValue('opened_by');
          pa.name = gr.name + '';
          pa.discovered_on = gr.discovered_on + '';
          pa.state = gr.getDisplayValue('state');
          pas.push(pa);
      }
      return pas;
  },

  _calculateGainEvent: function(risk_event) {
      if (risk_event.sub_type == '2') {
          risk_event.gain_event = risk_event.expected_loss < 0 || risk_event.potential_loss < 0 ? true : false;
      } else if (risk_event.sub_type == '1') {
          risk_event.gain_event = risk_event.net_amount < 0 ? true : false;
      }
  },

  _canEventClose: function(eventID) {
      return !(this._eventHasOpenIssues(eventID) || this._eventHasOpenTasks(eventID));
  },

  _getContributingEvents: function(eventID) {
      return 'sn_risk_advanced_event_impact_list.do?sysparm_query=risk_event=' + eventID;
  },

  checkIfRapidRecoveryFlagShouldBeChecked: function(eventEntry, noOfRapidRecoveryDaysProperty) {
      this._checkIfRapidRecoveryFlagShouldBeChecked(eventEntry, noOfRapidRecoveryDaysProperty);
  },

  updateRapidRecoveryFlags: function(riskEvents, propertyValue) {
      this._updateRapidRecoveryFlags(riskEvents, propertyValue);
  },

  updateDownstreamBusinessLineValues: function(currentLevelProfiles, entityBusinessLine) {
      this._updateDownstreamBusinessLineValues(currentLevelProfiles, entityBusinessLine);
  },

  _removeFinancialImpacts: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_event_impact');
      gr.addQuery('risk_event', eventID);
      gr.addQuery('impact_type', '!=', '4');
      gr.query();
      var removed = gr.getRowCount();
      gr.deleteMultiple();
      return removed;
  },

  _eventHasFinancialImpacts: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_event_impact');
      gr.addQuery('risk_event', eventID);
      gr.addQuery('impact_type', '!=', '4');
      gr.query();
      return gr.getRowCount();
  },

  _getSingleCurrencyCode: function() {
      return gs.getProperty('glide.i18n.single_currency.code', 'USD');
  },

  _getCurrencyCodesArray: function() {
      if (gs.getProperty('glide.i18n.single_currency').toString() == "true") {
          var singleCurrencyCode = (gs.getProperty('glide.i18n.single_currency.code')) + '';
          if (singleCurrencyCode != '') {
              return singleCurrencyCode;
          }
      }
      var sessionCurrency = new GlideRecord('sn_risk_advanced_event');
      sessionCurrency.initialize();
      var sessionCurrencyCode = sessionCurrency.expected_loss.getSessionCurrencyCode().toString();
      var codes = [];

      if (sessionCurrencyCode != '') {
          codes.push(sessionCurrencyCode);
      }

      var currencyTypes = new GlideRecord('fx_currency');
      currencyTypes.addActiveQuery();
      currencyTypes.addQuery('code', '!=', sessionCurrencyCode);
      currencyTypes.query();

      while (currencyTypes.next()) {
          codes.push(currencyTypes.getValue('code').toString());
      }
      return codes;
  },

  _getCurrencyCodesSymbolArray: function() {
      var currencies = [];
      var currency = {};
      if (gs.getProperty('glide.i18n.single_currency').toString() == "true") {
          var singleCurrencyCode = (gs.getProperty('glide.i18n.single_currency.code')) + '';
          if (singleCurrencyCode != '') {
              currency.code = singleCurrencyCode;
              currency.symbol = this._getCurrencySymbol(singleCurrencyCode);
              currencies.push(currency);
              return currencies;
          }
      }
      var sessionCurrency = new GlideRecord('sn_risk_advanced_event');
      sessionCurrency.initialize();
      var sessionCurrencyCode = sessionCurrency.expected_loss.getSessionCurrencyCode().toString();
      var codes = [];

      if (sessionCurrencyCode != '') {
          currency = {};
          currency.code = sessionCurrencyCode;
          currency.symbol = this._getCurrencySymbol(sessionCurrencyCode);
          currencies.push(currency);
      }

      var currencyTypes = new GlideRecord('fx_currency');
      currencyTypes.addActiveQuery();
      currencyTypes.addQuery('code', '!=', sessionCurrencyCode);
      currencyTypes.query();

      while (currencyTypes.next()) {
          currency = {};
          currency.code = currencyTypes.getValue('code');
          currency.symbol = currencyTypes.getValue('symbol');
          currencies.push(currency);
      }
      return currencies;
  },

  _getCurrencySymbol: function(currencyCode) {
      var currencyTypes = new GlideRecord('fx_currency');
      currencyTypes.addQuery('code', currencyCode);
      currencyTypes.query();
      if (currencyTypes.next())
          return currencyTypes.getValue('symbol');
      return '';
  },

  _getCurrencyCode: function() {
      var codes = this._getCurrencyCodesArray();
      return codes.toString();
  },

  _getCurrencyRatesOnDate: function(currency, date) {
      var dayNum = new GlideDateTime().getNumericValue();
      if (date)
          dayNum = new GlideDateTime(date).getNumericValue();

      var rate = 0;
      var currentDiff = Number.MAX_VALUE;

      var gr = new GlideRecord('fx_rate');
      gr.addQuery('currency', currency);
      gr.orderByDesc('sys_created_on');
      gr.query();
      while (gr.next()) {
          var dateNum = new GlideDateTime(gr.getValue('sys_created_on')).getNumericValue();
          var diff = Math.abs(dateNum - dayNum);
          if (diff < currentDiff) {
              currentDiff = diff;
              rate = parseFloat(gr.getValue('rate'));
          } else
              break;
      }
      return rate;
  },

  _updateEventWhenImpactChanges: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_event');
      gr.get(eventID);

      // reset existing financial information
      var toCurrency = this._getSingleCurrencyCode();
      if (gr.isValidRecord()) {
          gr.setValue('direct_amount', toCurrency + ";" + 0);
          gr.setValue('indirect_amount', toCurrency + ";" + 0);
          gr.setValue('additional_cost', toCurrency + ";" + 0);
          gr.setValue('gross_amount', toCurrency + ";" + 0);
          gr.setValue('recovered_amount', toCurrency + ";" + 0);
          gr.setValue('rapid_recovery_amount', toCurrency + ";" + 0);
          gr.setValue('net_amount', toCurrency + ";" + 0);
      }

      this._setEventSummaryLoss(gr);
      gr.update();
  },

  _setEventSummaryLoss: function(event) {
      var toCurrency = this._getSingleCurrencyCode();

      var direct_amount = 0;
      var indirect_amount = 0;
      var additional_cost = 0;
      var recovered_amount = 0;
      var rapid_recovery_amount = 0;
      var non_financial_impact = 0;
      var hasFinancialImpact = false;

      var gr = new GlideRecord('sn_risk_advanced_event_impact');
      gr.addQuery('risk_event', event.getUniqueValue());
      gr.query();
      while (gr.next()) {
          var amount = 0;

          if (gr.impact_type == '4') { //non-financial impact
              non_financial_impact = Math.max(non_financial_impact, gr.impact + '');
          } else {
              hasFinancialImpact = true;

              var date = gr.getValue('impacted_on');
              var fromCurrency = gr.amount.getCurrencyCode();
              var fromCurrencyValue = gr.amount.getCurrencyValue();
              var fromRate = this._getCurrencyRatesOnDate(fromCurrency, date);
              var toRate = this._getCurrencyRatesOnDate(toCurrency, date);
              if (!fromRate || !toRate) {
                  gs.addErrorMessage(gs.getMessage('No exchange rate error. Check if your system is set to load exchange rate.'));
                  return;
              }

              amount = fromCurrencyValue / fromRate * toRate;

              if (gr.impact_type == '1') { //direct/indirect amount
                  if (gr.category == '1')
                      direct_amount += amount;
                  else if (gr.category == '2')
                      indirect_amount += amount;
              } else if (gr.impact_type == '2') { //recovered, rapid recovered
                  recovered_amount += amount;
                  if (gr.rapid_recovery)
                      rapid_recovery_amount += amount;
              } else if (gr.impact_type == '3') { //additional cost
                  additional_cost += amount;
              }
          }
      }

      if (event.event_type == '1') { //Financial Loss
          var gross_amount = direct_amount + indirect_amount + additional_cost;
          var net_amount = gross_amount - recovered_amount;

          event.setValue('direct_amount', toCurrency + ";" + direct_amount);
          event.setValue('indirect_amount', toCurrency + ";" + indirect_amount);
          event.setValue('additional_cost', toCurrency + ";" + additional_cost);
          event.setValue('gross_amount', toCurrency + ";" + gross_amount);
          event.setValue('recovered_amount', toCurrency + ";" + recovered_amount);
          event.setValue('rapid_recovery_amount', toCurrency + ";" + rapid_recovery_amount);
          event.setValue('net_amount', toCurrency + ";" + net_amount);

      }

      //Non-financial loss
      if (non_financial_impact >= 1)
          event.setValue('non_financial_impact', non_financial_impact + '');
      else
          event.setValue('non_financial_impact', '');
  },

  _removeEventProfileControls: function(eventID, profileID) {
      var gr = new GlideRecord('sn_risk_advanced_m2m_event_control');
      gr.addQuery('risk_event', eventID);
      gr.addQuery('control.profile', profileID);
      gr.deleteMultiple();
  },

  _getEventControls: function(eventID) {
      var profiles = this._getEventProfiles(eventID);
      var gr = new GlideRecord('sn_compliance_control');
      gr.addEncodedQuery('stateNOT INdraft,retired^profile.sys_idIN' + profiles.join(','));
      gr.addActiveQuery();
      gr.query();
      var controls = [];
      while (gr.next())
          controls.push(gr.number + '');

      return controls;
  },

  _removeEventProfileRisks: function(eventID, profileID) {
      var gr = new GlideRecord('sn_risk_advanced_m2m_event_risk');
      gr.addQuery('risk_event', eventID);
      gr.addQuery('risk.profile', profileID);
      gr.deleteMultiple();
  },

  showIssueNewButton: function(parent) {
      var parentTable = parent.getTableName();
      return (parentTable != 'sn_risk_advanced_event') || ((gs.hasRole('sn_risk.manager') && parentTable == 'sn_risk_advanced_event') && parent.state == "2");
  },

  _getEventProfiles: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_m2m_event_profile');
      gr.addQuery('event', eventID);
      gr.query();
      var profiles = [];
      while (gr.next())
          profiles.push(gr.profile + '');

      return profiles;
  },

  _getEventRisks: function(eventID) {
      var profiles = this._getEventProfiles(eventID);
      var gr = new GlideRecord('sn_risk_risk');
      gr.addEncodedQuery('profile.sys_idIN' + profiles.join(','));
      gr.addActiveQuery();
      gr.query();
      var risks = [];
      while (gr.next())
          risks.push(gr.number + '');

      return risks;
  },

  _eventHasOpenIssues: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_m2m_issue_risk_event');
      gr.addQuery('risk_event', eventID);
      gr.addQuery('sn_grc_issue.active', true);
      gr.setLimit(1);
      gr.query();

      return gr.hasNext();
  },

  _eventHasOpenTasks: function(eventID) {
      var gr = new GlideRecord('sn_risk_advanced_mitigation_task');
      gr.addQuery('risk_event', eventID);
      gr.addActiveQuery();
      gr.setLimit(1);
      gr.query();

      return gr.hasNext();
  },

  _getUserProfileFilter: function(showMine, profiles) {
      var query = "active=true";
      if (showMine === true || showMine == 'true')
          query += "^owned_byDYNAMIC90d1921e5f510100a9ad2572f2b477fe";
      if (profiles)
          query += "^sys_idNOT IN" + profiles;

      return query + "^EQ";
  },

  getRelatedORXEvents: function(item) {
      return this._getRelatedORXEvents(item);
  },

  _getRelatedORXEvents: function(item) {
      var table, column;
      if (item.getTableName() == 'sn_risk_risk') {
          table = 'sn_risk_advanced_m2m_orx_event_risk_statement';
          column = 'sn_risk_definition';
      } else {
          table = 'sn_risk_advanced_m2m_orx_event_control_objective';
          column = 'sn_compliance_policy_statement';
      }
      var gr = new GlideRecord(table);
      gr.addQuery(column, item.content + '');
      gr.query();
      var sysIds = [];
      while (gr.next()) {
          sysIds.push(gr.event + '');
      }
      return sysIds;
  },

  needRecalculation: function(current) {
      return this._needRecalculation(current);
  },

  _needRecalculation: function(current) {
      return ((current.operation() == "update" && current.impacted_on.changes()) || current.operation() == "insert" || (current.operation() == "delete" && current.impacted_on == current.risk_event.first_recognized_on));
  },

  _checkIfRapidRecoveryFlagShouldBeChecked: function(eventEntry, noOfRapidRecoveryDaysProperty) {
      if (eventEntry.impact_type == '2') {
          var discoveredDate = new GlideDateTime(eventEntry.risk_event.discovered_on);
          var RecoveredDate = new GlideDateTime(eventEntry.impacted_on);
          var diff = GlideDateTime.subtract(discoveredDate, RecoveredDate);
          var durationInMilliSeconds = diff.getNumericValue();
          var daysTookForRecovery = durationInMilliSeconds / (1000 * 3600 * 24);
          if (daysTookForRecovery <= noOfRapidRecoveryDaysProperty) {
              eventEntry.setValue('rapid_recovery', true);
          } else {
              eventEntry.setValue('rapid_recovery', false);
          }
      } else {
          eventEntry.setValue('rapid_recovery', false);
      }
  },

  _updateRapidRecoveryFlags: function(riskEvents, propertyValue) {
      var riskEventEntries = new GlideRecord('sn_risk_advanced_event_impact');
      if (riskEvents != null) {
          riskEventEntries.addQuery('risk_event', riskEvents.getUniqueValue());
      }
      riskEventEntries.addQuery('impact_type', '2');
      riskEventEntries.query();
      while (riskEventEntries.next()) {
          this.checkIfRapidRecoveryFlagShouldBeChecked(riskEventEntries, propertyValue);
          riskEventEntries.update();
      }
  },
  
  isRiskEventIntegrationConfigured: function(current) {
      var riskEventConfig = new GlideRecord('sn_risk_advanced_risk_event_configuration');
      riskEventConfig.addActiveQuery();
      riskEventConfig.addQuery('source_table', current.getTableName());
      riskEventConfig.query();
      if (!riskEventConfig.hasNext()) {
          return false;
      }
      riskEventConfig.next();
      var mode = riskEventConfig.getValue('u_mode');
      if(mode == 'Simple') {
          var role = riskEventConfig.getValue('role_condition');
          if(role && !gs.hasRole(role)) {
              return false;
          }           
          var condition = riskEventConfig.getValue('condition');
          if(condition && !GlideFilter.checkRecord( current , condition)) {
              return false;
          }
          return true;
      } else if(mode == 'Advanced') {
          var evaluator = new GlideScopedEvaluator();
          evaluator.putVariable('result', false);
          evaluator.evaluateScript(riskEventConfig, 'u_script');
          return evaluator.getVariable('result');
      }
      return false;
  },    

  retrieveRiskEventInfo: function(upStreamApplicationRecord) {
      return this._retrieveRiskEventInfo(upStreamApplicationRecord);
  },

  _retrieveRiskEventInfo: function(upStreamApplicationRecord) {
      var riskEventInfo = {};
      var riskEventConfig = new GlideRecord('sn_risk_advanced_risk_event_configuration');
      riskEventConfig.addActiveQuery();
      riskEventConfig.addQuery('source_table', upStreamApplicationRecord.getTableName());
      riskEventConfig.query();
      if (riskEventConfig.next()) {
          this._setEntityIdFromRiskEventConfig(riskEventConfig, riskEventInfo, upStreamApplicationRecord);
          if (riskEventInfo.errorMessage) {
              return riskEventInfo;
          }
          riskEventInfo.date_of_discovery = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'date_of_discovery');
          riskEventInfo.name = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'name');
          riskEventInfo.description = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'description');
          riskEventInfo.event_type = this._getValue(upStreamApplicationRecord, riskEventConfig, 'event_type');
  		riskEventInfo.eventTypeChoices = this.getEventTypeChoices();			
  		riskEventInfo.currencies = this._getCurrencyCodesSymbolArray();
  		
          if (riskEventInfo.event_type == '1') {
              this._setExpectedLossDataFromRiskEventConfig(riskEventConfig, riskEventInfo, upStreamApplicationRecord);
          } else {
              riskEventInfo.non_financial_impact = this._getValue(upStreamApplicationRecord, riskEventConfig, 'non_financial_impact');
          }
  		riskEventInfo.event_subtype = riskEventConfig.getValue('event_subtype');
      } else {
          riskEventInfo.errorMessage = gs.getMessage('Risk Event Configuration is missing/inactive for {0} table', upStreamApplicationRecord.getTableName());
  		riskEventInfo.errorType = 'config_error';
      }
      return riskEventInfo;
  },

  getEventTypeChoices: function() {
  	var sysChoice = new GlideRecord("sys_choice");
  	sysChoice.addQuery("name", "sn_risk_advanced_risk_event_configuration"); // the name of your table
  	sysChoice.addQuery("element", "default_event_type"); // the name of the field
  	sysChoice.addQuery("language", "en"); // language of labels, which you need
  	sysChoice.orderBy("sequence");
  	sysChoice.query();
  	var table, element, label;
  	var eventTypeChoices = [];
  	while (sysChoice.next()) {	
  		var eventTypeChoice = {};
          eventTypeChoice.value = sysChoice.value.toString();
          eventTypeChoice.label = sysChoice.label.toString();
  		eventTypeChoices.push(eventTypeChoice);
  	}
  	return eventTypeChoices;
  },

  _setEntityIdFromRiskEventConfig: function(riskEventConfig, riskEventInfo, upStreamApplicationRecord) {
      var entityName;
      var entityId;
      if (riskEventConfig.getValue('source_of_entity') == 1) {
          var entityMappingColumn = riskEventConfig.getValue('entity');
          var cmdb_ci_id = upStreamApplicationRecord.getValue(entityMappingColumn);
          if (!cmdb_ci_id) {
              riskEventInfo.errorMessage = gs.getMessage("To create a risk event, the {0} column must have a value.", upStreamApplicationRecord.getElement(entityMappingColumn).getLabel());
  			riskEventInfo.errorType = 'config_error';
              return;
          }
          var entityMappingElement = upStreamApplicationRecord.getElement(entityMappingColumn);
          if (entityMappingElement.getReferenceTable() == 'sn_grc_profile') {
              entityId = cmdb_ci_id;
              entityName = this._getEntityName(entityMappingElement);
          } else {
              var entityGr = new GlideRecord('sn_grc_profile');
              entityGr.addQuery('applies_to', cmdb_ci_id);
              entityGr.query();
              entityName = entityMappingElement.getDisplayValue();
              if (!entityGr.next()) {
                  riskEventInfo.errorMessage = new sn_grc.GRCUtils().getMessage('entity_missing').replace('{0}',entityName);
  				riskEventInfo.errorType = 'missing_field';
                  return;
              }
              entityId = entityGr.getUniqueValue();
          }

      } else {
          entityId = riskEventConfig.getValue('default_entity');
          entityName = this._getEntityName(riskEventConfig.default_entity);
      }
      if (!this._isEntityActive(entityId)) {
          riskEventInfo.errorMessage = new sn_grc.GRCUtils().getMessage('entity_inactive').replace('{0}',entityName);
  		riskEventInfo.errorType = 'missing_field';
          return;
      }
      riskEventInfo.entityId = entityId;
      riskEventInfo.entity_name = entityName;
  },

  _isEntityActive: function(entityId) {
      var entityGr = new GlideRecord('sn_grc_profile');
      entityGr.get(entityId);
      return entityGr.getValue('active') == 1;
  },

  _getEntityName: function(entityElement) {
      var entityName;
      if (entityElement.applies_to) {
          entityName = entityElement.applies_to.getDisplayValue();
      } else {
          entityName = entityElement.getDisplayValue();
      }
      return entityName;
  },

  _setExpectedLossDataFromRiskEventConfig: function(riskEventConfig, riskEventInfo, upStreamApplicationRecord) {
      var value = riskEventConfig.getValue('source_of_expected_loss') == 1 ? upStreamApplicationRecord.getElement(riskEventConfig.getValue('expected_loss')) : riskEventConfig.getElement('default_expected_loss');
      riskEventInfo.expected_loss = value.getSessionDisplayValue();
      riskEventInfo.currency_code = value.getSessionCurrencyCode();
      riskEventInfo.currency_value = value.getSessionValue();
  },

  createRiskEvent: function(riskEventInfo) {
      return this._createRiskEvent(riskEventInfo);
  },

  _createRiskEvent: function(riskEventInfo) {
      var riskEvent = new GlideRecord('sn_risk_advanced_event');
      riskEvent.setValue('name', riskEventInfo.name);
      riskEvent.setValue('primary_profile', riskEventInfo.entityId);
      riskEvent.setValue('description', riskEventInfo.description);
      riskEvent.setValue('event_type', riskEventInfo.eventType);
      riskEvent.discovered_on.setDisplayValue(riskEventInfo.discoveredOn);
      riskEvent.setValue('source_record', riskEventInfo.upStreamSysId);
      riskEvent.setValue('source_record_table', riskEventInfo.upStreamTableName);
      if (riskEventInfo.eventType == '1') {
          riskEvent.expected_loss.setDisplayValue(riskEventInfo.expectedLoss);
      } else {
          riskEvent.setValue('non_financial_impact', riskEventInfo.nonFinancialImpact);
      }
  	riskEvent.setValue('sub_type', riskEventInfo.eventSubtype);
      riskEvent.comments = gs.getMessage("This record was automatically created from the {0}, refer to source application record details related list for further information", riskEventInfo.upStreamTableName);
      var riskEventId = riskEvent.insert();
      var result = {};
      if (riskEventId) {
          var url = '/sn_risk_advanced_event.do?sys_id=' + riskEventId;
          var link = ' <a target="_blank" href="' + url + '">' + riskEvent.number + '</a>';
          result.infoMessage = gs.getMessage('Risk event is successfully created for {0} {1}', [riskEventInfo.entityName, link]);
      } else {
          result.errorMessage = gs.getMessage('Risk event creation failed for {0}. Please contact your administrator to proceed.', riskEventInfo.entityName);
      }
      return result;
  },

  _getDisplayValue: function(upStreamApplicationRecord, riskEventConfig, column) {
      return riskEventConfig.getValue('source_of_' + column) == 1 ? upStreamApplicationRecord[riskEventConfig.getValue(column)].getDisplayValue() : riskEventConfig['default_' + column].getDisplayValue();
  },

  _getValue: function(upStreamApplicationRecord, riskEventConfig, column) {
      return riskEventConfig.getValue('source_of_' + column) == 1 ? upStreamApplicationRecord.getValue(riskEventConfig.getValue(column)) : riskEventConfig.getValue('default_' + column);
  },

  _updateDownstreamBusinessLineValues: function(currentLevelProfiles, entityBusinessLine) {
      var downstreamEntities = new GlideRecord('sn_grc_m2m_profile_profile');
      downstreamEntities.addQuery('upstream_profile', "IN", currentLevelProfiles);
      downstreamEntities.query();
      var nextLevelProfiles = [];

      if (!downstreamEntities.hasNext())
          return;

      while (downstreamEntities.next()) {
          var profile = downstreamEntities.getValue('downstream_profile');
          nextLevelProfiles.push(profile);
      }
      var gr = new GlideRecord('sn_grc_profile');
      gr.addQuery('sys_id', 'IN', nextLevelProfiles);
      gr.query();
      gr.setValue('sn_risk_advanced_basel_business_line', entityBusinessLine);
      gr.updateMultiple();
      this.updateDownstreamBusinessLineValues(nextLevelProfiles, entityBusinessLine);
  },

  _clearBaselReportsTable: function() {
      var baselRootTable = new GlideRecord('sn_risk_advanced_basel_reports');
      baselRootTable.query();
      baselRootTable.deleteMultiple();
  },

  _updateBaselReportsTable: function() {
      var riskEvents = new GlideRecord('sn_risk_advanced_event');
      riskEvents.addEncodedQuery('sys_created_on>=javascript:gs.beginningOfLast12Months()');
      riskEvents.addQuery('state', '!=', 4);
      riskEvents.addNotNullQuery('primary_profile.sn_risk_advanced_basel_business_line');
      riskEvents.query();
      while (riskEvents.next()) {
          var businessLine = riskEvents.primary_profile.sn_risk_advanced_basel_business_line.root;
          var m2m = new GlideRecord('sn_risk_advanced_m2m_event_risk');
          m2m.addQuery('risk_event', riskEvents.getUniqueValue());
          m2m.addNotNullQuery('risk.statement.basel_category');
          m2m.query();
          while (m2m.next()) {
              var category = m2m.risk.statement.basel_category.root;
              var baselRootTable = new GlideRecord('sn_risk_advanced_basel_reports');
              baselRootTable.initialize();
              baselRootTable.risk_event = riskEvents.getUniqueValue();
              baselRootTable.business_line = businessLine;
              baselRootTable.category = category;
              baselRootTable.insert();
          }
      }
  },

  _getClosedStates: function() {
      return "3";
  },

  _getReferenceCurrencyCode: function() {
      var gr = new GlideRecord("sn_risk_advanced_event");
      gr.initialize();
      return gr.gross_amount.getReferenceCurrencyCode();
  },

  _getReportingPeriodStart: function() {
      var yrsProperty = gs.getProperty('sn_risk_advanced.number_of_years_report_data', 2);
      var g = new GlideDateTime();
      g.addYearsUTC(-1 * yrsProperty);
      return g;
  },

  _createRiskReportingRecord: function(category, state, grossLoss, netLoss, recovery, noOfRiskEvents) {
      var currencyCode = this._getReferenceCurrencyCode();
      var reportData = new GlideRecord('sn_risk_advanced_risk_event_reporting');
      reportData.addQuery('category', category);
      reportData.addQuery('state', state);
      reportData.query();
      reportData.next();

      reportData.setValue('state', state);
      reportData.setValue('category', category);
      reportData.gross_loss.setDisplayValue(currencyCode + ';' + parseFloat(grossLoss));
      reportData.net_loss.setDisplayValue(currencyCode + ';' + parseFloat(netLoss));
      reportData.recovery.setDisplayValue(currencyCode + ';' + parseFloat(recovery));
      reportData.setValue('no_of_events', noOfRiskEvents);
      reportData.update();
  },

  collectReportingDataBaselCategory: function(state) {
      this._collectReportingDataBaselCategory(state);
  },

  _collectReportingDataBaselCategory: function(state) {
      var categories = new GlideRecord("sn_risk_advanced_basel_category");
      categories.addNullQuery('parent');
      categories.query();

      while (categories.next()) {
          var riskEvents = new GlideAggregate("sn_risk_advanced_m2m_event_risk");
          riskEvents.addQuery('risk.statement.basel_category.root', categories.getUniqueValue());
          riskEvents.addQuery('risk_event.sys_created_on', '>', this._getReportingPeriodStart());

          if (state == '1')
              riskEvents.addQuery('risk_event.state', 'NOT IN', this._getClosedStates());
          else
              riskEvents.addQuery('risk_event.state', 'IN', this._getClosedStates());

          riskEvents.addAggregate('sum', 'risk_event.gross_amount');
          riskEvents.addAggregate('sum', 'risk_event.net_amount');
          riskEvents.addAggregate('sum', 'risk_event.recovered_amount');
          riskEvents.addAggregate('count');
          riskEvents.setGroup(false);
          riskEvents.query();

          if (riskEvents.next() && riskEvents.getAggregate('count') > 0) {
              this._createRiskReportingRecord(categories.getUniqueValue(), state, riskEvents.getAggregate('sum', 'risk_event.gross_amount'), riskEvents.getAggregate('sum', 'risk_event.net_amount'), riskEvents.getAggregate('sum', 'risk_event.recovered_amount'), riskEvents.getAggregate('count'));
          }
      }
  },

  collectReportingDataForLineOfBusiness: function(state) {
      this._collectReportingDataForLineOfBusiness(state);
  },

  _collectReportingDataForLineOfBusiness: function(state) {
      var baselLines = new GlideRecord("sn_risk_advanced_basel_business_line");
      baselLines.addNullQuery('parent');
      baselLines.query();

      while (baselLines.next()) {
          var riskEvents = new GlideAggregate("sn_risk_advanced_event");
          riskEvents.addQuery('primary_profile.sn_risk_advanced_basel_business_line.root', baselLines.getUniqueValue());
          riskEvents.addQuery('sys_created_on', '>', this._getReportingPeriodStart());

          if (state == '1')
              riskEvents.addQuery('state', 'NOT IN', this._getClosedStates());
          else
              riskEvents.addQuery('state', 'IN', this._getClosedStates());

          riskEvents.addAggregate('sum', 'gross_amount');
          riskEvents.addAggregate('sum', 'net_amount');
          riskEvents.addAggregate('sum', 'recovered_amount');
          riskEvents.addAggregate('count');
          riskEvents.setGroup(false);
          riskEvents.query();

          if (riskEvents.next() && riskEvents.getAggregate('count') > 0) {
              this._createRiskReportingRecord(baselLines.getUniqueValue(), state, riskEvents.getAggregate('sum', 'gross_amount'), riskEvents.getAggregate('sum', 'net_amount'), riskEvents.getAggregate('sum', 'recovered_amount'), riskEvents.getAggregate('count'));
          }
      }
  },

  collectReportingDataForCause: function(state) {
      this._collectReportingDataForCause(state);
  },

  _collectReportingDataForCause: function(state) {
      var causeRoots = new GlideRecord("sn_risk_advanced_cause");
      causeRoots.addNullQuery('parent');
      causeRoots.query();

      while (causeRoots.next()) {
          var gr1 = new GlideAggregate("sn_risk_advanced_event");
          gr1.addQuery('sys_created_on', '>', this._getReportingPeriodStart());
          gr1.addQuery('cause.root', causeRoots.getUniqueValue());
          if (state == '1')
              gr1.addQuery('state', 'NOT IN', this._getClosedStates());
          else
              gr1.addQuery('state', 'IN', this._getClosedStates());
          gr1.addAggregate('sum', 'gross_amount');
          gr1.addAggregate('sum', 'net_amount');
          gr1.addAggregate('sum', 'recovered_amount');
          gr1.addAggregate('count');
          gr1.setGroup(false);
          gr1.query();
          gr1.next();

          var count = gr1.getAggregate('count');
          if (count != 0) {
              this._createRiskReportingRecord(causeRoots.getUniqueValue(), state, gr1.getAggregate('sum', 'gross_amount'), gr1.getAggregate('sum', 'net_amount'), gr1.getAggregate('sum', 'recovered_amount'), count);
          }
      }
  },

  clearReportingData: function() {
      this._clearReportingData();
  },

  _clearReportingData: function() {
      var reportData = new GlideRecord('sn_risk_advanced_risk_event_reporting');
      reportData.deleteMultiple();
  },
  type: 'GRCRiskEventBase'
};

Sys ID

c0e67873877323003058d1a936cb0b91

Offical Documentation

Official Docs: