Name
sn_grc.GRCWorkspaceUtilsBase
Description
General GRC Workspace Utilities
Script
var GRCWorkspaceUtilsBase = Class.create();
GRCWorkspaceUtilsBase.prototype = {
initialize: function() {},
/* Start of Controls Monitoring records insertion during upgrade */
initializeControlMonitoringOnUpgrade: function() {
this._initializeControlMonitoringOnUpgrade();
},
_initializeControlMonitoringOnUpgrade: function() {
if (gs.tableExists("sn_compliance_control")) {
var control = new GlideRecord('sn_compliance_control');
control.addActiveQuery();
control.addQuery('state', '!=', 'retired');
control.addNotNullQuery('content');
control.query();
while (control.next()) {
//indicators
var item = control.getUniqueValue();
var indicatorFailureCount = this._getIndicatorFailureCount(item);
//control attestations
var controlAttestationFailureCount = this._getAttestationTestFailureCount(item);
//control Tests
var controlTestFailureCount = 0;
if (GlidePluginManager().isActive('com.sn_audit')) {
controlTestFailureCount = this._getControlTestFailureCount(item);
}
//update control monitoring
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (!controlMonitoring.get('item', control.getUniqueValue())) {
controlMonitoring.initialize();
controlMonitoring.setValue('active', true);
controlMonitoring.setValue('item', control.getUniqueValue());
controlMonitoring.setValue('content', control.content);
controlMonitoring.setValue('failed_indicators', indicatorFailureCount);
controlMonitoring.setValue('failed_attestations', controlAttestationFailureCount);
controlMonitoring.setValue('failed_control_tests', controlTestFailureCount);
controlMonitoring.insert();
}
}
}
},
_getIndicatorFailureCount: function(item) {
var indicatorRecord = new GlideAggregate('sn_grc_indicator');
indicatorRecord.addAggregate('COUNT');
indicatorRecord.addQuery('active', true);
indicatorRecord.addQuery('item', item);
indicatorRecord.addQuery('status', '2'); //Failed = 2, Passed = 1
indicatorRecord.query();
var indicatorCount = 0;
if (indicatorRecord.next()) {
indicatorCount = indicatorRecord.getAggregate('COUNT');
}
return indicatorCount;
},
_getAttestationTestFailureCount: function(item) {
var m2mIssueItem = new GlideAggregate('sn_grc_m2m_issue_item');
m2mIssueItem.addAggregate('COUNT');
m2mIssueItem.addEncodedQuery('sn_grc_issue.issue_sourceLIKE9690c489730323003aebda013ef6a7e7^sn_grc_issue.stateIN1,2,5,0^sn_grc_issue.active=true^is_originator=true^sn_grc_issue.contentISNOTEMPTY^sn_grc_issue.item=' + item);
m2mIssueItem.query();
var controlAttestationCount = 0;
if (m2mIssueItem.next() && m2mIssueItem.getAggregate('COUNT') > 0) {
controlAttestationCount = m2mIssueItem.getAggregate('COUNT');
}
return controlAttestationCount;
},
_getControlTestFailureCount: function(item) {
//control Tests
var m2mIssueItem = new GlideAggregate('sn_grc_m2m_issue_item');
m2mIssueItem.addEncodedQuery('sn_grc_issue.issue_sourceLIKEb2a04889730323003aebda013ef6a782^sn_grc_issue.stateIN1,2,5,0^sn_grc_issue.active=true^is_originator=true^sn_grc_issue.contentISNOTEMPTY^sn_grc_issue.item=' + item);
m2mIssueItem.query();
var controlTestCount = 0;
if (m2mIssueItem.next() && m2mIssueItem.getAggregate('COUNT') == 1) {
var issueId = m2mIssueItem.getValue('sn_grc_issue');
var controlTest = new GlideAggregate('sn_audit_control_test');
controlTest.addAggregate('COUNT');
controlTest.addQuery('issue', issueId);
controlTest.query();
if (controlTest.next()) {
controlTestCount = controlTest.getAggregate('COUNT');
}
}
return controlTestCount;
},
/* End of Controls Monitoring records insertion during upgrade */
/* Start of Controls creation updation and deletion in control monitoring table */
deleteControlsInControlMonitoringOnDeletion: function(currentControl) {
this._deleteControlsInControlMonitoringOnDeletion(currentControl);
},
_deleteControlsInControlMonitoringOnDeletion: function(currentControl) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
controlMonitoring.addNullQuery('item');
controlMonitoring.query();
controlMonitoring.deleteMultiple();
},
deleteControlsInControlMonitoringOnRetiring: function(currentControl) {
this._deleteControlsInControlMonitoringOnRetiring(currentControl);
},
_deleteControlsInControlMonitoringOnRetiring: function(currentControl) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
controlMonitoring.addQuery('item', currentControl.getUniqueValue() + '');
controlMonitoring.query();
controlMonitoring.deleteMultiple();
},
updateControlsInControlMonitoring: function(current) {
this._updateControlsInControlMonitoring(current);
},
_updateControlsInControlMonitoring: function(current) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (!controlMonitoring.get('item', current.getUniqueValue())) {
controlMonitoring.initialize();
controlMonitoring.setValue('active', true);
controlMonitoring.setValue('item', current.getUniqueValue());
controlMonitoring.setValue('content', current.content);
controlMonitoring.insert();
}
},
/* End of Controls creation updation and deletion in control monitoring table */
updateControlMonitoringWhenCOChanges: function(current, previous) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (previous.content.nil()) {
if (!controlMonitoring.get('item', current.getUniqueValue())) {
controlMonitoring.initialize();
controlMonitoring.setValue('active', true);
controlMonitoring.setValue('item', current.getUniqueValue());
controlMonitoring.setValue('content', current.content);
controlMonitoring.insert();
}
} else {
controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (!controlMonitoring.get('item', previous.getUniqueValue())) {
if (!current.content.nil()) {
controlMonitoring.initialize();
controlMonitoring.setValue('active', true);
controlMonitoring.setValue('item', current.getUniqueValue());
controlMonitoring.setValue('content', current.content);
controlMonitoring.insert();
}
} else {
if (!current.content.nil()) {
controlMonitoring.setValue('content', current.content);
controlMonitoring.update();
} else {
controlMonitoring.deleteRecord();
}
}
}
},
/* Start of updating Control Monitoring */
updateControlTestsCountOnIssueClosure: function(controlId) {
this._updateControlTestsCountOnIssueClosure(controlId);
},
_updateControlTestsCountOnIssueClosure: function(controlId) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (controlMonitoring.get('item', controlId) && controlMonitoring.active) {
controlMonitoring.setValue('failed_control_tests', 0);
controlMonitoring.update();
}
},
updateControlTestsCountOnControlTestClosure: function(current) {
this._updateControlTestsCountOnControlTestClosure(current);
},
_updateControlTestsCountOnControlTestClosure: function(current) {
var controlTest = new GlideAggregate('sn_audit_control_test');
controlTest.addQuery('issue', current.issue);
controlTest.addAggregate('COUNT');
controlTest.query();
if (controlTest.next()) {
var count = controlTest.getAggregate('COUNT');
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (controlMonitoring.get('item', current.control) && controlMonitoring.active) {
controlMonitoring.setValue('failed_control_tests', count);
controlMonitoring.update();
}
}
},
generateIndicatorMonitoringResultsForControl: function(currentIndicator) {
this._generateIndicatorMonitoringResultsForControl(currentIndicator);
},
_generateIndicatorMonitoringResultsForControl: function(currentIndicator) {
var indicatorRecord = new GlideAggregate('sn_grc_indicator');
indicatorRecord.addAggregate('COUNT');
indicatorRecord.addQuery('active', 'true');
indicatorRecord.addQuery('item', currentIndicator.item);
indicatorRecord.addQuery('status', '2'); //Failed = 2, Passed = 1
indicatorRecord.query();
var count = 0;
if (indicatorRecord.next()) {
count = indicatorRecord.getAggregate('COUNT');
}
//Update the new table (control monitoring) with control indicator details
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (controlMonitoring.get('item', currentIndicator.item) && controlMonitoring.active) {
controlMonitoring.setValue('failed_indicators', count);
controlMonitoring.update();
}
},
generateAttestationResultsForControl: function(issueId) {
this._generateAttestationResultsForControl(issueId);
},
generateAttestationResultsForSingleControl: function(issueId, itemId) {
this._generateAttestationResultsForSingleControl(issueId, itemId);
},
_generateAttestationResultsForControl: function(issueId) {
var issue = new GlideRecord('sn_grc_issue');
if (issue.get(issueId)) {
var issueExist = true;
var issueState = issue.getValue('state');
}
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
var issuesToItemM2M = new GlideRecord('sn_grc_m2m_issue_item');
issuesToItemM2M.addQuery('sn_grc_issue', issueId);
issuesToItemM2M.query();
while (issuesToItemM2M.next()) {
var item = issuesToItemM2M.getValue('sn_grc_item');
controlMonitoring.initialize();
if (controlMonitoring.get('item', item) && controlMonitoring.active) {
if (issueExist) {
if (issueState == '3' || issueState == '4') {
controlMonitoring.setValue('failed_attestations', 0);
} else {
controlMonitoring.setValue('failed_attestations', 1);
}
} else {
controlMonitoring.setValue('failed_attestations', 0);
}
controlMonitoring.update();
}
}
},
_generateAttestationResultsForSingleControl: function(issueId, itemId) {
var controlMonitoring = new GlideRecord('sn_grc_control_monitoring');
if (controlMonitoring.get('item', itemId) && controlMonitoring.active) {
var issue = new GlideRecord('sn_grc_issue');
issue.addEncodedQuery('issue_sourceLIKE9690c489730323003aebda013ef6a7e7');
issue.addQuery('sys_id', issueId);
issue.query();
if (issue.next()) {
if (issue.getValue('state') == '3' || issue.getValue('state') == '4') {
controlMonitoring.setValue('failed_attestations', 0);
} else {
controlMonitoring.setValue('failed_attestations', 1);
}
} else {
controlMonitoring.setValue('failed_attestations', 0);
}
controlMonitoring.update();
}
},
/* End of updating Control Monitoring */
getHighlightColorForHierarchyItem: function(table, sysId, highlightedValueField) {
var highlightedValueCondition = new GlideRecord("sys_highlighted_value_condition");
highlightedValueCondition.addQuery("highlighted_value.table", table);
highlightedValueCondition.addQuery("highlighted_value.field", highlightedValueField);
highlightedValueCondition.query();
while (highlightedValueCondition.next()) {
var record = new GlideRecord(table);
record.addQuery("sys_id", sysId);
record.addEncodedQuery(highlightedValueCondition.getValue("conditions"));
record.query();
if (record.hasNext()) {
return highlightedValueCondition.getValue("status");
}
}
return "";
},
createItemTree: function(currentRecord, highlightedValueField) {
var tree = {};
tree.id = currentRecord.getUniqueValue();
tree.label = currentRecord.getDisplayValue();
tree.actionable = true;
if (highlightedValueField) {
tree.highlightedValueProps = [{
status: this.getHighlightColorForHierarchyItem(currentRecord.getTableName(), currentRecord.getUniqueValue(), highlightedValueField),
label: currentRecord.getValue(highlightedValueField)
}];
}
return tree;
},
getHierarchyItemsJSON: function(recordTable, recordSysId, parentField, orderByField, highlightedValueField) {
var items = [];
var currentRecord = new GlideRecord(recordTable);
currentRecord.get(recordSysId);
// Initialize recordTree JSON with current record's item JSON
var recordTree = this.createItemTree(currentRecord, highlightedValueField);
recordTree.identifierProps = {
icon: 'diamond-fill'
};
// Add Child records to recordTree
var childRecords = new GlideRecord(recordTable);
childRecords.addQuery(parentField, currentRecord.getUniqueValue());
childRecords.orderBy(orderByField);
childRecords.query();
if (childRecords.hasNext()) recordTree.children = [];
while (childRecords.next()) {
var childRecordTree = this.createItemTree(childRecords, highlightedValueField);
recordTree.children.push(childRecordTree);
}
// Add parent records to recordTree
var parent = currentRecord; // Initialize parent to current record
while (parent.getValue(parentField)) {
var parentSysId = parent.getValue(parentField);
parent = new GlideRecord(recordTable);
parent.get(parentSysId);
var parentRecordTree = this.createItemTree(parent, highlightedValueField);
parentRecordTree.children = [];
parentRecordTree.children.push(recordTree);
recordTree = parentRecordTree;
}
items.push(recordTree);
// Create expanded items JSON
var expandedItems = [
[]
];
var node = items;
while (node[0] && node[0].children) {
expandedItems.push(expandedItems[expandedItems.length - 1].concat(node[0].id));
node = node[0].children;
}
if (node[0].id == recordSysId) expandedItems.push(expandedItems[expandedItems.length - 1].concat(node[0].id));
return {
items: items,
expandedItems: expandedItems,
selectedItems: [expandedItems[expandedItems.length - 1]]
};
},
getRelatedRecordsLinks: function(queryTable, query, recordTable, referenceFieldName, maxCount, orderBy) {
var count = 0;
var recordLinks = [];
var recordSysIds = [];
var relatedRecords = new GlideRecord(queryTable);
relatedRecords.addEncodedQuery(query);
if (orderBy) relatedRecords.orderBy(orderBy);
relatedRecords.query();
while (relatedRecords.next()) {
if (count < maxCount)
recordLinks.push(this.getLinkJSON(recordTable, relatedRecords.getValue(referenceFieldName), relatedRecords[referenceFieldName].getDisplayValue()));
recordSysIds.push(relatedRecords.getValue(referenceFieldName));
count++;
}
return {
recordLinks: recordLinks,
recordSysIds: recordSysIds
};
},
getLinkJSON: function(table, sysId, label) {
return {
"label": label,
"value": {
"route": "record",
"fields": {
"table": table,
"sysId": sysId
}
},
"type": "route",
"opensWindow": false
};
},
getBrowseAllLinkJSON: function(table, sysIds, linkLabel, title) {
var fields = {
"table": table,
};
var params = {
"query": "sys_idIN" + sysIds.join(','),
"listTitle": title
};
var data = {
"type": "link",
"label": "",
"icon": "chevron-right-outline",
"link": {
"type": "route",
"label": linkLabel,
"value": {
"route": "list-view",
"fields": fields,
"params": params,
"title": title
},
"opensWindow": false,
}
};
return data;
},
validateNewButtonOnAssessmentInstanceRelatedList: function(tableName) {
var excludeNewButtonMap = {};
excludeNewButtonMap['sn_privacy_processing_activity'] = 1;
excludeNewButtonMap['sn_grc_profile'] = 1;
excludeNewButtonMap['vm_vdr_contact'] = 1;
excludeNewButtonMap['sn_risk_risk'] = 1;
excludeNewButtonMap['sn_compliance_control'] = 1;
excludeNewButtonMap['sn_risk_advanced_risk_identification'] = 1;
excludeNewButtonMap['sn_oper_res_self_attestation'] = 1;
excludeNewButtonMap['sn_oper_res_importance_impact_tolerance_assessment'] = 1;
if (tableName in excludeNewButtonMap) {
return false;
}
return true;
},
getLabelValueJSON: function(label, valueText, table, encodedQuery) {
var data = {
"label": label,
"value": {
"type": "text-link",
"label": valueText,
"href": "javascript:void(0)",
"table": table,
"encodedQuery": encodedQuery,
"listTitle": label
}
};
return data;
},
type: 'GRCWorkspaceUtilsBase'
};
Sys ID
259346985bb12010c6cf08e53381c70e