Name

sn_nb_action.NextBestActionDAOImpl

Description

A Data Access Object for Recommended Action. All DB operations routed through this class.

Script

var NextBestActionDAOImpl = Class.create();
NextBestActionDAOImpl.prototype = {
  initialize: function() {
      this._log = new global.GSLog(sn_nb_action.Constants.PROP_LOG_LEVEL, this.type);
  },
  getRules: function(currentRecord, fields) {
      var hasUnsavedChanges = fields && Object.keys(fields).length > 0 ? true : false;
      var fieldNames = hasUnsavedChanges ? Object.keys(fields) : [];
      var fieldsQuery = '';
      if (hasUnsavedChanges) {
          for (var j = 0; j < fieldNames.length; j++) {
              if (j == 0)
                  fieldsQuery = '^' + sn_nb_action.Constants.COL_FIELD_AFF_RULE + 'LIKE' + fieldNames[j];
              else
                  fieldsQuery = fieldsQuery + '^OR' + sn_nb_action.Constants.COL_FIELD_AFF_RULE + 'LIKE' + fieldNames[j];
          }
      }
      var currentTable = currentRecord.getTableName();
      var tables = new GlideTableHierarchy(currentTable).getTables();
      var parentTables = [];
      for (var i = 0; i < tables.length; i++) {
          if (tables[i] != currentTable)
              parentTables.push(tables[i]);
      }
      var rules = new GlideRecord(sn_nb_action.Constants.TBL_RULE_BASE);
      var currentTableQuery = sn_nb_action.Constants.COL_ACTIVE + "=true^" + sn_nb_action.Constants.COL_RULE_CONTEXT + '.' + sn_nb_action.Constants.COL_CONTEXT + "=" + currentTable + fieldsQuery;
      var parentTableQuery = sn_nb_action.Constants.COL_ACTIVE + "=true^" + sn_nb_action.Constants.COL_RULE_CONTEXT + '.' + sn_nb_action.Constants.COL_CONTEXT + "IN" + parentTables + "^" + sn_nb_action.Constants.COL_APPLIES_TO_CHILD_TABLES + "=true" + fieldsQuery;
      var encodedQuery = currentTableQuery + "^NQ" + parentTableQuery;
      rules.addEncodedQuery(encodedQuery);
      rules.orderBy(sn_nb_action.Constants.COL_ORDER);
      rules.query();
      if (rules.hasNext())
          return rules;
  },
  getActionTypes: function() {
      var actionTypes = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_TYPE_DEFINITION);
      actionTypes.addActiveQuery();
      actionTypes.query();
      if (actionTypes.hasNext())
          return actionTypes;
      return false;
  },
  /*
   * Returns a map of action type definition with table name key and action type definition as value
   */
  loadActionTypesByTable: function() {
      var actionTypesRecord = this.getActionTypes();
      if (actionTypesRecord) {
          var actionTypes = {};
          while (actionTypesRecord.next()) {
              var actionType = {};
              actionType[sn_nb_action.Constants.COL_SYS_ID] = actionTypesRecord.getUniqueValue();
              actionType[sn_nb_action.Constants.COL_NAME] = actionTypesRecord.getValue(sn_nb_action.Constants.COL_NAME);
              actionType[sn_nb_action.Constants.COL_TABLE_NAME] = actionTypesRecord.getValue(sn_nb_action.Constants.COL_TABLE_NAME);
              var rendererRecord = actionTypesRecord[sn_nb_action.Constants.COL_RENDERER].getRefRecord();
              actionType[sn_nb_action.Constants.COL_RENDERER] = rendererRecord.getValue(sn_nb_action.Constants.COL_TAG);
              actionTypes[actionTypesRecord.getValue(sn_nb_action.Constants.COL_TABLE_NAME)] = actionType;
          }
          return actionTypes;
      }
      return false;
  },
  /*
   * Creates and return recommended action context for the given currentRecord
   */
  createContext: function(currentRecord) {

      var userId = gs.getUserID();
      var context = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_CONTEXT);
      context.initialize();
      context.setValue(sn_nb_action.Constants.COL_CONTEXT_TABLE, currentRecord.getTableName());
      context.setValue(sn_nb_action.Constants.COL_DOCUMENT, currentRecord.getUniqueValue());
      context.setValue(sn_nb_action.Constants.COL_USER, userId);
      var contextId = "";
      try {
          contextId = context.insert();
          if (!gs.nil(contextId)) {
              this._log.debug("Context " + context.getDisplayValue() + " created.");
              return context;
          }
      } finally {
          if (gs.nil(contextId))
              return this.getContext(currentRecord);
      }

      return false;
  },
  getContext: function(currentRecord) {

      var userId = gs.getUserID();
      var context = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_CONTEXT);
      context.addQuery(sn_nb_action.Constants.COL_CONTEXT_TABLE, currentRecord.getTableName());
      context.addQuery(sn_nb_action.Constants.COL_DOCUMENT, currentRecord.getUniqueValue());
      context.addQuery(sn_nb_action.Constants.COL_USER, userId);
      context.orderByDesc(sn_nb_action.Constants.COL_SYS_CREATED_ON);
      context.query();
      if (context.next())
          return context;

      return false;
  },

  getAllContexts: function(currentRecord) {
      var context = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_CONTEXT);
      context.addQuery(sn_nb_action.Constants.COL_CONTEXT_TABLE, currentRecord.getTableName());
      context.addQuery(sn_nb_action.Constants.COL_DOCUMENT, currentRecord.getUniqueValue());
      context.orderByDesc(sn_nb_action.Constants.COL_SYS_CREATED_ON);
      context.query();
      return context;
  },

  getOldContext: function(currentRecord) {
      var context = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_CONTEXT);
      context.addQuery(sn_nb_action.Constants.COL_CONTEXT_TABLE, currentRecord.getTableName());
      context.addQuery(sn_nb_action.Constants.COL_DOCUMENT, currentRecord.getUniqueValue());
      context.addQuery(sn_nb_action.Constants.COL_USER, '');
      context.addEncodedQuery('stateNOT INnew,ready');
      context.orderByDesc(sn_nb_action.Constants.COL_SYS_CREATED_ON);
      context.query();
      if (context.next())
          return context;

      return false;
  },

  copyOldActionsToNewContext: function(oldContextRecord, newContextRecord) {
      var actionDetailgr = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
      actionDetailgr.addQuery(sn_nb_action.Constants.COL_CONTEXT, oldContextRecord.getUniqueValue());
      actionDetailgr.addEncodedQuery('stateNOT INnew');
      actionDetailgr.query();

      while (actionDetailgr.next()) {
          if (this.isInProgressGuidance(actionDetailgr))
              continue;
          actionDetailgr.setValue(sn_nb_action.Constants.COL_CONTEXT, newContextRecord.getUniqueValue());
          var inputObj = {};
          for (var input in actionDetailgr.action_inputs) {
              if (input != "sys_meta" && input != "sys_id") {
                  inputObj[input] = actionDetailgr.action_inputs[input];
              }
          }
          actionDetailgr.insert();
          for (var input1 in actionDetailgr.action_inputs) {
              if (input1 != "sys_meta" && input1 != "sys_id") {
                  actionDetailgr.action_inputs[input1] = inputObj[input1];
              }
          }

          actionDetailgr.update();
      }
      newContextRecord.setValue(sn_nb_action.Constants.COL_STATE, sn_nb_action.Constants.STATE_IN_USE);
      newContextRecord.update();
  },

  isInProgressGuidance: function(actionDetailgr) {
      if (actionDetailgr[sn_nb_action.Constants.COL_STATE] == sn_nb_action.Constants.STATE_IN_PROGRESS && actionDetailgr[sn_nb_action.Constants.COL_RECOMMENDED][sn_nb_action.Constants.COL_SYS_CLASS_NAME] == sn_nb_action.Constants.TBL_GUIDANCE)
          return true;
  },

  setContextState: function(contextRecord, state, refresh, recommendationType) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(contextRecord) &&
          sn_nb_action.NextBestActionUtil.isValidContextState(state.toLowerCase())) {
          contextRecord.setValue(sn_nb_action.Constants.COL_STATE, state.toLowerCase());
          if (refresh) {
              if (recommendationType == sn_nb_action.Constants.VAL_FIELD_RECOMMENDATIONS)
                  contextRecord.setValue(sn_nb_action.Constants.COL_REFRESHED_ON_FIELD_TYPE, new GlideDateTime());
              else
                  contextRecord.setValue(sn_nb_action.Constants.COL_REFRESHED_ON, new GlideDateTime());
          }
          if (sn_nb_action.NextBestActionUtil.isValidString(contextRecord.update()))
              return true;
          else
              this._log.error("Could not set context state [" + contextRecord.getUniqueValue() + "," + state + "]");
      }
      return false;
  },
  addActionDetails: function(contextRecord, actionDetailArr) {
      var actCount = 0;
      if (sn_nb_action.NextBestActionUtil.isValidRecord(contextRecord) && actionDetailArr && actionDetailArr.length > 0) {
          var maxAgeInDateTime = sn_nb_action.NextBestActionUtil.getMaxAge(contextRecord);
          for (var i = 0; i < actionDetailArr.length; i++) {
              var actionDetail = actionDetailArr[i];
              if (actionDetail && typeof actionDetail.isValid === "function" && actionDetail.isValid()) {
                  var actDetSysId = this._addActionDetail(contextRecord, actionDetail, maxAgeInDateTime);
                  if (sn_nb_action.NextBestActionUtil.isValidString(actDetSysId)) {
                      actCount++;
                      this._log.debug("Action " + actDetSysId + " added for " + actionDetailArr[i].getAction());
                  } else {
                      this._log.debug("Failed to add Action " + actionDetailArr[i].getAction());
                  }
              }
          }
      }
      return actCount;
  },
  _addActionDetail: function(contextRecord, actionDetail, maxAgeInDateTime) {
      var actionDetailRecord = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
      actionDetailRecord.initialize();
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_CONTEXT, contextRecord.getUniqueValue());
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_ACTION_TYPE, actionDetail.getActionType());
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_RECOMMENDED, actionDetail.getAction());
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_MAX_AGE, maxAgeInDateTime);
      var actionDetailRecordId = actionDetailRecord.insert();
      var actionInputs = actionDetail.getActionInputs();
      var contextSysId = actionDetailRecord.context.document;
      var actionSysId = actionDetailRecord.recommended;
      var recommendedActionParentId = sn_nb_action.NextBestActionUtil.getHashValue(contextSysId, actionSysId, actionInputs);
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_PARENT_RA_ID, recommendedActionParentId);
      actionDetailRecord.update();
      if (!NextBestActionUtil.isEmptyObject(actionInputs)) {
          sn_nb_action.NextBestActionUtil.setGlideVarInputs(actionDetailRecord, sn_nb_action.Constants.COL_ACTION_INPUTS, actionInputs);
          actionDetailRecord.update();
      }
      var actionDetailOrderArr = sn_nb_action.NextBestActionUtil.getObjectValues(actionDetail.getRules());
      var actionOrderCount = this.addActionDetailOrders(actionDetailOrderArr, actionDetailRecordId);
      this._log.debug("Action Detail Order record added count " + actionOrderCount + " added for Action Detail " + actionDetailRecordId);
      return actionDetailRecordId;
  },

  addActionDetailOrders: function(actionDetailOrderArr, actionDetailRecordSysId) {
      var actionOrderCount = 0;
      if (actionDetailOrderArr && actionDetailOrderArr.length > 0) {
          for (var i = 0; i < actionDetailOrderArr.length; i++) {
              var actionDetailOrder = actionDetailOrderArr[i];
              var actionDetailRecordId = actionDetailRecordSysId || actionDetailOrder.getActionDetail();
              if (actionDetailOrder && typeof actionDetailOrder.isValid === "function" && actionDetailOrder.isValid()) {
                  var actDetOrderSysId = this._addActionDetailOrder(actionDetailOrder, actionDetailRecordId);
                  if (sn_nb_action.NextBestActionUtil.isValidString(actDetOrderSysId)) {
                      actionOrderCount++;
                      this._log.debug("Action Detail Order" + actDetOrderSysId + " added for Action Detail " + actionDetailRecordId);
                  } else {
                      this._log.debug("Failed to add Action Detail Order for Action Detail " + actionDetailRecordId);
                  }
              }
          }
      }
      return actionOrderCount;
  },
  _addActionDetailOrder: function(actionDetailOrder, actionDetailRecordId) {
      var actionDetailOrderRecord = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_ORDER_DETAIL);
      actionDetailOrderRecord.initialize();
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_RULE, actionDetailOrder.getRule());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_NEXT_BEST_ACTION, actionDetailRecordId);
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_INTER_ORDER, actionDetailOrder.getInterOrder());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_INTRA_ORDER, actionDetailOrder.getIntraOrder());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_ROLES, actionDetailOrder.getRoles());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_RECOMMENDATION_HINT, actionDetailOrder.getHint());
  	actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_CONTEXT_GROUPS, actionDetailOrder.getActionGroupsAsCommaSeparatedString());
      return actionDetailOrderRecord.insert();
  },
  updateActionDetailOnUpgrade: function(actionDetailRecord) {
      if (actionDetailRecord.getValue(sn_nb_action.Constants.COL_ACTIVE) == 0)
          return this.removeRuleFromActionDetail(actionDetailRecord);
      var actionDetailOrderObj = sn_nb_action.ActionDetailOrder.createFromRule(actionDetailRecord[sn_nb_action.Constants.COL_RULE] + '', actionDetailRecord[sn_nb_action.Constants.COL_RULE][sn_nb_action.Constants.COL_ORDER], 1, actionDetailRecord[sn_nb_action.Constants.COL_RULE][sn_nb_action.Constants.COL_ROLES] + '');
      var actionDetailOrderId = this._addActionDetailOrder(actionDetailOrderObj, actionDetailRecord.getUniqueValue());
      if (sn_nb_action.NextBestActionUtil.isValidString(actionDetailOrderId))
          return this.removeRuleFromActionDetail(actionDetailRecord);
      else
          this._log.debug("Failed to add Action Detail Order record for existing Action Detail Record " + actionDetailRecord.getUniqueValue() + "for upgrade scenario");
      return false;
  },
  removeRuleFromActionDetail: function(actionDetailRecord) {
      actionDetailRecord.setValue(sn_nb_action.Constants.COL_RULE, '');
      var actionDetailId = actionDetailRecord.update();
      if (sn_nb_action.NextBestActionUtil.isValidString(actionDetailId))
          return true;
      else
          this._log.debug("Failed to remove rule for existing Action Detail Record " + actionDetailRecord.getUniqueValue() + "for upgrade scenario");
      return false;
  },
  updateActionDetailOrders: function(actionDetailOrderArr) {
      var actionOrderCount = 0;
      if (actionDetailOrderArr && actionDetailOrderArr.length > 0) {
          for (var i = 0; i < actionDetailOrderArr.length; i++) {
              var actionDetailOrder = actionDetailOrderArr[i];
              if (actionDetailOrder && typeof actionDetailOrder.isValid === "function" && actionDetailOrder.isValid()) {
                  var actDetOrderSysId = this._updateActionDetailOrder(actionDetailOrder);
                  if (sn_nb_action.NextBestActionUtil.isValidString(actDetOrderSysId)) {
                      actionOrderCount++;
                      this._log.debug("Action Detail Order" + actDetOrderSysId + " updated for Action Detail " + actionDetailOrder.getActionDetail());
                  } else {
                      this._log.debug("Failed to update Action Detail Order details for " + actionDetailOrder.getActionDetailOrderId());
                  }
              }
          }
      }
      return actionOrderCount;
  },
  _updateActionDetailOrder: function(actionDetailOrder) {
      var actDetOrderSysId = actionDetailOrder.getActionDetailOrderId();
      if (gs.nil(actDetOrderSysId))
          return false;
      var actionDetailOrderRecord = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_ORDER_DETAIL);
      if (!actionDetailOrderRecord.get(actDetOrderSysId))
          return false;
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_RULE, actionDetailOrder.getRule());
      if (actionDetailOrder.isActive() === true)
          actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_ACTIVE, true);
      else if (actionDetailOrder.isActive() === false)
          actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_ACTIVE, false);
      if (!gs.nil(actionDetailOrder.getInterOrder()))
          actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_INTER_ORDER, actionDetailOrder.getInterOrder());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_INTRA_ORDER, actionDetailOrder.getIntraOrder());
      actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_ROLES, actionDetailOrder.getRoles());
  	actionDetailOrderRecord.setValue(sn_nb_action.Constants.COL_CONTEXT_GROUPS, actionDetailOrder.getActionGroupsAsCommaSeparatedString());
      return actionDetailOrderRecord.update();
  },
  /*
   * Returns GlideRecord of all the recommended actions for the given context
   */
  getActionDetail: function(contextRecord, actionSysId) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(contextRecord) && sn_nb_action.NextBestActionUtil.isValidString(actionSysId)) {
          var actionDetail = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
          actionDetail.addActiveQuery();
          actionDetail.addQuery(sn_nb_action.Constants.COL_CONTEXT, contextRecord.getUniqueValue());
          actionDetail.addQuery(sn_nb_action.Constants.COL_RECOMMENDED, actionSysId);
          actionDetail.query();
          if (actionDetail.next())
              return actionDetail;
      }
      return false;
  },
  getActionDetailBySysId: function(actionDetailSysId) {
      if (sn_nb_action.NextBestActionUtil.isValidString(actionDetailSysId)) {
          var actionDetail = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
          if (actionDetail.get(actionDetailSysId))
              return actionDetail;
      }
      return false;
  },
  /*
   * Returns GlideRecord of all the recommended actions for the given context
   */
  getAllActionDetails: function(contextRecord, states, recommendationType) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(contextRecord)) {
          var actionDetails = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
          if (states)
              actionDetails.addQuery(sn_nb_action.Constants.COL_STATE, states);
          if (recommendationType) {
              if (recommendationType == sn_nb_action.Constants.VAL_FIELD_RECOMMENDATIONS)
                  actionDetails.addQuery(sn_nb_action.Constants.COL_ACTION_TYPE, sn_nb_action.Constants.VAL_ACTION_TYPE_FIELD_RECOMMENDATION);
              else
                  actionDetails.addQuery(sn_nb_action.Constants.COL_ACTION_TYPE, '!=', sn_nb_action.Constants.VAL_ACTION_TYPE_FIELD_RECOMMENDATION);
          }
          actionDetails.addQuery(sn_nb_action.Constants.COL_CONTEXT, contextRecord.getUniqueValue());
          actionDetails.orderByDesc(sn_nb_action.Constants.COL_SYS_CREATED_ON);
          actionDetails.query();
          if (actionDetails.hasNext())
              return actionDetails;
      }
  },
  //Returns Gliderecord of all Action Detail Order records for a given context
  getActionDetailOrdersFromContext: function(contextRecord, onlyActive, limit) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(contextRecord)) {
          var actionDetailOrders = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_ORDER_DETAIL);
          if (onlyActive)
              actionDetailOrders.addQuery(sn_nb_action.Constants.COL_ACTIVE, true);
          actionDetailOrders.addQuery(sn_nb_action.Constants.COL_NEXT_BEST_ACTION + "." + sn_nb_action.Constants.COL_CONTEXT, contextRecord.getUniqueValue());
          if (limit)
              actionDetailOrders.setLimit(limit);
          actionDetailOrders.query();
          if (actionDetailOrders.hasNext())
              return actionDetailOrders;
      }
      return false;
  },
  // Returns Gliderecord of all Action Detail Order records for a given recommended action.
  getActionDetailOrders: function(actionDetailRecord, onlyActive) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(actionDetailRecord)) {
          var actionDetailOrders = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_ORDER_DETAIL);
          if (onlyActive)
              actionDetailOrders.addActiveQuery();
          actionDetailOrders.addQuery(sn_nb_action.Constants.COL_NEXT_BEST_ACTION, actionDetailRecord.getUniqueValue());
          actionDetailOrders.orderBy(sn_nb_action.Constants.COL_INTRA_ORDER);
          actionDetailOrders.query();
          if (actionDetailOrders.hasNext())
              return actionDetailOrders;
      }
      return false;
  },
  setActionState: function(actionDetailRecord, state) {
      if (sn_nb_action.NextBestActionUtil.isValidRecord(actionDetailRecord) && sn_nb_action.NextBestActionUtil.isValidActionState(state.toLowerCase())) {
          actionDetailRecord.setValue(sn_nb_action.Constants.COL_STATE, state.toLowerCase());
          if (sn_nb_action.NextBestActionUtil.isValidString(actionDetailRecord.update()))
              return true;
          else
              this._log.error("Could not set action state" + [actionDetailRecord.getUniqueValue(), state]);
      }
      return false;
  },
  setActionAttribute: function(actionDetailRecord, attribute) {
      if (actionDetailRecord && actionDetailRecord.isValidRecord() &&
          attribute && attribute != null) {
          actionDetailRecord.setValue(sn_nb_action.Constants.COL_ATTRIBUTE, JSON.stringify(attribute));
          if (sn_nb_action.NextBestActionUtil.isValidString(actionDetailRecord.update()))
              return true;
          else
              this._log.error("Could not update action attribute " + [actionDetailRecord, attribute]);
      }
      return false;
  },
  getRuleContext: function(contextTable) {
      var ruleContextGr = new GlideRecord(sn_nb_action.Constants.TBL_RULE_CONTEXT);
      ruleContextGr.addQuery(sn_nb_action.Constants.COL_CONTEXT, contextTable);
      ruleContextGr.query();
      if (ruleContextGr.next()) {
          return ruleContextGr;
      }
      return false;
  },
  getRulesFromContext: function(ruleContext) {
      var rules = new GlideRecord(sn_nb_action.Constants.TBL_RULE_BASE);
      rules.addQuery(sn_nb_action.Constants.COL_RULE_CONTEXT, ruleContext.getValue(sn_nb_action.Constants.COL_SYS_ID));
      rules.query();
      return rules;
  },

  /**
   * To fetch states and attributes of all RAexecution records based on parentRA of current RAexecution
   */

  getStatesAttributesListFromActionDetails: function(hash, actionDetailRecord) {
      var detailList = [];
      var actionDetail = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
      actionDetail.addQuery(sn_nb_action.Constants.COL_PARENT_RA_ID, hash);
      actionDetail.addQuery(sn_nb_action.Constants.COL_SYS_ID, "!=", actionDetailRecord.getUniqueValue());
      actionDetail.addQuery(sn_nb_action.Constants.COL_RECOMMENDED, actionDetailRecord.recommended);
      actionDetail.addQuery(sn_nb_action.Constants.COL_CONTEXT_DOCUMENT_ID, actionDetailRecord.context.document);
      actionDetail.query();
      while (actionDetail.next()) {
          var detailObj = {
              state: actionDetail.getValue(sn_nb_action.Constants.COL_STATE),
              attributes: actionDetail.getValue(sn_nb_action.Constants.COL_ATTRIBUTE)
          };
          detailList.push(detailObj);
      }
      return detailList;
  },

  /**
   * For deletion of all RAexecution in new state only for current user based on RAcontext.
   */
  deleteRAByContext: function(contextRecordId, recommendationType) {
      var rowCount = 0;
      var raExecutionGr = new GlideRecord(sn_nb_action.Constants.TBL_ACTION_DETAIL);
      raExecutionGr.addQuery(sn_nb_action.Constants.COL_CONTEXT, contextRecordId);
      raExecutionGr.addQuery(sn_nb_action.Constants.COL_STATE, sn_nb_action.Constants.STATE_NEW);
      if (recommendationType) {
          if (recommendationType == sn_nb_action.Constants.VAL_FIELD_RECOMMENDATIONS)
              raExecutionGr.addQuery(sn_nb_action.Constants.COL_ACTION_TYPE, sn_nb_action.Constants.VAL_ACTION_TYPE_FIELD_RECOMMENDATION);
          else
              raExecutionGr.addQuery(sn_nb_action.Constants.COL_ACTION_TYPE, '!=', sn_nb_action.Constants.VAL_ACTION_TYPE_FIELD_RECOMMENDATION);
      }
      raExecutionGr.query();
      if (raExecutionGr.hasNext()) {
          rowCount = raExecutionGr.getRowCount();
          raExecutionGr.deleteMultiple();
      }
      return rowCount;
  },

  type: 'NextBestActionDAOImpl'
};

Sys ID

883e11393bfa1010c24e870044efc4bb

Offical Documentation

Official Docs: