Name
sn_sow.SOWInvestigateUtils
Description
No description available
Script
var SOWInvestigateUtils = Class.create();
SOWInvestigateUtils.prototype = {
ATTRIBUTES_FOR_VISUALIZATION_HISTORY: {
"mem_percentage": true, // Memory utilization
"disk_percentage": true, // Disk utilization
"cpu_percentage": true, // CPU utilization
"uptime": false // Uptime
},
initialize: function(sourceTable, sourceRecordId, ci, metricFetchType, sourcePage) {
this.investigateConfig = new SOWInvestigateConfig();
var definitionIds = this.investigateConfig.getDefinitionIds(sourceTable);
this.SOURCE_TABLE = sourceTable;
this.SOURCE_RECORD_ID = sourceRecordId;
this.SOURCE_PAGE = sourcePage;
this.arrayUtil = new global.ArrayUtil();
this.RESULT = {
overview: {
"data": []
},
definitionGroupData: {
hideSection: true,
visualization: [],
tabular: [],
},
visualization: [],
tabular: [],
uiMessage: {},
ciStatus: {
status: true,
message: ""
}
};
this.DEFINITION_IDS = [];
this.DATA = {};
if (definitionIds) {
this.DEFINITION_IDS = definitionIds.split(",");
this.CI = ci;
this.DEFINITION_CONFIG = this.investigateConfig.DEFINITION_CONFIG;
this.UI_TYPES = this.investigateConfig.UI_TYPES;
this.metricFetchType = metricFetchType;
this.definitionGroupConfig = this.investigateConfig.getDefinitionGroupConfig();
}
},
fetchData: function() {
if (!this.CI)
return false;
var metricEngine = new sn_cimaf.CIMetricEngine();
var hasMetrics = false;
this._sourceGr = this._sourceGr || this._getSourceGr();
if (this._sourceGr) {
this.startDate = this._metricWindowStartDate(this._sourceGr);
this.endDate = this._metricWindowEndDate(this._sourceGr);
}
for (index in this.DEFINITION_IDS) {
if (this.metricFetchType == "initial")
this.DATA[this.DEFINITION_IDS[index]] = metricEngine.getLastMetric(this.CI, this.DEFINITION_IDS[index], this.startDate.getValue(), this.endDate.getValue());
else if (this.metricFetchType == "recent")
this.DATA[this.DEFINITION_IDS[index]] = metricEngine.getFirstMetric(this.CI, this.DEFINITION_IDS[index]);
if (this.DATA[this.DEFINITION_IDS[index]])
hasMetrics = true;
}
return hasMetrics;
},
_getMetricFetchWindowProp: function() {
return gs.getProperty("sn_sow.initial_metric_fetch_window", 30);
},
_metricWindowEndDate: function(sourceGr) {
var metricFetchWindow = this._getMetricFetchWindowProp();
var incidentCreatedOn = sourceGr.getValue("sys_created_on");
var endGdt = new GlideDateTime(incidentCreatedOn);
endGdt.add(metricFetchWindow * 60 * 1000);
return endGdt;
},
_metricWindowStartDate: function(sourceGr) {
var metricFetchWindow = this._getMetricFetchWindowProp();
var incidentCreatedOn = sourceGr.getValue("sys_created_on");
var startGdt = new GlideDateTime(incidentCreatedOn);
startGdt.add(metricFetchWindow * -1 * 60 * 1000);
return startGdt;
},
_getSourceGr: function() {
if (!this.SOURCE_TABLE)
return null;
var sourceGr = new GlideRecord(this.SOURCE_TABLE);
if (sourceGr.get(this.SOURCE_RECORD_ID))
return sourceGr;
return null;
},
evaluateEmptyStateForSelectedCI: function(primaryCIClassSupported) {
var metricEngine = new sn_cimaf.CIMetricEngine();
//empty state for primary CI
var result = {
emptyStates: metricEngine.EMPTY_STATES
};
var adapterSupport;
if (this.CI && this.metricFetchType == 'initial') {
result.primaryCI = this.CI;
adapterSupport = this.checkAdapterSupport(this.CI);
if (adapterSupport[this.CI]) {
result.metricFetchWindow = this._getMetricFetchWindowProp();
result.emptyState = metricEngine.EMPTY_STATES.NO_INITIAL_METRICS;
return result;
}
result.emptyState = adapterSupport.reason;
return result;
}
// empty state for CI selected
else if (this.CI && this.metricFetchType == 'recent') {
adapterSupport = this.checkAdapterSupport(this.CI);
if (!adapterSupport[this.CI]) {
result.emptyState = adapterSupport.reason;
return result;
}
var ciStatus = this.checkCIStatus(this.CI);
if (!ciStatus.status) {
result.emptyState = metricEngine.EMPTY_STATES.CI_OFFLINE;
result.offlineMessage = ciStatus.message;
return result;
}
result.emptyState = metricEngine.EMPTY_STATES.NO_RECENT_METRICS;
return result;
} else {
if (this._countAffectedCIs(this.SOURCE_RECORD_ID) == 0) {
result.emptyState = metricEngine.EMPTY_STATES.NO_CI_ASSOCIATED;
return result;
}
if (!this._getPrimaryCI().value || primaryCIClassSupported == false)
result.emptyState = metricEngine.EMPTY_STATES.NO_PRIMARY_CI;
if (!this.checkForCIClasses(this.SOURCE_RECORD_ID))
result.emptyState = metricEngine.EMPTY_STATES.NO_SUPPORTED_CI;
return result;
}
},
checkForCIClasses: function(parentSysId) {
var ga = new GlideAggregate('task_ci');
ga.addQuery('task', parentSysId);
ga.addEncodedQuery('ci_item.sys_class_nameINSTANCEOFcmdb_ci_computer');
ga.addAggregate('COUNT');
ga.query();
if (ga.next())
return ga.getAggregate('COUNT') > 0;
return false;
},
checkAdapterSupport: function(CISysId) {
var metricEngine = new sn_cimaf.CIMetricEngine();
var adapterApplicableResult = metricEngine.hasApplicableAdapter(CISysId, this.DEFINITION_IDS);
var result = {};
result[CISysId] = false;
for (metricDefId in adapterApplicableResult) {
if (adapterApplicableResult[metricDefId].adapterConfigGr) {
result[CISysId] = true;
break;
}
}
if (!result[CISysId]) {
for (metricDefId in adapterApplicableResult) {
if (!adapterApplicableResult[metricDefId].adapterConfigGr) {
result.reason = adapterApplicableResult[metricDefId].reason;
break;
}
}
}
return result;
},
checkCIStatus: function(CISysId) {
var metricEngine = new sn_cimaf.CIMetricEngine();
return metricEngine.getCIStatus(CISysId);
},
_getPrimaryCI: function() {
if (this.primaryCI) {
return this.primaryCI;
}
this._sourceGr = this._sourceGr || this._getSourceGr();
if (this._sourceGr) {
return {
value: this._sourceGr.getValue("cmdb_ci"),
displayValue: this._sourceGr.getDisplayValue("cmdb_ci")
};
}
return {};
},
_isClassSupported: function(ciSysId) {
var ciGr = new GlideRecord('cmdb_ci');
if (ciGr.get(ciSysId)) {
if (ciGr.sys_class_name == 'cmdb_ci_computer')
return true;
var table = new GlideTableHierarchy('cmdb_ci_computer');
var classes = table.getTableExtensions();
for (var index in classes) {
if (ciGr.sys_class_name == classes[index])
return true;
}
}
return false;
},
_getSelectedCI: function(parentSysId, ciSysId) {
var gr = new GlideRecord("task_ci");
gr.addQuery("ci_item", ciSysId);
gr.addQuery("task", parentSysId);
gr.setLimit(1);
gr.query();
if (gr.next()) {
return {
value: gr.getValue("ci_item"),
displayValue: gr.getDisplayValue("ci_item"),
};
}
return;
},
_countAffectedCIs: function(parentSysId) {
var ga = new GlideAggregate('task_ci');
ga.addQuery('task', parentSysId);
ga.addAggregate('COUNT');
ga.query();
if (ga.next())
return ga.getAggregate('COUNT');
return 0;
},
searchResultForCI: function(selectedCI, searchText, primaryCIClassSupported) {
var output = {
"options": [{
"label": gs.getMessage("Only laptops and servers can be investigated"),
"children": []
}],
"primaryCI": "",
"selectedCI": ""
};
var primaryCI = this._getPrimaryCI();
if (primaryCIClassSupported == undefined)
output["primaryCIClassSupported"] = this._isClassSupported(primaryCI.value);
else
output["primaryCIClassSupported"] = primaryCIClassSupported;
var gr = new GlideRecord("task_ci");
gr.addQuery('task', this.SOURCE_RECORD_ID);
if (searchText && searchText != '')
gr.addQuery("ci_item.nameLIKE" + searchText);
gr.addEncodedQuery('ci_item.sys_class_nameINSTANCEOFcmdb_ci_computer');
gr.orderBy('ci_item.name');
gr.setLimit(5);
gr.query();
while (gr.next()) {
var ci = gr.getValue('ci_item');
var isPrimaryCI = false;
if (output["primaryCIClassSupported"] && !output["primaryCI"] && ci == primaryCI.value) {
isPrimaryCI = true;
output["primaryCI"] = ci;
}
if (!output["selectedCI"] && ci == selectedCI)
output["selectedCI"] = ci;
output.options[0].children.push({
"primaryCI": isPrimaryCI,
"id": ci,
"label": isPrimaryCI ? gs.getMessage("{0} (Primary CI)", gr.getDisplayValue('ci_item')) : gr.getDisplayValue('ci_item'),
"disabled": false
});
}
if (selectedCI && !output['selectedCI'] && (primaryCI.value != selectedCI)) {
var CISelected = this._getSelectedCI(this.SOURCE_RECORD_ID, selectedCI);
if (CISelected) {
output.options[0].children.push({
"primaryCI": false,
"id": CISelected.value,
"label": CISelected.displayValue,
"disabled": false
});
output["selectedCI"] = CISelected.value;
}
} else if (primaryCI.value && !output["primaryCI"] && output["primaryCIClassSupported"]) {
output.options[0].children.push({
"primaryCI": true,
"id": primaryCI.value,
"label": gs.getMessage("{0} (Primary CI)", primaryCI.displayValue),
"disabled": false
});
output["primaryCI"] = primaryCI.value;
}
return output;
},
submitMetricFetchRequest: function() {
var metricEngine = new sn_cimaf.CIMetricEngine();
var definitionIds = this.DEFINITION_IDS.join();
if (definitionIds) {
var batchIdMap = metricEngine.requestMetrics(this.CI, definitionIds);
}
return batchIdMap;
},
buildDataForUI: function(checkCIStatus) {
for (var i = 0; i < this.DEFINITION_IDS.length; i++) {
var data = this.DATA[this.DEFINITION_IDS[i]];
this.transformData(this.DEFINITION_IDS[i], data);
}
this.RESULT.definitionGroupData.config = this.definitionGroupConfig;
this.setUIMessage(checkCIStatus);
return this.RESULT;
},
transformData: function(metricDefId, data) {
if (data && data.payload) {
switch (this.DEFINITION_CONFIG[metricDefId].UI_TYPE) {
case this.UI_TYPES.OVERVIEW:
this._formatDataForOverviewUI(metricDefId, data);
break;
case this.UI_TYPES.VISUALIZATION:
this._formatDataForVisualizationUI(metricDefId, data);
break;
case this.UI_TYPES.TABULAR:
this._formatDataForTabularUI(metricDefId, data, this.DATA);
break;
}
}
},
setUIMessage: function(checkCIStatus) {
if (this.metricFetchType == "initial") {
this._sourceGr = this._sourceGr || this._getSourceGr();
if (this._sourceGr) {
var table = this._sourceGr.getClassDisplayValue().toLowerCase();
var timeFormat = this.investigateConfig.getLoggedInUserTimeFormat();
var startTime = this.startDate.getLocalTime().getByFormat(timeFormat);
var endTime = this.endDate.getLocalTime().getByFormat(timeFormat);
var sourceRecordCreated = this._sourceGr.getDisplayValue("sys_created_on");
this.RESULT.uiMessage = {
showMessage: true,
header: gs.getMessage("Initial metrics"),
message: gs.getMessage("You're viewing metrics captured around {0} creation ({1}), between {2} - {3}.", [table, sourceRecordCreated, startTime, endTime]),
icon: "circle-info-outline"
};
}
} else if (checkCIStatus && this.metricFetchType == "recent") {
var metricEngine = new sn_cimaf.CIMetricEngine();
var ciStatus = metricEngine.getCIStatus(this.CI);
if (!ciStatus.status) {
this.RESULT.uiMessage = {
showMessage: true,
type: "critical",
header: "",
message: ciStatus.message,
icon: "circle-info-outline"
};
}
this.RESULT.ciStatus = ciStatus;
}
return;
},
isPartOfDefinitionGroupConfig: function(metricDefinitionId) {
return this.definitionGroupConfig && this.definitionGroupConfig.definition_ids.indexOf(metricDefinitionId) != -1;
},
_formatDataForOverviewUI: function(definitionId, metricData) {
this.RESULT.overview.fetchTime = metricData.timestamp.displayValue;
if (Object.keys(metricData).length === 0) {
return;
}
var data = this.buildDataForOverviewUI(definitionId, metricData);
this.RESULT.overview.data = this.arrayUtil.concat(this.RESULT.overview.data, data);
return;
},
buildDataForOverviewUI: function(definitionId, metricData) {
var data = [];
var definitionConfig = this.DEFINITION_CONFIG[definitionId];
Object.keys(definitionConfig.ATTRIBUTES).forEach(function(attr) {
var value = metricData.payload[attr];
if (value) {
data.push({
'label': this.DEFINITION_CONFIG[definitionId].ATTRIBUTES[attr],
'value': {
"type": "string",
"value": metricData.payload[attr]
}
});
}
}.bind(this));
return data;
},
_formatDataForVisualizationUI: function(definitionId, metricData) {
var definitionConfig = this.DEFINITION_CONFIG[definitionId];
var result = {
data: [],
definitionId: definitionId,
header: definitionConfig.HEADER
};
result.data = this.buildDataForVisualizationUI(definitionId, metricData);
if (result.data.length > 0) {
if (this.isPartOfDefinitionGroupConfig(definitionId)) {
this.RESULT.definitionGroupData.visualization.push(result);
this.RESULT.definitionGroupData.hideSection = false;
} else {
this.RESULT.visualization.push(result);
}
}
return;
},
buildDataForVisualizationUI: function(definitionId, metricData) {
var definitionConfig = this.DEFINITION_CONFIG[definitionId];
var calculatedAttr = definitionConfig["CALCULATED_FIELDS"];
var data = [];
Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
var getAttrValue = calculatedAttr[col];
var dataVal = getAttrValue && typeof getAttrValue === "function" ? getAttrValue(metricData.payload) : metricData.payload[col];
var header = definitionConfig.ATTRIBUTES[col];
var value = typeof dataVal == 'object' ? dataVal.value : dataVal;
if (value) {
data.push({
'header': header,
'value': value,
'threshold': typeof dataVal == 'object' ? dataVal.threshold : '',
'fetchTime': metricData.timestamp.displayValue
});
}
}.bind(this));
return data;
},
buildDataForScatterPlot: function(definitionId, metrics) {
var definitionConfig = this.DEFINITION_CONFIG[definitionId];
var calculatedAttr = definitionConfig["CALCULATED_FIELDS"];
var data = [];
var map = {};
for (var i = 0; i < metrics.data.length; i++) {
metricData = metrics.data[i];
var timeStamp = new GlideDateTime(metricData.timestamp.value).getNumericValue().toString();
Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
var getAttrValue = calculatedAttr[col];
var dataVal = getAttrValue && typeof getAttrValue === "function" ? getAttrValue(metricData.payload) : metricData.payload[col];
var header = definitionConfig.ATTRIBUTES[col];
var value = typeof dataVal == 'object' ? dataVal.value : dataVal;
if (value && this.ATTRIBUTES_FOR_VISUALIZATION_HISTORY[col]) {
if (map[header])
map[header].push({
"timestamp": timeStamp,
"value": Number(value.slice(0, -1))
});
else
map[header] = [{
"timestamp": timeStamp,
"value": Number(value.slice(0, -1))
}];
}
}.bind(this));
}
Object.keys(map).forEach(function(attribute) {
var formattedObject = {
"data": map[attribute],
"metadata": {
"series": [{
"label": attribute,
"id": "value",
"type": "value"
}],
"aggregate": {
"fieldType": "decimal"
},
"format": {
"unitFormat": "{0}%",
"frequency": "daily",
"precision": 0
}
}
};
data.push(formattedObject);
});
return data;
},
_formatDataForTabularUI: function(definitionId, metricData, completeMetricData) {
var definitionConfig = this.DEFINITION_CONFIG[definitionId];
var items = definitionConfig["ITEMS"];
if (!(Array.isArray(metricData.payload) && metricData.payload.length > 0)) {
return;
}
var remedialActionEngine = new sn_reacf.RemedialActionEngine();
var sourceGr = this._getSourceGr();
var isSourceGrActive = sourceGr && sourceGr.getValue("active") == "1";
for (var i = 0; i < items.length; i++) {
var result = {
data: {
columns: [],
rowData: []
},
definitionId: definitionId,
header: items[i].HEADER,
count: 0,
key: items[i]["KEY"],
action: [],
fetchTime: metricData.timestamp.displayValue
};
result.data = this.buildDataForTabularUI(items[i], metricData, completeMetricData);
var count = result.data.rowData.length;
if (count == 0) {
continue;
} else {
var getCount = items[i].hasOwnProperty("CALCULATED_FIELDS") && items[i]["CALCULATED_FIELDS"]["getCount"];
result.showEmptyState = false;
result.count = typeof getCount == 'function' ? getCount(metricData.payload) : count;
result.pagination = items[i].PAGINATION;
result.collapsible = items[i].COLLAPSIBLE;
var actions = items[i]["ACTIONS"];
if (isSourceGrActive) {
for (var j = 0; j < actions.length; j++) {
var remedialActionInternalName = actions[j]["internalName"];
if (remedialActionEngine.isApplicable(remedialActionInternalName, this.CI)) {
actions[j].isVisible = remedialActionEngine.isAuthorized(remedialActionInternalName);
result.action.push(actions[j]);
}
}
}
}
if (this.isPartOfDefinitionGroupConfig(definitionId)) {
this.RESULT.definitionGroupData.tabular.push(result);
this.RESULT.definitionGroupData.hideSection = false;
} else {
this.RESULT.tabular.push(result);
}
}
return;
},
buildDataForTabularUI: function(definitionConfig, metricData, completeMetricData) {
var data = {
columns: [],
rowData: []
};
var getRowData = definitionConfig.hasOwnProperty("CALCULATED_FIELDS") && definitionConfig["CALCULATED_FIELDS"]["rowData"];
var rowData = getRowData && typeof getRowData === "function" ? getRowData(metricData.payload, completeMetricData) : metricData.payload;
if (rowData.length > 0) {
Object.keys(definitionConfig.ATTRIBUTES).forEach(function(col) {
var hideColumn = true;
var isRowSelectable = this.SOURCE_PAGE == "investigate" ? (col == "selectable" && definitionConfig.ATTRIBUTES[col]) : false;
for (var i = 0; i < rowData.length; i++) {
if (!gs.nil(rowData[i][col]) || isRowSelectable) {
hideColumn = false;
break;
}
}
if (!hideColumn) {
if (isRowSelectable) {
data.columns.push({
"field": "row_selector",
"type": "row_selector",
"title": ""
});
} else {
data.columns.push({
"field": col,
"type": 'string',
"title": typeof definitionConfig.ATTRIBUTES[col] == "object" ? definitionConfig.ATTRIBUTES[col].label : definitionConfig.ATTRIBUTES[col]
});
}
}
}.bind(this));
}
for (var i = 0; i < rowData.length; i++) {
data.columns.forEach(function(col) {
var value = rowData[i][col.field];
var threshold = rowData[i].threshold;
if (threshold && threshold.columnName == col.field) {
rowData[i][col.field] = this.getCellValueWithThresholdIcon(value, threshold);
} else if (col.field == "row_selector") {
rowData[i][col.field] = {};
rowData[i][col.field]["clickable"] = true;
rowData[i][col.field]["value"] = "";
rowData[i][col.field]["displayValue"] = "";
rowData[i][col.field]["components"] = [{
"name": "now-checkbox",
"properties": {
"checked": false,
"readonly": false,
"title" : gs.getMessage("Select this record"),
"configAria" : {
"aria-label" : gs.getMessage("Select this record")
},
}
}];
rowData[i][col.field]["payload"] = {
"uniqueId": gs.generateGUID()
};
} else {
rowData[i][col.field] = {};
rowData[i][col.field]["clickable"] = false;
rowData[i][col.field]["value"] = !gs.nil(value) ? value : "";
rowData[i][col.field]["displayValue"] = !gs.nil(value) ? value : gs.getMessage("(empty)");
rowData[i][col.field]["components"] = [{
"name": "now-stylized-text",
"properties": {
"css": "* {\n font-size: 16px; min-width: 100%; max-width: 100%;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n display: inline-block;\n vertical-align: middle;\n}",
"text": value,
"tag": "div",
"style": {
"padding-left": "10px",
"white-space": "nowrap",
"overflow": "hidden",
"text-overflow": "ellipsis"
}
}
}];
}
}.bind(this));
}
data.rowData = rowData;
return data;
},
fetchDataForSystemOverview: function(ci) {
var result = [];
var fieldNames = new SOWInvestigateConfig().getSystemOverviewAttributes();
var gr = new GlideRecord("cmdb_ci_computer");
if (gr.get(ci)) {
for (index in fieldNames) {
var value = gr[fieldNames[index]].getDisplayValue();
if (value) {
var labelValuePair = {
"label": gr[fieldNames[index]].getLabel(),
"value": {
"value": value,
"type": "string"
}
};
result.push(labelValuePair);
}
}
}
//Make 1st element as link that would open CI record
if (result.length > 0) {
result[0].value.type = "text-link";
result[0].value.href = "javascript:void(0)";
result[0].value.label = result[0].value.value;
}
return result;
},
getCellValueWithThresholdIcon: function(value, threshold) {
var result = {
"displayValue": value,
"value": value,
"clickable": false,
"components": []
};
if (threshold.critical) {
var criticalIconComponent = {
"name": "now-icon",
"properties": {
"icon": "circle-exclamation-fill",
"size": "sm",
"style": {
"width": "auto",
"color": "rgb(var(--now-color_alert--critical-4))",
"padding-left": "4px",
"padding-right": "4px"
}
}
};
result.components.push(criticalIconComponent);
}
result.components.push({
"name": "now-stylized-text",
"properties": {
"css": "* {\n font-size: 16px; max-width: 100px;\n text-overflow: ellipsis;\n overflow: hidden;\n}",
"text": value,
"tag": "div",
"style": threshold.critical ? null : {
"padding-left": "20px"
}
}
});
return result;
},
systemInfoDisplayCheck: function(ci) {
var msinfo32_metric_definition = this.investigateConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_MSINFO32;
var dsregcmd_metric_definition = this.investigateConfig.DEFINITION_CONFIG_MAP.SYSTEM_INFO_DSREGCMD;
var metricEngine = new sn_cimaf.CIMetricEngine();
//check if adapter is present for one of the metrics
if (metricEngine.getAdapter(msinfo32_metric_definition, ci)) {
return true;
}
if (metricEngine.getAdapter(dsregcmd_metric_definition, ci)) {
return true;
}
return false;
},
getRemedialActionExecutionData: function(table, record, maxLimit) {
var remedialData = [];
var gr = new GlideRecord("sn_reacf_remedial_action_execution");
gr.addQuery("parent_record_table", table);
gr.addQuery("parent_record_id", record);
gr.addQuery("origin", this.investigateConfig.SERVICE_OPERATIONS_WORKSPACE_ORIGIN_RECORD);
gr.orderByDesc("sys_created_on");
gr.setLimit(maxLimit);
gr.query();
while (gr.next()) {
remedialData.push({
"sys_id": {
"displayValue": gr.getDisplayValue("sys_id"),
"value": gr.getValue("sys_id")
},
"remedial_action": {
"displayValue": gr.getDisplayValue("remedial_action"),
"value": gr.getValue("remedial_action")
},
"sys_created_on": {
"displayValue": gr.getDisplayValue("sys_created_on"),
"value": gr.getValue("sys_created_on")
},
"state": {
"displayValue": gr.getDisplayValue("state"),
"value": gr.getValue("state")
},
"target_record_id": {
"displayValue": gr.getDisplayValue("target_record_id"),
"value": gr.getValue("target_record_id")
},
});
}
var remedialDataObj = {
"data": remedialData
};
return remedialDataObj;
},
type: 'SOWInvestigateUtils'
};
Sys ID
8effd540531301103eacddeeff7b121c