Name

global.ModelAndCategoryFilters

Description

Refine reference qualifiers for models and model categories based on class

Script

var ModelAndCategoryFilters = Class.create();
ModelAndCategoryFilters.prototype = {
  initialize : function() {
  },
  
  /*
   * Configuration Item model reference
   */
  ciModelRefQual: function(ci) {
      // when creating a CI, we always allow models with no category
  	var refQual = 'cmdb_model_categoryISEMPTY';
     
      // add an OR filter to get only the models that match the class of CI we are creating
      var ciClass = this._getCIClass(ci);		
  	var category = new GlideRecord('cmdb_model_category');
  	category.addQuery('cmdb_ci_class', ciClass);
  	category.query();
      if (category.next())
  	    refQual += '^ORcmdb_model_categoryLIKE' + category.sys_id; 
     
      return refQual;
  },

  /*
   * Model category reference qualifier based on asset class and whether or
   * not model is already set
   */
  assetModelCategoryRefQual : function(asset) {
  	var refQual = '';
  	var assetClass = this._getAssetClass(asset);
  	if (assetClass == 'alm_asset') {
  		// real assets must be declared as such by the category or come from
  		// a bundle
  		refQual = 'asset_class=alm_asset^ORbundle=true';
  	} else if (assetClass == 'alm_consumable') {
  		// consumable can be declared directly by the category or by model
  		// overriding a core asset category
  		refQual = 'asset_class!=alm_license';
  	} else if (GlidePluginManager.isActive('sn_eam') && sn_ent.EnterpriseContentEAMUtils.isEnterpriseModelClass(asset.model.sys_class_name)) {
  		refQual = 'asset_classIN' + sn_ent.EnterpriseContentEAMUtils.getEAMAssetClasses();
  	} else {
  		// other alm_asset extensions are just a direct mapping to the
  		// asset_class defined in category
  		refQual = 'asset_class=' + assetClass;
  	}

  	var isModelSet = (asset.model.toString() != '');
  	if (GlidePluginManager.isActive('sn_hamp')) {
  		isModelSet = (isModelSet
  							&& asset.model.toString() !== sn_hamp.HAMConstants.UNKNOWN_MODEL_SYS_ID);
  	}
  	if (GlidePluginManager.isActive('sn_eam') && sn_ent.EnterpriseContentEAMUtils.isEnterpriseModelClass(asset.model.sys_class_name)) {
  		isModelSet = (isModelSet
  							&& asset.model.toString() !== sn_eam.EAMConstants.UNKNOWN_MODEL);
  	}
  	
  	if (isModelSet) {
  		// refine qualifier if model is already set
  		var model = new GlideRecord('cmdb_model');
  		model.get(asset.model.toString());
  		refQual = refQual + '^sys_idIN' + model.cmdb_model_category;
  	}

  	return refQual;
  },

  /*
   * Model reference qualifier based on asset class and whether or not model
   * category is already set
   */
  assetModelRefQual : function(asset) {
  	var categoryClause = '';
  	var isCategoryDefined = (asset.model_category.toString() != '');
  	var isCategoryConsumable = false;
  	var isCategoryBundle = false;
  	var assetClass = this._getAssetClass(asset);

  	if (isCategoryDefined) {
  		var category = new GlideRecord('cmdb_model_category');
  		category.get(asset.model_category.toString());
  		categoryClause = 'cmdb_model_categoryLIKE' +
  				category.sys_id.toString();
  		if (category.asset_class.toString() == 'alm_consumable')
  			isCategoryConsumable = true;
  		if (category.bundle.toString() == 'true')
  			isCategoryBundle = true;
  	} else {
  		// when category is not specified, we should still narrow down based
  		// on the possible categories for the record's actual table
  		categoryClause = this
  				._getCategoriesProducingAssetClassOrClause(assetClass);
  	}
  	var refQual = categoryClause;

  	// refine filter based on asset tracking strategy of the models
  	if (assetClass != 'alm_consumable') {
  		if (refQual != '')
  			refQual = refQual + '^';
  		// exclude models that force tracking as consumable or no asset at
  		// all
  		refQual = refQual + 'asset_tracking_strategy=leave_to_category';
  	} else {
  		if (isCategoryDefined == true) {
  			if (refQual != '')
  				refQual = refQual + '^';
  			if (isCategoryConsumable == true) {
  				// exclude models that force no tracking
  				refQual = refQual + 'asset_tracking_strategy!=do_not_track';
  			} else {
  				// exclude models that don't force tracking as consumable
  				// for categories other than consumable
  				refQual = refQual +
  						'asset_tracking_strategy=track_as_consumable';
  			}
  		} else {
  			// category not defined -> we expand the result set, not narrow
  			// it down, with asset tracking strategy (or)
  			refQual = refQual +
  					'^ORasset_tracking_strategy=track_as_consumable';
  		}
  	}
  	if (global.AssetUtils.IS_HAMP_ACTIVE) {
  		var processedData = {};
  		processedData.assetClass = assetClass;
  		processedData.categoryClause = categoryClause;
  		refQual = sn_hamp.HAMUtils.assetModelRefQual(asset, refQual, processedData);
  	}
  	return refQual;
  },

  cmdbModelCategoryRefQual : function() {
  	var models = '';

  	var gr = new GlideRecord('cmdb_model_category');
  	gr.addQuery('cmdb_ci_class', current.sys_class_name);
  	gr.query();
  	while (gr.next()) {
  		var mlist = this.getModels(gr.sys_id);
  		if (mlist != '')
  			models = models + "," + mlist;
  	}

  	if (models != '')
  		return "sys_idIN" + models;
  	else
  		return null;
  },

  getModels : function(sys_id) {
  	var models = "";

  	var gr = new GlideRecord('cmdb_model');
  	gr.addQuery('cmdb_model_category', sys_id);
  	gr.query();
  	while (gr.next())
  		models = models + "," + gr.sys_id;
  	return models;
  },

  /*
   * Model category reference qualifier for model component definition records
   */
  bundleModelCategoryRefQual : function(component_def) {
  	var isEAMActive = GlidePluginManager.isActive('com.sn_eam');
  	if(isEAMActive && sn_eam.EAMUtils.isEnterpriseModel(component_def.parent)){
  		return 'sys_id!='+sn_eam.EAMConstants.CONTRACT_MODEL_CATEGORY_ID;
  	}
  	return;
  },

  /*
   * Model reference qualifier for model component definition records
   * (component field)
   */
  componentModelRefQual : function(component_def) {
  	var refQual = '';

  	if (component_def.model_category.toString()) {
  		var category = new GlideRecord('cmdb_model_category');
  		category.get(component_def.model_category.toString());
  		refQual = 'cmdb_model_categoryLIKE' + category.sys_id.toString();
  	} else {
  		// when category is not specified, allow all categories
  		refQual = this._getFlaggedCategoriesOrClause();
  	}

  	// filter out models that don't create any assets
  	if (refQual != '')
  		refQual = refQual + '^';
  	return refQual + 'asset_tracking_strategy!=do_not_track';
  },

  /*
   * Model reference qualifier for model component definition records (bundle
   * field)
   */
  bundleModelRefQual : function(component_def) {
  	// when category is not specified, we should still narrow down to
  	// include only models
  	// corresponding to categories that can instantiate main component in
  	// bundles
  	var refQual = this._getFlaggedCategoriesOrClause('allow_as_master');
  	// abstract bundles can also be bundle parents
  	if (refQual != '')
  		refQual = refQual + '^OR';
  	refQual = refQual + this._getFlaggedCategoriesOrClause('bundle');

  	// filter out models that force tracking as consumable or no tracking
  	if (refQual != '')
  		refQual = refQual + '^';
  	return refQual + 'asset_tracking_strategy=leave_to_category';
  },

  /*
   * Helper to get asset class of asset.
   */
  _getAssetClass : function(asset) {
      if (asset === null)
  	    return '';
     
  	var assetClass = asset.sys_class_name || asset.getTableName();
  	if ('' == assetClass)
  		assetClass = 'alm_asset';
  	return assetClass;
  },
  
  /*
   * Helper to get ci class of ci.
   */
  _getCIClass: function(ci) {
      if (ci === null)
  	    return '';
      var ciClass = ci.sys_class_name;
      if ('' == ciClass)
          ciClass = 'cmdb_ci';
      return ciClass;  
  },

  /*
   * Helper to filter models based on what class their category would allow
   * them to create
   */
  _getCategoriesProducingAssetClassOrClause : function(assetClass) {
  	var categoryClause = '';
  	var categories = new GlideRecord('cmdb_model_category');
  	categories.addQuery('asset_class', assetClass);
  	categories.query();
  	while (categories.next()) {
  		if (categoryClause != '')
  			categoryClause = categoryClause + '^OR';
  		categoryClause = categoryClause + 'cmdb_model_categoryLIKE' +
  				categories.sys_id.toString();
  	}
  	return categoryClause;
  },

  /*
   * Helper to filter models belonging to categories with paramter flag set to
   * true
   */
  _getFlaggedCategoriesOrClause : function(flag) {
  	var categoryClause = '';
  	var categories = new GlideRecord('cmdb_model_category');
  	if (!gs.nil(flag))
  		categories.addQuery(flag, 'true');
  	categories.query();
  	while (categories.next()) {
  		if (categoryClause != '')
  			categoryClause = categoryClause + '^OR';
  		categoryClause = categoryClause + 'cmdb_model_categoryLIKE' +
  				categories.sys_id.toString();
  	}
  	return categoryClause;
  },

  nextVersionRefQual: function(current) {
  	var refQual = 'manufacturer=' + current.manufacturer.sys_id + '^sys_id!=' + current.sys_id;
  	if (GlidePluginManager.isActive('com.snc.sams')) {
  		refQual = 'manufacturer=' + current.manufacturer.sys_id + '^sys_id!=' + current.sys_id+ '^product=' + current.product;
  	}
  	return refQual;
  },

  type : 'ModelAndCategoryFilters'
};

Sys ID

d1816da63703100044e0bfc8bcbe5d61

Offical Documentation

Official Docs: