Name
global.CSMRelationshipUtils
Description
No description available
Script
var CSMRelationshipUtils = Class.create();
CSMRelationshipUtils.prototype = {
initialize: function() {
},
getSafely: function(object, keys) {
if (!keys || !object) return object;
return this.getSafely(object[keys[0]], keys.splice(1));
},
isChildOf: function(parent, tableName) {
if(gs.nil(tableName) || gs.nil(parent))
return false;
var tu = new global.TableUtils(tableName);
var tables = tu.getTables();
return tables.indexOf(parent) > -1;
},
// Returns the very fist matching relationship
getRelationshipEPService: function(relationship, additionalParams){
if(gs.nil(relationship))
return null;
var ep = new GlideScriptedExtensionPoint().getExtensions(global.CSMRelationshipConstants.RELATIONSHIP_EXTENSION_POINT);
for (var e = 0; e < ep.length; e++) {
ep[e].initialize();
if (ep[e].canProcess(relationship, additionalParams)){
return ep[e];
}
}
},
hasAccess: function(current, relationship, accessLevel, additionalParams) {
var service = this.getRelationshipEPService(relationship, additionalParams);
return service.hasAccess(current, relationship, accessLevel, additionalParams);
},
getResponsibilities: function(relationship, accessLevel, respParams) {
var service = this.getRelationshipEPService(relationship);
return service.getResponsibilities(relationship, accessLevel, respParams);
},
getMyEntities: function(current, relationship, entityName, accessLevel, additionalParams) {
var service = this.getRelationshipEPService(relationship, additionalParams);
return service.getMyEntities(current, relationship, entityName, accessLevel, additionalParams);
},
getRelatedPartyCases: function() {
var RC = global.CSMRelationshipConstants;
var params = {};
params[RC.SKIP_BEFORE_QUERY_FILTER] = true;
return this.getMyEntities(null, RC.RELATIONSHIP_CASE_RELATED_PARTY, RC.RP_CASE_FIELD, RC.ACCESS.FULL, params);
},
/*
entityList: ['<entity_type>:<entity_sys_id>', '<entity_type>:<entity_sys_id>' ...]
entity_type can be customer_contact | csm_consumer | sys_user
returns:
{
'customer_contact': [sys_id1, sys_id2 ...],
'sys_user': [sys_id1, sys_id2.. ],
'csm_consumer': [sys_id1, sys_id2..]
}
*/
groupRelatedPartiesByEntityTypes: function(entityList, groupedEntityObject){
if (gs.nil(groupedEntityObject))
groupedEntityObject = {};
var contactTable = global.CSMBaseConstants.CONTACT_TABLE,
consumerTable = global.CSMBaseConstants.CONSUMER_TABLE,
userTable = global.CSMBaseConstants.USER_TABLE;
if (gs.nil(groupedEntityObject[contactTable]))
groupedEntityObject[contactTable] = [];
if (gs.nil(groupedEntityObject[consumerTable]))
groupedEntityObject[consumerTable] = [];
if (gs.nil(groupedEntityObject[userTable]))
groupedEntityObject[userTable] = [];
if(gs.nil(entityList) || entityList.length == 0)
return groupedEntityObject;
for(var i=0; i < entityList.length; i++){
var entityObject = entityList[i];
//splitting entity object with ':' as seperator should give us array of length two
//First element in the array will be entity type, second element will be entity sys_id
var entityObjectArray = entityObject.split(":");
if(gs.nil(entityObjectArray) || entityObjectArray.length !=2 || gs.nil(entityObjectArray[1])) continue;
if(entityObjectArray[0] != contactTable && entityObjectArray[0] != consumerTable && entityObjectArray[0] != userTable) continue;
groupedEntityObject[entityObjectArray[0]].push(entityObjectArray[1]);
}
return groupedEntityObject;
},
/*
returns:
{
'customer_contact': [sys_id1, sys_id2 ...],
'sys_user': [sys_id1, sys_id2.. ],
'csm_consumer': [sys_id1, sys_id2..]
}
*/
getSoldProductMembers: function(current, accessLevel, groupedEntityObject) {
if (!current || !current.getTableName() == global.CSMBaseConstants.CASE_TABLE)
return;
if (gs.nil(groupedEntityObject))
groupedEntityObject = {};
var additionalParams = {};
additionalParams[CSMRelationshipConstants.NO_PERSONA_QUERY] = true;
additionalParams[CSMRelationshipConstants.SKIP_ROLE_CHECK] = true;
if (!gs.nil(current[global.CSMRelationshipConstants.FIELD_SOLD_PRODUCT])) {
if (current[CSMRelationshipConstants.FIELD_CONSUMER]) {
additionalParams[CSMRelationshipConstants.IS_CONSUMER_SOLD_PRODUCT] = true;
additionalParams[CSMRelationshipConstants.IS_CONTACT_SOLD_PRODUCT] = false;
this._populateSoldProductRelatedParties(current, CSMRelationshipConstants.RELATIONSHIP_SOLD_PRODUCT_RELATED_PARTY, CSMRelationshipConstants.FIELD_CONSUMER, accessLevel, additionalParams, groupedEntityObject, global.CSMBaseConstants.CONSUMER_TABLE);
}
if (current[CSMRelationshipConstants.FIELD_CONTACT]) {
additionalParams[CSMRelationshipConstants.IS_CONTACT_SOLD_PRODUCT] = true;
additionalParams[CSMRelationshipConstants.IS_CONSUMER_SOLD_PRODUCT] = false;
this._populateSoldProductRelatedParties(current, CSMRelationshipConstants.RELATIONSHIP_SOLD_PRODUCT_RELATED_PARTY, CSMRelationshipConstants.FIELD_CONTACT, accessLevel, additionalParams, groupedEntityObject, global.CSMBaseConstants.CONTACT_TABLE);
}
}
return groupedEntityObject;
},
/*
returns:
{
'customer_contact': [sys_id1, sys_id2 ...],
'sys_user': [sys_id1, sys_id2.. ],
'csm_consumer': [sys_id1, sys_id2..]
}
*/
getCaseRelatedParties: function(current, accessLevel, groupedEntityObject) {
if (!current || !current.getTableName() == global.CSMBaseConstants.CASE_TABLE)
return;
if (gs.nil(groupedEntityObject))
groupedEntityObject = {};
var additionalParams = {};
additionalParams[CSMRelationshipConstants.NO_PERSONA_QUERY] = true;
additionalParams[CSMRelationshipConstants.SKIP_ROLE_CHECK] = true;
var entityList = this.getMyEntities(current, CSMRelationshipConstants.RELATIONSHIP_CASE_RELATED_PARTY, null, accessLevel, additionalParams) || [];
this.groupRelatedPartiesByEntityTypes(entityList, groupedEntityObject);
return groupedEntityObject;
},
/*
returns:
{
'customer_contact': [sys_id1, sys_id2 ...],
'sys_user': [sys_id1, sys_id2.. ],
'csm_consumer': [sys_id1, sys_id2..]
}
*/
getAllRelatedParties: function(current, accessLevel) {
if (!current || !current.getTableName() == global.CSMBaseConstants.CASE_TABLE)
return;
var groupedEntityObject = {};
this.getCaseRelatedParties(current, accessLevel, groupedEntityObject);
this.getSoldProductMembers(current, accessLevel, groupedEntityObject);
return groupedEntityObject;
},
/*
relatedParties:
{
'customer_contact': [sys_id1, sys_id2 ...],
'sys_user': [sys_id1, sys_id2.. ],
'csm_consumer': [sys_id1, sys_id2..]
}
This method returns list of emailIds of these related parties: [emailId1, emailId2, ...]
*/
fetchEmailIdListOfCaseRelatedParties: function(relatedParties){
if (gs.nil(relatedParties)) return [];
var contactTable = global.CSMBaseConstants.CONTACT_TABLE,
consumerTable = global.CSMBaseConstants.CONSUMER_TABLE,
userTable = global.CSMBaseConstants.USER_TABLE;
var contactIds = relatedParties[contactTable] || [];
var userIds = relatedParties[userTable] || [];
var consumerIds = relatedParties[consumerTable] || [];
var emailIdList = [];
//For both user and contact records, we can query user table to fetch email.
if (userIds.length > 0 || contactIds.length > 0) {
var userGr = new GlideRecord(userTable);
userGr.addQuery('sys_id', 'IN', userIds.concat(contactIds));
userGr.setWorkflow(false);
userGr.query();
while (userGr.next()) {
if (!gs.nil(userGr.email))
emailIdList.push(userGr.email + '');
}
}
if (consumerIds.length > 0) {
var consumerGr = new GlideRecord(consumerTable);
consumerGr.addQuery('sys_id', 'IN', consumerIds);
consumerGr.setWorkflow(false);
consumerGr.query();
while (consumerGr.next()) {
if (!gs.nil(consumerGr.email))
emailIdList.push(consumerGr.email + '');
}
}
return emailIdList;
},
/*
caseGr: GlideRecord of sn_customerservice_case
Checks if the given email belongs to the case related party with full access
*/
checkIfEmailBelongsToCaseRelatedPartyWithFullAccess: function(caseGr, email_from) {
if(gs.nil(caseGr) || gs.nil(email_from)) return false;
var emailIdList = this.fetchEmailIdListOfCaseRelatedParties(this.getAllRelatedParties(caseGr, CSMRelationshipConstants.ACCESS.FULL)) || [];
var email_from_lowercase = email_from.toLowerCase();
for(var i=0; i<emailIdList.length; i++){
if(emailIdList[i].toLowerCase() == email_from_lowercase) return true;
}
return false;
},
generateSoldProductRelatedPartyNotifications: function(current, eventName) {
var recipients = this.fetchEmailIdListOfCaseRelatedParties(this.getSoldProductMembers(current, CSMRelationshipConstants.ACCESS.FULL, null));
if (recipients.length > 0) {
gs.eventQueue(eventName, current, recipients);
}
},
generateCaseRelatedPartyNotifications: function(current, eventName) {
var recipients = this.fetchEmailIdListOfCaseRelatedParties(this.getCaseRelatedParties(current, CSMRelationshipConstants.ACCESS.FULL, null));
if (recipients.length > 0) {
gs.eventQueue(eventName, current, recipients);
}
},
generateRelatedPartyNotifications_caseCommented: function(current) {
this.generateCaseRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_COMMENTED_RP);
this.generateSoldProductRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_COMMENTED_SP);
},
generateRelatedPartyNotifications_caseClosed: function(current) {
this.generateCaseRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_CLOSED_RP);
this.generateSoldProductRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_CLOSED_SP);
},
generateRelatedPartyNotifications_caseResolved: function(current) {
this.generateCaseRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_RESOLVED_RP);
this.generateSoldProductRelatedPartyNotifications(current, CSMRelationshipConstants.EVENT_CASE_RESOLVED_SP);
},
//This method checks can contact create or update sold product cases for restricted access account
canContactCreateOrUpdateCase: function(current) {
var caseAccessUtil = new global.CSMContentAccessUtils().getContentAccessEPService(global.CSMBaseConstants.CASE_TABLE, current);
var spGR = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT);
spGR._skip_before_query_filter = true;
spGR.get(current.sold_product);
var loggedInUserId = gs.getUserID();
/*
* if case is not created by sp contact or sp additional contact throw error message
* else if case is not being updated by primary contact, related party, sp primary contact, sp additional contact throw error
* message
*/
var RC = global.CSMRelationshipConstants;
var authorizedContactParams = {};
authorizedContactParams[RC.SKIP_BEFORE_QUERY_FILTER] = true;
authorizedContactParams[RC.IS_CONTACT_SOLD_PRODUCT] = true;
var authorizedAccountParams = {};
authorizedAccountParams[RC.SKIP_BEFORE_QUERY_FILTER] = true;
authorizedAccountParams[RC.NO_PERSONA_QUERY] = true;
authorizedAccountParams[RC.IS_ACCOUNT_QUERY] = true;
authorizedAccountParams[RC.IS_CONTACT_SOLD_PRODUCT] = true;
if (current.operation() == 'insert' && spGR.contact != current.contact && !caseAccessUtil.canCreate(authorizedContactParams) && !caseAccessUtil.canCreate(authorizedAccountParams)) {
gs.addErrorMessage(gs.getMessage("Contact does not match with valid contacts for the sold product"));
current.setAbortAction(true);
return false;
} else if (current.operation() == 'update' && !caseAccessUtil.canWrite(authorizedContactParams) && !caseAccessUtil.canWrite(authorizedAccountParams) && current.contact != loggedInUserId && spGR.contact != loggedInUserId) {
gs.addErrorMessage(gs.getMessage("Contact does not match with valid contacts for the case"));
current.setAbortAction(true);
return false;
} else return true;
},
/* Private Methods */
/*
current: case record
relationship: sn_install_base_sold_product_related_party
entity: consumer or contact
groupedEntityObjectKey: csm_consumer or customer_contact
*/
_populateSoldProductRelatedParties: function(current, relationship, entity, accessLevel, additionalParams, groupedEntityObject, groupedEntityObjectKey) {
if (!current || !this.isChildOf(global.CSMBaseConstants.CASE_TABLE, current.getTableName()) || gs.nil(current[global.CSMRelationshipConstants.FIELD_SOLD_PRODUCT]) || gs.nil(groupedEntityObject) || !groupedEntityObjectKey)
return;
if (gs.nil(groupedEntityObject[groupedEntityObjectKey]))
groupedEntityObject[groupedEntityObjectKey] = [];
if (current[entity]) {
var entityList = this.getMyEntities(current, relationship, entity, accessLevel, additionalParams) || [];
entityList.forEach(function(entity_id){
groupedEntityObject[groupedEntityObjectKey].push(entity_id);
});
}
},
getCSMRelationshipRolesAndRespConfig: function(config, configUtil) {
if (!configUtil)
return;
config = config || {};
var ep = new GlideScriptedExtensionPoint().getExtensions(global.CSMRelationshipConstants.RELATIONSHIP_RESP_CONFIG_EXTENSION_POINT);
for (var e = 0; e < ep.length; e++) {
ep[e].initialize();
var relationshipEntity = ep[e].getRelationshipEntity();
if (!gs.nil(relationshipEntity))
config[relationshipEntity] = ep[e][configUtil]();
}
return config;
},
type: 'CSMRelationshipUtils'
};
Sys ID
43bc2b027782b010d3ef07dc7d5a9942