Name
sn_risk_advanced.GRCRiskEventBase
Description
No description available
Script
var GRCRiskEventBase = Class.create();
GRCRiskEventBase.prototype = {
initialize: function() {},
getUserProfileFilter: function(showMine, profiles) {
return this._getUserProfileFilter(showMine, profiles);
},
eventHasOpenIssues: function(eventID) {
return this._eventHasOpenIssues(eventID);
},
getCurrencyCode: function() {
return this._getCurrencyCode();
},
getCurrencyCodesArray: function() {
return this._getCurrencyCodesArray();
},
eventHasOpenTasks: function(eventID) {
return this._eventHasOpenTasks(eventID);
},
getEventRisks: function(eventID) {
return this._getEventRisks(eventID);
},
getEventProfiles: function(eventID) {
return this._getEventProfiles(eventID);
},
removeEventProfileRisks: function(eventID, profileID) {
return this._removeEventProfileRisks(eventID, profileID);
},
getEventControls: function(eventID) {
return this._getEventControls(eventID);
},
removeEventProfileControls: function(eventID, profileID) {
return this._removeEventProfileControls(eventID, profileID);
},
setEventSummaryLoss: function(event) {
this._setEventSummaryLoss(event);
},
updateEventWhenImpactChanges: function(eventID) {
this._updateEventWhenImpactChanges(eventID);
},
getExchangeValue: function(value, fromCurrency, toCurrency, date) {
return this._getExchangeValue(value, fromCurrency, toCurrency, date);
},
getSingleCurrencyCode: function() {
return this._getSingleCurrencyCode();
},
eventHasFinancialImpacts: function(eventID) {
return this._eventHasFinancialImpacts(eventID);
},
removeFinancialImpacts: function(eventID) {
return this._removeFinancialImpacts(eventID);
},
canEventClose: function(eventID) {
return this._canEventClose(eventID);
},
getContributingEvents: function(eventID) {
return this._getContributingEvents(eventID);
},
calculateGainEvent: function(risk_event) {
return this._calculateGainEvent(risk_event);
},
getMyRiskEvents: function() {
return this._getMyRiskEvents();
},
clearBaselReportsTable: function() {
this._clearBaselReportsTable();
},
updateBaselReportsTable: function() {
this._updateBaselReportsTable();
},
addRiskControlToRiskEvent: function(riskId, riskEventId) {
this._addRiskControlToRiskEvent(riskId, riskEventId);
},
deleteRiskControlFromRiskEvent: function(riskId, riskEventId) {
this._deleteRiskControlFromRiskEvent(riskId, riskEventId);
},
getEntitiesQuery: function(riskEventId) {
return this._getEntitiesQuery(riskEventId);
},
getCurrencyCodesSymbolArray: function() {
return this._getCurrencyCodesSymbolArray();
},
getCurrencySymbol: function(currencyCode) {
return this._getCurrencySymbol(currencyCode);
},
_getEntitiesQuery: function(riskEventId) {
var gr = new GlideRecord('sn_risk_advanced_m2m_event_profile');
gr.addQuery('event', riskEventId);
gr.query();
var query = "active=true^";
while (gr.next()) {
query = query + "profile=" + gr.getValue('profile') + "^OR";
}
query = query.substring(0, query.length - 3);
return query;
},
_addRiskControlToRiskEvent: function(riskId, riskEventId) {
var riskControlm2m = new GlideRecord('sn_risk_m2m_risk_control');
riskControlm2m.addQuery('sn_risk_risk', riskId);
riskControlm2m.query();
var eventControlm2m = new GlideRecord('sn_risk_advanced_m2m_event_control');
while (riskControlm2m.next()) {
eventControlm2m.initialize();
eventControlm2m.setValue('risk_event', riskEventId);
eventControlm2m.setValue('control', riskControlm2m.getValue('sn_compliance_control'));
eventControlm2m.insert();
}
},
_deleteRiskControlFromRiskEvent: function(riskId, riskEventId) {
var controls = this._getControlsForRisk(riskId);
var eventControlm2m = new GlideRecord('sn_risk_advanced_m2m_event_control');
eventControlm2m.initialize();
eventControlm2m.addQuery('risk_event', riskEventId);
eventControlm2m.addQuery('control', 'IN', controls);
eventControlm2m.deleteMultiple();
},
_getControlsForRisk: function(riskId) {
var riskControlm2m = new GlideRecord('sn_risk_m2m_risk_control');
riskControlm2m.addQuery('sn_risk_risk', riskId);
riskControlm2m.query();
var controls = [];
while (riskControlm2m.next()) {
controls.push(riskControlm2m.getValue('sn_compliance_control'));
}
return controls;
},
_getMyRiskEvents: function() {
var gr = new GlideRecordSecure('sn_risk_advanced_event');
gr.addQuery('opened_by', gs.getUserID());
gr.query();
var pas = [];
while (gr.next()) {
var pa = {};
pa.sys_id = gr.sys_id + '';
pa.number = gr.number + '';
pa.assigned_to = gr.getDisplayValue('opened_by');
pa.name = gr.name + '';
pa.discovered_on = gr.discovered_on + '';
pa.state = gr.getDisplayValue('state');
pas.push(pa);
}
return pas;
},
_calculateGainEvent: function(risk_event) {
if (risk_event.sub_type == '2') {
risk_event.gain_event = risk_event.expected_loss < 0 || risk_event.potential_loss < 0 ? true : false;
} else if (risk_event.sub_type == '1') {
risk_event.gain_event = risk_event.net_amount < 0 ? true : false;
}
},
_canEventClose: function(eventID) {
return !(this._eventHasOpenIssues(eventID) || this._eventHasOpenTasks(eventID));
},
_getContributingEvents: function(eventID) {
return 'sn_risk_advanced_event_impact_list.do?sysparm_query=risk_event=' + eventID;
},
checkIfRapidRecoveryFlagShouldBeChecked: function(eventEntry, noOfRapidRecoveryDaysProperty) {
this._checkIfRapidRecoveryFlagShouldBeChecked(eventEntry, noOfRapidRecoveryDaysProperty);
},
updateRapidRecoveryFlags: function(riskEvents, propertyValue) {
this._updateRapidRecoveryFlags(riskEvents, propertyValue);
},
updateDownstreamBusinessLineValues: function(currentLevelProfiles, entityBusinessLine) {
this._updateDownstreamBusinessLineValues(currentLevelProfiles, entityBusinessLine);
},
_removeFinancialImpacts: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_event_impact');
gr.addQuery('risk_event', eventID);
gr.addQuery('impact_type', '!=', '4');
gr.query();
var removed = gr.getRowCount();
gr.deleteMultiple();
return removed;
},
_eventHasFinancialImpacts: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_event_impact');
gr.addQuery('risk_event', eventID);
gr.addQuery('impact_type', '!=', '4');
gr.query();
return gr.getRowCount();
},
_getSingleCurrencyCode: function() {
return gs.getProperty('glide.i18n.single_currency.code', 'USD');
},
_getCurrencyCodesArray: function() {
if (gs.getProperty('glide.i18n.single_currency').toString() == "true") {
var singleCurrencyCode = (gs.getProperty('glide.i18n.single_currency.code')) + '';
if (singleCurrencyCode != '') {
return singleCurrencyCode;
}
}
var sessionCurrency = new GlideRecord('sn_risk_advanced_event');
sessionCurrency.initialize();
var sessionCurrencyCode = sessionCurrency.expected_loss.getSessionCurrencyCode().toString();
var codes = [];
if (sessionCurrencyCode != '') {
codes.push(sessionCurrencyCode);
}
var currencyTypes = new GlideRecord('fx_currency');
currencyTypes.addActiveQuery();
currencyTypes.addQuery('code', '!=', sessionCurrencyCode);
currencyTypes.query();
while (currencyTypes.next()) {
codes.push(currencyTypes.getValue('code').toString());
}
return codes;
},
_getCurrencyCodesSymbolArray: function() {
var currencies = [];
var currency = {};
if (gs.getProperty('glide.i18n.single_currency').toString() == "true") {
var singleCurrencyCode = (gs.getProperty('glide.i18n.single_currency.code')) + '';
if (singleCurrencyCode != '') {
currency.code = singleCurrencyCode;
currency.symbol = this._getCurrencySymbol(singleCurrencyCode);
currencies.push(currency);
return currencies;
}
}
var sessionCurrency = new GlideRecord('sn_risk_advanced_event');
sessionCurrency.initialize();
var sessionCurrencyCode = sessionCurrency.expected_loss.getSessionCurrencyCode().toString();
var codes = [];
if (sessionCurrencyCode != '') {
currency = {};
currency.code = sessionCurrencyCode;
currency.symbol = this._getCurrencySymbol(sessionCurrencyCode);
currencies.push(currency);
}
var currencyTypes = new GlideRecord('fx_currency');
currencyTypes.addActiveQuery();
currencyTypes.addQuery('code', '!=', sessionCurrencyCode);
currencyTypes.query();
while (currencyTypes.next()) {
currency = {};
currency.code = currencyTypes.getValue('code');
currency.symbol = currencyTypes.getValue('symbol');
currencies.push(currency);
}
return currencies;
},
_getCurrencySymbol: function(currencyCode) {
var currencyTypes = new GlideRecord('fx_currency');
currencyTypes.addQuery('code', currencyCode);
currencyTypes.query();
if (currencyTypes.next())
return currencyTypes.getValue('symbol');
return '';
},
_getCurrencyCode: function() {
var codes = this._getCurrencyCodesArray();
return codes.toString();
},
_getCurrencyRatesOnDate: function(currency, date) {
var dayNum = new GlideDateTime().getNumericValue();
if (date)
dayNum = new GlideDateTime(date).getNumericValue();
var rate = 0;
var currentDiff = Number.MAX_VALUE;
var gr = new GlideRecord('fx_rate');
gr.addQuery('currency', currency);
gr.orderByDesc('sys_created_on');
gr.query();
while (gr.next()) {
var dateNum = new GlideDateTime(gr.getValue('sys_created_on')).getNumericValue();
var diff = Math.abs(dateNum - dayNum);
if (diff < currentDiff) {
currentDiff = diff;
rate = parseFloat(gr.getValue('rate'));
} else
break;
}
return rate;
},
_updateEventWhenImpactChanges: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_event');
gr.get(eventID);
// reset existing financial information
var toCurrency = this._getSingleCurrencyCode();
if (gr.isValidRecord()) {
gr.setValue('direct_amount', toCurrency + ";" + 0);
gr.setValue('indirect_amount', toCurrency + ";" + 0);
gr.setValue('additional_cost', toCurrency + ";" + 0);
gr.setValue('gross_amount', toCurrency + ";" + 0);
gr.setValue('recovered_amount', toCurrency + ";" + 0);
gr.setValue('rapid_recovery_amount', toCurrency + ";" + 0);
gr.setValue('net_amount', toCurrency + ";" + 0);
}
this._setEventSummaryLoss(gr);
gr.update();
},
_setEventSummaryLoss: function(event) {
var toCurrency = this._getSingleCurrencyCode();
var direct_amount = 0;
var indirect_amount = 0;
var additional_cost = 0;
var recovered_amount = 0;
var rapid_recovery_amount = 0;
var non_financial_impact = 0;
var hasFinancialImpact = false;
var gr = new GlideRecord('sn_risk_advanced_event_impact');
gr.addQuery('risk_event', event.getUniqueValue());
gr.query();
while (gr.next()) {
var amount = 0;
if (gr.impact_type == '4') { //non-financial impact
non_financial_impact = Math.max(non_financial_impact, gr.impact + '');
} else {
hasFinancialImpact = true;
var date = gr.getValue('impacted_on');
var fromCurrency = gr.amount.getCurrencyCode();
var fromCurrencyValue = gr.amount.getCurrencyValue();
var fromRate = this._getCurrencyRatesOnDate(fromCurrency, date);
var toRate = this._getCurrencyRatesOnDate(toCurrency, date);
if (!fromRate || !toRate) {
gs.addErrorMessage(gs.getMessage('No exchange rate error. Check if your system is set to load exchange rate.'));
return;
}
amount = fromCurrencyValue / fromRate * toRate;
if (gr.impact_type == '1') { //direct/indirect amount
if (gr.category == '1')
direct_amount += amount;
else if (gr.category == '2')
indirect_amount += amount;
} else if (gr.impact_type == '2') { //recovered, rapid recovered
recovered_amount += amount;
if (gr.rapid_recovery)
rapid_recovery_amount += amount;
} else if (gr.impact_type == '3') { //additional cost
additional_cost += amount;
}
}
}
if (event.event_type == '1') { //Financial Loss
var gross_amount = direct_amount + indirect_amount + additional_cost;
var net_amount = gross_amount - recovered_amount;
event.setValue('direct_amount', toCurrency + ";" + direct_amount);
event.setValue('indirect_amount', toCurrency + ";" + indirect_amount);
event.setValue('additional_cost', toCurrency + ";" + additional_cost);
event.setValue('gross_amount', toCurrency + ";" + gross_amount);
event.setValue('recovered_amount', toCurrency + ";" + recovered_amount);
event.setValue('rapid_recovery_amount', toCurrency + ";" + rapid_recovery_amount);
event.setValue('net_amount', toCurrency + ";" + net_amount);
}
//Non-financial loss
if (non_financial_impact >= 1)
event.setValue('non_financial_impact', non_financial_impact + '');
else
event.setValue('non_financial_impact', '');
},
_removeEventProfileControls: function(eventID, profileID) {
var gr = new GlideRecord('sn_risk_advanced_m2m_event_control');
gr.addQuery('risk_event', eventID);
gr.addQuery('control.profile', profileID);
gr.deleteMultiple();
},
_getEventControls: function(eventID) {
var profiles = this._getEventProfiles(eventID);
var gr = new GlideRecord('sn_compliance_control');
gr.addEncodedQuery('stateNOT INdraft,retired^profile.sys_idIN' + profiles.join(','));
gr.addActiveQuery();
gr.query();
var controls = [];
while (gr.next())
controls.push(gr.number + '');
return controls;
},
_removeEventProfileRisks: function(eventID, profileID) {
var gr = new GlideRecord('sn_risk_advanced_m2m_event_risk');
gr.addQuery('risk_event', eventID);
gr.addQuery('risk.profile', profileID);
gr.deleteMultiple();
},
showIssueNewButton: function(parent) {
var parentTable = parent.getTableName();
return (parentTable != 'sn_risk_advanced_event') || ((gs.hasRole('sn_risk.manager') && parentTable == 'sn_risk_advanced_event') && parent.state == "2");
},
_getEventProfiles: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_m2m_event_profile');
gr.addQuery('event', eventID);
gr.query();
var profiles = [];
while (gr.next())
profiles.push(gr.profile + '');
return profiles;
},
_getEventRisks: function(eventID) {
var profiles = this._getEventProfiles(eventID);
var gr = new GlideRecord('sn_risk_risk');
gr.addEncodedQuery('profile.sys_idIN' + profiles.join(','));
gr.addActiveQuery();
gr.query();
var risks = [];
while (gr.next())
risks.push(gr.number + '');
return risks;
},
_eventHasOpenIssues: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_m2m_issue_risk_event');
gr.addQuery('risk_event', eventID);
gr.addQuery('sn_grc_issue.active', true);
gr.setLimit(1);
gr.query();
return gr.hasNext();
},
_eventHasOpenTasks: function(eventID) {
var gr = new GlideRecord('sn_risk_advanced_mitigation_task');
gr.addQuery('risk_event', eventID);
gr.addActiveQuery();
gr.setLimit(1);
gr.query();
return gr.hasNext();
},
_getUserProfileFilter: function(showMine, profiles) {
var query = "active=true";
if (showMine === true || showMine == 'true')
query += "^owned_byDYNAMIC90d1921e5f510100a9ad2572f2b477fe";
if (profiles)
query += "^sys_idNOT IN" + profiles;
return query + "^EQ";
},
getRelatedORXEvents: function(item) {
return this._getRelatedORXEvents(item);
},
_getRelatedORXEvents: function(item) {
var table, column;
if (item.getTableName() == 'sn_risk_risk') {
table = 'sn_risk_advanced_m2m_orx_event_risk_statement';
column = 'sn_risk_definition';
} else {
table = 'sn_risk_advanced_m2m_orx_event_control_objective';
column = 'sn_compliance_policy_statement';
}
var gr = new GlideRecord(table);
gr.addQuery(column, item.content + '');
gr.query();
var sysIds = [];
while (gr.next()) {
sysIds.push(gr.event + '');
}
return sysIds;
},
needRecalculation: function(current) {
return this._needRecalculation(current);
},
_needRecalculation: function(current) {
return ((current.operation() == "update" && current.impacted_on.changes()) || current.operation() == "insert" || (current.operation() == "delete" && current.impacted_on == current.risk_event.first_recognized_on));
},
_checkIfRapidRecoveryFlagShouldBeChecked: function(eventEntry, noOfRapidRecoveryDaysProperty) {
if (eventEntry.impact_type == '2') {
var discoveredDate = new GlideDateTime(eventEntry.risk_event.discovered_on);
var RecoveredDate = new GlideDateTime(eventEntry.impacted_on);
var diff = GlideDateTime.subtract(discoveredDate, RecoveredDate);
var durationInMilliSeconds = diff.getNumericValue();
var daysTookForRecovery = durationInMilliSeconds / (1000 * 3600 * 24);
if (daysTookForRecovery <= noOfRapidRecoveryDaysProperty) {
eventEntry.setValue('rapid_recovery', true);
} else {
eventEntry.setValue('rapid_recovery', false);
}
} else {
eventEntry.setValue('rapid_recovery', false);
}
},
_updateRapidRecoveryFlags: function(riskEvents, propertyValue) {
var riskEventEntries = new GlideRecord('sn_risk_advanced_event_impact');
if (riskEvents != null) {
riskEventEntries.addQuery('risk_event', riskEvents.getUniqueValue());
}
riskEventEntries.addQuery('impact_type', '2');
riskEventEntries.query();
while (riskEventEntries.next()) {
this.checkIfRapidRecoveryFlagShouldBeChecked(riskEventEntries, propertyValue);
riskEventEntries.update();
}
},
isRiskEventIntegrationConfigured: function(current) {
var riskEventConfig = new GlideRecord('sn_risk_advanced_risk_event_configuration');
riskEventConfig.addActiveQuery();
riskEventConfig.addQuery('source_table', current.getTableName());
riskEventConfig.query();
if (!riskEventConfig.hasNext()) {
return false;
}
riskEventConfig.next();
var mode = riskEventConfig.getValue('u_mode');
if(mode == 'Simple') {
var role = riskEventConfig.getValue('role_condition');
if(role && !gs.hasRole(role)) {
return false;
}
var condition = riskEventConfig.getValue('condition');
if(condition && !GlideFilter.checkRecord( current , condition)) {
return false;
}
return true;
} else if(mode == 'Advanced') {
var evaluator = new GlideScopedEvaluator();
evaluator.putVariable('result', false);
evaluator.evaluateScript(riskEventConfig, 'u_script');
return evaluator.getVariable('result');
}
return false;
},
retrieveRiskEventInfo: function(upStreamApplicationRecord) {
return this._retrieveRiskEventInfo(upStreamApplicationRecord);
},
_retrieveRiskEventInfo: function(upStreamApplicationRecord) {
var riskEventInfo = {};
var riskEventConfig = new GlideRecord('sn_risk_advanced_risk_event_configuration');
riskEventConfig.addActiveQuery();
riskEventConfig.addQuery('source_table', upStreamApplicationRecord.getTableName());
riskEventConfig.query();
if (riskEventConfig.next()) {
this._setEntityIdFromRiskEventConfig(riskEventConfig, riskEventInfo, upStreamApplicationRecord);
if (riskEventInfo.errorMessage) {
return riskEventInfo;
}
riskEventInfo.date_of_discovery = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'date_of_discovery');
riskEventInfo.name = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'name');
riskEventInfo.description = this._getDisplayValue(upStreamApplicationRecord, riskEventConfig, 'description');
riskEventInfo.event_type = this._getValue(upStreamApplicationRecord, riskEventConfig, 'event_type');
riskEventInfo.eventTypeChoices = this.getEventTypeChoices();
riskEventInfo.currencies = this._getCurrencyCodesSymbolArray();
if (riskEventInfo.event_type == '1') {
this._setExpectedLossDataFromRiskEventConfig(riskEventConfig, riskEventInfo, upStreamApplicationRecord);
} else {
riskEventInfo.non_financial_impact = this._getValue(upStreamApplicationRecord, riskEventConfig, 'non_financial_impact');
}
riskEventInfo.event_subtype = riskEventConfig.getValue('event_subtype');
} else {
riskEventInfo.errorMessage = gs.getMessage('Risk Event Configuration is missing/inactive for {0} table', upStreamApplicationRecord.getTableName());
riskEventInfo.errorType = 'config_error';
}
return riskEventInfo;
},
getEventTypeChoices: function() {
var sysChoice = new GlideRecord("sys_choice");
sysChoice.addQuery("name", "sn_risk_advanced_risk_event_configuration"); // the name of your table
sysChoice.addQuery("element", "default_event_type"); // the name of the field
sysChoice.addQuery("language", "en"); // language of labels, which you need
sysChoice.orderBy("sequence");
sysChoice.query();
var table, element, label;
var eventTypeChoices = [];
while (sysChoice.next()) {
var eventTypeChoice = {};
eventTypeChoice.value = sysChoice.value.toString();
eventTypeChoice.label = sysChoice.label.toString();
eventTypeChoices.push(eventTypeChoice);
}
return eventTypeChoices;
},
_setEntityIdFromRiskEventConfig: function(riskEventConfig, riskEventInfo, upStreamApplicationRecord) {
var entityName;
var entityId;
if (riskEventConfig.getValue('source_of_entity') == 1) {
var entityMappingColumn = riskEventConfig.getValue('entity');
var cmdb_ci_id = upStreamApplicationRecord.getValue(entityMappingColumn);
if (!cmdb_ci_id) {
riskEventInfo.errorMessage = gs.getMessage("To create a risk event, the {0} column must have a value.", upStreamApplicationRecord.getElement(entityMappingColumn).getLabel());
riskEventInfo.errorType = 'config_error';
return;
}
var entityMappingElement = upStreamApplicationRecord.getElement(entityMappingColumn);
if (entityMappingElement.getReferenceTable() == 'sn_grc_profile') {
entityId = cmdb_ci_id;
entityName = this._getEntityName(entityMappingElement);
} else {
var entityGr = new GlideRecord('sn_grc_profile');
entityGr.addQuery('applies_to', cmdb_ci_id);
entityGr.query();
entityName = entityMappingElement.getDisplayValue();
if (!entityGr.next()) {
riskEventInfo.errorMessage = new sn_grc.GRCUtils().getMessage('entity_missing').replace('{0}',entityName);
riskEventInfo.errorType = 'missing_field';
return;
}
entityId = entityGr.getUniqueValue();
}
} else {
entityId = riskEventConfig.getValue('default_entity');
entityName = this._getEntityName(riskEventConfig.default_entity);
}
if (!this._isEntityActive(entityId)) {
riskEventInfo.errorMessage = new sn_grc.GRCUtils().getMessage('entity_inactive').replace('{0}',entityName);
riskEventInfo.errorType = 'missing_field';
return;
}
riskEventInfo.entityId = entityId;
riskEventInfo.entity_name = entityName;
},
_isEntityActive: function(entityId) {
var entityGr = new GlideRecord('sn_grc_profile');
entityGr.get(entityId);
return entityGr.getValue('active') == 1;
},
_getEntityName: function(entityElement) {
var entityName;
if (entityElement.applies_to) {
entityName = entityElement.applies_to.getDisplayValue();
} else {
entityName = entityElement.getDisplayValue();
}
return entityName;
},
_setExpectedLossDataFromRiskEventConfig: function(riskEventConfig, riskEventInfo, upStreamApplicationRecord) {
var value = riskEventConfig.getValue('source_of_expected_loss') == 1 ? upStreamApplicationRecord.getElement(riskEventConfig.getValue('expected_loss')) : riskEventConfig.getElement('default_expected_loss');
riskEventInfo.expected_loss = value.getSessionDisplayValue();
riskEventInfo.currency_code = value.getSessionCurrencyCode();
riskEventInfo.currency_value = value.getSessionValue();
},
createRiskEvent: function(riskEventInfo) {
return this._createRiskEvent(riskEventInfo);
},
_createRiskEvent: function(riskEventInfo) {
var riskEvent = new GlideRecord('sn_risk_advanced_event');
riskEvent.setValue('name', riskEventInfo.name);
riskEvent.setValue('primary_profile', riskEventInfo.entityId);
riskEvent.setValue('description', riskEventInfo.description);
riskEvent.setValue('event_type', riskEventInfo.eventType);
riskEvent.discovered_on.setDisplayValue(riskEventInfo.discoveredOn);
riskEvent.setValue('source_record', riskEventInfo.upStreamSysId);
riskEvent.setValue('source_record_table', riskEventInfo.upStreamTableName);
if (riskEventInfo.eventType == '1') {
riskEvent.expected_loss.setDisplayValue(riskEventInfo.expectedLoss);
} else {
riskEvent.setValue('non_financial_impact', riskEventInfo.nonFinancialImpact);
}
riskEvent.setValue('sub_type', riskEventInfo.eventSubtype);
riskEvent.comments = gs.getMessage("This record was automatically created from the {0}, refer to source application record details related list for further information", riskEventInfo.upStreamTableName);
var riskEventId = riskEvent.insert();
var result = {};
if (riskEventId) {
var url = '/sn_risk_advanced_event.do?sys_id=' + riskEventId;
var link = ' <a target="_blank" href="' + url + '">' + riskEvent.number + '</a>';
result.infoMessage = gs.getMessage('Risk event is successfully created for {0} {1}', [riskEventInfo.entityName, link]);
} else {
result.errorMessage = gs.getMessage('Risk event creation failed for {0}. Please contact your administrator to proceed.', riskEventInfo.entityName);
}
return result;
},
_getDisplayValue: function(upStreamApplicationRecord, riskEventConfig, column) {
return riskEventConfig.getValue('source_of_' + column) == 1 ? upStreamApplicationRecord[riskEventConfig.getValue(column)].getDisplayValue() : riskEventConfig['default_' + column].getDisplayValue();
},
_getValue: function(upStreamApplicationRecord, riskEventConfig, column) {
return riskEventConfig.getValue('source_of_' + column) == 1 ? upStreamApplicationRecord.getValue(riskEventConfig.getValue(column)) : riskEventConfig.getValue('default_' + column);
},
_updateDownstreamBusinessLineValues: function(currentLevelProfiles, entityBusinessLine) {
var downstreamEntities = new GlideRecord('sn_grc_m2m_profile_profile');
downstreamEntities.addQuery('upstream_profile', "IN", currentLevelProfiles);
downstreamEntities.query();
var nextLevelProfiles = [];
if (!downstreamEntities.hasNext())
return;
while (downstreamEntities.next()) {
var profile = downstreamEntities.getValue('downstream_profile');
nextLevelProfiles.push(profile);
}
var gr = new GlideRecord('sn_grc_profile');
gr.addQuery('sys_id', 'IN', nextLevelProfiles);
gr.query();
gr.setValue('sn_risk_advanced_basel_business_line', entityBusinessLine);
gr.updateMultiple();
this.updateDownstreamBusinessLineValues(nextLevelProfiles, entityBusinessLine);
},
_clearBaselReportsTable: function() {
var baselRootTable = new GlideRecord('sn_risk_advanced_basel_reports');
baselRootTable.query();
baselRootTable.deleteMultiple();
},
_updateBaselReportsTable: function() {
var riskEvents = new GlideRecord('sn_risk_advanced_event');
riskEvents.addEncodedQuery('sys_created_on>=javascript:gs.beginningOfLast12Months()');
riskEvents.addQuery('state', '!=', 4);
riskEvents.addNotNullQuery('primary_profile.sn_risk_advanced_basel_business_line');
riskEvents.query();
while (riskEvents.next()) {
var businessLine = riskEvents.primary_profile.sn_risk_advanced_basel_business_line.root;
var m2m = new GlideRecord('sn_risk_advanced_m2m_event_risk');
m2m.addQuery('risk_event', riskEvents.getUniqueValue());
m2m.addNotNullQuery('risk.statement.basel_category');
m2m.query();
while (m2m.next()) {
var category = m2m.risk.statement.basel_category.root;
var baselRootTable = new GlideRecord('sn_risk_advanced_basel_reports');
baselRootTable.initialize();
baselRootTable.risk_event = riskEvents.getUniqueValue();
baselRootTable.business_line = businessLine;
baselRootTable.category = category;
baselRootTable.insert();
}
}
},
_getClosedStates: function() {
return "3";
},
_getReferenceCurrencyCode: function() {
var gr = new GlideRecord("sn_risk_advanced_event");
gr.initialize();
return gr.gross_amount.getReferenceCurrencyCode();
},
_getReportingPeriodStart: function() {
var yrsProperty = gs.getProperty('sn_risk_advanced.number_of_years_report_data', 2);
var g = new GlideDateTime();
g.addYearsUTC(-1 * yrsProperty);
return g;
},
_createRiskReportingRecord: function(category, state, grossLoss, netLoss, recovery, noOfRiskEvents) {
var currencyCode = this._getReferenceCurrencyCode();
var reportData = new GlideRecord('sn_risk_advanced_risk_event_reporting');
reportData.addQuery('category', category);
reportData.addQuery('state', state);
reportData.query();
reportData.next();
reportData.setValue('state', state);
reportData.setValue('category', category);
reportData.gross_loss.setDisplayValue(currencyCode + ';' + parseFloat(grossLoss));
reportData.net_loss.setDisplayValue(currencyCode + ';' + parseFloat(netLoss));
reportData.recovery.setDisplayValue(currencyCode + ';' + parseFloat(recovery));
reportData.setValue('no_of_events', noOfRiskEvents);
reportData.update();
},
collectReportingDataBaselCategory: function(state) {
this._collectReportingDataBaselCategory(state);
},
_collectReportingDataBaselCategory: function(state) {
var categories = new GlideRecord("sn_risk_advanced_basel_category");
categories.addNullQuery('parent');
categories.query();
while (categories.next()) {
var riskEvents = new GlideAggregate("sn_risk_advanced_m2m_event_risk");
riskEvents.addQuery('risk.statement.basel_category.root', categories.getUniqueValue());
riskEvents.addQuery('risk_event.sys_created_on', '>', this._getReportingPeriodStart());
if (state == '1')
riskEvents.addQuery('risk_event.state', 'NOT IN', this._getClosedStates());
else
riskEvents.addQuery('risk_event.state', 'IN', this._getClosedStates());
riskEvents.addAggregate('sum', 'risk_event.gross_amount');
riskEvents.addAggregate('sum', 'risk_event.net_amount');
riskEvents.addAggregate('sum', 'risk_event.recovered_amount');
riskEvents.addAggregate('count');
riskEvents.setGroup(false);
riskEvents.query();
if (riskEvents.next() && riskEvents.getAggregate('count') > 0) {
this._createRiskReportingRecord(categories.getUniqueValue(), state, riskEvents.getAggregate('sum', 'risk_event.gross_amount'), riskEvents.getAggregate('sum', 'risk_event.net_amount'), riskEvents.getAggregate('sum', 'risk_event.recovered_amount'), riskEvents.getAggregate('count'));
}
}
},
collectReportingDataForLineOfBusiness: function(state) {
this._collectReportingDataForLineOfBusiness(state);
},
_collectReportingDataForLineOfBusiness: function(state) {
var baselLines = new GlideRecord("sn_risk_advanced_basel_business_line");
baselLines.addNullQuery('parent');
baselLines.query();
while (baselLines.next()) {
var riskEvents = new GlideAggregate("sn_risk_advanced_event");
riskEvents.addQuery('primary_profile.sn_risk_advanced_basel_business_line.root', baselLines.getUniqueValue());
riskEvents.addQuery('sys_created_on', '>', this._getReportingPeriodStart());
if (state == '1')
riskEvents.addQuery('state', 'NOT IN', this._getClosedStates());
else
riskEvents.addQuery('state', 'IN', this._getClosedStates());
riskEvents.addAggregate('sum', 'gross_amount');
riskEvents.addAggregate('sum', 'net_amount');
riskEvents.addAggregate('sum', 'recovered_amount');
riskEvents.addAggregate('count');
riskEvents.setGroup(false);
riskEvents.query();
if (riskEvents.next() && riskEvents.getAggregate('count') > 0) {
this._createRiskReportingRecord(baselLines.getUniqueValue(), state, riskEvents.getAggregate('sum', 'gross_amount'), riskEvents.getAggregate('sum', 'net_amount'), riskEvents.getAggregate('sum', 'recovered_amount'), riskEvents.getAggregate('count'));
}
}
},
collectReportingDataForCause: function(state) {
this._collectReportingDataForCause(state);
},
_collectReportingDataForCause: function(state) {
var causeRoots = new GlideRecord("sn_risk_advanced_cause");
causeRoots.addNullQuery('parent');
causeRoots.query();
while (causeRoots.next()) {
var gr1 = new GlideAggregate("sn_risk_advanced_event");
gr1.addQuery('sys_created_on', '>', this._getReportingPeriodStart());
gr1.addQuery('cause.root', causeRoots.getUniqueValue());
if (state == '1')
gr1.addQuery('state', 'NOT IN', this._getClosedStates());
else
gr1.addQuery('state', 'IN', this._getClosedStates());
gr1.addAggregate('sum', 'gross_amount');
gr1.addAggregate('sum', 'net_amount');
gr1.addAggregate('sum', 'recovered_amount');
gr1.addAggregate('count');
gr1.setGroup(false);
gr1.query();
gr1.next();
var count = gr1.getAggregate('count');
if (count != 0) {
this._createRiskReportingRecord(causeRoots.getUniqueValue(), state, gr1.getAggregate('sum', 'gross_amount'), gr1.getAggregate('sum', 'net_amount'), gr1.getAggregate('sum', 'recovered_amount'), count);
}
}
},
clearReportingData: function() {
this._clearReportingData();
},
_clearReportingData: function() {
var reportData = new GlideRecord('sn_risk_advanced_risk_event_reporting');
reportData.deleteMultiple();
},
type: 'GRCRiskEventBase'
};
Sys ID
c0e67873877323003058d1a936cb0b91