Name

global.UserSetSubscriptionSyncHelper

Description

No description available

Script

var UserSetSubscriptionSyncHelper = Class.create();
UserSetSubscriptionSyncHelper.prototype = {
  initialize: function() {
  	this._arrayUtil = new ArrayUtil();
  	this._userSetHelper = new UserSetHelper();
  	this._userSubscriptionHelper = new UserSubscriptionHelper();
  	this.LICENSE_DETAILS_TABLE = 'license_details';
  	this.SYS_USER_LICENSE_SOURCE_TABLE = 'sys_user_license_source';
  	this.userSetIDToNameMap = {};
  	this.licenseIDToNameMap = {};
  },

  //used to sync only user based license
  //This method is no longer called form subscription summary job
  startSync: function() {
  	var autoSyncedLicenseGR = this._getAllUserBasedLicense();
  	
  	if (!autoSyncedLicenseGR.hasNext()) {
  		gs.log('No subscription marked as auto sync, skipping sync');
  		return;
  	}
  	var subUtils = new SNSubscriptionUtils();
  	while(autoSyncedLicenseGR.next()) {
  		
  		gs.log('Syncing subscription ' + autoSyncedLicenseGR.getValue('name'));
  		
  		subUtils.syncLicense(autoSyncedLicenseGR);
  	}
  },
  
  syncLicense: function(licenseGR) {
  	
  	if (!licenseGR.isValidRecord())
  		return;

  	var licenseSysId = licenseGR.getValue('sys_id');
  	this.licenseIDToNameMap[licenseSysId] = licenseGR.getValue('name');
  	var licenseHasUserSetGR = this._getUserSetsForLicense(licenseSysId);
  		
  	var usersToBeAdded = {};
  	var usersTobeRemoved = {};
  	var totalUsersToBeAddedForThisLicense = 0;
  	var totalUsersToBeRemovedFromLicense = 0;
  	while(licenseHasUserSetGR.next()) {
  		var userSetSysId = licenseHasUserSetGR.getValue('user_set');

  		var userSetGR = this._getUserSetGR(userSetSysId);
  		this.userSetIDToNameMap[userSetSysId] = userSetGR.getValue('name');

  		// Retrieve the users who came to the license from this user set
  		var userFromThisSetInLicense = this._getUsersInLicenseFromThisUserSet(licenseSysId, userSetSysId);
  		var usersInThisSet = this._userSetHelper.retrieveUserSetMemberWithSysID(userSetSysId);

  		// add members who are in the set and not in the license from this set
  		var usersAddedToSet = this._arrayUtil.diff(usersInThisSet, userFromThisSetInLicense);

  		// remove members who are in the license and not in set
  		var usersRemovedFromSet = this._arrayUtil.diff(userFromThisSetInLicense, usersInThisSet);

  		if (usersAddedToSet.length > 0) {
  			totalUsersToBeAddedForThisLicense += usersAddedToSet.length;
  			usersToBeAdded[userSetSysId] = usersAddedToSet; // mapping of user set sys id to the array of members to add
  		}	

  		if (usersRemovedFromSet.length > 0) {
  			totalUsersToBeRemovedFromLicense += usersRemovedFromSet.length;
  			usersTobeRemoved[userSetSysId] = usersRemovedFromSet; // mapping of user set sys id to the array of members to remove
  		}
  	}

  	var retObj;
  	
  	if (this._getObjectSize(usersToBeAdded) > 0 || this._getObjectSize(usersTobeRemoved) > 0) {
  		 retObj = this._addRemoveUsersFromLicense(licenseSysId, usersToBeAdded, usersTobeRemoved);
  	} else {
  			retObj = {};
  			retObj.numUsersAdded = totalUsersToBeAddedForThisLicense;
  			retObj.numUsersRemoved = totalUsersToBeRemovedFromLicense;
  	}
  	
  	return retObj;
  },
  
  _addRemoveUsersFromLicense: function(licenseSysID, /* object */addedUsers, /* object */removedUsers) {
  	var retStatus = {};
  	retStatus.numUsersAdded = 0;
  	retStatus.numUsersRemoved = 0;
  	
  	for(var userSetSysID in removedUsers) {
  		var numRemoved = this._syncRemoveUsersFromLicense(removedUsers[userSetSysID], licenseSysID, userSetSysID);
  		retStatus.numUsersRemoved = numRemoved;
  		gs.log('Syncher removed ' + numRemoved + ' users from user set ' +  this.userSetIDToNameMap[userSetSysID] + ' from the subscription ' + this.licenseIDToNameMap[licenseSysID]);
  	}
  	
  	// So, here numUsersToAdd number of users are added from all the sets, if the license has
  	// that many slots available all of them can be assigned else all of them go to pending 
  	if (this._getObjectSize(addedUsers) > 0) {
  		
  		var uniqueUsersAddedInSets = [];
  		for(var setSysID in addedUsers) {
  			uniqueUsersAddedInSets = this._arrayUtil.union(uniqueUsersAddedInSets, addedUsers[setSysID]);
  		}
  		
  		var uniqueUsersToBeAddedToLicense = [];
  		for (var i = 0; i < uniqueUsersAddedInSets.length; i++) {
  			// From the uniqueUsersAddedInSets, check if anyone already is already allocated to the license or is excluded
  			if (!this._userSubscriptionHelper.doesUserHaveLicense(uniqueUsersAddedInSets[i], licenseSysID) 
  				&& !this._userSubscriptionHelper._isUserExcludedFromLicense(uniqueUsersAddedInSets[i], licenseSysID))
  				uniqueUsersToBeAddedToLicense.push(uniqueUsersAddedInSets[i]);
  		}
  		
  		var status = this._userSetHelper.getUserLicenseStatus(licenseSysID, uniqueUsersToBeAddedToLicense.length);
  		
  		gs.log('Adding ' + uniqueUsersToBeAddedToLicense.length + ' users to license ' + this.licenseIDToNameMap[licenseSysID]);
  		for(var usrSetSysID in addedUsers) {
  			var numAdded = this._syncAddUsersToLicense(addedUsers[usrSetSysID], licenseSysID, usrSetSysID, status);
  			gs.log('Syncher added ' + numAdded + ' new users from the user set ' + this.userSetIDToNameMap[usrSetSysID]  + ' to the subscription ' +   this.licenseIDToNameMap[licenseSysID]);
  		}
  		
  		retStatus.numUsersAdded = uniqueUsersToBeAddedToLicense.length;
  	}
  	
  	return 	retStatus;
  },

  _getUserSetsForLicense: function(licenseSysId){
  	var licenseUserSetGr = new GlideRecord('license_has_user_set');
  	licenseUserSetGr.addQuery('license',licenseSysId);
  	licenseUserSetGr.query();
  	return licenseUserSetGr;
  },
  
  _getUsersInLicenseFromThisUserSet: function(licenseSysId, userSetSysId){
  	
  	var userInLicenseIds = [];
  	var userHaLicenseGR = new GlideRecord(this.SYS_USER_LICENSE_SOURCE_TABLE);
  	userHaLicenseGR.initialize();
  	userHaLicenseGR.addQuery('license', licenseSysId);
  	userHaLicenseGR.addQuery('user_set_source', userSetSysId);
  	userHaLicenseGR.orderBy('user.sys_id');
  	userHaLicenseGR.query();

  	while (userHaLicenseGR.next()) {
  		userInLicenseIds.push(userHaLicenseGR.getValue('user'));

  	}
  	return userInLicenseIds;
  },
  
  _getAllLicenseWithSyncSetTrue: function() {
  	var licenseDetailsGR = new GlideRecord(this.LICENSE_DETAILS_TABLE);
  	licenseDetailsGR.addQuery('auto_sync', '1');
  	licenseDetailsGR.query();
  	
  	return licenseDetailsGR;
  },

  _getAllUserBasedLicense: function() {
  	var licenseDetailsGR = new GlideRecord(this.LICENSE_DETAILS_TABLE);
  	licenseDetailsGR.addQuery('license_type', 0);
  	licenseDetailsGR.addQuery('display_only', false);
  	licenseDetailsGR.query();

  	return licenseDetailsGR;
  },
  
  _syncRemoveUsersFromLicense: function(/* array */removedUserList, licenseSysID, userSetSysId) {
  	var removedUserCount = 0;
  	for (var i = 0; i < removedUserList.length; i++) {
  		if (this._userSubscriptionHelper.removeUserFromLicense(removedUserList[i], licenseSysID, userSetSysId));
  			removedUserCount++;
  		
  	}
  	
  	return removedUserCount;
  },
  
  _syncAddUsersToLicense: function(/* array */addedUserList, licenseSysID, userSetSysId, status) {
  	var addedUserCount = 0;
  	
  	for (var i = 0; i < addedUserList.length; i++) {
  		gs.log('Adding ' +addedUserList[i] + ' user to subscription ' +licenseSysID + ' with status ' +status);
  		if (this._userSubscriptionHelper.addUserToLicenseWithStatus(addedUserList[i], licenseSysID, userSetSysId, status))
  			addedUserCount++;
  	}
  	
  	return addedUserCount;
  },
  
  _getObjectSize: function(obj) {
  	var size = 0, key;
  	for (key in obj) {
  		if (obj.hasOwnProperty(key)) size++;
  	}
  	return size;
  },
  
  _getUserSetGR: function(userSetSysID) {
  	var userSetGR = new GlideRecord('sys_user_set');
  	if (JSUtil.nil(userSetSysID))
  		return userSetGR;
  		
  	userSetGR.get(userSetSysID);
  		
  	return userSetGR;
  },
  
  type: 'UserSetSubscriptionSyncHelper'
};

Sys ID

f962e0d69f3012001526317f842e70ed

Offical Documentation

Official Docs: