Name

global.GlobalServiceCatalogUtil

Description

Global util for service catalog to talk to global script includes. This Util is open for any scope. Not opened for extension/modification

Script

var GlobalServiceCatalogUtil = Class.create();
GlobalServiceCatalogUtil.prototype = {
  initialize: function() {},
  _mergeScriptsInPolicies: function(policies, scripts) {
      for (var i = 0; i < policies.length; i++) {
          var policy = policies[i];
          var name = policy['script_true'];
          if (name) {
              policy['script_true'] = {
                  'name': name,
                  'script': scripts[name]
              };
          }
          name = policy['script_false'];
          if (name) {
              policy['script_false'] = {
                  'name': name,
                  'script': scripts[name]
              };
          }
      }
      return policies;
  },

  getCatalogUIPolicy: function(item, sets) {
      var builder = new CatalogUIPolicyBuilder();

      var gr = new GlideRecordSecure('catalog_ui_policy');
      gr.addActiveQuery();
      gr.addQuery('applies_to', 'item');
      gr.addQuery('catalog_item', item);
      gr.addQuery('applies_catalog', true);
      gr.orderBy('order');
      gr.query();
      builder.process(gr);

      if (sets) {
          sets = sets.split(',');
          for (var i = 0; i < sets.length; i++) {
              gr = new GlideRecord('catalog_ui_policy');
              gr.addActiveQuery();
              gr.addQuery('applies_to', 'set');
              gr.addQuery('catalog_item', item);
              gr.addQuery('applies_catalog', true);
              gr.orderBy('order');
              gr.query();
              builder.process(gr);
          }
      }
      builder.updateValues();
      return this._mergeScriptsInPolicies(builder.getFieldPolicies(), builder.getScripts());
  },

  stripScriptComments: function(script) {
      var sc = new global.JavaScriptCommentStripper().stripComments(script);
      sc.replaceAll('\r', '');
      return sc;

  },

  isWishListEnabled: function(catalogId) {
      //Checks if an item in a catalog can be added to wish list
      return new sn_sc.Catalog(catalogId).isWishlistEnabled();
  },

  getRequestForSysID: function(parentTable, parentID) {
      //returns the requestedForSysID for the given parentID and parentTable configuration
      var requestForSysID = '';
      if (JSUtil.notNil(parentID) && JSUtil.notNil(parentTable)) {
          var requestForField;
          var reqMapGR = new GlideRecord('request_parent_mapping');
          reqMapGR.addQuery('parent_table', parentTable);
          reqMapGR.query();
          if (reqMapGR.next()) {
              var recFound;
              requestForField = reqMapGR.requested_for_field;
              var parentRecGR = new GlideRecord(parentTable);
              if (parentRecGR.isValid()) {
                  recFound = parentRecGR.get(parentID);
                  if (recFound)
                      requestForSysID = parentRecGR.getValue(requestForField);
              }
          }
      }
      return requestForSysID;
  },

  getCatItemIconAltText: function(catItem) {
      //returns the catalog item icon's alt text
      var alt_text = '';
      if (JSUtil.notNil(catItem)) {
          alt_text = catItem.getName();
          var item_short_desc = catItem.getShortDescription();
          if (JSUtil.notNil(item_short_desc))
              alt_text = item_short_desc;
      }
      return alt_text;
  },

  isCatItemTable: function(tableName) {
      return GlideDBObjectManager.get().isInstanceOf(tableName, 'sc_cat_item');
  },

  getMaxRowCountMultiRowVS: function(variableSetId, srcTable, srcId) {
      return GlideappScriptHelper.getMaxRowCountMultiRowVS(variableSetId, srcTable, srcId);
  },

	canReadApprovingRecord: function(approvingRecordId) {
  	if (JSUtil.nil(approvingRecordId))
  		return false;
  	var approvalGr = new GlideRecord('sysapproval_approver');
  	approvalGr.addQuery('sysapproval', approvingRecordId);
  	approvalGr.query();

  	while(approvalGr.next()) {
  		if (new ApprovalDelegationUtil().isMyApproval(approvalGr))
  			return true;
  	}
  	return false;
  },

  getVariablesForTask: function( /*task GR*/ gr, /*with MRVS*/ withMRVS) {
      var result = [];
      if (!gr.isValidRecord())
  		return result;
  	
      var variables = gr.variables.getElements(withMRVS);
  	for (var i = 0; i < variables.length; i++) {
  		var variable = variables[i];
  		if (!variable.canRead())
  			continue;
  		
  		if (variable.isMultiRow()) {
  			var rows = variable.getRows();
  			var table_variable = [];
  			for (var j = 0; j < rows.length; j++) {
  				var row = rows[j];
  				var cells = row.getCells();
  				var column = [];
  				for (var k = 0; k < cells.length; k++) {
  					var cell = cells[k];
  					if (cell != null && cell.isValidCell())
  						column.push({
  							name: cell.getName(),
  							label: cell.getLabel(),
  							display_value: cell.getCellDisplayValue()
  						});
  					else
  						gs.log("GlobalServiceCatalogUtil: Invalid cell in table variable row");
  				}
  				table_variable.push(column);
  			}
  			
  			if (rows.length == 0)
  				continue;
  			
  			result.push({
  				label: variable.getLabel(),
  				visible_summary: true,
  				multi_row: true,
  				table_variable: table_variable,
  				name: variable.getName()
  			});

  		} else {
  			var question = variable.getQuestion();
  			if (!question.getValue() || question.getValue() == '')
  				continue;
  			
  			if (question.getType() =='33')
  				var sysAttachment = new GlideSysAttachment(question.getValue());
  			
  			result.push({
  				label: variable.getLabel(),
  				display_value: question.getDisplayValue(),
  				visible_summary: question.isVisibleSummary(),
  				multi_row: false,
  				type: question.getType(),
  				value : question.getValue(),
  				state : question.getType() =='33' && !GlideStringUtil.nil(question.getValue()) && sysAttachment.exists() ? sysAttachment.getState() : undefined
  			});
  		}
  	}
  	return result;
  },
  
  getRelativeDuration: function(args) {
  	var duration = new global.DurationCalculator();
  	duration.setSchedule(args["schedule"]);
  	duration.setTimeZone(args["timezone"]);
  	duration.calcRelativeDuration(args["relative_duration"]);
  	return duration.getEndDateTime();
  },

  /**
  * data = {
  *	  sysparm_id: <catalog_item_sys_id>,
  *	  sysparm_quantity: <quantity>,
  *	  variables: {
  *	    variable_name: <value>
  *	  },
  *	}
  *
  */
  getCatalogItemPrice: function(data) {
  	var priceGenerator = new global.GlideappCatalogPriceGenerator(data);
  	var result = {};
  	result.price = priceGenerator.getPrice();
  	result.price_display = priceGenerator.getDisplayPrice();
  	
  	result.recurring_price = priceGenerator.getRecurringPrice();
  	result.recurring_price_display = priceGenerator.getRecurringDisplayPrice();
  	result.recurring_frequency = priceGenerator.getRecurringFrequency();
  	
  	result.price_subtotal = priceGenerator.getTotal();
  	result.price_subtotal_display = priceGenerator.getDisplayTotalForSession();
  	
  	result.recurring_price_subtotal = priceGenerator.getRecurringTotal();
  	result.recurring_price_subtotal_display = priceGenerator.getRecurringDisplayTotalForSession();
  	
  	return result;
  },

  isMultiRowVariableSet : function(variableSetSysId) {
  	if(!GlideStringUtil.isEligibleSysID(variableSetSysId))
  		return false;
  	var gr = new GlideRecord("item_option_new_set");
  	gr.get(variableSetSysId);
  	if(gr.isValid() && gr.getValue('type') == 'one_to_many')
  		return true;
  	return false;
  },

  findCatItemsForSpLogs : function(cartItemGr) {
  	//Seperating order guides from cart items
  	var items = [];
  	var orderGuideObj = {};
  	while(cartItemGr.next()) {
  		var orderGuideKey = cartItemGr.getValue('order_guide');
  		if(orderGuideKey != null) {
  			if(!orderGuideObj.hasOwnProperty(orderGuideKey))
  				orderGuideObj[orderGuideKey]='';
  		} else
  			items.push(cartItemGr.getValue('cat_item'));
  	}
  	return items.concat(Object.keys(orderGuideObj));
  },
  
  logRequestedCatItems : function(requestedCatItems, portalId) {
  	for (var i = 0; i < requestedCatItems.length; i++) {
  		var catItem = new sn_sc.CatItem(requestedCatItems[i]).getItemSummary(true);
  		GlideSPScriptable.logStat('Cat Item Request', catItem.sys_class_name, catItem.sys_id, catItem.name, portalId);
  	}
  },

  getRequestedFor: function(parentParams) {
  	var gr = new GlideRecord('request_parent_mapping');
  	gr.setWorkflow(false);
  	var requested_for = {};
  	if (gr.get('parent_table', parentParams.sysparm_parent_table)) {
  		var parent = new GlideRecord(parentParams.sysparm_parent_table);
  		parent.get(parentParams.sysparm_parent_sys_id);
  		if (JSUtil.notNil(parent.getValue(gr.requested_for_field))) {
  			requested_for.id = parent.getValue(gr.requested_for_field);
  			requested_for.displayValue = parent.getDisplayValue(gr.requested_for_field);
  		}
  	}
  	return requested_for;
  },

  //Reference Qualifer for Set field in sc_template_detail
  getMRVSVariableSetsForTemplate: function(templateGr) {
      if (!templateGr || !templateGr.cat_item)
          return 'sys_id=';

      var ans = [];
      var gr = new GlideRecord('io_set_item');
      gr.addQuery('sc_cat_item', templateGr.cat_item);
      gr.addNotNullQuery('variable_set');
      gr.addQuery('variable_set.type', 'one_to_many');
      gr.setWorkflow(false);
      gr.query();
      while (gr.next())
          ans.push(gr.getValue('variable_set'));

      return 'sys_idIN' + ans.join();
  },

  //Reference Qualifer for Question field in sc_template_detail
  getFlatQuestionsForTemplate: function(templateGr) {
      if (!templateGr || !templateGr.cat_item)
          return 'sys_id=';

      var ans = [];
      var sets = [];
      var gr = new GlideRecord('io_set_item');
      gr.addQuery('sc_cat_item', templateGr.cat_item);
      gr.addNotNullQuery('variable_set');
      gr.addQuery('variable_set.type', 'one_to_one');
      gr.setWorkflow(false);
      gr.query();
      while (gr.next())
          sets.push(gr.getValue('variable_set'));

      var qGr = new GlideRecord('item_option_new');
      qGr.addActiveQuery();
      var query = qGr.addQuery('cat_item', templateGr.cat_item);
      if (sets.length > 0)
          query.addOrCondition('variable_set', sets);
      qGr.setWorkflow(false);
      qGr.query();

      while (qGr.next())
          ans.push(qGr.getUniqueValue());

      return 'sys_idIN' + ans.join();

  },

  canUseTemplate: function(templateId){
  	if (JSUtil.notNil(templateId)) {
  		var template = new sn_sc.CatalogTemplate(templateId);
  		var producer = template.getProducer();
  		var producerItem = new sn_sc.CatItem(producer);
  		if (JSUtil.notNil(producerItem))
  			return producerItem.canView() && template.canUse(); 
  	}
  	return false;	
  },

  canEditTemplate: function(templateId) {
  	if (JSUtil.notNil(templateId)) {
  		var template = new sn_sc.CatalogTemplate(templateId);
  		var producer = template.getProducer();
  		return this._hasTemplateManagerRoleForItem(producer);
  	}
  	return false;	
  },

  getTemplateReadAccess: function(templateId){
  	var template = new sn_sc.CatalogTemplate(templateId);
  	if (JSUtil.notNil(template)) {
  		var producer = template.getProducer();
  		return (this.canUseTemplate(templateId) || this._hasTemplateManagerRoleForItem(producer));
  	}
  	return false;
  },

  _hasTemplateManagerRoleForItem: function(itemId) {
  	if (JSUtil.notNil(itemId)) {
  		var item = new sn_sc.CatItem(itemId);
  		return item.hasTemplateManagerRole();
  	}

  	return false;
  },

  getCatalogBuilderEditorPersonaItemAccess: function(itemId, setId) {
  	if (JSUtil.nil(itemId))
  		return JSUtil.nil(setId);

  	var catalogItem = new sn_sc.CatItem(itemId);
  	return catalogItem.isOwner() || this._allowItemAccessBasedOnTemplateAccess(catalogItem);
  },

  getCatalogBuilderEditorPersonaPolicyActionAccess: function(policyActionGr) {
      if (JSUtil.nil(policyActionGr))
          return false;

      var policyReferenceElement = policyActionGr.getElement('ui_policy');
      if (JSUtil.notNil(policyReferenceElement)) {
          var policyRecord = policyReferenceElement.getRefRecord();
          return JSUtil.nil(policyRecord)? false : this.getCatalogBuilderEditorPersonaItemAccess(policyRecord.getValue('catalog_item'), policyRecord.getValue('variable_set'));
      }
  	return false;
  },
  
  getCatalogBuilderEditorPersonaQuestionChoiceAccess: function(questionChoiceGr) {
  	if (JSUtil.nil(questionChoiceGr))
  		return false;

  	var itemOptionElement = questionChoiceGr.getElement('question');
  	if (JSUtil.notNil(itemOptionElement)) {
  		var itemOptionRecord = itemOptionElement.getRefRecord();
  		return JSUtil.nil(itemOptionRecord) ? false : this.getCatalogBuilderEditorPersonaItemAccess(itemOptionRecord.getValue('cat_item'), itemOptionRecord.getValue('variable_set'));
  	}
  	return false;
  },

  _allowItemAccessBasedOnTemplateAccess: function(catalogItem) {
      return (gs.getProperty('glide.sc.builder.template_access', 'false') == 'true') && this.canUseTemplate(catalogItem.getTemplateUsed());
  },
  
  getCatalogWizardOrigin: function() {
  	return GlideappScriptHelper.getCatalogWizardOrigin();
  },
  
  isVARenderTypeAvailableForItem: function(catalogItemId) {
  	var gr = new GlideRecord('catalog_item_analytics');
  	return gr.get('catalog_item', catalogItemId);
  },
  
  generateDynamicValueConfigsForCatItem: function(catItemId) {
  	var catItem = new sn_sc.CatItem(catItemId);
  	var questions = catItem.getVariables(false, true, false);

  	return this._generateDynamicValueConfigs(questions);
  },

  generateDynamicValueConfigsForVariableSet: function(variableSetId) {
  	var variableSet = new sn_sc.TableVariableSetJS(variableSetId);
  	variableSet.load();
  	var questions = variableSet.getFlatQuestions();

  	return this._generateDynamicValueConfigs(questions);
  },

  _generateDynamicValueConfigs : function (questions) {
  	var dynamicValueSupportedFieldsMap = {};
      for (var i = 0; i < questions.length; i++) {
          var question = questions[i];
          if (question.type == '8' || question.type == '31')
              dynamicValueSupportedFieldsMap[question.id] = question;
      }

      var dynamicVariableConfigList = [];

      var targetFieldsByTriggerField = {};

      for (var i = 0; i < questions.length; i++) {
          var questionSummary = questions[i];
          if (questionSummary.dynamic_value_field && questionSummary.dynamic_value_dot_walk_path) {

              var triggerField = questionSummary.dynamic_value_field;

  			var targetField = questionSummary.id;

              if (targetFieldsByTriggerField[triggerField])
  				targetFieldsByTriggerField[triggerField].push(targetField);
              else {
  				targetFieldsByTriggerField[triggerField] = [];
  				targetFieldsByTriggerField[triggerField].push(targetField);
              }
          }
      }

      for (var triggerField in targetFieldsByTriggerField) {
  		if (dynamicValueSupportedFieldsMap[triggerField]) {
  			var dynamicVariableConfig = {};
  			dynamicVariableConfig['dynamicTriggerField'] = triggerField;
  			dynamicVariableConfig['dynamicTargetFields'] = JSON.stringify(targetFieldsByTriggerField[triggerField]);
  			dynamicVariableConfigList.push(dynamicVariableConfig);
  		}
      }

      return dynamicVariableConfigList;
  },

  getEngagementChannel: function(engagementChannelOptions) {
  	var engagementChannel = '';
  	if (engagementChannelOptions.native_mobile)
  		engagementChannel = 'mobile';
  	else if (engagementChannelOptions.isServiceWorkspace)
  		engagementChannel = 'workspace';
  	else {
  		var portalGr = $sp.getPortalRecord();
  		engagementChannel = portalGr.getDisplayValue('sys_id') === '70cd9f3b734b13001fdae9c54cf6a72f' ? 'ec' : 'sp';
  	}
  	return engagementChannel;
  },

  type: 'GlobalServiceCatalogUtil'
};

Sys ID

c22bf956c3330200d68d3b0ac3d3aeb1

Offical Documentation

Official Docs: