Name

sn_install_base.SoldProductAndInstallBaseUtil

Description

Util class for sold product and install base records.

Script

var SoldProductAndInstallBaseUtil = Class.create();
SoldProductAndInstallBaseUtil.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
  getSoldProductRelatedFields: function() {
      var soldProductId = this.getParameter('sysparm_soldProductId') || '';
      var item = this.newItem();
      var gr = new GlideRecord("sn_install_base_sold_product");
      gr.addQuery('sys_id', soldProductId);
      gr.query();

      if (gr.next()) {
          item.setAttribute('account', gr.account);
          item.setAttribute('consumer', gr.consumer);
          item.setAttribute('product', gr.product);
          if (this.isSOActivated()) {
              item.setAttribute('service_organization', gr.service_organization);
          }
          if (gs.tableExists('csm_household_member'))
              item.setAttribute('household', gr.household);
      }
  },

  getDeployedItemRelatedFields: function() {
      var deployedItemId = this.getParameter('sysparm_deployedItemId') || '';
      var item = this.newItem();
      var gr = new GlideRecord("sn_install_base_item");
      gr.addQuery('sys_id', deployedItemId);
      gr.query();

      if (gr.next()) {
          item.setAttribute('account', gr.account);
          item.setAttribute('consumer', gr.consumer);
      }
  },

  isSoldProductPresentInM2M: function(soldProduct, contract, dateAdded, dateRemoved) {
      var coveredSoldProductGr = new GlideRecord("sn_install_base_m2m_contract_sold_product");
      coveredSoldProductGr.addQuery('contract', contract);
      coveredSoldProductGr.addQuery('sold_product', soldProduct);
      coveredSoldProductGr.query();

      while (coveredSoldProductGr.next()) {
          var added = (new GlideDateTime(coveredSoldProductGr.getValue('added'))).getNumericValue();
          var removed = (new GlideDateTime(coveredSoldProductGr.getValue('removed'))).getNumericValue();
          if ((added == 0 && removed == 0) || (dateAdded == added && dateRemoved == removed))
              return true;
      }
      return false;
  },
  insertChildSoldItem: function() {
      var sysIdList = this.getParameter('sysparm_sysIdList') || '';
      var contractSysId = this.getParameter('sysparm_contractSysId') || '';
      var sysId = sysIdList.split(',');

      for (var i = 0; i < sysId.length; i++) {
          var id = sysId[i];
          var gr = new GlideRecord('sn_install_base_m2m_contract_sold_product');
          if (!gr.get(id))
              continue;

          var soldProduct = gr.sold_product;
          var soldProductGr = new GlideRecord('sn_install_base_sold_product');
          soldProductGr.addQuery('parent_sold_product', soldProduct);
          soldProductGr.query();

          var added = (new GlideDateTime(gr.getValue('added'))).getNumericValue();
          var removed = (new GlideDateTime(gr.getValue('removed'))).getNumericValue();
          while (soldProductGr.getRowCount() > 0) {
              var child = [];
              /* Add all child sold product */
              while (soldProductGr.next()) {
                  child.push(soldProductGr.sys_id + '');
                  /* only insert if exact record is not there */
                  if (!this.isSoldProductPresentInM2M(soldProductGr.sys_id, contractSysId, added, removed)) {
                      var coveredSoldProductGr = new GlideRecord("sn_install_base_m2m_contract_sold_product");
                      if (!coveredSoldProductGr.canCreate())
                          continue;
                      coveredSoldProductGr.initialize();
                      coveredSoldProductGr.contract = contractSysId;
                      coveredSoldProductGr.sold_product = soldProductGr.sys_id;
                      coveredSoldProductGr.added = gr.added;
                      coveredSoldProductGr.removed = gr.removed;
                      coveredSoldProductGr.insert();
                  }
              }
              soldProductGr = new GlideRecord('sn_install_base_sold_product');
              soldProductGr.addQuery('parent_sold_product', 'IN', child);
              soldProductGr.query();
          }
      }
  },

  //Helper method to check whether a given record is present in Sold Product Covered table or not
  isInstallBaseItemPresentInM2M: function(installbaseitem, contract, dateAdded, dateRemoved) {
      var coveredInstallBaseItemGr = new GlideRecordSecure(global.CSMBaseConstants.M2M_CONTRACT_SOLD_PRODUCT);
      coveredInstallBaseItemGr.addQuery('contract', contract);
      coveredInstallBaseItemGr.addQuery('install_base', installbaseitem);
      coveredInstallBaseItemGr.query();

      while (coveredInstallBaseItemGr.next()) {
          var added = (new GlideDateTime(coveredInstallBaseItemGr.getValue('added'))).getNumericValue();
          var removed = (new GlideDateTime(coveredInstallBaseItemGr.getValue('removed'))).getNumericValue();
          if ((added == 0 && removed == 0) || (dateAdded == added && dateRemoved == removed))
              return true;
      }
      return false;
  },

  //Fetches all the child install base items and drops into Install Base Items Covered related list on Contracts
  insertChildInstallBaseItem: function() {
      var sysIdList = this.getParameter('sysparm_sysIdList') || '';
      var contractSysId = this.getParameter('sysparm_contractSysId') || '';
      var sysId = sysIdList.split(',');
      for (var i = 0; i < sysId.length; i++) {
          var id = sysId[i];
          var gr = new GlideRecordSecure(global.CSMBaseConstants.M2M_CONTRACT_SOLD_PRODUCT);
          if (!gr.get(id))
              continue;
          var installBaseItem = gr.install_base;
          var installBaseItemGr = new GlideRecordSecure(global.CSMBaseConstants.INSTALL_BASE_ITEM);;
          installBaseItemGr.addQuery('parent', installBaseItem);
          installBaseItemGr.query();

          var added = (new GlideDateTime(gr.getValue('added'))).getNumericValue();
          var removed = (new GlideDateTime(gr.getValue('removed'))).getNumericValue();
          while (installBaseItemGr.getRowCount() > 0) {
              var child = [];
              /* Add all child install base item */
              while (installBaseItemGr.next()) {
                  child.push(installBaseItemGr.sys_id + '');
                  /* only insert if exact record is not there */
                  if (!this.isInstallBaseItemPresentInM2M(installBaseItemGr.sys_id, contractSysId, added, removed)) {
                      var coveredInstallBaseItemGr = new GlideRecordSecure(global.CSMBaseConstants.M2M_CONTRACT_SOLD_PRODUCT);
                      if (!coveredInstallBaseItemGr.canCreate())
                          continue;
                      coveredInstallBaseItemGr.initialize();
                      coveredInstallBaseItemGr.contract = contractSysId;
                      coveredInstallBaseItemGr.install_base = installBaseItemGr.sys_id;
                      coveredInstallBaseItemGr.added = gr.added;
                      coveredInstallBaseItemGr.removed = gr.removed;
                      coveredInstallBaseItemGr.insert();
                  }
              }
              installBaseItemGr = new GlideRecordSecure(global.CSMBaseConstants.INSTALL_BASE_ITEM);
              installBaseItemGr.addQuery('parent', 'IN', child);
              installBaseItemGr.query();
          }
      }
  },

  //helper method to fetch consumer sold product entities 
  getConsumerSoldProducts: function(accessLevel, additionalParams) {
      var relConst = global.CSMRelationshipConstants;
      if (gs.nil(additionalParams))
          additionalParams = {};
      if (!additionalParams["consumerId"] && !gs.hasRole(relConst.ROLE_SOLD_PRODUCT_AUTH_CONSUMER))
          return [];
      additionalParams[relConst.SKIP_BEFORE_QUERY_FILTER] = true;
      additionalParams[relConst.IS_CONSUMER_SOLD_PRODUCT] = true;
      if (!accessLevel)
          accessLevel = relConst.ACCESS.READ;
      var spCacheKey = new sn_install_base.InstallBaseUtil().generateCacheKeyForSPConsumer(accessLevel, additionalParams);
      var validSP = GlideAppCache.get(spCacheKey);
      if (gs.nil(validSP)) {
          validSP = new global.CSMRelationshipUtils().getMyEntities(null, global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY, relConst.SOLD_PRODUCT, accessLevel, additionalParams);
          GlideAppCache.put(spCacheKey, validSP);
      }
      return validSP;
  },

  //Fetch install base items from valid installed products of consumer/customer
  getInstallBaseItems: function(pointerEncodedQuery, cacheKey) {
  	var cachedIB;
  	if (!cacheKey)
  		cacheKey = sn_install_base.InstallBaseUtil.CACHE_KEY_MY_IB;
  		
  	cachedIB = GlideAppCache.get(cacheKey);
  	if (!gs.nil(cachedIB))
  		return cachedIB;
  
  	var soldProdIBGR = new GlideRecord(global.CSMBaseConstants.M2M_INSTALLED_PRODUCT);
  	var ipCacheValue = GlideAppCache.get(sn_install_base.InstallBaseUtil.CACHE_KEY_MY_IP_FROM_SP);
  	if (!gs.nil(ipCacheValue)) {
  		soldProdIBGR.addEncodedQuery('sys_idIN' + ipCacheValue.join());
  	}
  	if(pointerEncodedQuery){
  		soldProdIBGR.setWorkflow(false); // to avoid cyclic loops, IB-->IP-->IB
  		soldProdIBGR.addEncodedQuery(pointerEncodedQuery);
  	}
  	soldProdIBGR.query(); //query rules or query business rules takes care of adding filters.
  	
  	var installBaseItems = [];
  	while (soldProdIBGR.next())
  		installBaseItems.push(soldProdIBGR.install_base_item + '');

  	GlideAppCache.put(cacheKey, installBaseItems);
  	return installBaseItems;
  },

  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.getValue("default_responsibility") + "";
      var additionalContacts = new GlideRecordSecure(table);
      additionalContacts.addQuery('sys_id', 'IN', sysIds);
      additionalContacts.setValue('responsibility', responsibility);
      additionalContacts.updateMultiple();
  },

  getRelatedPartyConfigGr: function(sysId) {
      if (gs.nil(sysId)) return;
      var partyConfig = new GlideRecord(global.CSMBaseConstants.RELATED_PARTY_CONFIG_TABLE);
      partyConfig.get(sysId);
      return partyConfig;
  },

  isSOActivated: function() {
      return GlidePluginManager.isActive('com.snc.service_organization');
  },

  validateTypeAndResponsibility: function(current, entityType) {
      return this.validateType(current, entityType) && this.validateResponsibility(current, entityType);
  },

  validateType: function(current, entityType) {
      if (current.type && (current.type.applies_to != global.CSMBaseConstants.SOLD_PRODUCT || current.type.entity_type != entityType)) {
          gs.addErrorMessage(gs.getMessage('Invalid type'));
          return false;
      }
      return true;
  },

  validateResponsibility: function(current, entityType) {
      if (current.responsibility && current.responsibility.type && current.responsibility.type != entityType) {
          gs.addErrorMessage(gs.getMessage('Invalid responsibility'));
          return false;
      }
      return true;
  },

  validateFieldBasedOnType: function(entityType, current) {
      var field = '';
      if (entityType == "customer_contact" && gs.nil(current.contact))
          field = "Contact";
      else if (entityType == "csm_consumer" && gs.nil(current.consumer))
          field = "Consumer";
      else if (entityType == "customer_account" && gs.nil(current.account))
          field = "Account";
      if (!gs.nil(field)) {
          gs.addErrorMessage(gs.getMessage("The following mandatory fields are not filled in: {0}", field));
          return false;
      }
      return true;
  },

  type: 'SoldProductAndInstallBaseUtil'
});

Sys ID

c0b7f88e734323008b516cb63cf6a7c9

Offical Documentation

Official Docs: