Name

sn_install_base.SoldProductAndInstallBaseFilterSNC

Description

Set of Function to filter install base and sold product

Script

var SoldProductAndInstallBaseFilterSNC = Class.create();
SoldProductAndInstallBaseFilterSNC.prototype = {
  initialize: function() {
      this.householdPluginPresent = false;
      this.householdApi = null;
      if (gs.tableExists('csm_household_member')) {
          this.householdPluginPresent = true;
          this.householdApi = new sn_csm_household.HouseHoldUtils();
      }
      this.csmRelationshipUtil = new global.CSMRelationshipUtils();
      this.respParams = {
          "isSPViewer": true
      };
      this.B2B2CPluginAtive = GlidePluginManager.isActive('com.sn_csm_b2b_consumers');
      this.serviceOrgPluginActive = GlidePluginManager.isActive('com.snc.service_organization');
  },

  isConsumerOrHouseholdPresent: function(soldProduct) {
      return (!gs.nil(soldProduct) && (!gs.nil(soldProduct.household) || !gs.nil(soldProduct.consumer)));
  },

  /*
      Helper functions to validate the kind of sold products - 
      1. B2CSoldProduct -> soldProduct.account is empty & consumer or household is not empty.
      2. B2BSoldProduct -> soldProduct.account is not empty & consumer & household is empty.
      3. B2B2CSoldProduct -> b2b2c plugin is active & soldProduct.account is not empty & consumer is not empty.
  */
  isB2CSoldProduct: function(soldProduct) {
      return !gs.nil(soldProduct) && gs.nil(soldProduct.account) && this.isConsumerOrHouseholdPresent(soldProduct);
  },

  isB2BSoldProduct: function(soldProduct) {
      return !gs.nil(soldProduct) && !gs.nil(soldProduct.account) && !this.isConsumerOrHouseholdPresent(soldProduct);
  },

  isB2B2CSoldProduct: function(soldProduct) {
      if (!this.B2B2CPluginAtive) return false;
      return !gs.nil(soldProduct) && !gs.nil(soldProduct.account) && !gs.nil(soldProduct.consumer);
  },

  //check whether current logged in consumer is a valid consumer for sold product
  isLoggedinUserValidConsumer: function(soldproduct) {
      var userConsumerID = new global.CSManagementUtils().getConsumerId();
      list = this.getValidConsumers(soldproduct.sys_id);
      if (list.indexOf(userConsumerID) != -1)
          return true;
      return false;
  },
  /* a sold product S is valid for given consumer C if 
  	1. S is created for C
  	2. S is created for household where household.head = C
  	3. C has additonal access on S by sn_install_base_m2m_consumer_sold_product table and satify 
  	   any of one below condition
  	      S is created for a consumer
  		  S is created for Household H, and C is valid memebbr of H
      4. Perform above based on responsibilities related to consumer.
  	5. @consumerId: consumerId to fetch the related SP -
  	    if null, defaults to loggedInConsumerId
  	6. @responsibilities: list of responsibilities to fetch the SP -
  	    if null, defaults to read responsibilities.
  */
  getValidSoldProducts: function(consumerId, responsibilities, skipRoles) {
      var params = {
          "isSPViewer": true,
          "responsibilities": responsibilities,
          "consumerId": consumerId
      };
      params[global.CSMRelationshipConstants.SKIP_ROLE_CHECK] = skipRoles;
      return new sn_install_base.InstallBaseUtil().getConsumerSoldProducts(global.CSMRelationshipConstants.ACCESS.READ, params);
  },

  /*  consumer C is valid for given Sold Product S if 
  	1. S is created for C
  	2. S is created for household where household.head = C
  	3. C has additional access on S by sn_install_base_m2m_consumer_sold_product table and satify
  	   any of one below condition
  	      S is created for any consumer
  		  S is created for Household H, and C is valid memebbr of H
  */
  getValidConsumers: function(soldproductId, skipResponsibilities) {
      var activeconsumer;
      var validConsumerList = [];
      var soldProduct = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT);
      soldProduct.get(soldproductId);
      if (soldProduct.consumer.nil() && gs.nil(soldProduct.household))
          return;
      else if (!soldProduct.consumer.nil()) /* condition 1 as mentioned above */
          validConsumerList.push(soldProduct.consumer + '');
      /* condition 3 as mentioned above */
      var conSoldProductGr = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY);
      conSoldProductGr.addQuery('sold_product', soldProduct.sys_id);
      if (!skipResponsibilities) {
          var responsibilities = this.csmRelationshipUtil.getResponsibilities(global.CSMRelationshipConstants.RELATIONSHIP_CONSUMER_SOLDPRODUCT, global.CSMRelationshipConstants.ACCESS.READ, this.respParams);
          conSoldProductGr.addQuery("responsibility", "IN", responsibilities);
      }
      if (this.householdPluginPresent && !soldProduct.household.nil()) {
  		activeconsumer = this.householdUtil(soldProduct.household, 'household');
          conSoldProductGr.addQuery('consumer', 'IN', activeconsumer);
          if (this.householdApi.isConsumerCurrentInHousehold(soldProduct.household.head, soldProduct.household))
              validConsumerList.push(soldProduct.household.head); /* condition 2 as mentioned above */
      }
      //skip before query filters
      conSoldProductGr._skip_before_query_filter = true;
      conSoldProductGr.query();
      while (conSoldProductGr.next()) {
          validConsumerList.push(conSoldProductGr.consumer.sys_id + '');
      }
      return validConsumerList;
  },

  isAdditionalConsumerAndInHousehold: function(household, soldProduct) {
      if(!gs.tableExists('csm_household_member') || !gs.tableExists('sn_install_base_m2m_consumer_sold_product'))
        return false;
      var consumer = new global.CSManagementUtils().getConsumerId();
      var chm = new GlideRecord("csm_household_member");
      chm.addQuery("household", household);
      chm.addQuery("consumer", consumer);
      chm.setLimit(1);
      chm.query();
      if (!chm.next())
          return false;
      var csp = new GlideRecord("sn_install_base_m2m_consumer_sold_product");
      csp.addQuery("consumer", consumer);
      csp.addQuery("sold_product", soldProduct);
      csp.setLimit(1);
      csp.query();

      return csp.next();


  },
  getHouseholdRefQulifier: function(SoldRec) {
      if (!this.householdPluginPresent || SoldRec.consumer.nil())
          return;
      var refQualifier = '';
      var list = this.householdUtil(SoldRec.consumer, 'consumer');
      refQualifier = 'sys_idIN' + list;
      return refQualifier;
  },
  getConsumerRefQulifier: function(SoldRec) {
      var refQualifier = '';
      if (gs.nil(SoldRec)) {
          return refQualifier;
      }
      if (this.householdPluginPresent && !SoldRec.household.nil()) {
          var list = this.householdUtil(SoldRec.household, 'household');
          refQualifier = 'sys_idIN' + list;
      }
      if (GlidePluginManager.isActive('com.sn_csm_b2b_consumers') && !SoldRec.account.nil()) {
          refQualifier += '^' + new sn_acct_consumer.AccountConsumerUtil().getConsumerRefFromAccount(SoldRec.account);
      }
      return refQualifier;
  },
  /* get valid consumer for consumer sold product when sold product is selected */
  getConsumerForConsumerSoldProduct: function(sold_product, currentRecord) {
      /*
          if currentRecord.type.entity_type is not "csm_consumer", no consumer should be shown
      */
      if (gs.nil(currentRecord) || (currentRecord.type && (currentRecord.type.entity_type != global.CSMBaseConstants.CONSUMER_TABLE)))
          return 'sys_idISEMPTY';
      var refQualifier = 'active=true';
  	if (this.householdPluginPresent && !sold_product.household.nil()) {
          var list = this.householdUtil(sold_product.household.sys_id, 'household');
          refQualifier += '^sys_idIN' + list;
      }
      // When b2b2c is active show sold_product.account->consumers for (b2b & b2b2c sold products)
      if (this.B2B2CPluginAtive && !sold_product.account.nil()) {
          var consumerIds = new sn_acct_consumer.AccountConsumerUtil().getConsumerFromAccount(sold_product.account);
          if (consumerIds && consumerIds.length)
              refQualifier += '^sys_idIN' + consumerIds.join();
          else
              refQualifier = 'sys_idISEMPTY';
      }
      return refQualifier;
  },
  /* get valid Sold Product for consumer sold product table when consumer is selected */
  getSoldProductForConsumerSoldProduct: function(consumer) {
      var refQualifier = 'consumerISNOTEMPTY^ORhouseholdISNOTEMPTY';

      if (consumer.nil())
          return refQualifier;
      if (this.householdPluginPresent) {
          var list = this.householdUtil(consumer, 'consumer');
          refQualifier = 'householdIN' + list + '^NQhouseholdISEMPTY^consumerISNOTEMPTY';
      }
      return refQualifier;
  },
  householdUtil: function(sysid, type) {
      /* type = consumer then API returns all household of which the consumer is active member of */
      /* type = household then retrive all active consumers of the household */
      var list = [];
      if (type === 'consumer')
          list = this.householdApi.getCurrentHouseholdIdsForConsumerId(sysid);
      else if (type === 'household')
          list = this.householdApi.getCurrentConsumerIdsForHouseholdId(sysid);
      else
          return;
      return list.join();
  },

  getReferenceQualifierForUser: function(relPartyRecord) {
      var refQualifier = relPartyRecord.type.reference_condition + '';
      if (relPartyRecord.type.name == "Authorized Member" && !relPartyRecord.service_organization.nil()) {
          var memberGr = new GlideRecord("sn_csm_service_organization_member");
          var membersList = [];
          memberGr.addQuery("service_organization", relPartyRecord.service_organization)
          memberGr.query();
          while (memberGr.next()) {
              membersList.push(memberGr.user + '');
          }
          refQualifier += refQualifier == '' ? "sys_idIN" + membersList.join(',') : "^sys_idIN" + membersList.join(',');
      }
      return refQualifier;
  },

  getContactRefQual: function(installBaseRelatedPartyRecord) {
      var refQualifier = '';
      if (!installBaseRelatedPartyRecord.account.nil()) {
          refQualifier = 'account=' + installBaseRelatedPartyRecord.account;
      }
      return refQualifier;
  },

  getParentSoldProductRefQulifier: function(SoldRec) {
      var refQualifier = '';
      if (!SoldRec.account.nil()) {
          refQualifier = 'account=' + SoldRec.account;
      } else if (!gs.nil(SoldRec.service_organization)) {
          refQualifier = 'service_organization=' + SoldRec.service_organization;
      } else {
          if (!SoldRec.consumer.nil()) {
              refQualifier = 'accountISEMPTY^consumer=' + SoldRec.consumer;
          }
          if (this.householdPluginPresent) {
              var list = '';
              /* if consumer present, fetch all householdIDs of which consumer is active member */
              if (!SoldRec.consumer.nil())
                  list = this.householdUtil(SoldRec.consumer, 'consumer');
              /* if Household is set, fetch all sold product for selected household as well  */
              if (!SoldRec.household.nil()) {
                  if (list.length > 0)
                      list = list + ',' + SoldRec.household;
                  else
                      list = SoldRec.household + '';
              }
              if (list.length > 0)
                  refQualifier = refQualifier + (refQualifier.length > 0 ? '^OR' : '') +
                  'householdIN' + list;
          }
      }

      refQualifier = refQualifier + (refQualifier.length > 0 ? '^' : '') +
          'sys_id!=' + SoldRec.sys_id;

      return refQualifier;

  },

  getInstallBaseItemRefQualifier: function(depSol) {

      var refQualifier = '';
      if (!depSol.sold_product.nil()) {
          if (!depSol.sold_product.account.nil())
              refQualifier = 'account=' + depSol.sold_product.account.sys_id;
          else if (!depSol.sold_product.consumer.nil())
              refQualifier = 'accountISEMPTY^consumer=' + depSol.sold_product.consumer.sys_id;
          else if (new sn_install_base.SoldProductAndInstallBaseUtil().isSOActivated())
              refQualifier = 'service_organization=' + depSol.sold_product.service_organization.sys_id;

      }
      return refQualifier;

  },

  getSoldProductRefQulifier: function(depSol) {

      var refQualifier = '';
      if (!depSol.install_base_item.nil()) {
          if (!depSol.install_base_item.account.nil())
              refQualifier = 'account=' + depSol.install_base_item.account.sys_id;
          else if (!depSol.install_base_item.consumer.nil())
              refQualifier = 'accountISEMPTY^consumer=' + depSol.install_base_item.consumer.sys_id;
          else if (new sn_install_base.SoldProductAndInstallBaseUtil().isSOActivated())
              refQualifier = 'service_organization=' + depSol.install_base_item.service_organization.sys_id;
      }
      return refQualifier;
  },

  getContactRefQualifier: function(installBaseItem) {
      if (!installBaseItem.account.nil())
          return "account=" + installBaseItem.account.sys_id;

  },

  getContactRefQualifierForSoldProduct: function(soldProduct) {
      if (!soldProduct.account.nil())
          return "account=" + soldProduct.account.sys_id;

  },
  filterInstallBaseItemOnCase: function(passedRec) {
  	var csm_case_record = new GlideRecord('sn_customerservice_case');
  	csm_case_record.get(passedRec.csm_case);
      var refQualifier = this.getInstallBaseRefQualifierOnCase(csm_case_record);
      return refQualifier;
  },

  filterCaseOnInstallBaseItem: function(passedRec) {
      var refQualifier = '';
      if (passedRec.install_base_item.nil())
          return refQualifier;
      // account and consumer are mutually exclusive.
      if (!passedRec.install_base_item.account.nil()) {
          refQualifier = 'account=' + passedRec.install_base_item.account;
          refQualifier = refQualifier + '^' + 'ORaccountISEMPTY' + '^' + 'consumerISEMPTY';
      } else if (!passedRec.deployed_entity.consumer.nil()) {
          refQualifier = 'consumer=' + passedRec.install_base_item.consumer;
          refQualifier = refQualifier + '^' + 'ORconsumerISEMPTY' + '^' + 'accountISEMPTY';
      }
      return refQualifier;
  },

  _getAccountHierarchy: function(account) {
      var accountgr = new GlideRecord('customer_account');
      accountgr.addQuery('sys_id', account);
      accountgr.query();
      var list = new Array();
      while (accountgr.next()) {
          list.push(account + '');
          account = accountgr.account_parent;
          accountgr = new GlideRecord('customer_account');
          accountgr.addQuery('sys_id', account);
          accountgr.query();
      }
      return list;
  },
  getContract: function(m2m) {
      var refQualifier = '';
      // account and consumer are mutually exclusive.
      if (!gs.nil(m2m) && !m2m.sold_product.nil()) {
          if (!m2m.sold_product.account.nil()) {
              var list = this._getAccountHierarchy(m2m.sold_product.account);
              refQualifier = 'accountIN' + list;
          } else {
              refQualifier = 'consumer=' + m2m.sold_product.consumer;
          }
      } else if (!gs.nil(m2m) && !m2m.install_base.nil()) {
          if (!m2m.install_base.account.nil()) {
              var list = this._getAccountHierarchy(m2m.install_base.account);
              refQualifier = 'accountIN' + list;
          } else {
              refQualifier = 'consumer=' + m2m.install_base.consumer;
          }
      }
      return refQualifier;
  },
  getSoldProduct: function(m2m) {
      var refQualifier = '';
      // account and consumer are mutually exclusive.
      if (!gs.nil(m2m) && !m2m.contract.nil()) {
          if (!m2m.contract.account.nil()) {
              var acc = m2m.contract.account;
              var list = [m2m.contract.account];
              while (!gs.nil(acc)) {
                  var accountgr = new GlideRecord('customer_account');
                  accountgr.addQuery('account_parent', 'IN', acc);
                  accountgr.query();
                  acc = '';
                  while (accountgr.next()) {
                      list.push(accountgr.sys_id + '');
                      acc = acc + ',' + accountgr.sys_id;
                  }
                  if (!gs.nil(acc))
                      acc = acc.substr(1);
              }
              refQualifier = 'accountIN' + list;
          } else {
              refQualifier = 'consumer=' + m2m.contract.consumer;
          }
      }
      return refQualifier;
  },
  getInstallBase: function(m2m) {
      var refQualifier = '';
      // account and consumer are mutually exclusive.
      if (!gs.nil(m2m) && !m2m.contract.nil()) {
          if (!m2m.contract.account.nil()) {
              var acc = m2m.contract.account;
              var list = [m2m.contract.account];
              while (!gs.nil(acc)) {
                  var accountgr = new GlideRecord('customer_account');
                  accountgr.addQuery('account_parent', 'IN', acc);
                  accountgr.query();
                  acc = '';
                  while (accountgr.next()) {
                      list.push(accountgr.sys_id + '');
                      acc = acc + ',' + accountgr.sys_id;
                  }
                  if (!gs.nil(acc))
                      acc = acc.substr(1);
              }
              refQualifier = 'accountIN' + list;
          } else {
              refQualifier = 'consumer=' + m2m.contract.consumer;
          }
      }
      return refQualifier;
  },
  //Check is valid household member or not
  addHouseHoldRelatedQuery: function(conSoldProductGr, consumerId) {
      if (!consumerId || !conSoldProductGr || !conSoldProductGr.isValid()) return;
      if (this.householdPluginPresent) {
          this.validHousehold = this.householdUtil(consumerId, 'consumer');
          qc = conSoldProductGr.addJoinQuery('sn_install_base_sold_product', 'sold_product', 'sys_id');
          qc.addCondition('household', 'IN', this.validHousehold);
          qc.addOrCondition('household', null);
      }
  },

  /* a sold product S is valid for given consumer C if 
  	1. S is created for C
  	2. S is created for household where household.head = C
  */
  getAdditionalValidSoldProducts: function(consumerId, validSoldProducts) {
      if (!consumerId) return;
      if (!validSoldProducts) validSoldProducts = {};
      var soldProductGr = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT);
      var encodedQuery = 'consumer=' + consumerId;
      if (this.householdPluginPresent) {
          /* get Ids of household whose current head is consumer */
          var hdIds = [];
          var householdGr = new GlideRecord(global.CSMBaseConstants.HOUSEHOLD);
          householdGr.addQuery('head', consumerId);
          if (gs.nil(this.validHousehold))
              this.validHousehold = this.householdUtil(consumerId, 'consumer');
          householdGr.addQuery('sys_id', 'IN', this.validHousehold);
          householdGr.query();
          while (householdGr.next()) {
              hdIds.push(householdGr.getUniqueValue());
          }
          encodedQuery = encodedQuery + '^ORhouseholdIN' + hdIds;
      }
      soldProductGr.addEncodedQuery(encodedQuery);
      soldProductGr.setWorkflow(false);
      soldProductGr.query();
      while (soldProductGr.next())
          validSoldProducts[soldProductGr.getUniqueValue()] = true;
      return Object.keys(validSoldProducts);
  },

  //Get contacts belonging to same account, accounts from account relationships, accounts from contact relationship
  getContactsForSoldProduct: function(soldProduct, currentRecord) {
      /*
         if currentRecord.type.entity_type is not "customer_contact", no contacts should be shown
      */
      if (gs.nil(currentRecord) || (currentRecord.type && (currentRecord.type.entity_type != global.CSMBaseConstants.CONTACT_TABLE)))
          return 'sys_idISEMPTY';
      var query = null;
      var account = currentRecord.account;
      // If account field is filled, show the related contacts. Else, show all active contacts.
      var isSPAccount = false;
      if (!gs.nil(soldProduct) && !gs.nil(soldProduct.account)) {
          if (gs.nil(account)) {
              account = soldProduct.account;
          }
          if (account == soldProduct.account) {
              isSPAccount = true;
          }
      }

      if (gs.nil(soldProduct) || gs.nil(account)) return 'active=true';
      var csmutil = new global.CSManagementUtils();
      //Add Partner Accounts
      var accounts = [];
      if (gs.nil(currentRecord.account)) {
          accounts = csmutil.getPartnerAccounts(account) || [];
      }
      //Add contacts of the same account   
      accounts.push(account);

      query = 'accountIN' + accounts.join(',');
      //Add Contacts from Contact Relationship of this account
      if (isSPAccount) {
          var contacts = csmutil.getContactsFromContactRelationship([account]) || [];
          if (contacts.length > 0)
              query = query + '^ORsys_idIN' + contacts.join(',');
      }
      query = query + '^active=true';
      return query;
  },
  //Get sold products belonging to same account, accounts from account relationships, accounts from contact relationship
  getSoldProductsForContact: function(contact) {
      //If no contact is chosen, all sold products associated with account should be shown
      if (gs.nil(contact)) return 'accountISNOTEMPTY';
      var query = null;
      var gr = new GlideRecord(global.CSMBaseConstants.CONTACT_TABLE);
      if (gr.get(contact)) {
          var account = gr.getValue('account');
          if (!gs.nil(account)) {
              var csmutil = new global.CSManagementUtils();
              //Add Customer Accounts
              var accounts = csmutil.getCustomerAccounts(account) || [];
              // Add sold products of the same account
              accounts.push(account);
              //Add Accounts from Contact Relationship
              var accountsfromrels = csmutil.getAccountsFromContactRelationship(contact);
              var allAccounts = accounts.concat(accountsfromrels);
              query = 'accountIN' + allAccounts.join(',');
          }
      }
      //if for some misconfiguration, contact selected is invalid or valid and doesnot have an account populated, no sold products should be shown
      if (gs.nil(query))
          query = 'sys_idISEMPTY';
      return query;
  },
  getSoldProductsForRelatedParty: function(current) {
      if (gs.nil(current))
          return 'consumerISNOTEMPTY^ORhouseholdISNOTEMPTY^ORaccountISNOTEMPTY';
      if (current.consumer)
          return this.getSoldProductForConsumerSoldProduct(current.consumer);
      if (current.contact)
          return this.getSoldProductsForContact(current.contact);
  },
  getTypeRefQual: function(entity, currentRecord) {
      var entityOperator = '=';
      var appliesToTable = global.CSMBaseConstants.SOLD_PRODUCT;
      if (gs.nil(entity)) {
          if (currentRecord.getTableName() == global.CSMBaseConstants.M2M_CON_SOLD_PRODUCT)
              entity = 'csm_consumer';
          else if (currentRecord.getTableName() == global.CSMBaseConstants.M2M_CONTACT_SOLD_PRODUCT)
              entity = 'customer_contact';
          else if (currentRecord.getTableName() == global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY) {
              var soldProduct = currentRecord.sold_product;
              /* 
                  1. B2BSoldProduct - without b2b2c show only contact/account types
                  2. B2CSoldProduct - with or without b2b2c show only consumer type
                  3. B2B2CSoldProduct || B2BSoldProduct (with b2b2c plugin active) - show all types
                  4. Else, retrict the type (show no type)
              */
              if (this.isB2BSoldProduct(soldProduct) && !this.B2B2CPluginAtive) entity = 'customer_contact,customer_account';
              else if (this.isB2CSoldProduct(soldProduct)) entity = 'csm_consumer';
              else if (this.isB2B2CSoldProduct(soldProduct) || (this.isB2BSoldProduct(soldProduct) && this.B2B2CPluginAtive))
                  entity = 'csm_consumer,customer_contact,customer_account';
              else entity = "";
              entityOperator = 'IN';
          } else if (currentRecord.getTableName() == global.CSMBaseConstants.INSTALL_BASE_RELATED_PARTY) {
              entity = 'csm_consumer,customer_contact,customer_account,sys_user,sn_customer_service_organization';
              entityOperator = 'IN';
              appliesToTable = global.CSMBaseConstants.INSTALL_BASE_ITEM;
          } else
              entity = '';
      }
      return "entity_type" + entityOperator + entity + "^applies_to=" + appliesToTable;
  },
  getResponsibilityRefQual: function(entity, currentRecord) {
      if (gs.nil(entity)) {
          if (currentRecord.getTableName() == global.CSMBaseConstants.M2M_CON_SOLD_PRODUCT)
              entity = 'csm_consumer';
          else if (currentRecord.getTableName() == global.CSMBaseConstants.M2M_CONTACT_SOLD_PRODUCT)
              entity = 'customer_contact';
          else if (currentRecord.getTableName() == global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY || currentRecord.getTableName() == global.CSMBaseConstants.INSTALL_BASE_RELATED_PARTY) {
              entity = currentRecord.type.entity_type;
          } else
              entity = '';
      }
      // Not fetching "authotized representative" when the entity type is "customer_account"
      var fetchNullType = !(entity == "customer_account");
      return (fetchNullType ? "type=NULL^OR" : "") + "type=" + entity;
  },
  isValidAdditionalConsumerOfSP: function(consumerId, soldProduct, accessLevel, household) {
      if (!consumerId || !soldProduct) return false;
      var isValidConsumer = this._isAdditionalConsumerOfSP(consumerId, soldProduct, accessLevel);
      return (gs.nil(household)) ? isValidConsumer : (isValidConsumer && this.householdApi.isConsumerCurrentInHousehold(consumerId, household));
  },
  _isAdditionalConsumerOfSP: function(consumerId, soldProduct, accessLevel) {
      if (!accessLevel)
          accessLevel = global.CSMRelationshipConstants.ACCESS.READ;
      var responsibilities = this.csmRelationshipUtil.getResponsibilities(global.CSMRelationshipConstants.RELATIONSHIP_CONSUMER_SOLDPRODUCT, accessLevel, this.respParams);
      var conSoldProductGr = new GlideRecord(global.CSMBaseConstants.M2M_CON_SOLD_PRODUCT);
      conSoldProductGr.addQuery("consumer", consumerId);
      conSoldProductGr.addQuery("sold_product", soldProduct);
      conSoldProductGr.addQuery("responsibility", "IN", responsibilities);
      conSoldProductGr.query();
      return conSoldProductGr.hasNext();
  },

  /*
   * This function returns consumer id only if household plugin is inactive
   * If household is active, string "HOUSEHOLD_ACTIVE" will be returned
   * There is no purpose in setting return value to "HOUSEHOLD_ACTIVE", -
   * it could have been anything else , we just don't want the return value to match a general consumer id.
   */
  getConsumerIdOnlyIfHouseHoldPluginInactive: function() {
      if (this.householdPluginPresent) {
          return "HOUSEHOLD_ACTIVE";
      }
      return new global.CSManagementUtils().getConsumerId();
  },

  getSPForAdditionalUser: function() {
      var result = [];
      var spGr = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT);
      spGr.addEncodedQuery("additional_usersLIKE" + gs.getUserID());
      spGr.query();
      while (spGr.next()) {
          result.push(spGr.getUniqueValue());
      }
      return result;
  },

  getSPForAdditionalConsumer: function() {
      var result = [];
      var spGr = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT);
      spGr.addEncodedQuery("additional_consumersLIKE" + new global.CSManagementUtils().getConsumerId());
      spGr.query();
      while (spGr.next()) {
          result.push(spGr.getUniqueValue());
      }
      return result;
  },

  getSPForAddConsumerWithoutHousehold: function() {
      var result = [];
      if (!gs.tableExists('csm_household_member')) {
          result = this.getSPForAdditionalConsumer();
      }
      return result;
  },

  getAccountsForSoldProduct: function(currentRecord) {
      if (gs.nil(currentRecord) || gs.nil(currentRecord.type) || gs.nil(currentRecord.type.entity_type))
          return "sys_idISEMPTY";
      var query = "";
      var soldProduct = currentRecord.sold_product;
      var enityType = currentRecord.type.entity_type;
      if (enityType == global.CSMBaseConstants.CONSUMER_TABLE) {
          /*
              if b2b2c is not activated, no account should be shown.
              else, show only sold_product.account (for b2c show no account)
          */
          if (!this.B2B2CPluginAtive || this.isB2CSoldProduct(soldProduct))
              return "sys_idISEMPTY";
          query = "sys_idIN" + soldProduct.account;
      } else if (enityType == global.CSMBaseConstants.CONTACT_TABLE || enityType == global.CSMBaseConstants.ACCOUNT_TABLE) {
  		if(gs.nil(soldProduct) || gs.nil(soldProduct.account)){
  			return "sys_idISEMPTY";
  		}
  		var account = soldProduct.account;
          var csmutil = new global.CSManagementUtils();
          // Add customer accounts
          var accounts = csmutil.getPartnerAccounts(account) || [];
          // Add contact account
          accounts.push(account);
          query = "sys_idIN" + accounts.join(",");
      }
      return query;
  },

  getAccountsForInstallBase: function(currentRecord) {
      if (gs.nil(currentRecord) || gs.nil(currentRecord.type) || gs.nil(currentRecord.type.entity_type))
          return "sys_idISEMPTY";
      if (currentRecord.type.entity_type == global.CSMBaseConstants.CONTACT_TABLE) {
          var contact = currentRecord.contact;
          if (gs.nil(contact)) return "";
          return "sys_idIN" + contact.company;
      }
      return "";
  },

  getSOForInstallBase: function(currentRecord) {
      if (gs.nil(currentRecord) || gs.nil(currentRecord.type) || gs.nil(currentRecord.type.entity_type))
          return "sys_idISEMPTY";
      if (currentRecord.type.name == "Authorized Member" && !currentRecord.user.nil()) {
          var memberGr = new GlideRecord("sn_csm_service_organization_member");
          memberGr.addQuery("user", currentRecord.user);
          memberGr.query();
          if (memberGr.next()) {
              return "sys_idIN" + memberGr.service_organization;
          }
      }
      return "";
  },

  getInstallBaseItemParentRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      if (!gs.nil(installBaseGr.account)) {
          refQualifier = 'account=' + installBaseGr.account;
      } else if (this.serviceOrgPluginActive && !gs.nil(installBaseGr.service_organization)) {
          refQualifier = 'service_organization=' + installBaseGr.service_organization;
      } else {
          if (!gs.nil(installBaseGr.consumer)) {
              refQualifier = 'consumer=' + installBaseGr.consumer;
          }
          if (this.householdPluginPresent) {
              var list = '';
              /* if consumer is present, fetch all householdIDs in which consumer is active member */
              if (!gs.nil(installBaseGr.consumer))
                  list = this.householdUtil(installBaseGr.consumer, 'consumer');
              if (!gs.nil(installBaseGr.household)) {
                  if (list.length > 0)
                      list = list + ',' + installBaseGr.household;
                  else
                      list = installBaseGr.household + '';
              }
              if (list.length > 0)
                  refQualifier = refQualifier + (refQualifier.length > 0 ? '^OR' : '') + 'householdIN' + list;
          }
      }
      refQualifier = refQualifier + (refQualifier.length > 0 ? '^' : '') + 'sys_id!=' + installBaseGr.sys_id;
      return refQualifier;
  },

  getInstallBaseItemConsumerRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      if (this.householdPluginPresent && !gs.nil(installBaseGr.household)) {
          var list = this.householdUtil(installBaseGr.household, 'household');
          refQualifier = 'sys_idIN' + list;
      }
  	//When b2b2c is active show installBase.account->consumers for (b2b & b2b2c install bases)
      if (this.B2B2CPluginAtive && !installBaseGr.account.nil()) {
          var consumerIds = new sn_acct_consumer.AccountConsumerUtil().getConsumerFromAccount(installBaseGr.account);
          if (consumerIds && consumerIds.length)
              refQualifier += '^sys_idIN' + consumerIds.join();
          else
              refQualifier = 'sys_idISEMPTY';
      }
      return refQualifier;
  },

  getInstallBaseItemHouseholdRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      if (this.householdPluginPresent && !gs.nil(installBaseGr.consumer)) {
          var list = this.householdUtil(installBaseGr.consumer, 'consumer');
          refQualifier = 'sys_idIN' + list;
      }
      return refQualifier;
  },

  getInstallBaseItemProductModelRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      var productModel = '';
      if (!gs.nil(installBaseGr.configuration_item)) {
          productModel = installBaseGr.configuration_item.model_id;
      } else if (!gs.nil(installBaseGr.asset)) {
          productModel = installBaseGr.asset.model;
      }
      if (!gs.nil(productModel)) refQualifier = 'sys_id=' + productModel;
      return refQualifier;
  },

  getInstallBaseItemCIRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      if (!gs.nil(installBaseGr.product)) {
          refQualifier = 'model_id=' + installBaseGr.product;
      }
      var asset = installBaseGr.asset;
      if (!gs.nil(asset)) {
          refQualifier = 'sys_id=' + asset.ci;
      }
      return refQualifier;
  },

  getInstallBaseItemAssetRefQulifier: function(installBaseGr) {
      var refQualifier = '';
      if (gs.nil(installBaseGr)) return refQualifier;
      if (!gs.nil(installBaseGr.product)) {
          refQualifier = 'model=' + installBaseGr.product;
      }
      var ci = installBaseGr.configuration_item;
      if (!gs.nil(ci)) {
          refQualifier = 'sys_id=' + ci.asset;
      }
      return refQualifier;
  },

  isAdditionalAccountContact: function(soldProduct, contact) {
  	if (gs.tableExists(global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY) && !gs.nil(soldProduct) && !gs.nil(contact) && !gs.nil(contact.account)) {
  		var gr = new GlideRecord(global.CSMBaseConstants.SOLD_PRODUCT_RELATED_PARTY);
  		gr.addQuery('sold_product', soldProduct);
  		gr.addQuery('account', contact.account);
  		gr.addQuery('responsibility', global.CSMRelationshipConstants.AUTHORISED_ACCOUNT);
  		gr.setLimit(1);
  		gr.setWorkflow(false);
  		gr.query();
  		return gr.hasNext();
  	}
  	return false;
  },

  getInstallBaseRefQualifierOnCase: function(caseRecord) {
      if (gs.nil(caseRecord)) return "";

      var inputVars = {};
      inputVars[global.CSMBaseConstants.ACCOUNT_TABLE] = caseRecord.getValue('account');
      inputVars[global.CSMBaseConstants.CONTACT_TABLE] = caseRecord.getValue('contact');
      inputVars[global.CSMBaseConstants.CONSUMER_TABLE] = caseRecord.getValue('consumer');
      if (this.isHouseholdPluginActive())
          inputVars[global.CSMBaseConstants.HOUSEHOLD] = caseRecord.getValue('household');
      if (this.isServiceOrgPluginActive()) {
          inputVars[global.CSMBaseConstants.SERVICE_ORGANIZATION_TABLE] = caseRecord.getValue('requesting_service_organization');
          if(caseRecord.service_organization)
             var supportedProducts = new global.ServiceOrganizationUtil().getProductsAvailableForCase(caseRecord);
      }

      var refQualifier = new sn_install_base.InstallBaseFilter().getRefQualifierForIBonCase(inputVars);

      var installBaseGr = new GlideRecord(global.CSMBaseConstants.INSTALL_BASE_ITEM);
      installBaseGr.addQuery(refQualifier);

      if (!gs.nil(caseRecord.product))
          installBaseGr.addQuery('product', caseRecord.product).addOrCondition('product', '');
          if (!gs.nil(supportedProducts))
          installBaseGr.addQuery('product', supportedProducts);
      if (!gs.nil(caseRecord.asset))
          installBaseGr.addQuery('asset', caseRecord.asset).addOrCondition('asset', '');
      if (!gs.nil(caseRecord.cmdb_ci))
          installBaseGr.addQuery('configuration_item', caseRecord.cmdb_ci).addOrCondition('configuration_item', '');
      return installBaseGr.getEncodedQuery();
  },

  isServiceOrgPluginActive: function() {
      return GlidePluginManager.isActive(global.CSMBaseConstants.SERVICE_ORGANIZATION_PLUGIN);
  },

  isB2BConsumersPluginActive: function() {
      return GlidePluginManager.isActive(global.CSMBaseConstants.B2B2C_PLUGIN);
  },

  isHouseholdPluginActive: function() {
      return GlidePluginManager.isActive(global.CSMBaseConstants.HOUSEHOLD_PLUGIN);
  },

  type: 'SoldProductAndInstallBaseFilterSNC'
};

Sys ID

1169ee464ce75510f877f8ad0e930dcc

Offical Documentation

Official Docs: