Name

sn_nb_action.DecisionTableRuleHandler

Description

Implements extension point sn_nb_action.RuleTypeFactory to handle decision table rules

Script

var DecisionTableRuleHandler = Class.create();
DecisionTableRuleHandler.prototype = Object.extendsObject(sn_nb_action.RuleTypeHandlerBase, {
  initialize: function() {},

  /*
   * This identifies the rule type handled by this implementation.
   * Should be name of a table that extends "sn_nb_action_rule_base" table.
   */
  getId: function() {
      return sn_nb_action.Constants.TBL_DECISION_TABLE_RULE;
  },

  /*
   * Return an array of GlideRecord actions recommended by this rule
   */
  evaluateRule: function(currentRecord, ruleRecord) {
      var dt = new sn_dt.DecisionTableAPI();
      var input = new Object();
      input[sn_nb_action.Constants.INPUT_START_CONTEXT] = currentRecord;
      input[sn_nb_action.Constants.INPUT_START_CONTEXT_USER] = currentRecord;
      var actions = dt.getDecisions(ruleRecord.getValue(sn_nb_action.Constants.COL_DECISION_TABLE), input);
      var recommendedActions = [];
      var recommendedAction;
      for (var i = 0; i < actions.length; i++) {
          recommendedAction = sn_nb_action.RecommendedAction.createFromRule(actions[i], new Object(), ruleRecord.getValue(sn_nb_action.Constants.COL_ROLES));
          recommendedActions.push(recommendedAction);
      }
      return recommendedActions;
  },

  /*
   * Checks if recommended action is valid for current rule
   */
  isValidRule: function(ruleRecord) {
      var tableName = ruleRecord[sn_nb_action.Constants.COL_RULE_CONTEXT][sn_nb_action.Constants.COL_CONTEXT];
      var decisionTableId = ruleRecord.getValue(sn_nb_action.Constants.COL_DECISION_TABLE);

      var tables = new GlideTableHierarchy(tableName);
      var hierarchyTablesList = tables.getHierarchy();

      //check if decision table captures the given tablename reference record as one of its input.
      var inputsGr = new GlideRecord(sn_nb_action.Constants.TBL_DECISION_INPUT);
      inputsGr.addQuery(sn_nb_action.Constants.COL_MODEL, decisionTableId);
      inputsGr.addQuery(sn_nb_action.Constants.COL_INTERNAL_TYPE, sn_nb_action.Constants.VAL_REFERENCE);
      inputsGr.addQuery(sn_nb_action.Constants.COL_REFERENCE, hierarchyTablesList);
      inputsGr.query();
      if (!inputsGr.next()) {
          var tableGr = new GlideRecord(sn_nb_action.Constants.TBL_SYS_DB_OBJECT);
          tableGr.query(sn_nb_action.Constants.COL_NAME, tableName);
          tableGr.next();
          gs.addErrorMessage(gs.getMessage("Selected decision table '{0}' does not accept '{1}' record as input.Please reconfigure the rule", [ruleRecord.getDisplayValue(sn_nb_action.Constants.COL_DECISION_TABLE), tableGr.getDisplayValue()]));
          return false;
      }

      var dt = new sn_dt.DecisionTableAPI();
      var response = dt.getAnswers(decisionTableId);
      var nextBestActionService = new sn_nb_action.NextBestActionService();

      var actionsArray = response['result'];
      var actionCount = actionsArray.length;
      if (actionCount == 0) {
          gs.addErrorMessage(gs.getMessage("Selected decision table '{0}' does not have any answer records asscociated with it.", [ruleRecord.getDisplayValue(sn_nb_action.Constants.COL_DECISION_TABLE)]));
          return false;
      }
      var actionTableName = actionsArray[0].table;
      var actionRecord = new GlideRecord(actionTableName);
      for (var i = 0; i < actionCount; i++) {
          actionRecord.get(actionsArray[i].value);
          if (!nextBestActionService.isActionAllowed(tableName, actionRecord))
              return false;
      }
      return true;
  },

  type: 'DecisionTableRuleHandler'
});

Sys ID

335fdb8b53031010763eddeeff7b1287

Offical Documentation

Official Docs: