Name

sn_nb_action.FieldRecommendationService

Description

No description available

Script

var FieldRecommendationService = Class.create();
FieldRecommendationService.prototype = {
  tableName: Constants.TBL_FIELD_RECOMMENDATION,

  pillPickerExprConstants: {
      "fi_expr_start": "{{" + Constants.pillPickerVars.FIELD_RECOMMENDATION_INPUT_KEY, //When pill expression contains field recommendation inputs
      "expr_end": "}}"
  },

  initialize: function(grOrSysId) {
      this.logger = new global.GSLog(Constants.PROP_LOG_LEVEL, this.type);
      if (grOrSysId && grOrSysId.sys_class_name == this.tableName) {
          this.currentRecord = grOrSysId;
      } else if (grOrSysId) {
          var actionGr = new GlideRecord(this.tableName);
          if (actionGr.get(grOrSysId)) {
              this.currentRecord = actionGr;
          }
      }
  },

  hasValidRecord: function() {
      return this.currentRecord && this.currentRecord.sys_class_name == this.tableName;
  },

  getRecommendations: function(actionInputs) {
      try {
          var recommendations = {};
          var actionInputObject = this._getActionInputObject(actionInputs);
          var definitionsGr = this._getDefinitions();
          if (definitionsGr) {
              while (definitionsGr.next()) {
                  var details = this._getDefinitionDetails(definitionsGr, actionInputObject);
                  if (details.hasOwnProperty('fieldRecommendation')) {
                      var recommendation = details.fieldRecommendation;
                      var field = details.field;
                      this._mergeRecommendations(recommendations, field, recommendation);
                  }
              }
          }
          return recommendations;
      } catch (e) {
          this.logger.error('Error executing getRecommendations, Error: ' + e);
      }

  },

  _mergeRecommendations: function(recommendations, field, recommendation) {
      if (recommendations[field]) {
          recommendations[field].push(recommendation);
      } else {
          recommendations[field] = [recommendation];
      }
  },

  _getActionInputObject: function(actionInputs) {
      var inputObj = {};
      for (var attribute in actionInputs) {
          if (attribute == Constants.SYS_META || attribute == Constants.COL_SYS_ID) {
              continue;
          }
          var element = actionInputs[attribute];

          //DEF0421746
          if (element == 'undefined' || element === undefined) {
              inputObj[attribute] = Constants.STRING_WHITESPACE;
              continue;
          }

          var value = '';
          if (element) {
              if (actionInputs.constructor.name != "ScopedGlideElement") {
                  value = actionInputs[attribute];
              } else {
                  value = actionInputs[attribute].getRefRecord();
                  if (value && !value.isValidRecord()) {
                      value = actionInputs[attribute];
                  }
              }
          }
          if (gs.nil(value)) {
              inputObj[attribute] = actionInputs[attribute].getDisplayValue();
          } else {
              inputObj[attribute] = value;
          }
      }
      return inputObj;
  },

  _getDefinitions: function() {
      var definitionGr = new GlideRecord(Constants.TBL_FIELD_RECOMMENDATION_DEFINITION);
      definitionGr.addActiveQuery();
      definitionGr.addQuery(Constants.COL_FIELD_RECOMMENDATION, this.currentRecord.getUniqueValue());
      definitionGr.orderBy(Constants.COL_ORDER);
      definitionGr.query();
      if (definitionGr.hasNext()) {
          return definitionGr;
      }
      return false;
  },

  _getDefinitionDetails: function(definitionGr, actionInputObject) {
      var fieldRecommendation = {};
      var field = definitionGr.getValue(Constants.COL_FIELD);
      var recommendationMessage = definitionGr.getDisplayValue(Constants.COL_RECOMMENDATION_MESSAGE);
      var confidence = definitionGr.getValue(Constants.COL_CONFIDENCE);
      confidence = this._parseValue(confidence, actionInputObject);

      fieldRecommendation[Constants.RECOMMENDATION_MESSAGE] = this._parseValue(recommendationMessage, actionInputObject);
      if (fieldRecommendation[Constants.RECOMMENDATION_MESSAGE] == Constants.STRING_WHITESPACE) {
          this.logger.warn('Recommendation message contains a pill that returned empty value on parsing for Field recommendation defintion id = ' + definitionGr.getUniqueValue());
          return {};
      }
      fieldRecommendation[Constants.IS_CONFIDENT] = false;
      var autofillConfigValue = definitionGr.getValue(Constants.COL_RECOMMENDATION_METHOD);

      if (autofillConfigValue == Constants.CHOICE_NO_AUTOFILL) {
          fieldRecommendation[Constants.CONFIDENCE] = confidence;
      } else if (autofillConfigValue == Constants.CHOICE_AUTOFILL_USING_CONFIDENCE) {
          var thresholdForStamping = definitionGr.getValue(Constants.COL_CONFIDENCE_THRESHOLD_FOR_DIRECT_ASSIGNMENT);
          if (parseInt(confidence) >= parseInt(thresholdForStamping)) {
              fieldRecommendation[Constants.CONFIDENCE] = confidence;
              if (!this._setStampedValueDetails(definitionGr, actionInputObject, fieldRecommendation))
                  return {};

          }
      } else if (autofillConfigValue == Constants.CHOICE_AUTOFILL_USING_RESOURCE_GENERATOR) {
          var autofillExpression = definitionGr.getValue(Constants.COL_RECOMMENDATION_PREFERENCE);
          var shouldAutofill = this._parseValue(autofillExpression, actionInputObject);
          if (shouldAutofill == "true") {
              if (!this._setStampedValueDetails(definitionGr, actionInputObject, fieldRecommendation))
                  return {};
          }
      }

      return {
          "fieldRecommendation": fieldRecommendation,
          "field": field
      };
  },

  _setStampedValueDetails: function(definitionGr, actionInputObject, fieldRecommendation) {
      var stampValue = definitionGr.getValue(Constants.COL_RECOMMENDED_VALUE);
      var parsedStampValue = this._parseValue(stampValue, actionInputObject, true);
      if (parsedStampValue == Constants.STRING_WHITESPACE) {
          this.logger.warn('Recommended value contains a pill that returned empty value on parsing for Field recommendation defintion id = ' + definitionGr.getUniqueValue());
          return false;
      }
      fieldRecommendation[Constants.IS_CONFIDENT] = true;
      var stampDetails = {};
      if (parsedStampValue instanceof GlideRecord && parsedStampValue.isValidRecord()) {
          stampDetails[Constants.VALUE] = parsedStampValue.getValue(Constants.COL_SYS_ID);
          stampDetails[Constants.DISPLAY_VALUE] = parsedStampValue.getDisplayValue();
      } else {
          stampDetails[Constants.VALUE] = parsedStampValue;
      }
      fieldRecommendation[Constants.STAMP_DETAILS] = stampDetails;
      return true;
  },

  _parseValue: function(parameterizedInputValue, inputObj, isStampValue) {
      isStampValue = isStampValue || false;
      var getGlideRecord = isStampValue;
      var parsedInputValue = parameterizedInputValue;
      var pattern = /(\{{[a-z0-9_.-?]*}})/gi;
      try {
          var pillExpressions = parameterizedInputValue ? parameterizedInputValue.match(pattern) : [];
          if (gs.nil(pillExpressions) || !inputObj) {
              return parsedInputValue;
          }
          var pillExpressionsLength = pillExpressions.length;
          if (pillExpressionsLength > 1 ||
              (pillExpressionsLength == 1 && pillExpressions[0] && pillExpressions[0].trim() != parameterizedInputValue.trim())) {
              getGlideRecord = false;
          }
          for (var i = 0; i < pillExpressionsLength; i++) {
              var pillExpr = pillExpressions[i];
              var pillExprParsedValue;
              var pillVariableStr = pillExpr.substring(this.pillPickerExprConstants.fi_expr_start.length + 1, pillExpr.lastIndexOf(this.pillPickerExprConstants.expr_end));
              var pillVariables = pillVariableStr ? pillVariableStr.split(".") : [];
              var parsedInput = ' ';
              if (pillVariables.length == 1) {
                  parsedInput = inputObj[pillVariableStr];
              } else if (pillVariables.length > 1 && this._isValidRecord(inputObj[pillVariables[0]])) {
                  var lookupStr = pillVariableStr.substring(pillVariables[0].length + 1);
                  var replaceValue = this._getReplaceValueFromGr(inputObj[pillVariables[0]], lookupStr, isStampValue, getGlideRecord);
                  parsedInput = gs.nil(replaceValue) ? ' ' : replaceValue;
              }
              pillExprParsedValue = parsedInput;
              if (pillExprParsedValue == Constants.STRING_WHITESPACE || pillExprParsedValue == Constants.STRING_EMPTY) {
                  return Constants.STRING_WHITESPACE;
              }
              parsedInputValue = this._getFinalParsedInputValue(pillExpr, pillExprParsedValue, parsedInputValue, parameterizedInputValue, getGlideRecord, isStampValue);
          }
      } catch (e) {
          var inputs = 'parameterizedInputValue: ' + parameterizedInputValue +
              ', actionInputObject: ' + JSON.stringify(inputObj) +
              ', getGlideRecord: ' + getGlideRecord;
          this.logger.error('Error executing _parseValue, Inputs - ' + inputs + ', Error: ' + e);
      }
      return parsedInputValue;
  },

  _isValidRecord: function(record) {
      return !gs.nil(record) && record.isValidRecord;
  },

  _getReplaceValueFromGr: function(gr, lookupStr, isStampValue, getGlideRecord) {
      if (getGlideRecord) {
          var replaceValue = gr.getElement(lookupStr).getRefRecord();
          if (!gs.nil(replaceValue)) {
              return replaceValue.isValidRecord() ? replaceValue : null;
          }
      }
      return isStampValue ? gr.getValue(lookupStr) : gr.getDisplayValue(lookupStr);
  },

  _getFinalParsedInputValue: function(pillExpr, pillExprParsedValue, parsedInputValue, parameterizedInputValue, getGlideRecord, isStampValue) {
      var isPillEqualToInput = pillExpr.trim() == parameterizedInputValue.trim();
      if (this._isValidRecord(pillExprParsedValue)) {
          pillExprParsedValue = getGlideRecord ? pillExprParsedValue :
              (isStampValue ? pillExprParsedValue.getUniqueValue() : pillExprParsedValue.getDisplayValue());
      }
      if (isPillEqualToInput) {
          return pillExprParsedValue;
      }
      return parsedInputValue.replace(pillExpr, pillExprParsedValue);
  },

  type: 'FieldRecommendationService'
};

Sys ID

63474242a32301103953792e16fcda6b

Offical Documentation

Official Docs: