Name
global.CSManagementUtils
Description
Helper functions for Customer Service Management
Script
var CSManagementUtils = Class.create();
CSManagementUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
generateCreateCaseHiddenValue: function(company) {
company = company || gs.getUser().getCompanyID();
var value = "company-" + company;
var gr = new GlideRecord('customer_account');
if (gr.get(company)) {
value += "#isCustomer-" + gr.customer;
value += "#isPartner-" + gr.partner;
var count = new GlideAggregate('customer_account');
count.addQuery('account_path', 'STARTSWITH', gr.account_path + '/');
count.addAggregate('COUNT');
count.setWorkflow(false);
count.query();
if (count.next())
value += "#hasSubAccounts-" + (count.getAggregate('COUNT') > 0);
var ar = new GlideAggregate('sn_customerservice_contact_relationship');
ar.addQuery('contact', gs.getUserID());
ar.addAggregate('COUNT');
ar.setWorkflow(false);
ar.query();
if (ar.next())
value += "#hasAccountContactRelation-" + (ar.getAggregate('COUNT') > 0);
}
// gs.info("generateCreateCaseHiddenValue -->" + value);
return value;
},
// isEntitlementValid:function(entitlement_sysId){
// var valid = false;
// if(entitlement_sysId){
// var entitlement = new GlideRecord("service_entitlement");
// if(entitlement.get(entitlement_sysId) && entitlement.state == 1){
// var startDate = new GlideDateTime(entitlement.start_date);
// var endDate = new GlideDateTime(entitlement.end_date);
// var currentDate = new GlideDateTime();
// if(currentDate.compareTo(startDate)==1 && currentDate.compareTo(endDate)== -1){
// if(entitlement.getValue("per_case")==1){
// valid = entitlement.getValue("remaining_units") > 0 ? true : false;
// }else{
// valid = true;
// }
// }
// }
// return valid;
// }else{
// return valid;
// }
// },
getEntitlements: function(account, product, channel){
var cus = current.consumer;
var com = account || current.account;
var pro = product || current.product;
channel = channel || current.contact_type;
var query = ' ';
var household = current.household;
var entitlements = new GlideRecord("service_entitlement");
var channelSysId = this.getChoiceSysIdForChannel(channel);
var entqc = entitlements.addNullQuery('channel');
if (!gs.nil(channelSysId))
entqc.addOrCondition("channel", "CONTAINS", channelSysId);
var isQuerySet = false;
var qc = "";
if(!gs.nil(com)){
qc = entitlements.addNullQuery("consumer", 'ISEMPTY');
qc = qc.addCondition("account", com);
isQuerySet = true;
} else if(!gs.nil(cus) || !gs.nil(household)){
qc = entitlements.addNullQuery("account", 'ISEMPTY');
if (!gs.nil(cus)) {
qc = qc.addCondition("consumer", cus);
}
if (!gs.nil(household)) {
qc = qc.addCondition("household", household);
}
isQuerySet = true;
}
if(!gs.nil(pro)){
if(isQuerySet)
qc.addOrCondition("product", pro);
else{
entitlements.addQuery("product", pro);
isQuerySet = true;
}
}
if(isQuerySet){
entitlements.query();
while(entitlements.next()){
if (query.length > 0)
query += ', ' + entitlements.sys_id;
else
query = entitlements.sys_id;
}
}
if(!gs.nil(current.contract)){
entitlements = new GlideRecord("service_entitlement");
entqc = entitlements.addNullQuery('channel');
if (!gs.nil(channelSysId))
entqc.addOrCondition("channel", "CONTAINS", channelSysId);
entitlements.addQuery("contract", current.contract);
entitlements.query();
while(entitlements.next()){
if (query.length > 0)
query += ', ' + entitlements.sys_id;
else
query = entitlements.sys_id;
}
}
return 'sys_idIN' + query;
},
getEntitlement: function(){
var entitlement = new GlideRecord("service_entitlement");
if(!gs.nil(current.contract)){
entitlement.addQuery("contract",current.contract);
entitlement.query();
if(entitlement.getRowCount() == 1 ){
entitlement.next();
return entitlement.getValue("sys_id");
}else if(entitlement.getRowCount() > 1)
return '';
}
if(!gs.nil(current.product)){
entitlement = new GlideRecord("service_entitlement");
entitlement.addQuery("product",current.product);
entitlement.query();
if(entitlement.getRowCount() == 1 ){
entitlement.next();
return entitlement.getValue("sys_id");
}else if(entitlement.getRowCount() > 1)
return '';
}
if(!gs.nil(current.account)){
entitlement = new GlideRecord("service_entitlement");
entitlement.addQuery("account",current.account);
entitlement.query();
if(entitlement.getRowCount() == 1 ){
entitlement.next();
return entitlement.getValue("sys_id");
}else if(entitlement.getRowCount() > 1)
return '';
}
return '';
},
_containsChannel : function(eGrType,currGrChannel) {
var eGrChannels = eGrType.split(',');
for(var i =0;i < eGrChannels.length;i++)
if(eGrChannels[i] == currGrChannel)
return true;
return false;
},
_isValidChannel : function(eGrType,currGrChannel) {
return (eGrType && this._containsChannel(eGrType,currGrChannel)) || !eGrType ;
},
_isValidField : function(caseElement,entElement) {
return gs.nil(entElement) || (caseElement == entElement);
},
_isValidEntitlement : function(current,entitlementGr,fieldList) {
var valid = true;
for(var i =0; i < fieldList.length; i++)
if(current.isValidField(fieldList[i]) && entitlementGr.isValidField(fieldList[i]))
valid = valid && this._isValidField(current.getValue(fieldList[i]),entitlementGr.getValue(fieldList[i]));
return valid;
},
isServiceOrgPluginActive: function() {
if(pm.isActive("com.snc.service_organization"))
return true;
return false;
},
isPSSPluginActive: function() {
if(pm.isActive("com.sn_pss_core"))
return true;
return false;
},
getFirstEntitlement: function(current){
//Relative precidence order/weightage for each field contributing to entitlement selection
var weightMap = {
account : 1,
consumer : 1,
product : 2,
asset : 3,
sold_product : 3,
install_base_item : 3,
contract : 4
};
var maxScore = 0;
var score = 0;
var selectedEntitlement = '';
var caseChannelSysId = this.getChoiceSysIdForChannel(current.getValue('contact_type'));
var installBaseItem = '';
if(pm.isActive('com.snc.install_base')){
if(!gs.nil(current.getValue('sold_product')) && gs.nil(current.getValue('product')))
current.product = current.sold_product.product;
var affectedInstallBaseGr = new GlideRecord('sn_install_base_m2m_affected_install_base');
affectedInstallBaseGr.addQuery('csm_case',current.getValue('sys_id'));
affectedInstallBaseGr.query();
if(affectedInstallBaseGr.getRowCount() == 1) {
affectedInstallBaseGr.next();
if(affectedInstallBaseGr.install_base_item.getRefRecord().canRead())
installBaseItem = affectedInstallBaseGr.getValue('install_base_item');
}
}
var entitlementGr = new GlideRecord('service_entitlement');
entitlementGr.addActiveQuery();
if (this.isPSSPluginActive()) {
entitlementGr.addQuery("advanced", false);
}
if(gs.nil(current.getValue('contract')))
current.contract = this.getContractForAccount();
if(!gs.nil(current.account))
entitlementGr.addQuery('account',current.account);
else if(!gs.nil(current.consumer))
entitlementGr.addQuery('consumer',current.consumer);
else
return '';
entitlementGr.query();
while(entitlementGr.next()) {
var validEntitlement = this._isValidEntitlement(current,entitlementGr,Object.keys(weightMap)) &&
this._isValidField(installBaseItem,entitlementGr.getValue('install_base_item'));
//check if the entitlement is meant for a different channel type or bypass if channel type is not defined for entitlement
if(validEntitlement && this._isValidChannel(entitlementGr.getValue('channel'),caseChannelSysId)){
//check if field value exists or is null in both table records
var sameContract = current.getValue('contract') == entitlementGr.getValue('contract');
var sameAsset = current.getValue('asset') == entitlementGr.getValue('asset');
var sameSoldProduct = current.getValue('sold_product') == entitlementGr.getValue('sold_product');
var sameInstallBaseItem = installBaseItem == entitlementGr.getValue('install_base_item');
var sameProduct = current.getValue('product') == entitlementGr.getValue('product');
var sameAccount = current.getValue('account') == entitlementGr.getValue('account');
var sameConsumer = current.getValue('consumer') == entitlementGr.getValue('consumer');
score = sameContract * weightMap.contract +
sameAsset * weightMap.asset +
sameSoldProduct * weightMap.sold_product +
sameInstallBaseItem * weightMap.install_base_item +
sameProduct * weightMap.product;
if(!gs.nil(current.getValue('account')))
score += sameAccount * weightMap.account;
else if(!gs.nil(current.getValue('consumer')))
score += sameConsumer * weightMap.consumer;
if(score > maxScore) {
selectedEntitlement = entitlementGr.getValue('sys_id');
maxScore = score;
}
}
}
return selectedEntitlement;
},
getContractsForAccount: function(){
if(!gs.nil(current.consumer) || !gs.nil(current.household)){
var result = '';
if (!gs.nil(current.consumer))
result = 'consumer=' + current.consumer;
if (!gs.nil(current.household)) {
if (result.length > 0)
result = result + '^household=' + current.household;
else
result = 'household=' + current.household;
}
return result;
} else if(!gs.nil(current.account)){
return 'account=' + current.account;
}
},
getContractForAccountAjax : function () {
var account = this.getParameter("sysparm_account");
if(gs.nil(account))
return '';
var gr = new GlideRecord("ast_contract");
if (this.isPSSPluginActive()) {
gr.addQuery("sys_class_name", "!=", "sn_pss_core_service_contract");
}
gr.addQuery("account",account);
gr.addQuery("state",'active');
gr.query();
if(gr.next() && gr.canRead()){
return gr.getValue('sys_id');
}
return '';
},
getContractForAccount : function (account) {
account = account || current.getValue('account');
if (gs.nil(account) || gs.nil(current))
return '';
var contractId = '';
var gr = new GlideRecord("ast_contract");
if (this.isPSSPluginActive()) {
gr.addQuery("sys_class_name", "!=", "sn_pss_core_service_contract");
}
gr.addQuery("account", account);
gr.setLimit(1);
gr.query();
if (gr.next())
contractId = gr.getValue('sys_id');
if (gs.nil(current.asset))
return contractId;
var accountQuery = "contract.account=" + account + "^asset=" + current.asset;
var clm = new GlideRecord("clm_m2m_contract_asset");
clm.addEncodedQuery(accountQuery);
clm.orderBy("contract.sys_created_on");
clm.setLimit(1);
clm.query();
if (clm.next()) {
contractId = clm.getValue("contract");
}
return contractId;
},
getContractsForContact : function(){
if(!gs.nil(current.contact)){
var query = ' ';
var contract = new GlideRecord("ast_contract");
contract.addQuery("account", current.contact.account);
contract.query();
while(contract.next()){
if (query.length > 0)
query += ', ' + contract.sys_id;
else
query = contract.sys_id;
}
return 'sys_idIN' + query;
}
},
getContactsForContract : function(){
if(!gs.nil(current.contract)){
var query = ' ';
var contact = new GlideRecord("customer_contact");
contact.addQuery("account", current.contract.account);
contact.query();
while(contact.next()){
if (query.length > 0)
query += ', ' + contact.sys_id;
else
query = contact.sys_id;
}
return 'sys_idIN' + query;
}
},
getContactsForCurrentAccount : function(){
if(current.getTableName() == "customer_account"){
var query = ' ';
var contact = new GlideRecord("customer_contact");
contact.addQuery("account", current.sys_id);
contact.query();
while(contact.next()){
if (query.length > 0)
query += ', ' + contact.sys_id;
else
query = contact.sys_id;
}
return 'sys_idIN' + query;
}
},
getAssetForCase: function(account, product){
var asset;
if(gs.nil(account))
account = current.account;
if(gs.nil(product))
product = current.product;
var consumer = current.consumer;
if (current.getTableName() == 'csm_service_case') {
asset = new GlideRecord("alm_service");
if (!gs.nil(current.service)) {
var qc = asset.addQuery("ci", current.service);
qc.addOrCondition("parent.ci", current.service);
}
} else {
asset = new GlideRecord("alm_asset");
if (!gs.nil(product))
asset.addQuery("model", product);
}
if (!gs.nil(account))
asset.addQuery("account", account);
else if (!gs.nil(consumer))
asset.addQuery("consumer", consumer);
return asset.getEncodedQuery();
},
getAssetsForEntitlement: function(account, contract){
if(gs.nil(account))
account = current.account;
if(gs.nil(contract))
contract = current.contract;
var asset = new GlideRecord("alm_asset");
var query = ' ';
if(!gs.nil(account) && gs.nil(contract)){
asset.addQuery("account", account);
asset.query();
while(asset.next()){
if (query.length > 0)
query += ', ' + asset.sys_id;
else
query = asset.sys_id;
}
return 'sys_idIN' + query ;
}
if(!gs.nil(contract)){
var assetsCovered = new GlideRecord("clm_m2m_contract_asset");
assetsCovered.addQuery("contract", contract);
assetsCovered.query();
while(assetsCovered.next()){
if (query.length > 0)
query += ', ' + assetsCovered.asset;
else
query = assetsCovered.asset;
}
return 'sys_idIN' + query ;
}
},
getChannelChoicesForEntitlement: function(){
var query = ' ';
var choice = new GlideRecord("sys_choice");
choice.addQuery("name", "sn_customerservice_case");
choice.addQuery("element", "contact_type");
choice.query();
while(choice.next()){
if (query.length > 0)
query += ', ' + choice.sys_id;
else
query = choice.sys_id;
}
return 'sys_idIN' + query ;
},
getChoiceSysIdForChannel: function(channel){
var query = ' ';
var choice = new GlideRecord("sys_choice");
choice.addQuery("name", "sn_customerservice_case");
choice.addQuery("element", "contact_type");
choice.addQuery("value",channel);
choice.query();
choice.next();
return choice.sys_id;
},
addCaseToChat: function(){
var answer = '';
var caseID = this.getParameter("sysparm_case_id");
var chatChannelID = this.getParameter("sysparm_channel_id");
if(gs.nil(caseID) || gs.nil(chatChannelID)) {
gs.log("Invalid request, caseID : "+ caseID +" , chatChannelID : " + chatChannelID);
return answer;
}
var gr = new GlideRecord("chat_channel_member");
gr.initialize();
if(gr.isValid() && gr.canCreate()){
gr.affiliation='member';
gr.chat_channel=chatChannelID;
gr.member_id=caseID;
gr.member_table='sn_customerservice_case';
gr.status = 'active';
answer = gr.insert();
}
return answer;
},
findLatestExpiringTaskSLA: function(caseRecord) {
var latestExpiringTaskSla=null;
var gr = new GlideRecordSecure('task_sla');
gr.addQuery('task', caseRecord.sys_id);
gr.orderBy('time_left');
gr.query();
if(gr.next()) {
latestExpiringTaskSla = gr;
}
return latestExpiringTaskSla;
},
isLatestExpiringSLABreached: function(caseRecord) {
var isBreached = false;
var latestExpiringTaskSla = this.findLatestExpiringTaskSLA(caseRecord);
if (latestExpiringTaskSla)
isBreached = (latestExpiringTaskSla.stage == 'breached');
return isBreached;
},
isLatestExpiringSLABreachInNextHour: function(caseRecord) {
var latestExpiringTaskSla = this.findLatestExpiringTaskSLA(caseRecord);
if (latestExpiringTaskSla) {
var dur = latestExpiringTaskSla.time_left.getGlideObject();
if (!gs.nil(dur)) {
var time_left = dur.getNumericValue();
return time_left > 0 && time_left <= 3600000;
}
}
return false;
},
getUsersInSameCompany: function(){
if(!gs.nil(current.parent.assigned_to.company)){
var query = ' ';
var users = new GlideRecord("sys_user");
users.addQuery("company", current.parent.assigned_to.company);
users.query();
while(users.next()){
if (query.length > 0)
query += ', ' + users.sys_id;
else
query = users.sys_id;
}
return 'sys_idIN' + query;
}
},
updateValue: function(table, id, field, value) {
var gr = this._getGlideRecord(table, id);
if (gr) {
gr.setValue(field, value);
gr.update();
}
},
deleteRecord: function(table, id) {
var gr = this._getGlideRecord(table, id);
if (gr) {
gr.deleteRecord();
}
},
_getGlideRecord: function(tableName, recordId) {
var gr = new GlideRecord(tableName);
if (gr.get(recordId))
return gr;
return null;
},
getModelFromAsset: function(){
var asset = this.getParameter("sysparm_asset");
var gr = new GlideRecord("alm_asset");
gr.get(asset);
if (gr.canRead())
return gr.getValue("model");
},
getGlideRecordData: function() {
var result = this.getDocument().createElement("result");
this.getRootElement().appendChild(result);
var table_name = this.getParameter("sysparm_table_name");
var sys_id = this.getParameter("sysparm_sys_id");
var fields = this.getParameter("sysparm_fields") ? this.getParameter("sysparm_fields").split(",") : [];
result.setAttribute("table_name", table_name);
result.setAttribute("sys_id", sys_id);
var gr = new GlideRecordSecure(table_name);
if (!gr.get(sys_id)) {
result.setAttribute("error", "NOT_FOUND");
return;
}
result.setAttribute("label", gr.getLabel());
result.setAttribute("display_value", gr.getDisplayValue());
for(var i = 0; i < fields.length; i++) {
var field = fields[i];
if (!field)
continue;
try {
var el = gr.getElement(field);
if (el) {
var item = this.getDocument().createElement("item");
item.setAttribute("field", field);
item.setAttribute("value", gr.getValue(field));
item.setAttribute("display_value", gr.getDisplayValue(field));
if (el.getED().isReference()) {
item.setAttribute("isReference", "true");
item.setAttribute("label", el.getRefRecord().getLabel());
item.setAttribute("dependent", el.getReferenceTable());
}
result.appendChild(item);
}
} catch (ex) {
gs.info("CSManagementUtils.getGlideRecordDatae : " + ex.message );
}
}
},
getPartnerContacts: function(account){
//Get contacts of my company and the company whom I am partner of
if(gs.nil(account))
account = current.account;
var query =' ';
if (account){
var accountsRelationship = new GlideRecord("account_relationship");
accountsRelationship.addQuery("to_company", account);
accountsRelationship.addQuery("reverse_relationship", false);
accountsRelationship.query();
var partnerContacts = [];
while(accountsRelationship.next()){
partnerContacts.push(accountsRelationship.from_company.toString());
}
query = partnerContacts.join();
}
return 'sys_idIN' + query;
},
getPartnerAndCustomerContacts: function(account){
if (!account)
return "";
var accountsRelationship = new GlideRecord("account_relationship");
accountsRelationship.addQuery("to_company", account);
accountsRelationship.query();
var partnerContacts = [];
partnerContacts.push(account); //add the current account
while(accountsRelationship.next()){
//add the current account's partners
partnerContacts.push(accountsRelationship.from_company.toString());
}
return this.getUsersInCompanies(partnerContacts);
},
getUsersInCompanies: function(companies){
var users = new GlideRecord("customer_contact");
users.addQuery('company','IN', companies);
users.query();
var contacts = [];
while(users.next()){
contacts.push(users.sys_id.toString());
}
return 'sys_idIN' + contacts;
},
getUserAccount: function() {
return gs.getUser().getCompanyID();
},
getUserPartnerContacts: function() {
//Get contacts of my company and my partner company
var partnerContacts = this.getMeAndPartners();
return this.getUsersInCompanies(partnerContacts);
},
getAccounts: function(account) {
//Reference qual used by contacts and asset variables on portal "Create Case"
//to filter contact/asset based on selected account
//if account is not selected, then return all accounts for the current user
if(account)
return account;
else
return this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, true, true);
},
getMeAndPartners: function() {
//return this.getMyAccessibleAccountsStr();
return this.getAccessibleAccounts('', false, true, true);
},
getMyAccessibleAccountsStr: function(account) {
var accounts = this.getMyAccessibleAccounts(account);
if (!accounts)
accounts = [];
return accounts.join();
},
getMyAccessibleAccounts: function(account) {
//Get my accounts for which I have access to
var myAccessibleAccounts = [];
var key = this._getKey("cs_partner_accounts");
//gs.getSession().clearClientData(key);
var value = gs.getSession().getClientData(key);
if (!gs.nil(value)) {
if (value == "NIL") {
return [];
} else {
var valArray = value.split(',');
for (i=0; i < valArray.length; i++)
myAccessibleAccounts.push(valArray[i]);
return myAccessibleAccounts;
}
}
value = "NIL";
account = account || gs.getUser().getCompanyID();
var accountGr = new GlideRecord("customer_account");
if (accountGr.get(account)) {
//Step 1: add the user account, if account is customer
if (accountGr.customer)
myAccessibleAccounts.push(account);
//Step 2: if account is type of partner and user has partner role
//then get all partner's for current user account
if (accountGr.partner && gs.hasRole('sn_customerservice.partner')) {
var accountsRelationship = new GlideRecord("account_relationship");
accountsRelationship.addQuery("from_company", account);
accountsRelationship.addQuery("reverse_relationship", false);
accountsRelationship.query();
while(accountsRelationship.next()){
myAccessibleAccounts.push(accountsRelationship.getValue("to_company"));
}
}
}
//store list in user session as string to resue
if (myAccessibleAccounts.length > 0)
value = myAccessibleAccounts.toString();
gs.getSession().putClientData(key, value);
return myAccessibleAccounts;
},
getAllAccessibleAccounts: function(account) {
//Get my accounts for which I have access to
var myAccessibleAccounts = [];
var key = this._getKey("cs_all_accounts");
//gs.getSession().clearClientData(key);
var value = gs.getSession().getClientData(key);
if (!gs.nil(value)) {
if (value == "NIL") {
return [];
} else {
var valArray = value.split(',');
for (i=0; i < valArray.length; i++)
myAccessibleAccounts.push(valArray[i]);
return myAccessibleAccounts;
}
}
value = "NIL";
account = account || gs.getUser().getCompanyID();
var accountGr = new GlideRecord("customer_account");
if (accountGr.get(account)) {
myAccessibleAccounts.push(account);
//Step 2: if account is type of partner and user has partner role
//then get all partner's for current user account
if (accountGr.partner && gs.hasRole('sn_customerservice.partner')) {
var accountsRelationship = new GlideRecord("account_relationship");
accountsRelationship.addQuery("from_company", account);
accountsRelationship.addQuery("reverse_relationship", false);
accountsRelationship.query();
while(accountsRelationship.next()){
myAccessibleAccounts.push(accountsRelationship.getValue("to_company"));
}
}
}
//store list in user session as string to resue
if (myAccessibleAccounts.length > 0)
value = myAccessibleAccounts.toString();
gs.getSession().putClientData(key, value);
return myAccessibleAccounts;
},
getDefaultAccount : function(userId){
return getUserAccount();
},
isAccountAdmin: function(userId){
userId = userId || gs.getUserID();
var key = this._getKey("cs_is_user_account_admin");
gs.getSession().clearClientData(key);
var value = gs.getSession().getClientData(key);
if (gs.nil(value)) {
var userRecord = gs.getUser().getUserByID(userId);
var company = userRecord.getCompanyRecord();
value = company && userId == company.contact;
gs.getSession().putClientData(key, value);
}
return value === true;
},
hasPartner: function() {
var accountGr = new GlideRecord("customer_account");
if(accountGr.get(gs.getUser().getCompanyID()))
return accountGr.partner;
return false;
},
hasPartnerOrIsAccountAdmin : function(){
if ( gs.hasRole('sn_esm_user_admin') || gs.hasRole('sn_esm_partner_admin') || gs.hasRole('sn_esm_partner')) {
if (this.hasPartner())
return "hasPartner";
else if (this.isAccountAdmin())
return "accountAdmin";
}
return "none";
},
isPartnerOfAccount : function() {
var account = this.getParameter("sysparm_account");
return this.isPartnerOf(account);
},
isPartnerOf: function(account) {
if (!account)
return false;
var accountsRelationship = new GlideRecord("account_relationship");
accountsRelationship.addQuery("to_company", account);
accountsRelationship.setLimit(1);
accountsRelationship.query();
return accountsRelationship.hasNext();
},
isCustomer: function(account) {
var gr = new GlideRecord("customer_account");
if (gr.get(account))
return gr.customer;
return false;
},
isPartner: function(account){
var gr = new GlideRecord("customer_account");
if (gr.get(account))
return gr.partner;
return false;
},
hasAccountAccessForPartnerAdmin: function(account){
if(gs.nil(account))
return false;
var accounts = this.getAllAccessibleAccounts();
if(accounts.toString().indexOf(account) != -1)
return true;
return false;
},
hasAccountAccessForPartner: function(account, contact){
if(gs.nil(account))
return false;
var accounts = this.getAllAccessibleAccounts();
if(accounts.toString().indexOf(account) != -1){
if(gs.getUser().getCompanyID() == account && contact != gs.getUserID())
return false;
else
return true;
}
return false;
},
getPortalCaseListPage: function() {
var key = this._getKey("cs_portal_list_page");
var value = gs.getSession().getClientData(key);
if (gs.nil(value)) {
value = "my_cases.do";
if ( gs.hasRole('sn_customerservice.customer_admin') || gs.hasRole('sn_customerservice.partner_admin'))
value = "cases.do";
gs.getSession().putClientData(key, value);
}
return value;
},
/** Get Accounts to determine the cases to which I have read/write access in the portal.
account: account sys_id
readWriteAccess:
true : create access
false : read access
checkAcctCustomer: check account is a customer account for creating cases
returnStr:
true : return a string
false : return an array
*/
getAccessibleAccounts: function(account, readWriteAccess, checkAcctCustomer, returnStr) {
var key = "cs_user_accessible_accounts";
var accessibleAccounts;
key += checkAcctCustomer ? '_customer': '';
key += readWriteAccess ? '_write': '_read';
key = this._getKey(key);
accessibleAccounts = gs.getSession().getClientData(key);
if (!gs.nil(accessibleAccounts)) {
if (accessibleAccounts == "NIL")
return [];
else
accessibleAccounts = accessibleAccounts.split(',');
} else {
accessibleAccounts = new sn_customerservice.CSPortalUtil().getAccessibleAccounts(account, readWriteAccess, checkAcctCustomer);
if(accessibleAccounts.length > 0)
gs.getSession().putClientData(key, accessibleAccounts.join());
else
gs.getSession().putClientData(key, 'NIL');
}
if(returnStr)
return accessibleAccounts.slice(0).join();
return accessibleAccounts.slice(0);
},
getAssetsBasedOnAccountRelationship: function(account, checkCustomerFlag) {
var key = "cs_user_accessible_assets";
var accounts;
var m2mAssetContact;
var assets;
var almAsset = new GlideRecord('alm_asset');
var useM2MAssetContact = gs.getProperty('sn_customerservice.use_asset_contact_relationship');
var asset;
key += checkCustomerFlag ? '_customer': '';
key = this._getKey(key);
//Get from Cache only when account is empty
//We don't want to cache for each account
//Already the getAccessibleAccounts function caches the accounts
if(gs.nil(account))
assets = gs.getSession().getClientData(key);
if (!gs.nil(assets)) {
if (assets == "NIL")
assets = '';
return assets;
} else if(useM2MAssetContact == 'true') {
assets = [];
accounts = this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, false, true);
m2mAssetContact = new GlideRecord('sn_customerservice_m2m_asset_contact');
m2mAssetContact.addQuery('contact', gs.getUserID());
if(account)
m2mAssetContact.addQuery('asset.account', account);
m2mAssetContact.query();
while(m2mAssetContact.next()) {
asset = m2mAssetContact.asset.getRefRecord();
if(accounts.indexOf(asset.getValue('account')) > -1)
assets.push(m2mAssetContact.getValue('asset'));
}
} else {
assets = [];
if(!gs.nil(account))
almAsset.addQuery('account', account);
else {
if(checkCustomerFlag == true)
accounts = this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, true, true);
else
accounts = this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, false, true);
almAsset.addQuery('account', 'IN', accounts);
}
almAsset.query();
while(almAsset.next())
assets.push(almAsset.getValue('sys_id'));
}
if(gs.nil(account)) {
if(assets.length > 0)
gs.getSession().putClientData(key, assets.join());
else
gs.getSession().putClientData(key, 'NIL');
}
return assets.join();
},
hasAccessToAccount: function(company, checkAgent) {
var hasAccess = false;
if(checkAgent && gs.hasRole("sn_esm_agent")){
hasAccess =true;
} else {
var accounts = this.getAccessibleAccounts('', false, false, false);
/*if(accounts[0] == gs.getUser().getCompanyID())
accounts.shift();*/
if(company && accounts.toString().indexOf(company) != -1) {
if(gs.hasRole("sn_esm_user"))
hasAccess = true;
}
/*else if(gs.hasRole("sn_esm_user")){
if(company == gs.getUser().getCompanyID())
hasAccess = true;
}*/
}
return hasAccess;
},
hasReadAccessToAsset: function(company, asset, checkAgent) {
var m2mAssetContact;
var hasAccess = false;
var useM2MAssetContact = gs.getProperty('sn_customerservice.use_asset_contact_relationship');
if(checkAgent && gs.hasRole("sn_esm_agent")){
hasAccess =true;
} else {
hasAccess = this.hasAccessToAccount(company, checkAgent);
if(hasAccess && useM2MAssetContact == 'true') {
m2mAssetContact = new GlideRecord('sn_customerservice_m2m_asset_contact');
m2mAssetContact.addQuery('asset', asset);
m2mAssetContact.addQuery('contact', gs.getUserID());
m2mAssetContact.query();
if(m2mAssetContact.hasNext())
hasAccess = true;
}
}
return hasAccess;
},
hasWriteAccessToContact: function(account, user) {
var hasAccess = false;
if(gs.hasRole("sn_esm_user") || gs.hasRole("sn_esm_partner")){
if(user == gs.getUserID())
hasAccess = true;
else if(gs.hasRole("sn_esm_user_admin") && account == gs.getUser().getCompanyID())
hasAccess = true;
else {
var accounts = this.getAccessibleAccounts('', true, false, true);
if(accounts.indexOf(account) != -1) {
hasAccess = true;
}
}
}
return hasAccess;
},
hasReadAccessToContact: function(account, user) {
var hasAccess = false;
if(gs.hasRole("sn_esm_agent"))
hasAccess = true;
else if(gs.hasRole("sn_esm_user")) {
if(user == gs.getUserID())
hasAccess = true;
else if(gs.hasRole("sn_esm_user_admin") && account == gs.getUser().getCompanyID())
hasAccess = true;
else {
var accounts = this.getAccessibleAccounts('', false, false, true);
if(accounts.indexOf(account) != -1) {
hasAccess = true;
if(!this.hasUserAdminAccess()) {
if(gs.getUser().getCompanyID() == account && user != gs.getUserID())
hasAccess = false;
}
}
}
}
return hasAccess;
},
hasUserAdminAccess: function() {
var key = this._getKey("cs_user_has_admin_access");
var value = gs.getSession().getClientData(key);
if (gs.nil(value)) {
var roles = new sn_customerservice.CSPortalUtil().getRelationshipRolesWithAdminAccess();
for(var i=0; i<roles.length; i++) {
if(gs.hasRole(roles[i])) {
value = true;
break;
}
}
value = value ? value : false;
gs.getSession().putClientData(key, value);
}
return value == 'true' ? true : false;
},
hasSubAccounts: function(account) {
var subAccounts = this.getAccountsFromHierarchy(account);
if(subAccounts.length > 0)
return true;
return false;
},
hasAccountContactRelation: function(contact) {
var accounts = this.getAccountsFromContactRelationship(contact);
if(accounts.length > 0)
return true;
return false;
},
getRelatedAccountContacts: function(account) {
//var relationshipType;
var accountRelationships;
var customerContacts;
//var contact;
//var roles;
var contacts = [];
//var relationshipRoles = new sn_customerservice.CSPortalUtil().getRelationshipRolesWithReadAccess();
//Add all contacts of the partner accounts who have read access for the account relationship type
//for(relationshipType in relationshipRoles) {
//roles = relationshipRoles[relationshipType];
accountRelationships = new GlideRecord('account_relationship');
//accountRelationships.addQuery('relationship_type', relationshipType);
accountRelationships.addQuery('reverse_relationship', false);
accountRelationships.addQuery('to_company', account);
accountRelationships.query();
while(accountRelationships.next()) {
customerContacts = new GlideRecord('customer_contact');
customerContacts.addQuery('account', accountRelationships.getValue('from_company'));
customerContacts.query();
while(customerContacts.next()) {
//contact = customerContacts.getValue('sys_id');
//for(var i=0 ; i<roles.length; i++) {
//if(gs.getUser().getUserByID(contact).hasRole(roles[i])) {
//contacts.push(contact);
contacts.push(customerContacts.getValue('sys_id'));
//break;
//}
//} // end of loop for contacts with roles
} // end of loop for contacts in account
} // end of loop for accounts with relationshipTypes
//} // end of loop for relationshipTypes
return contacts;
},
getAccountContacts: function(account) {
/* ReferenceQual for Account Contact Relationships:-
1) My Account contacts
2) Contacts from any Account (Partner or Account) relationship
3) Contacts from account hierarchy (whole account hierarchy tree)
4) Return all contacts if restrict_contact_relationship property is false
*/
var restrict_contact_relationship = gs.getProperty(CSMBaseConstants.RESTRICT_CONTACT_RELATIONSHIP, true) == "true";
if(!restrict_contact_relationship)
return "";
var query = null;
var gr = new GlideRecord('customer_account');
if (gr.get(account)) {
//Get related accounts
relatedAccounts = [account];
var accountRelationships = new GlideRecord('account_relationship');
accountRelationships.addQuery('reverse_relationship', false);
accountRelationships.addQuery('to_company', account);
accountRelationships.query();
while(accountRelationships.next())
relatedAccounts.push(accountRelationships.getValue('from_company'));
if (relatedAccounts.length > 0)
query = 'accountIN' + relatedAccounts.join(',');
//Accounts from account hierarchy (whole account hierarchy tree)
var accountPath = gr.getValue('account_path');
if(!gs.nil(accountPath)) {
if (!gs.nil(query))
query = query + '^ORaccount.account_pathSTARTSWITH' + accountPath.split('/')[0];
else
query = 'account.account_pathSTARTSWITH' + accountPath.split('/')[0];
}
}
//for invalid account or no match, make sure no contact is returned, is it right approach?
if (gs.nil(query))
query = 'sys_idISEMPTY';
return query;
},
getAssetContacts: function(asset) {
/* ReferenceQual for Asset Contact Relationships :-
1) My Account contacts
2) Contacts from Partner Account relationship
3) Contacts from "Contact Account relationship"
*/
var query = null;
var gr = new GlideRecord('alm_asset');
if (gr.get(asset)) {
var assetAccount = gr.getValue('account');
if (!gs.nil(assetAccount)) {
var accounts = [assetAccount]; //by default add asset.account
//get accounts from relationship
var ar = new GlideRecord('account_relationship');
ar.addQuery('reverse_relationship', false);
ar.addQuery('to_company', assetAccount);
ar.query();
while(ar.next())
accounts.push(ar.getValue('from_company'));
if (accounts.length > 0)
query = 'accountIN' + accounts.join(',');
//get contacts from account contact relationship
var contacts = [];
var ac = new GlideRecord('sn_customerservice_contact_relationship');
ac.addQuery('company', 'IN', accounts.join(','));
ac.query();
while(ac.next())
contacts.push(ac.getValue('contact'));
if (contacts.length > 0)
query = query + '^ORsys_idIN' + contacts.join(',');
}
}
//for invalid asset id or no match, make sure no contact is returned, is it right approach?
if (gs.nil(query))
query = 'sys_idISEMPTY';
return query;
},
getContactEncodedQueryBasedOnSO: function(account, reqServiceOrg, serviceOrg) {
var contactGr = new GlideRecord(global.CSMBaseConstants.CONTACT_TABLE);
if (gs.nil(account) && (!gs.nil(reqServiceOrg) || !gs.nil(serviceOrg))) {
var orgs = [];
if (!gs.nil(reqServiceOrg)) {
orgs.push(reqServiceOrg);
}
if (!gs.nil(serviceOrg) && orgs.indexOf(serviceOrg) < 0) {
orgs.push(serviceOrg);
}
contactGr.addEncodedQuery(new ServiceOrganizationUtil().getContactRefQualifierForSelectedSO(orgs));
}
return contactGr.getEncodedQuery();
},
/*
This method should be used only if contact access is not restricted for the given account.
Otherwise, use the method getCaseContactRefQualifier instead of this method.
*/
getCaseContacts : function(account, caseGr, isPortal) {
isPortal = gs.nil(isPortal) ? false : isPortal;
var contactGr = new GlideRecord(global.CSMBaseConstants.CONTACT_TABLE);
if (!gs.nil(caseGr)) {
if (this.isServiceOrgPluginActive()) {
var reqServiceOrg = !isPortal ? caseGr.requesting_service_organization : caseGr.variables.requesting_service_organization;
var serviceOrg = !isPortal ? caseGr.service_organization : caseGr.variables.service_organization;
contactGr.addEncodedQuery(this.getContactEncodedQueryBasedOnSO(account, reqServiceOrg, serviceOrg));
}
if (!isPortal) {
contactGr.addEncodedQuery(this.getCaseContactRefQualifier(caseGr));
return contactGr.getEncodedQuery();
}
}
var contacts = [];
var contactOr;
contactGr.addActiveQuery();
if (!gs.nil(account)) {
contactOr = contactGr.addQuery('account', account);
contacts = this.getContactsFromAccountRelationship(account.toString());
} else if (gs.hasRole('sn_customerservice.customer') && !gs.hasRole('admin')) {
var accounts = this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, true, false);
if (!gs.nil(accounts) && accounts.length > 0) {
contactOr = contactGr.addQuery('account', 'IN', accounts);
contacts = this.getContactsFromAccountRelationship(accounts);
}
}
if (!gs.nil(contacts) && contacts.length > 0) {
if (!gs.nil(contactOr)) {
contactOr.addOrCondition('sys_id', 'IN', contacts);
} else {
contactGr.addQuery('sys_id', 'IN', contacts);
}
}
return contactGr.getEncodedQuery();
},
/*
This method looks at the account, sold product, consumer of the case,
and returns encoded query for the list of contacts.
*/
getCaseContactRefQualifier: function(caseGr) {
if(gs.nil(caseGr)) return "";
var contactGr = new GlideRecord(CSMBaseConstants.CONTACT_TABLE);
var isInstallBasePluginActive = pm.isActive(CSMBaseConstants.INSTALL_BASE_PLUGIN);
if (!gs.nil(caseGr.account) && isInstallBasePluginActive && !gs.nil(caseGr.sold_product) &&
new global.Account().isRestrictedAccessAccount(caseGr.account)) {
/*
Install base plugin is active
sold product is not empty
Account is not empty and has restricted contact access.
*/
var installBaseUtil = new sn_install_base.InstallBaseUtil();
var spAuthAccounts = installBaseUtil.getSPAuthorizedAccounts(caseGr.sold_product);
contactGr.addActiveQuery();
var contactOr = contactGr.addQuery("account", caseGr.account);
var contactsFromCR = this.getContactsFromAccountRelationship(caseGr.account.toString());
var soldProductContactsWithFullAccess =
installBaseUtil.getSPContactsHavingFullAccessWithAccessRestriction(caseGr.sold_product);
var authContactsFromCR = [];
for (var i = 0; i < contactsFromCR.length; i++) {
if (soldProductContactsWithFullAccess.includes(contactsFromCR[i].toString())) {
authContactsFromCR.push(contactsFromCR[i].toString());
}
}
if (!gs.nil(authContactsFromCR) && authContactsFromCR.length > 0) {
contactOr.addOrCondition('sys_id', 'IN', authContactsFromCR);
}
if (spAuthAccounts.indexOf(caseGr.account.toString()) == -1) {
var qc = contactGr.addQuery('sys_id', 'IN', soldProductContactsWithFullAccess);
qc.addOrCondition("roles", "sn_customerservice.customer_admin");
}
} else {
contactGr.addEncodedQuery(this.getCaseContacts(caseGr.account));
}
if (!gs.nil(caseGr.consumer) && pm.isActive(CSMBaseConstants.B2B2C_PLUGIN))
contactGr.addEncodedQuery(new sn_acct_consumer.AccountConsumerUtil().getContactRefFromConsumer(caseGr.consumer));
if (gs.nil(caseGr.account) && (!gs.nil(caseGr.requesting_service_organization) || !gs.nil(caseGr.service_organization))) {
var orgs = [];
if (!gs.nil(caseGr.requesting_service_organization)) {
orgs.push(caseGr.requesting_service_organization);
}
if (!gs.nil(caseGr.service_organization)&& orgs.indexOf(caseGr.service_organization)<0) {
orgs.push(caseGr.service_organization);
}
contactGr.addEncodedQuery(new ServiceOrganizationUtil().getContactRefQualifierForSelectedSO(orgs));
}
return contactGr.getEncodedQuery();
},
/*
This method should be used only if contact access is not restricted for the given account.
Otherwise, use the method getCaseContactRefQualifier instead of this method.
*/
getCaseContactsSysIDs : function(account) {
var contacts = [];
var accounts;
var gr = new GlideRecord('customer_contact');
gr.addActiveQuery();
if (account) {
contacts = this.getContactsFromAccountRelationship(account.toString());
gr.addQuery('account', account);
} else if (gs.hasRole('sn_customerservice.customer') && !gs.hasRole('admin')) {
accounts = this.getAccessibleAccounts(gs.getUser().getCompanyID(), false, true, false);
contacts = this.getContactsFromAccountRelationship(accounts);
gr.addQuery('account', 'IN', accounts.join(','));
}
gr.query();
while(gr.next())
contacts.push(gr.getValue('sys_id'));
return contacts.join(',');
},
/*
This method looks at the account, sold product, household of the case,
and returns encoded query for the list of consumers.
*/
getCaseConsumerRefQualifier: function(caseGr) {
if(gs.nil(caseGr)) return "";
var consumerGr = new GlideRecord(CSMBaseConstants.CONSUMER_TABLE);
var isInstallBasePluginActive = pm.isActive(CSMBaseConstants.INSTALL_BASE_PLUGIN);
var isHouseholdPluginActive = pm.isActive(CSMBaseConstants.HOUSEHOLD_PLUGIN);
var isB2BConsumersPluginActive = pm.isActive(CSMBaseConstants.B2B2C_PLUGIN);
if (isInstallBasePluginActive && !gs.nil(caseGr.sold_product)) {
/*
Install base plugin is active
sold product is not empty
So restricted access for consumers can be applied here.
*/
var installBaseUtil = new sn_install_base.InstallBaseUtil();
var soldProductConsumersWithFullAccess =
installBaseUtil.getSPConsumersHavingFullAccess(caseGr.sold_product);
consumerGr.addEncodedQuery('sys_idIN' + soldProductConsumersWithFullAccess);
}
var isAddedHouseholdOrAccount = false;
if(isHouseholdPluginActive && !gs.nil(caseGr.household)){
consumerGr.addEncodedQuery(new sn_csm_household.HouseHoldUtils().getConsumersAvailableForHousehold(caseGr.household));
isAddedHouseholdOrAccount = true;
}
if (!gs.nil(caseGr.account) && isB2BConsumersPluginActive) {
consumerGr.addEncodedQuery(new sn_acct_consumer.AccountConsumerUtil().getConsumerRefFromAccount(caseGr.account));
isAddedHouseholdOrAccount = true;
}
if (!isAddedHouseholdOrAccount && (!gs.nil(caseGr.service_organization) || !gs.nil(caseGr.requesting_service_organization))) {
var orgs = [];
if (!gs.nil(caseGr.requesting_service_organization)) {
orgs.push(caseGr.requesting_service_organization);
}
if (!gs.nil(caseGr.service_organization) && orgs.indexOf(caseGr.service_organization)<0) {
orgs.push(caseGr.service_organization);
}
consumerGr.addEncodedQuery(new ServiceOrganizationUtil().getConsumerReferenceQualifier(orgs));
}
return consumerGr.getEncodedQuery();
},
/*
This method looks at the consumer of the case,
and returns encoded query for the list of accounts.
*/
getCaseAccountRefQualifier: function (caseGr){
if(gs.nil(caseGr)) return "";
var accountGr = new GlideRecord(CSMBaseConstants.ACCOUNT_TABLE);
accountGr.addQuery('customer', true);
if (!gs.nil(caseGr.consumer) && pm.isActive(CSMBaseConstants.B2B2C_PLUGIN)) {
accountGr.addEncodedQuery(new sn_acct_consumer.AccountConsumerUtil().getAccountRefFromConsumer(caseGr.consumer));
} else if (!gs.nil(caseGr.service_organization) || !gs.nil(caseGr.requesting_service_organization)) {
var orgs = [];
if (!gs.nil(caseGr.requesting_service_organization)) {
orgs.push(caseGr.requesting_service_organization);
}
if (!gs.nil(caseGr.service_organization) && orgs.indexOf(caseGr.service_organization)<0) {
orgs.push(caseGr.service_organization);
}
accountGr.addEncodedQuery(new ServiceOrganizationUtil().getAccountReferenceQualifier(orgs));
}
return accountGr.getEncodedQuery();
},
getServiceRefQualifierForCase: function(caseGR) {
if (gs.nil(caseGR))
return;
var encodedQuery = 'active=true^table='+caseGR.sys_class_name;
if (pm.isActive(global.CSMBaseConstants.SERVICE_ORGANIZATION_PLUGIN) && caseGR.service_organization) {
//get the services that are supported for the given products or service org
var services = new ServiceOrganizationUtil().getServicesAvailableForCase(caseGR);
//if it is empty, it will not fetch any records
if(!gs.nil(services))
encodedQuery += '^sys_idIN'+services;
}
return encodedQuery;
},
getCasePartnerContacts : function(partner, caseGr) {
var contacts = [];
var gr = new GlideRecord('customer_contact');
gr.addActiveQuery();
gr.addQuery('account',partner);
gr.query();
while(gr.next())
contacts.push(gr.getValue('sys_id'));
var partnerContacts ='';
partnerContacts = contacts.join(',');
var isInstallBasePluginActive = pm.isActive(CSMBaseConstants.INSTALL_BASE_PLUGIN);
if (!gs.nil(caseGr) && !gs.nil(caseGr.account) && isInstallBasePluginActive && new global.Account().isRestrictedAccessAccount(caseGr.account)) {
var installBaseUtil = new sn_install_base.InstallBaseUtil();
if(!gs.nil(caseGr.sold_product)) {
/*
Install base plugin is active
sold product is not empty
Account is not empty and has restricted contact access.
*/
var soldProductAuthorizedAccounts = installBaseUtil.getSPAuthorizedAccounts(caseGr.sold_product);
if(gs.nil(soldProductAuthorizedAccounts) || (soldProductAuthorizedAccounts.indexOf(caseGr.partner+'') == -1 )){
var soldProductAuthContacts = installBaseUtil.getSPContactsHavingFullAccessWithAccessRestriction(caseGr.sold_product);
partnerContacts = this.getPartnerContactsList(partner, soldProductAuthContacts);
}
return partnerContacts;
}
if(!gs.nil(caseGr.install_base)) {
/*
Install base plugin is active
install base is not empty
Account is not empty and has restricted contact access.
*/
var installBase = caseGr.install_base;
// If the current Install base is a child IB, then we will use its root IB to get the related parties.
if (!gs.nil(installBase.root)) {
installBase = installBase.root;
}
var installBaseAuthorizedAccounts = installBaseUtil.getIBAuthorizedAccounts(installBase);
if(gs.nil(installBaseAuthorizedAccounts) || (installBaseAuthorizedAccounts.indexOf(caseGr.partner+'') == -1 )){
var installBaseAuthContacts = installBaseUtil.getIBContactsHavingFullAccessWithAccessRestriction(installBase);
partnerContacts = this.getPartnerContactsList(partner, installBaseAuthContacts);
}
return partnerContacts;
}
}
return partnerContacts;
},
getPartnerContactsList : function(partner, authorizedContacts) {
var contacts = [];
var gr = new GlideRecord('customer_contact');
gr.addActiveQuery();
gr.addQuery('account',partner);
gr.addQuery("roles","sn_customerservice.partner_admin").addOrCondition('sys_id', 'IN', authorizedContacts);
gr.query();
while(gr.next()) {
contacts.push(gr.getValue('sys_id'));
}
return contacts.join(',');
},
getAccountsFromHierarchy : function(account, includeWholeTree) {
var accounts = new sn_customerservice.CSPortalUtil().getAccountsFromHierarchy(account, includeWholeTree);
return accounts;
},
getAccountsFromContactRelationship : function(contact) {
var accounts = new sn_customerservice.CSPortalUtil().getAccountsFromContactRelationship(contact);
return accounts;
},
getAccountsFromAccountRelationship : function(account) {
var accounts = new sn_customerservice.CSPortalUtil().getAccountsFromHierarchy(account);
return accounts;
},
getContactsFromAccountRelationship : function(account) {
var contacts = new sn_customerservice.CSPortalUtil().getContactsFromAccountRelationship(account);
return contacts;
},
isConnectCompatibility: function(){
return new GlideCollaborationCompatibility().getCompatibility();
},
checkCompatibility: function(browser){
var message = '';
if(typeof browser !== "undefined"){
if (browser['isMSIE']) {
if (browser.versionString <= 8) {
message = 'unsupported_browser';
}
}
} else {
var device = new GlideMobileExtensions().getDeviceType();
if (device == "m" || device == "mobile" || device == "tablet")
message = 'unsupported_device';
}
return message;
},
scopedGlideMobileExtensions: function(){
return GlideMobileExtensions();
},
scopedGlideCollaborationCompatibility: function(){
return GlideCollaborationCompatibility();
},
addRemoveRolesForContact: function(newRoles, contactId) {
if (gs.hasRole("sn_customerservice.customer_admin")) {
var availableRoles = gs.getProperty('sn_customerservice.contact_role_assignment','sn_customerservice.partner_admin,sn_customerservice.partner,sn_customerservice.customer_admin,sn_customerservice.customer');
var rolesToAdd = [];
newRoles = newRoles || this.getParameter("sysparm_add_roles");
contactId = contactId || this.getParameter("sysparm_contact_id");
this._deleteContactRoles(availableRoles, contactId);
if(!gs.nil(newRoles)) {
rolesToAdd = newRoles.split(',');
for(var k=0; k<rolesToAdd.length; k++)
this._addContactRole(rolesToAdd[k], contactId);
}
}
},
getChildAccounts: function() {
var id = this.getParameter('account_id');
var expanded_nodes = this.getParameter('expanded_nodes');
var expanded_nodes_arr = expanded_nodes.split(',');
var expanded_nodes_map = {};
for (var e_node in expanded_nodes_arr) {
expanded_nodes_map[expanded_nodes_arr[e_node]] = true;
}
var gr = new GlideRecordSecure('customer_account');
gr.addQuery('account_parent', id);
gr.orderBy('account_code');
gr.query();
var accountItems = [];
var childrenCounts = {};
while(gr.next()) {
var accountItem = {};
accountItem.sys_id = gr.getValue('sys_id');
accountItem.label = gr.getValue('name')+" - "+gr.getValue('number');
accountItems.push(accountItem);
childrenCounts[gr.getValue('sys_id')] = -1;
}
var countgr = new GlideAggregate('customer_account');
countgr.addAggregate('COUNT', 'account_parent');
countgr.addQuery('account_parent', 'IN', Object.keys(childrenCounts).join());
countgr.query();
while(countgr.next()) {
childrenCounts[countgr.getValue('account_parent')] = countgr.getAggregate('COUNT', 'account_parent');
}
for(var i = 0; i < accountItems.length; i++) {
if(expanded_nodes_map[accountItems[i].sys_id] == true){
this._getChildAccountItems(accountItems[i], childrenCounts);
}
}
for(var j = 0; j < accountItems.length; j++) {
if(expanded_nodes_map[accountItems[j].sys_id] != true){
this._getChildAccountItems(accountItems[j], childrenCounts);
}
}
},
_getChildAccountItems: function(accountItem, childrenCounts) {
item = this.newItem();
item.setAttribute('sys_id', accountItem.sys_id);
item.setAttribute('label', accountItem.label);
if(childrenCounts[accountItem.sys_id] < 1) {
item.setAttribute('has_children', false);
} else {
item.setAttribute('has_children', true);
}
},
/**
* Get login user consumer sys_id
*/
getConsumerId: function(){
var consumer;
var key = "consumer_id_" + gs.getUserID();
consumer = gs.getSession().getProperty(key);
if (consumer == "NIL" || gs.nil(consumer)) {
var gr = new GlideRecord("csm_consumer");
gr.addQuery('user',gs.getUserID());
gr._skip_before_query_filter = true;
gr.query();
if(gr.next())
consumer = gr.getUniqueValue();
gs.getSession().putProperty(key, gs.nil(consumer) ? 'NIL' : consumer);
}
return consumer == 'NIL' ? null : consumer;
},
/**
* param1 - csm_consumer sys_id
* returns - true if the consumer is active, false otherwise
*/
isActiveConsumer: function(consumerId) {
var gr = new GlideRecord("csm_consumer");
gr.addQuery('sys_id', consumerId);
gr.addQuery('active', 'true');
gr.setLimit(1);
gr.setWorkflow(false);
gr.query();
return gr.hasNext();
},
/**
* Get login user consumer record, return null if consumer record not found for login user
*/
getConsumerRecord: function(){
var gr = new GlideRecord("csm_consumer");
if (gr.get(this.getConsumerId()))
return gr;
return null;
},
/**
* param1 - consumer sys_id
* return - consumer_user sys_id
*/
getConsumerUserFromConsumer: function(consumerId) {
var consumerRecord = new GlideRecord('csm_consumer');
consumerRecord.setWorkflow(false);
consumerRecord.get(consumerId);
return consumerRecord.user + '';
},
verifyCaptcha: function(grc) {
try {
if(GlideUtil.isDeveloperInstance() || (gs.getProperty('sn_customerservice.captchaEnabled', 'true') == 'false'))
return true;
else if(grc){
// Create REST message to check the passed token with Google recaptcha service:
/* eslint-disable no-undef */
var r = new sn_ws.RESTMessageV2();
/* eslint-disable no-undef */
r.setHttpMethod('post');
r.setEndpoint('https://www.google.com/recaptcha/api/siteverify');
var secret= GlidePropertiesDB.get('google.captcha.secret');
r.setQueryParameter('secret', secret);
r.setQueryParameter('response', grc);
var response = r.execute();
var responseBody = response.getBody();
var parser = new JSONParser();
var parsed = parser.parse(responseBody);
return parsed.success;
}else
return false;
}
catch(ex) {
return false;
}
},
_deleteContactRoles: function(roles, contactId) {
var gr = new GlideRecord('sys_user_has_role');
gr.addQuery('role.name', 'IN', roles);
gr.addQuery('user', contactId);
gr.deleteMultiple();
},
_addContactRole: function(role, contactId) {
var gr = new GlideRecord('sys_user_has_role');
gr.initialize();
gr.user = contactId;
gr.role = role;
gr.insert();
},
_getKey: function(name) {
var key = name + "_" + gs.getUserID();
return key;
},
_getCaseSyncProp :function(){
return gs.getProperty("sn_customerservice.parent_child_ case_sync",false);
},
isChatConversation: function(conversation) {
return conversation.type === 'support' && conversation.table === 'chat_queue_entry';
},
isAgent: function() {
return gs.hasRole('sn_customerservice.consumer_agent') || gs.hasRole('sn_customerservice_agent');
},
showConfirmationDialog :function(){
var canSync =this._getCaseSyncProp();
var modifiedfields= this.getParameter('sysparm_modifiedfields');
modifiedfields=JSON.parse(modifiedfields);
if(canSync == 'true')
{
//Additional Check to see if the Record is eligible for Synching
var sys_id = this.getParameter("sysparm_parent_sysid");
var parentGr = new GlideRecord("sn_customerservice_case");
parentGr.get(sys_id);
var syncHelper = new sn_customerservice.CSCaseSyncHelper();
syncEnabled = syncHelper.isCaseSyncEnabled(parentGr);
if(syncEnabled){
var childRec = new GlideRecord("sn_customerservice_case");
childRec.addQuery("parent", sys_id);
childRec.query();
if (childRec.next()){
var field_list= gs.getProperty('sn_customerservice.case_fields_to_sync','').split(',');
for(var i=0; i<field_list.length;i++){
var field_name="sn_customerservice_case."+field_list[i].trim();
if(field_name in modifiedfields){
return true;
}
}
}
}
}
return false;
},
//Method to check access to fields under Related Records section on case form
hasAccessToRelatedRecords:function(){
var hasAccess = false;
if(pm.isActive(CSMBaseConstants.CASE_DIGEST_PLUGIN)){
var caseDigest = new sn_csm_case_digest.CaseDigest();
var hasPCRAccess = caseDigest.hasAccessToPCR();
var hasCASAccess = caseDigest.hasAccessToCAS();
hasAccess = hasPCRAccess || hasCASAccess;
}
//return true if there is access to any one of the fields
return hasAccess;
},
filterOnAccountAndProduct: function(currentRec) {
var refQualifier = '';
// account and consumer are mutually exclusive.
if (!currentRec.account.nil())
refQualifier = 'account=' + currentRec.account;
else if (!currentRec.consumer.nil())
refQualifier = 'consumer=' + currentRec.consumer;
if (!currentRec.product.nil())
refQualifier = refQualifier + (refQualifier.length > 0 ? '^' : '') +
'product=' + currentRec.product;
return refQualifier;
},
populateEntitlement : function(caseGr) {
var entitlement = this.getFirstEntitlement(caseGr);
if(!gs.nil(entitlement)) {
caseGr.entitlement = entitlement;
caseGr.update();
}
},
/*
* Get Project Task Details
*/
getProjectTaskDetails: function() {
var result = {};
var projectTaskId = this.getParameter('sysparm_projectTask');
if(!gs.nil(projectTaskId)){
var projectGr = new GlideRecord(sn_csm_ppm.CSMProjectManagementConstants.PROJECT_TASK_TABLE);
projectGr.get(projectTaskId);
if (!projectGr.canRead())
return;
result.projectValue = projectGr.sub_tree_root+'';
result.projectDisplayValue = projectGr.project_name+'';
result.accountValue = projectGr.project_account+'';
result.accountDisplayValue = projectGr.sub_tree_root.account.getDisplayValue();
return JSON.stringify(result);
}
},
isCMDBService: function() {
var sys_id = this.getParameter("sysparm_sys_id");
var result = this.getDocument().createElement("result");
this.getRootElement().appendChild(result);
var gr = new GlideRecordSecure("cmdb_ci");
if (!gr.get(sys_id)) {
result.setAttribute("error", "NOT_FOUND");
return;
}
var item = this.getDocument().createElement("item");
if(gr.instanceOf('cmdb_ci_service') && !gr.instanceOf('cmdb_ci_service_group'))
item.setAttribute("isService", true);
else
item.setAttribute("isService", false);
result.appendChild(item);
},
/*
* Attaches <result><item accountRestricted='${value}'></item></result> to the root xml element
* ${value} = 'true' if restrict_contact_access for the account 'sysparm_account' is set to true
* 'false' otherwise
*/
isRestrictedAccount: function() {
var account = this.getParameter('sysparm_account');
var result = this.getDocument().createElement('result');
this.getRootElement().appendChild(result);
var item = this.getDocument().createElement('item');
item.setAttribute('accountRestricted', new global.Account().isRestrictedAccessAccount(account) + '');
result.appendChild(item);
},
/* getEncodedQueryForEntity - return encoded query string
parameters : table - this is the table name on which the encode query is built
referenceField - the field name to be appeneded throughout the query
encodedQuery - the query that needs to be reconstructed
How to use :
getEncodedQueryForEntity('customer_account', 'account', 'nameLikeBoxeo^cityISCanada')
output : account.nameLikeBoxeo^account.cityISCanada
*/
getEncodedQueryForEntity: function(table, referenceField, encodedQuery) {
if (gs.nil(table) || gs.nil(referenceField) || gs.nil(encodedQuery))
return;
var queryString = new GlideQueryString(table, encodedQuery);
queryString.deserialize();
var terms = queryString.getTerms();
var appendedQuery;
var index;
var numberOfQueryStrs = terms.size();
for (index = 0; index < numberOfQueryStrs; index++) {
var term = terms.get(index);
if (gs.nil(appendedQuery)) {
appendedQuery = referenceField + "." + term.getTerm();
} else {
switch (true) {
case (term.isOR()):
appendedQuery = appendedQuery + "^OR" + referenceField + "." + term.getTerm();
break;
case (term.isNewQuery()):
appendedQuery = appendedQuery + "^NQ" + referenceField + "." + term.getTerm();
break;
case (term.isEndQuery()):
continue;
default:
appendedQuery = appendedQuery + "^" + referenceField + "." + term.getTerm();
}
}
}
return appendedQuery;
},
checkACLScript: function(current,root_rule){
var sm = GlideSecurityManager.get();
var checkMe = 'record/' + root_rule + '/write';
return sm.hasRightsTo(checkMe, current);
},
isProposeSolnUIActionValid: function(){
if((current.major_case_state != 'accepted' && (gs.hasRole("sn_esm_agent") || gs.hasRole('sn_csm_ocs.ext_agent') || gs.hasRole('sn_esm_location_agent') || gs.hasRole('sn_customerservice.relationship_agent'))) || gs.hasRole("sn_majorissue_mgt.major_issue_manager"))
return true;
return false;
},
getShowHTMLProperty: function(){
return gs.getProperty(CSMBaseConstants.CASE_DESCRIPTION_SHOW_HTML, false) == 'true';
},
getAssociatedInstallBasesGrForCase: function(caseSysId){
var installBasesGr = new GlideRecordSecure(CSMBaseConstants.AFFECTED_INSTALL_BASE_TABLE);
installBasesGr.addQuery('csm_case', caseSysId);
installBasesGr.query();
return installBasesGr;
},
getRelatedCaseTasksGrForCase: function(caseSysId){
var relatedCaseTasksGr = new GlideRecordSecure(CSMBaseConstants.CASE_TASK_TABLE);
relatedCaseTasksGr.addQuery('parent', caseSysId);
relatedCaseTasksGr.addQuery('visible_to_customer', 'true');
relatedCaseTasksGr.query();
return relatedCaseTasksGr;
},
getRelatedProjectTasksGrForCase: function(sysId){
var relatedProjectTasksGr = new GlideRecordSecure(CSMBaseConstants.CASE_TABLE);
relatedProjectTasksGr.addQuery('project_task', sysId);
relatedProjectTasksGr.query();
return relatedProjectTasksGr;
},
getStandardTicketTabVisibility: function(caseGr, tabName){
var sysId = caseGr.sys_id + '';
switch(tabName){
case CSMBaseConstants.INSTALL_BASE_TAB:
var installBases = this.getAssociatedInstallBasesGrForCase(sysId);
while(installBases.next()){
if (installBases.getValue("install_base_item"))
return sysId;
}
break;
case CSMBaseConstants.RELATED_RECORDS_TAB:
if (caseGr.canRead()){
var relatedRecords = new sn_customerservice.CSMServiceManagementUtil().getRelatedRecordsAssociatedToCase(caseGr);
if (relatedRecords && Object.keys(relatedRecords).length !== 0){
if(relatedRecords.hasOwnProperty('problem') && relatedRecords['problem'])
return sysId;
if(relatedRecords.hasOwnProperty('change') && relatedRecords['change'])
return sysId;
if(relatedRecords.hasOwnProperty('requests') && relatedRecords['requests'])
return sysId;
if(relatedRecords.hasOwnProperty('project_change') && relatedRecords['project_change'])
return sysId;
if(relatedRecords.hasOwnProperty('issue') && relatedRecords['issue'])
return sysId;
}
}
break;
case CSMBaseConstants.RELATED_CASE_TASKS_TAB:
var relatedCaseTasksGr = this.getRelatedCaseTasksGrForCase(sysId);
if(relatedCaseTasksGr.hasNext()){
return sysId;
}
break;
case CSMBaseConstants.RELATED_PROJECT_TASKS_TAB:
var relatedProjectTasks = getRelatedProjectTasksGrForCase(sysId);
if(relatedProjectTasks.hasNext()){
return sysId;
}
break;
default:return null;
}
return null;
},
getExtensionPoints: function(epName) {
var eps = new GlideScriptedExtensionPoint().getExtensions(epName);
return eps;
},
getContactsFromContactRelationship: function(accounts) {
if (gs.nil(accounts) || !accounts.length) {
accounts = [this.getUserAccount()];
}
var contacts = [];
var ac = new GlideRecord(CSMBaseConstants.CONTACT_RELATIONSHIP);
ac.addQuery('company', 'IN', accounts.join(','));
ac.query();
while (ac.next())
contacts.push(ac.getValue('contact'));
return contacts;
},
getPartnerAccounts: function(account) {
account = account || this.getUserAccount();
var accounts = [];
var ar = new GlideRecord(CSMBaseConstants.ACCOUNT_RELATIONSHIP);
ar.addQuery('reverse_relationship', false);
ar.addQuery('to_company', account);
ar.query();
while (ar.next())
accounts.push(ar.getValue('from_company'));
return accounts;
},
getCustomerAccounts: function(account) {
account = account || this.getUserAccount();
var accounts = [];
var ar = new GlideRecord(CSMBaseConstants.ACCOUNT_RELATIONSHIP);
ar.addQuery('reverse_relationship', false);
ar.addQuery('from_company', account);
ar.query();
while (ar.next())
accounts.push(ar.getValue('to_company'));
return accounts;
},
setHomePagePreference: function(userID) {
var userPrefGr = new GlideRecord('sys_user_preference');
userPrefGr.initialize();
userPrefGr.setValue('user', userID);
userPrefGr.setValue('description', 'Default Home Page');
userPrefGr.setValue('name', 'my_home_navigation_page');
userPrefGr.setValue('value', 'sn_customerservice_case_list.do?sysparm_userpref_module=e69b84b97313001022139a1ee2f6a7e8&sysparm_query=active=true^assigned_to=javascript:getMyAssignments()^EQ&active=true^assigned_to=javascript:gs.user_id()');
userPrefGr.insert();
},
getNewUniqueUserName: function(current, firstName, lastName) {
current = current || {};
firstName = current.first_name || firstName || '';
lastName = current.last_name || lastName || '';
if (!firstName && !lastName)
return;
var USER_NAME_SEPARATOR = '.';
userName = ((firstName || '') + (firstName && lastName ? USER_NAME_SEPARATOR : '') + (lastName || '')).toLowerCase();
userName = userName.split(' ').join(USER_NAME_SEPARATOR);
var uniqueUserName = userName;
var counter = 0;
var isExist = this._isExistingUserID(uniqueUserName);
while (isExist) {
counter++;
uniqueUserName = userName + USER_NAME_SEPARATOR + counter;
isExist = this._isExistingUserID(uniqueUserName);
}
return uniqueUserName;
},
_isExistingUserID: function(user_name) {
var user = new GlideRecord(CSMBaseConstants.USER_TABLE);
user.addQuery("user_name", user_name);
user.setWorkflow(false);
user.query();
return user.hasNext();
},
populateResponsibilityFromType: function() {
var table = this.getParameter('sysparm_table');
var sysIds = this.getParameter('sysparm_sysIds');
var typeId = this.getParameter('sysparm_typeId');
if (gs.nil(table) || gs.nil(sysIds) || gs.nil(typeId))
return;
var typeGr = this.getRelatedPartyConfigGr(typeId);
if (gs.nil(typeGr))
return;
var responsibility = typeGr.default_responsibility + '';
var gr = new GlideRecordSecure(table);
if (!gr.isValid())
return;
gr.addQuery('sys_id', 'IN', sysIds);
gr.query();
while (gr.next()) {
gr.setValue('responsibility', responsibility);
gr.setValue('type', typeId);
gr.update();
}
},
getRelatedPartyConfigGr: function(sysId) {
if (gs.nil(sysId))
return;
var partyConfig = new GlideRecord(global.CSMBaseConstants.RELATED_PARTY_CONFIG_TABLE);
partyConfig.get(sysId);
if (partyConfig.canRead())
return partyConfig;
},
//checks if session user has global agent roles
checkIfUserHasGlobalFulfillerRoles: function() {
if (gs.hasRole("sn_esm_agent") || gs.hasRole("sn_csm_ocs.ext_agent"))
return true;
return false;
},
//first we check for other fulfiller roles, then we check for esm_location_agent and responsibility
checkIfLoggedInUserCanFulfillCase: function(caseGr){
if(this.checkIfUserHasGlobalFulfillerRoles() || gs.hasRole('sn_customerservice.relationship_agent'))
return true;
if(pm.isActive('com.snc.business_location')){
return new global.ServiceOrganizationUtil().isLoggedInLocationAgentFulfillerForCase(caseGr);
}
return false;
},
/*
* Fetch all the parents of a given account
*
* @return list of account sysids (Including the given account).
*/
getAllParentsOfAccount: function(account) {
var list = [];
var accountgr = new GlideRecord(global.CSMBaseConstants.ACCOUNT_TABLE);
accountgr.addQuery('sys_id', account);
accountgr.query();
while (accountgr.next()) {
list.push(account + '');
account = accountgr.account_parent;
accountgr = new GlideRecord(global.CSMBaseConstants.ACCOUNT_TABLE);
accountgr.addQuery('sys_id', account);
accountgr.query();
}
return list;
},
getCaseAccountRefQualifierBLSPPortal: function(variables) {
var accountGr = new GlideRecord(CSMBaseConstants.ACCOUNT_TABLE);
accountGr.addQuery('customer', true);
var orgs = [];
if (!gs.nil(variables.requesting_service_organization) || !gs.nil(variables.service_organization)) {
if (!gs.nil(variables.requesting_service_organization)) {
orgs.push(variables.requesting_service_organization);
}
if (!gs.nil(variables.service_organization) && orgs.indexOf(variables.service_organization) < 0) {
orgs.push(variables.service_organization);
}
accountGr.addEncodedQuery(new ServiceOrganizationUtil().getAccountReferenceQualifier(orgs));
}
return accountGr.getEncodedQuery();
},
/*
* Function which restricts the Tables which will be shown in the configuration
*/
getRelationshipTables: function() {
var result = [];
var relatedPartyTables = [global.CSMBaseConstants.CASE_RELATED_PARTY_TABLE];
if (this.isServiceOrganizationPluginActive())
relatedPartyTables.push(global.ServiceOrganizationConstants.SO_MEMBER_RESPONSIBILITY_TABLE);
if (this.isInstallBasePluginActive()) {
relatedPartyTables.push(global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY);
relatedPartyTables.push(global.CSMBaseConstants.INSTALL_BASE_RELATED_PARTY);
}
// Fetch the child tables
for (var i = 0; i < relatedPartyTables.length; i++) {
var extensions = new TableUtils(relatedPartyTables[i]).getAllExtensions();
for (var j = 0; j < extensions.size(); j++) {
result.push(extensions.get(j) + "");
}
}
return result;
},
/*
* Returns list of CSMRelationshipConstants access levels which together are to be considered as FULL access level
* FULL access will be considered implicitly with READ, WRITE or CREATE.
* Example,
* "Get all cases with READ access level" is same as "Get all cases with access level READ or FULL".
* "Get all cases with WRITE access level" is same as "Get all cases with access level WRITE or FULL".
*
* However,
* "Get all cases with FULL access level" does NOT mean "Get all cases with access level READ, WRITE and CREATE".
*/
getFullAccessLevelList: function() {
return [
global.CSMRelationshipConstants.ACCESS.READ,
global.CSMRelationshipConstants.ACCESS.WRITE,
global.CSMRelationshipConstants.ACCESS.CREATE
];
},
/*
* returns true if service organization plugin is active.
*/
isServiceOrganizationPluginActive: function() {
return GlidePluginManager.isActive(global.CSMBaseConstants.SERVICE_ORGANIZATION_PLUGIN);
},
/*
* returns true if install base plugin is active.
*/
isInstallBasePluginActive: function() {
return GlidePluginManager.isActive(global.CSMBaseConstants.INSTALL_BASE_PLUGIN);
},
/*
* returns true if domain support plugin is active.
*/
isDomainSupportPluginActive: function() {
return GlidePluginManager.isActive(global.CSMBaseConstants.DOMAIN_SUPPORT_PLUGIN);
},
getCaseConsumerRefQualifierBLSPPortal: function(variables) {
var consumerGr = new GlideRecord(CSMBaseConstants.CONSUMER_TABLE);
var orgs = [];
var pm = new GlidePluginManager();
if (pm.isActive('com.snc.service_organization')) {
if (!gs.nil(variables.requesting_service_organization) || !gs.nil(variables.service_organization)) {
if (!gs.nil(variables.requesting_service_organization)) {
orgs.push(variables.requesting_service_organization);
}
if (!gs.nil(variables.service_organization) && orgs.indexOf(variables.service_organization) < 0) {
orgs.push(variables.service_organization);
}
consumerGr.addEncodedQuery(new ServiceOrganizationUtil().getConsumerReferenceQualifier(orgs));
}
}
return consumerGr.getEncodedQuery();
},
type: 'CSManagementUtils'
});
Sys ID
d5acd7d2d7123100b7490ee60e6103f4