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