Name
global.MIMWorkbenchUtilSNC
Description
Major Incident Workbench Utils SNC Version.
Script
var MIMWorkbenchUtilSNC = Class.create();
MIMWorkbenchUtilSNC.prototype = {
ATTR_STATE: 'state',
TABLE_SYS_CHOICE: 'sys_choice',
TABLE_INCIDENT: 'incident',
TABLE_INCIDENT_ALERT: 'incident_alert',
ATTR_SOURCE: 'source',
ATTR_INACTIVE: 'inactive',
ATTR_LANGUAGE: 'language',
ATTR_ELEMENT: 'element',
ATTR_NAME: 'name',
initialize: function() {
},
getUserProfile: function(userGr) {
var liveProfile = new GlideappLiveProfile();
return {
avatar: liveProfile.getAvatar(liveProfile.getID(userGr.getUniqueValue() + "")) + "",
initials: new SNC.LiveFeedApi().getInitials(userGr.name+"") + ""
};
},
getEmailAddresses: function(incidentAlertSysId) {
var emailAddress = [];
var grContact = new GlideRecord("contact");
grContact.addQuery("table", "incident_alert");
grContact.addQuery("document", incidentAlertSysId);
grContact.query();
while (grContact.next()) {
var type = grContact.type + "";
var user = grContact.user.email + "";
var group = grContact.group.email + "";
if ("sys_user" == type && !JSUtil.nil(user))
emailAddress.push(user);
if ("sys_user_group" == type && !JSUtil.nil(group))
emailAddress.push(group);
}
return emailAddress.join();
},
getNotesUrl: function(table, sysId) {
return table + ".do?sys_id=" + sysId + "&sysparm_stack=no&sysparm_view=mim_act&sysparm_titleless=true&sysparm_link_less=true&sysparm_view_forced=true&sysparm_nofocus=true";
},
canAccessWorkbench: function() {
return gs.hasRole("itil,sn_incident_read");
},
canAddAffected: function(task) {
return this.canCreate('task_ci') && this.isActive(task);
},
canAddImpacted: function(task) {
return this.canCreate('task_cmdb_ci_service') && this.isActive(task);
},
canWrite: function(table) {
return new GlideRecord(table).canWrite();
},
canCreate: function(table) {
return new GlideRecord(table).canCreate();
},
canExportPIR: function(incidentGr) {
if (!incidentGr)
return false;
var incidentStates = this.getAllIncidentStates();
return incidentGr.major_incident_state == 'accepted' && (incidentGr.state == incidentStates.CLOSED || incidentGr.state == incidentStates.RESOLVED) && gs.hasRole('itil,sn_incident_write');
},
getExportPIRUIPage: function() {
var uiPage = gs.getProperty('sn_major_inc_mgmt.pir_export_pdf_ui_page');
return uiPage;
},
isActive: function(task) {
return task.active + '' == 'true';
},
canChangeState: function() {
return gs.hasRole('itil,sn_incident_write');
},
getIncidentStates: function(taskGr) {
return this.getChoiceRecords('incident', 'state', taskGr, function(choiceGr) {
var state = {};
state.label = choiceGr.getValue('label');
state.value = choiceGr.getValue('value');
state.language = choiceGr.getValue('language');
return state;
});
},
getTaskDetails: function(table, sys_id) {
var requiredFields = ['number', 'sys_class_name', 'state', 'major_incident_state', 'sys_created_on', 'short_description', 'assigned_to', 'priority', 'category', 'description', 'close_code', 'close_notes', 'resolved_at', 'overview', 'lessons_learned', 'timeline', 'closed_at', 'active', 'problem_id', 'rfc', 'caused_by', 'cmdb_ci'];
var gr = new GlideRecord(table);
if(gr.get(sys_id)) {
return {
taskJs: this.toJS(gr, requiredFields),
taskGr: gr
};
}
},
getIncidentFields: function(sys_id, requiredFields){
var gr = new GlideRecord(this.TABLE_INCIDENT);
if(gr.get(sys_id))
return this.toJS(gr, requiredFields);
},
toJS: function(gr, requiredFields, skipACL) {
if (!gr)
return;
if (!gr.canRead())
return;
if (!requiredFields)
requiredFields = [];
var obj = {};
obj.sys_id = {};
obj.sys_id.value = gr.getUniqueValue();
var el = gr.getFields();
for (var i=0; i < el.size(); i++) {
var elem = el.get(i);
var elName = elem.getName()+"";
var fieldType = elem.getED().getInternalType();
if (requiredFields.indexOf(elName) == -1 || fieldType == 'journal' || fieldType == 'journal_input' || fieldType == 'journal_list')
continue;
obj[elName] = {};
obj[elName].canRead = elem.canRead();
if (obj[elName].canRead || skipACL) {
obj[elName].display_value = elem.getDisplayValue();
obj[elName].value = elem.toString();
obj[elName].label = elem.getLabel();
if (gr[elName] != null && gr[elName].getGlideObject() && gr[elName]
.getGlideObject().getDisplayValueInternal()) {
obj[elName].display_value_internal = gr[elName].getGlideObject().getDisplayValueInternal();
}
}
}
return obj;
},
getTableFieldsMap: function(table) {
var fieldsMap = {};
var gr = new GlideRecord(table);
gr.initialize();
var fields = gr.getFields();
for (var i=0; i < fields.size(); i++) {
var field = fields.get(i);
var fieldName = field.getName() + "";
fieldsMap[fieldName] = gr.getElement(fieldName).getLabel();
}
return fieldsMap;
},
evaluateUiAction: function(incidentGr, actionName) {
if (!incidentGr || !actionName)
return;
var uiActionGr = new GlideRecord('sys_ui_action');
uiActionGr.addActiveQuery();
uiActionGr.addQuery('table', 'incident');
uiActionGr.addQuery('action_name', actionName);
uiActionGr.query();
if (uiActionGr.next()) {
var evaluator = new GlideScopedEvaluator();
var result = evaluator.evaluateScript(uiActionGr, 'condition', {
current: incidentGr
});
if (result != null) {
if (result.toString() != "true")
return false;
}
return true;
}
return false;
},
getCloseCodes: function(taskGr){
var that = this;
var closeCodes = [];
var requiredFields = ['label', 'value', 'language'];
return this.getChoiceRecords('incident', 'close_code', taskGr, function(choiceGr) {
return that.toJS(choiceGr, requiredFields, true);
});
},
getChoiceRecords: function(table, element, taskGr, formatFunction) {
var records = [],
defaultLang = gs.getProperty('glide.sys.language', 'en'),
userLang = gs.getUser().getLanguage(),
recordsTranform = {};
var choiceRecords = this._getChoicesForRecord(table, element, taskGr, formatFunction, userLang, defaultLang);
if (defaultLang == userLang)
return choiceRecords;
recordsTranform[defaultLang] = {};
recordsTranform[userLang] = {};
choiceRecords.forEach(function(choiceRecord) {
recordsTranform[(choiceRecord.language && choiceRecord.language.value) ? choiceRecord.language.value : choiceRecord.language][((choiceRecord.value && choiceRecord.value.value) ? choiceRecord.value.value : choiceRecord.value).toString()] = choiceRecord;
});
Object.keys(recordsTranform[defaultLang]).forEach(function(key) {
records.push(gs.nil(recordsTranform[userLang][key.toString()]) ? recordsTranform[defaultLang][key.toString()] : recordsTranform[userLang][key.toString()]);
});
return records;
},
_getChoicesForRecord: function(table, element, taskGr, formatFunction, userLang, defaultLang) {
var records = [];
var domain = taskGr.getValue("sys_domain");
while (domain) {
var choiceGr = new GlideRecord(this.TABLE_SYS_CHOICE);
choiceGr.addQuery('name', table);
choiceGr.addQuery('element', element);
if (defaultLang == userLang)
choiceGr.addQuery(this.ATTR_LANGUAGE, userLang);
else {
var choiceORQuery = choiceGr.addQuery(this.ATTR_LANGUAGE, userLang);
choiceORQuery.addOrCondition(this.ATTR_LANGUAGE, defaultLang);
}
if (GlidePluginManager.isActive('com.snc.best_practice.incident.sandiego')) {
var dependentField = taskGr.getElement(element).getDependent();
if (dependentField) {
var dependentFieldValue = taskGr.getValue(dependentField);
choiceGr.addQuery("dependent_value", dependentFieldValue);
}
}
var qc = choiceGr.addNullQuery(this.ATTR_INACTIVE);
qc.addOrCondition(this.ATTR_INACTIVE, 'false');
// Check if the record domain is global before using queryNoDomain
if (domain == 'global')
choiceGr.queryNoDomain();
else {
choiceGr.addQuery('sys_domain', domain);
choiceGr.query();
}
var hasOptionsInDomain = choiceGr.hasNext();
if (choiceGr.canRead())
while (choiceGr.next()) {
var formatedChoiceObj = formatFunction(choiceGr);
if (formatedChoiceObj)
records.push(formatedChoiceObj);
}
if (hasOptionsInDomain || domain === 'global')
return records;
domain = this.getParentDomain(domain);
}
return records;
},
getParentDomain: function(domainId) {
var thisDomain = new GlideRecord('domain');
thisDomain.addQuery('sys_id', domainId);
thisDomain.setLimit(1);
thisDomain.queryNoDomain();
if (thisDomain.next()) {
return (thisDomain.getValue('parent') != null) ? thisDomain.parent : 'global';
}
},
getAllIncidentStates: function(){
return JSON.parse(new global.IncidentState().getIncidentState());
},
getCancelledIncidentStates: function(){ // States for which time ticker on workbench stops ticking.
var incidentStates = this.getAllIncidentStates();
return [incidentStates.CANCELED, incidentStates.CLOSED, incidentStates.RESOLVED];
},
getResolvedIncidentStates: function(){ // States for post incident report is displayed.
var incidentStates = this.getAllIncidentStates();
return [incidentStates.CLOSED, incidentStates.RESOLVED];
},
showGenerateTimeline: function(gr) {
return gs.getUser().hasRole(sn_major_inc_mgmt.MajorIncidentTriggerRules.prototype.ROLE_MAJOR_INCIDENT_MANAGER) && gr.state == IncidentState.RESOLVED && gr.major_incident_state == sn_major_inc_mgmt.MajorIncidentTriggerRules.prototype.MAJOR_INCIDENT_STATE.ACCEPTED;
},
getRelatedIncidentTasks: function(sysId) {
var incidentTasks = [];
var incTasksGr = new GlideRecord("incident_task");
incTasksGr.addQuery("incident", sysId);
incTasksGr.query();
while(incTasksGr.next() && incTasksGr.canRead()) {
var jsonOb = this.toJS(incTasksGr, ['number', 'short_description', 'sys_class_name']);
incidentTasks.push(jsonOb);
}
return incidentTasks;
},
canExportToPDF : function() {
return GlidePluginManager.isActive('com.snc.whtp') && SNC.WHTPUtils.isEnabled();
},
isSlackPluginInstalled: function() {
return GlidePluginManager.isActive('sn_slack_ah_v2');
},
isTeamsPluginInstalled: function() {
return GlidePluginManager.isActive('sn_now_teams');
},
isOnCallPluginActive: function() {
return GlidePluginManager.isActive('com.snc.on_call_rotation');
},
// Use this in case of boolean property
getBooleanApplicationPropertyValue: function(prop) {
var propertyValue = GlideApplicationProperty.getValue(prop);
if (gs.nil(propertyValue)) {
return true;
}
return propertyValue == 'true' || false;
},
shouldUseSlackForDM: function() {
if(this.isOnCallPluginActive()) {
return this.isSlackPluginInstalled() && this.getBooleanApplicationPropertyValue("com.snc.on_call_rotation.use_slack_for_dm");
}
return this.isSlackPluginInstalled();
},
shouldUseTeamsForDM: function() {
if(this.isOnCallPluginActive()) {
return this.isTeamsPluginInstalled() && this.getBooleanApplicationPropertyValue("com.snc.on_call_rotation.use_msteams_for_dm");
}
return this.isTeamsPluginInstalled();
},
type: 'MIMWorkbenchUtilSNC'
};
MIMWorkbenchUtilSNC.WORK_NOTES_AND_ACTIVITY = gs.getMessage("Work notes & Activity");
Sys ID
340d6274670103008775afa00585ef9c