Name

sn_rf.RFRecommendations

Description

This class is for Generate Recommendations API, it gives response in format expected by graphQL.

Script

var RFRecommendations = Class.create();

RFRecommendations.hasSideComponentRecommendations = function(table) {
  if (!table) {
      return false;
  }
  var gAggr = RFRecommendations.getRulesForTableAndTypes(table, [RFConstants.experienceType.MESSAGE_CARD, RFConstants.experienceType.RECORD_CARD]);
  while (gAggr.next()) {
      var ruleId = gAggr.recommendation_rule;
      var propValue = RFRuleService.isActivePropertyCheck(ruleId);
      if (propValue === undefined || propValue === true) {
          return true;
      }
  }
  return false;
};

RFRecommendations.getRulesForTableAndTypes = function(table, types) {
  var gAggr = new GlideAggregate(RFConstants.tables.SN_RF_RECOMMENDATION_EXPERIENCE);
  gAggr.addAggregate(RFConstants.queryConstants.COUNT);
  gAggr.addQuery(RFConstants.fields.SN_RF_RECOMMENDATION_EXPERIENCE_SHOW_AS, RFConstants.queryConstants.IN, types);
  gAggr.addQuery(RFConstants.fields.SN_RF_RECOMMENDATION_EXPERIENCE_TABLE, table);
  gAggr.addQuery(RFConstants.fields.SN_RF_RECOMMENDATION_EXPERIENCE_ACTIVE, true);
  gAggr.addQuery(RFConstants.fields.SN_RF_RECOMMENDATION_EXPERIENCE_RULE_ACTIVE, true);
  gAggr.groupBy(RFConstants.fields.SN_RF_RECOMMENDATION_EXPERIENCE_RULE);
  gAggr.query();
  return gAggr;
};

RFRecommendations.getTypes = function(recommendExperience) {
  return RFConstants.experienceToTypes[recommendExperience.toLowerCase()];
};

RFRecommendations.prototype = {
  initialize: function(contextRecord, recommendExperience, options) {
      this.types = RFRecommendations.getTypes(recommendExperience);
      this.options = options || {};
      this.contextRecord = contextRecord;
      if (this.options.updatedFields) {
          var updatedFields = this.options.updatedFields;
          for (var idx = 0; idx < updatedFields.length; idx++) {
              var updatedField = updatedFields[idx];
              this.contextRecord.setValue(updatedField.fieldName, updatedField.fieldValue);
          }
      }
  },

  generateRecommendations: function(gAggregateRules) {
      var recommendations = [];
      var allReEvaluationFields = [];
      var arrayUtil = new global.ArrayUtil();

      var gAggr = gAggregateRules || RFRecommendations.getRulesForTableAndTypes(this.contextRecord.getTableName(), this.types);
      while (gAggr.next()) {
          var rule = new RFRuleService(gAggr.recommendation_rule.getRefRecord());
          var reEvaluationFields = rule.getReEvaluationFields();
          allReEvaluationFields = arrayUtil.union(allReEvaluationFields, reEvaluationFields);
          if (this.options && this.options.triggerFieldNames && this.options.triggerFieldNames.length > 0) {
              if (reEvaluationFields.indexOf(this.options.triggerFieldNames[0]) == -1) {
                  continue;
              }
          }
          var ruleDetails = rule.getDetails(this.contextRecord, this.types);
          if (ruleDetails) {
              recommendations.push(ruleDetails);
          }
      }
      if (recommendations.length > 0) {
          recommendations.sort(RFRuleService.sortComparator());
      }
      return {
          "recommendationGroups": recommendations,
          "reEvaluationFields": allReEvaluationFields
      };
  },

  generateStampRecommendations: function() {
      try {
          var stampRecommendations = [];
          var result = this.generateRecommendations();
          var recommendationGroups = result.recommendationGroups;
          var isFieldStamped = {};
          var fieldStampIdxMap = {};
          for (var groupIdx = 0; groupIdx < recommendationGroups.length; groupIdx++) {
              var recommendations = recommendationGroups[groupIdx].recommendations;
              for (var recomIdx = 0; recomIdx < recommendations.length; recomIdx++) {
                  var recommendation = recommendations[recomIdx];
                  var showAs = recommendation[RFConstants.experienceDetails.SHOW_AS];
                  var field = recommendation[RFConstants.experienceDetails.ON_FIELD];
                  var expStampDetails = recommendation[RFConstants.experienceDetails.STAMP_DETAILS];
                  if (showAs != RFConstants.experienceType.FIELD_LEVEL || !field || !expStampDetails) {
                      continue;
                  }
                  if (!(field in isFieldStamped)) {
                      isFieldStamped[field] = false;
                      var stampDetails = {};
                      stampDetails[RFConstants.stampResponse.FIELD_NAME] = field;
                      stampDetails[RFConstants.stampResponse.IS_CONFIDENT] = RFConstants.FALSE;
                      stampRecommendations.push(stampDetails);
                      fieldStampIdxMap[field] = stampRecommendations.length - 1;
                  }
                  if (!isFieldStamped[field]) {
                      var confident = expStampDetails[RFConstants.experienceDetails.IS_CONFIDENT];
                      if (confident) {
                          stampDetails = stampRecommendations[fieldStampIdxMap[field]];
                          stampDetails[RFConstants.stampResponse.FIELD_VALUE] = expStampDetails[RFConstants.experienceDetails.VALUE];
                          stampDetails[RFConstants.stampResponse.IS_CONFIDENT] = RFConstants.TRUE;
                          isFieldStamped[field] = true;
                      }
                  }
              }
          }
          var res = {};
          res[RFConstants.STATUS] = RFConstants.SUCCESS;
          res[RFConstants.stampResponse.RECOMMENDATIONS] = stampRecommendations;
          return res;
      } catch (e) {
          res = new RFExceptionManager('UNKNOWN_ERROR').getJSON();
          res[RFConstants.STATUS] = RFConstants.ERROR;
          return res;
      }
  },

  type: 'RFRecommendations'
};

Sys ID

081bc605c7333010dd7ab6c427c26089

Offical Documentation

Official Docs: