Name
sn_grc.IndicatorGeneratorEngineBase
Description
Base utilities for generating and updating indicators
Script
var IndicatorGeneratorEngineBase = Class.create();
IndicatorGeneratorEngineBase.prototype = {
initialize: function() {},
generateIndicatorFromTemplate: function(templateId, itemId) {
this._createIndicator(templateId, itemId);
},
generateBulkIndicatorsFromTemplate: function(templateId, contentId) {
this._createIndicators(templateId, contentId);
},
deactivateIndicatorsFromContent: function(templateId, contentId) {
this._deactivateIndicatorsFromContent(templateId, contentId);
},
deactivateIndicatorsFromItem: function(templateId, itemId) {
this._deactivateIndicatorsFromItem(templateId, itemId);
},
deactivateIndicatorsFromTemplate: function(templateId, operation) {
this._deactivateIndicatorsFromTemplate(templateId, operation);
},
updatingIndicatorsInfoMessage: function(contentId, operation) {
this._updatingIndicatorsInfoMessage(contentId, operation);
},
checkForControlObectiveRiskStatementInRelatedList: function(indicatorTemplate) {
return this._checkForControlObectiveRiskStatementInRelatedList(indicatorTemplate);
},
_deactivateIndicatorsFromContent: function(templateId, contentId) {
var indi = new GlideRecord('sn_grc_indicator');
indi.addActiveQuery();
indi.addQuery('type', '!=', 'config_test');
indi.addQuery('template', templateId);
indi.addQuery('item.content', contentId);
indi.query();
while (indi.next()) {
indi.active = false;
indi.update();
}
},
_deactivateIndicatorsFromItem: function(templateId, itemId) {
var indi = new GlideRecord('sn_grc_indicator');
indi.addQuery('template', templateId);
indi.addQuery('item', itemId);
indi.query();
while (indi.next()) {
indi.active = false;
indi.update();
}
},
_deactivateIndicatorsFromTemplate: function(templateId, operation) {
var gr = new GlideRecord('sn_grc_m2m_ind_temp_cont');
gr.addQuery('indicator_template', templateId);
gr.query();
if (operation == 'delete') {
while (gr.next()) {
var contentId = gr.getValue('content');
this._deactivateIndicatorsFromContent(templateId, contentId);
}
} else {
while (gr.next()) {
var contentId = gr.getValue('content');
this._updatingIndicatorsInfoMessage(contentId, 'deactivate');
gs.eventQueue('sn_grc.deactivate_bulk_indicators', null, templateId, contentId);
}
}
},
setIndicatorFields: function(indicator, template) {
this._setIndicatorFields(indicator,template);
},
updateIndicators: function(template) {
// Get indicators created from this template with override false;
var indicator = new GlideRecord('sn_grc_indicator');
indicator.addQuery('template', template.getUniqueValue());
indicator.addQuery('override_template', 'false');
indicator.query();
while (indicator.next()) {
indicator = this._setIndicatorFields(indicator, template);
indicator.update();
}
},
setSchedulingFieldsToDefaultIfErrors: function(record) {
switch (record.getValue('collection_frequency')) {
case 'monthly':
var dayOfMonth = parseInt(record.day_of_month);
if (dayOfMonth < 0 || dayOfMonth > 31) {
gs.addInfoMessage(gs.getMessage('The day of the month has been set to default'));
record.setValue('day_of_month', 1);
}
break;
case 'quarterly':
case 'semi_annually':
var todayDate = new GlideDateTime().getLocalDate();
var nextRunDate = new GlideDateTime(record.getValue('next_run_time'));
if (record.next_run_time.nil() || nextRunDate.getNumericValue() < todayDate.getNumericValue()) {
record.next_run_time = todayDate.getDisplayValue();
gs.addInfoMessage(gs.getMessage('The next run date has been set to default'));
}
break;
case 'annually':
if (!this._dayOfMonthInRange(record.month, record.day_of_month)) {
record.setValue('day_of_month', 1);
gs.addInfoMessage(gs.getMessage('The day of the month has been set to default'));
}
}
},
_dayOfMonthInRange: function(month, dayOfMonth) {
var now = new GlideDateTime();
now.setMonthLocalTime(parseInt(month));
var daysInMonth = now.getDaysInMonthLocalTime();
if (dayOfMonth < 0 || parseInt(dayOfMonth) > daysInMonth)
return false;
return true;
},
_createIndicators: function(templateId, contentId) {
// Get the tempate
var template = new GlideRecord('sn_grc_indicator_template');
template.get(templateId);
// Get items associated with the content
var item = new GlideRecord('sn_grc_item');
item.addQuery('content', contentId);
item.query();
// Create item for each item and associate it with the template
while (item.next()) {
this._createIndicator(templateId, item.getUniqueValue());
}
},
_createIndicator: function(templateId, itemId) {
// check if that indicator already exists
var existingIndicator = new GlideRecord('sn_grc_indicator');
existingIndicator.addQuery('template', templateId);
existingIndicator.addQuery('item', itemId);
existingIndicator.setLimit(1);
existingIndicator.query();
if (existingIndicator.next()) {
if (!existingIndicator.active &&!existingIndicator.retired_manually) {
existingIndicator.active = true;
existingIndicator.update();
}
return;
}
var indicator = new GlideRecord('sn_grc_indicator');
indicator.item = itemId;
indicator.template = templateId;
indicator.inherit_fm_template = true;
// Get the template record
/* var template = new GlideRecord('sn_grc_indicator_template');
if (!template.get(templateId)) {
return;
}*/
// Get the template fields
// indicator = this._setIndicatorFields(indicator, template);
indicator.insert();
},
_updatingIndicatorsInfoMessage: function(contentId, operation) {
var item = new GlideAggregate('sn_grc_item');
item.addQuery('content', contentId);
item.setLimit(1);
item.query();
if (!item.hasNext())
return;
var content = new GlideRecord('sn_grc_content');
var table = '';
if (content.get(contentId))
table = content.sys_class_name + '';
var GRCUtils = new sn_grc.GRCUtils();
if (operation === 'deactivate') {
if (table === 'sn_risk_definition')
gs.addInfoMessage(GRCUtils.getMessage('indicator_deactivation_msg_rs'));
else if (table === 'sn_compliance_policy_statement')
gs.addInfoMessage(GRCUtils.getMessage('indicator_deactivation_msg_ps'));
} else if (operation === 'activate') {
if (table === 'sn_risk_definition')
gs.addInfoMessage(GRCUtils.getMessage('indicator_generation_msg_rs'));
else if (table === 'sn_compliance_policy_statement')
gs.addInfoMessage(GRCUtils.getMessage('indicator_generation_msg_ps'));
}
},
_setIndicatorFields: function(indicator, template) {
var fields = ['name', 'type', 'table', 'reference_table', 'use_reference_field', 'reference_field', 'owner', 'owning_group', 'passed', 'collection_frequency', 'day_of_week', 'next_run_time', 'day_of_month', 'month', 'script', 'value_mandatory', 'short_description', 'instructions', 'supporting_data', 'criteria', 'supporting_data_fields', 'sample_size', 'issue_source', 'target', 'target_type', 'additional_criteria'];
for (var i = 0; i < fields.length; i++) {
var value = '';
if (fields[i] == 'use_reference_field') {
var gr = new GlideRecord('sn_grc_item');
gr.get(indicator.item);
if (!gr.profile.nil() && gr.profile.applies_to.nil()) {
indicator.setValue(fields[i], false);
indicator.setValue('reference_field', '');
} else {
value = template.getValue(fields[i]);
indicator.setValue(fields[i], value ? value : '');
}
} else {
value = template.getValue(fields[i]);
indicator.setValue(fields[i], value ? value : '');
}
}
return indicator;
},
_isInstanceOf: function(gr, tableName) {
var hierarchy = new GlideTableHierarchy(gr).getHierarchy();
return new global.ArrayUtil().contains(hierarchy, tableName);
},
_checkForControlObectiveRiskStatementInRelatedList: function(indicatorTemplate) {
var m2mPresent = false;
var indicatorPresent = false;
var m2mRecord = new GlideRecord('sn_grc_m2m_ind_temp_cont');
m2mRecord.addQuery('indicator_template', indicatorTemplate);
m2mRecord.setLimit(1);
m2mRecord.query();
if (m2mRecord.next())
m2mPresent = true;
var indicator = new GlideRecord('sn_grc_indicator');
indicator.addQuery('template', indicatorTemplate);
indicator.setLimit(1);
indicator.query();
if (indicator.next())
indicatorPresent = true;
if (m2mPresent || indicatorPresent)
return true;
return false;
},
type: 'IndicatorGeneratorEngineBase'
};
Sys ID
57e47b52c3130200dd921a4112d3aea6