Name

sn_itom_licensing.ITOMHealthCiCountsWrongDomainFixer

Description

Summarize all itom_lu_ci_counts recrods with domain that is not legal into global domain record + remove the summarized records.

Script

var OTOM_SKU_TYPE = "otm";
var ITOM_SKU_TYPE = "itom";

var APPS = ["Health", "HLA"];
var itomLicensingUtils = new ITOMLicensingUtilsStore();

var recordsInsertedForAppSkuForLog = 0;
var recordsRemovedForAppSkuForLog = 0;
var sysCreatedOnForRemove = new GlideDateTime('1970-01-01 00:00:00');
var userName = '';

var ITOMHealthCiCountsWrongDomainFixer = Class.create();
ITOMHealthCiCountsWrongDomainFixer.prototype = {
  initialize: function(updateRealData) {
  	this.updateData = (!gs.nil(updateRealData) && updateRealData == 'true') ? true : false;
  },

  fixDomain: function() {

      this.logMessage('Script start. this.updateData:' + this.updateData);
      var skuIds = itomLicensingUtils._getSKUIDs();
      userName = gs.getUser().getName();
      // Loaded from domain table, or if table doesnot exist, filled with 'global' only
      var domainList = itomLicensingUtils.getDomains();
      this.logMessage('domains (from domain table or global if it does not exist):' + JSON.stringify(domainList));
      this.logMessage('Start handling otm records.');
      var otmSkuSysId = skuIds[OTOM_SKU_TYPE];
      if (otmSkuSysId) {
          // check if OTM is supported
          if (!itomLicensingUtils.isOTDependencyPresent()) {
              // updating otm records to be removed
              this.removeOtmRecords(otmSkuSysId);
          } else {
              this.fixBySku(OTOM_SKU_TYPE, otmSkuSysId, domainList);
          }
      } else {
          this.logMessage('Failed to find OTM sku in itom_lu_sku_type.');
      }

      this.logMessage('Start handling itom records.');
      var itomSkuSysId = skuIds[ITOM_SKU_TYPE];

      this.fixBySku(ITOM_SKU_TYPE, itomSkuSysId, domainList);

  },

  fixBySku: function(sku, skuTypeSysId, domainList) {
      for (var i = 0; i < APPS.length; i++) {
          this.summarizeRecordIntoGlobalByAppAndSku(sku, APPS[i], skuTypeSysId, domainList);
      }
  },

  summarizeRecordIntoGlobalByAppAndSku: function(sku, app, skuTypeSysId, domainList) {
      this.logMessage('Going to fix App:' + app + ' for sku:' + sku);
      // select all the non aggregated records of the sku+app
      var centralTableGr = new GlideRecord('itom_lu_ci_counts');
      centralTableGr.addQuery('is_aggregated', 'false');
      centralTableGr.addQuery('sku', skuTypeSysId);
      centralTableGr.addQuery('value_stream', app);
      centralTableGr.addQuery('sys_created_on', '>', sysCreatedOnForRemove);
      centralTableGr.orderByDesc('sys_created_on');
      centralTableGr.orderBy('category');
      centralTableGr.query();
  	// Init counters for log
      recordsInsertedForAppSkuForLog = 0;
      recordsRemovedForAppSkuForLog = 0;
      var prevCategory = '';
      var prevSysCreatedOn = '';
      var prevSysUpdatedOn = '';
      var prevUserCreated = '';
      var totalCount = 0;
      // If we have only 1 record of global that summarized, that record will remain
      var hasGlobalRecord = false;
      var recordsToDelete = [];
  	this.logMessage('Going to check ' + centralTableGr.getRowCount() + ' records for ' + app + '-' + sku);
      // loop over all none aggregated records for each sku + app
      while (centralTableGr.next()) {
          // If category or creation date was changed, a new summarized should start
          if (prevCategory != '' &&
              (prevCategory != centralTableGr.getValue('category') ||
                  prevSysCreatedOn != centralTableGr.getValue('sys_created_on'))) {
              this.updateCentralTable(sku, skuTypeSysId, app, prevUserCreated, prevCategory, prevSysCreatedOn, prevSysUpdatedOn, hasGlobalRecord, recordsToDelete, totalCount);
              totalCount = 0;
              hasGlobalRecord = false;
              recordsToDelete = [];
              prevSysUpdatedOn = '';
          }

          var domain = centralTableGr.getValue('sys_domain');
          // Summarize record if is a global domain or if the domain is not exist in domain list 
          if (domain == 'global' || !new global.ArrayUtil().contains(domainList, domain)) {
              var count = parseInt(centralTableGr.getValue('count'));
              totalCount = totalCount + count;
              if (domain == 'global' && hasGlobalRecord == false) {
                  hasGlobalRecord = true;
                  prevSysUpdatedOn = centralTableGr.getValue('sys_updated_on');
              }
              recordsToDelete.push(centralTableGr.getUniqueValue());
          }

          prevCategory = centralTableGr.getValue('category');
          prevSysCreatedOn = centralTableGr.getValue('sys_created_on');
  		prevUserCreated = centralTableGr.getValue('sys_created_by');
      }

      // insert the last combination of category+createdData, since we went out of the loop and the records weren't updated
      this.updateCentralTable(sku, skuTypeSysId, app, prevUserCreated, prevCategory, prevSysCreatedOn, prevSysUpdatedOn, hasGlobalRecord, recordsToDelete, totalCount);
      this.logMessage('Finished to fix App:' + app + ' for sku ' + sku + ' records insered:' + recordsInsertedForAppSkuForLog + ' records removed:' + recordsRemovedForAppSkuForLog);

  },

  updateCentralTable: function(sku, skuTypeSysId, app, createdUser, category, createdDateTime, updatedDateTime, hasGlobalRecord, recordsToDelete, totalCount) {
      if (recordsToDelete.length > 1 || (!hasGlobalRecord && recordsToDelete.length > 0)) {
          // insert global record + remove summarized records
          recordsInsertedForAppSkuForLog += 1;
          recordsRemovedForAppSkuForLog += recordsToDelete.length;
      this.logMessage("going to insert sku:" + sku + ' app:' + app + ' category:' + category + ' created:' + createdDateTime + ' updated:' + updatedDateTime + ' totalCount:' + totalCount + ' create by:' + createdUser + ' updated by:' + userName + ' and removing ' + recordsToDelete.length + ' summarized records');
          this.insertGlobalRecord(skuTypeSysId, app, createdUser, category, createdDateTime, updatedDateTime, totalCount);
          this.markRecordsToDelete(recordsToDelete);
      }
  },

  insertGlobalRecord: function(skuTypeSysId, app, createdUser, category, created, currentUpdated, totalCount) {
      if (currentUpdated == '') {
          currentUpdated = created;
      }
      var centralTableGr = new GlideRecord('itom_lu_ci_counts');
      centralTableGr.initialize();
      centralTableGr.setValue('sku', skuTypeSysId);
      centralTableGr.setValue('sys_domain', 'global');
      centralTableGr.setValue('sys_created_on', created);
      centralTableGr.setValue('sys_updated_on', currentUpdated);
      centralTableGr.setValue('sys_updated_by', userName);
      centralTableGr.setValue('sys_created_by', createdUser);
      centralTableGr.setValue('category', category);
      centralTableGr.setValue('value_stream', app);
      centralTableGr.setValue('count', "" + totalCount);
      // Do not update sys_updated_by, sys_updated_on, sys_mod_count, sys_created_by, and sys_created_on
      centralTableGr.autoSysFields(false);
  	if (this.updateData) {
  		centralTableGr.insert();
  	}        
  },

  markRecordsToDelete: function(recordsToDelete) {
      var gr = new GlideRecord('itom_lu_ci_counts');
      gr.addQuery('sys_id', 'IN', recordsToDelete);
      gr.setValue('sys_created_on', sysCreatedOnForRemove);
  	gr.setValue('sys_updated_on', sysCreatedOnForRemove);
  	if (this.updateData) {
  		gr.updateMultiple();
  	}      
  },

  removeOtmRecords: function(skuTypeSysId) {
      this.logMessage('Going to update otm records. field sys_created_on will be set to 1970-01-01 00:00:00');
      var gr = new GlideRecord('itom_lu_ci_counts');
      gr.addQuery('sku', skuTypeSysId);
      gr.addQuery('value_stream', 'IN', APPS);
      gr.setValue('sys_created_on', sysCreatedOnForRemove);
  	gr.setValue('sys_updated_on', sysCreatedOnForRemove);
  	if (this.updateData) {
  		gr.updateMultiple();
  	}      
      this.logMessage('otm records updated.');
  },

  logMessage: function(message) {
      gs.info("ITOMHealthCiCountsWrongDomainFixer - " + message);
  },

  type: 'ITOMHealthCiCountsWrongDomainFixer'
};

Sys ID

dfba873853f291102b5dddeeff7b12f2

Offical Documentation

Official Docs: