Name

sn_rf.RFUtils

Description

It provides utility functions for the Recommendation Framework.

Script

var RFUtils = Class.create();

RFUtils.addToSchema = function(schema, name, label, type, referenceTable) {
  var schemaElement = {
      'name': name,
      'label': label,
      'type': type
  };
  if (type == RFConstants.evaluationOutputTypes.REFERENCE) {
      schemaElement['referenceTable'] = referenceTable;
  }
  schema.push(schemaElement);
};

RFUtils.getFieldReferenceTable = function(table, field) {
  if (table && field) {
      var tableGr = (new GlideRecord(table));
      var referenceField = tableGr.isValid() && tableGr.getElement(field);
      if (referenceField == null || referenceField.getED().getInternalType() != RFConstants.evaluationOutputTypes.REFERENCE)
          return;
      return referenceField.getReferenceTable();
  }
};

RFUtils.evaluateScript = function(script, inputs, output) {
  var scriptGr = new GlideRecord(RFConstants.tables.SYS_SCRIPT_INCLUDE);
  scriptGr.get(RFConstants.EVALUATOR_RECORD_SYS_ID);

  scriptGr.script = 'try {' + script + '} catch(e){ gs.error(e);' + output + ' = { status: RFConstants.EXCEPTION, error: e }; }';

  var evaluator = new GlideScopedEvaluator();
  var keys = Object.keys(inputs);
  for (var idx = 0; idx < keys.length; idx++) {
      evaluator.putVariable(keys[idx], inputs[keys[idx]]);
  }
  evaluator.putVariable(output, {});
  evaluator.evaluateScript(scriptGr);
  return evaluator.getVariable(output);
};

RFUtils.sortByProperty = function(property) {
  return function(a, b) {
      if (a[property] > b[property])
          return 1;
      else if (a[property] < b[property])
          return -1;

      return 0;
  };
};

RFUtils.evaluateUserCriteria = function(userCriteriaId) {
  var propVars = RFConstants.configurationPropertyVars;
  var roleOverridePropertyName = propVars.PREFIX + RFConstants.DOT + propVars.RECOMMENDATION + RFConstants.DOT + propVars.ROLES_OVERRIDE;
  var rolesOverrideString = gs.getProperty(roleOverridePropertyName, '["maint", "admin"]');
  try {
      var rolesOverride = JSON.parse(rolesOverrideString);
  } catch (e) {
      rolesOverride = [];
      new RFLogger("RFUtils - evaluateUserCriteria").logError("Invalid list provided in property " +
          roleOverridePropertyName + " : " + rolesOverrideString);
  }
  if (!Array.isArray(rolesOverride)) {
      rolesOverride = [];
  }
  for (var idx = 0; idx < rolesOverride.length; idx++) {
      var hasRole = gs.hasRole(rolesOverride[idx]);
      if (hasRole) {
          return true;
      }
  }
  return sn_uc.UserCriteriaLoader.userMatches(gs.getUserID(), [userCriteriaId]);
};

RFUtils.getScriptingRuleImplementations = function() {
  var implementations = [];
  var instanceGr = new GlideRecord(RFConstants.tables.SYS_EXTENSION_INSTANCE);
  instanceGr.addActiveQuery();
  instanceGr.addQuery(RFConstants.fields.SYS_EXTENSION_INSTANCE_POINT, RFConstants.extensionPoint.SCRIPTING_RULE_INTERFACE);
  instanceGr.addQuery(RFConstants.fields.SYS_EXTENSION_INSTANCE_SCRIPT_INCLUDE +
      RFConstants.DOT + RFConstants.fields.ACTIVE, RFConstants.TRUE);
  instanceGr.query();
  while (instanceGr.next()) {
      var scriptInclude = instanceGr.getValue(RFConstants.fields.SYS_EXTENSION_INSTANCE_SCRIPT_INCLUDE);
      if (scriptInclude) {
          implementations.push(scriptInclude);
      }
  }
  return implementations;
};

RFUtils.timeAgo = function(dateTime) {
  var duration = GlideDateTime.subtract(dateTime, new GlideDateTime());
  return RFUtils._toTimeAgo(duration.getNumericValue());
};

RFUtils._toTimeAgo = function(distanceMillis) {
  var msgs = {
      ago: gs.getMessage('%d ago'),
      fromNow: gs.getMessage('%d from now'),
      justNow: gs.getMessage('just now'),
      seconds: gs.getMessage('less than a minute'),
      minute: gs.getMessage('about a minute'),
      minutes: gs.getMessage('%d minutes'),
      hour: gs.getMessage('about an hour'),
      hours: gs.getMessage('about %d hours'),
      day: gs.getMessage('a day'),
      days: gs.getMessage('%d days'),
      month: gs.getMessage('about a month'),
      months: gs.getMessage('%d months'),
      year: gs.getMessage('about a year'),
      years: gs.getMessage('%d years')
  };
  var seconds = Math.abs(distanceMillis) / 1000;
  var minutes = seconds / 60;
  var hours = minutes / 60;
  var days = hours / 24;
  var years = days / 365;
  var ago = msgs.ago;

  // handle 'just now' message suffix
  if (seconds < 45) {
      ago = '%d';
  }

  // handle future times
  if (distanceMillis < 0) {
      ago = msgs.fromNow;
  }

  function substitute(message, number) {
      return message.replace(/%d/i, number);
  }

  var words = seconds < 45 && (distanceMillis >= 0) && substitute(msgs.justNow, Math.round(seconds)) ||
      seconds < 45 && substitute(msgs.seconds, Math.round(seconds)) ||
      seconds < 90 && substitute(msgs.minute, 1) ||
      minutes < 45 && substitute(msgs.minutes, Math.round(minutes)) ||
      minutes < 90 && substitute(msgs.hour, 1) ||
      hours < 24 && substitute(msgs.hours, Math.round(hours)) ||
      hours < 42 && substitute(msgs.day, 1) ||
      days < 30 && substitute(msgs.days, Math.ceil(days)) ||
      days < 45 && substitute(msgs.month, 1) ||
      days < 365 && substitute(msgs.months, Math.round(days / 30)) ||
      years < 1.5 && substitute(msgs.year, 1) ||
      substitute(msgs.years, Math.round(years));

  return substitute(ago, words);
};

RFUtils.getConfigurationPropertyName = function(tableName, fieldName, sysId) {
  var prefix = RFConstants.configurationPropertyVars.PREFIX;
  var tableShortName = RFConstants.configurationPropertyVars[tableName];
  var fieldShortName = RFConstants.configurationPropertyVars[fieldName];
  return prefix + RFConstants.DOT + tableShortName + RFConstants.DOT + sysId + RFConstants.DOT + fieldShortName;
};

RFUtils.getSideComponentFooterProperties = function(tableName) {
  var propertyName = RFConstants.configurationPropertyVars.PREFIX + RFConstants.DOT + tableName + RFConstants.DOT + RFConstants.configurationPropertyVars.FOOTER_VISIBLE;
  return {
      "isHidden": !(gs.getProperty(propertyName, false) == "true")
  };

};

Sys ID

0146773153c33010e530ddeeff7b12f8

Offical Documentation

Official Docs: