var AssignApprover = Class.create();
AssignApprover.prototype = {
initialize: function() {
this.roleAssignmentGroup = "fdec78064736a91013e2df27e26d430e";
},
/**
* Add or remove approves roles for a given user.
*
@Param {GlideRecord} userRecord
*/
assignApprover: function(userRecord) {
if (this.requireApprover(userRecord)) {
this._addGroupMember(userRecord);
} else {
this._removeGroupMember(userRecord);
}
},
/**
* validates all existing approver role assignments and removes unecessary ones.
* Note will add/remove users from the designated group in this script include only.
*/
ValidateApprovers: function() {
var grUsrHasRole = new GlideRecord("sys_user_has_role");
grUsrHasRole.addEncodedQuery("role.nameSTARTSWITHapprover_user");
grUsrHasRole.query();
while (grUsrHasRole.next()) {
this.assignApprover(grUsrHasRole.user.getRefRecord());
}
},
/**
* returns true if the user requires approver rights to operate.
*
@Param {GlideRecord} userRecord
* @returns {boolean}
*/
requireApprover: function(userRecord) {
if (this._isActive(userRecord)) {
//delegation
var haveDelegation = this._haveActiveDelegation(userRecord);
//Manager
var isManagerHQ = this._isManager(userRecord);
//branch manager
var isBranchManager = this._isBranchManager(userRecord);
//regional director
var isRegionalDirector = this._isRegionalDirector(userRecord);
return haveDelegation || isBranchManager || isManagerHQ || isRegionalDirector || false;
}
},
/**
* Will evaluate all users and assign approver if needed.
* NB. only required for intial go live.
* var ut = new AssignApprover()
* ut.initializeApprover("country=DA^ORcountry=NO^ORcountry=SE^active=true")
*/
initializeApprover: function(encodedQuery) {
var grUser = new GlideRecord("sys_user");
grUser.addEncodedQuery(encodedQuery);
grUser.query();
while (grUser.next()) {
this.assignApprover(grUser);
}
},
/**
* add user to the designated approver group.
*
@Param {GlideRecord} userRecord
*/
_addGroupMember: function(userRecord) {
//ensure users is only added once.
var grGrpMemValidate = new GlideRecord("sys_user_grmember");
grGrpMemValidate.addEncodedQuery(
"user=" +
userRecord.getUniqueValue() +
"^group=" +
this.roleAssignmentGroup
);
grGrpMemValidate.query();
if (!grGrpMemValidate.next()) {
var grGrpMemAdd = new GlideRecord("sys_user_grmember");
grGrpMemAdd.initialize();
grGrpMemAdd.setValue("user", userRecord.getUniqueValue());
grGrpMemAdd.setValue("group", this.roleAssignmentGroup);
grGrpMemAdd.insert();
}
},
/**
* removes user from the designated approver group.
*
@Param {GlideRecord} userRecord
*/
_removeGroupMember: function(userRecord) {
//ensure users is only added once.
var grGrpMemDelete = new GlideRecord("sys_user_grmember");
grGrpMemDelete.addEncodedQuery(
"user=" +
userRecord.getUniqueValue() +
"^group=" +
this.roleAssignmentGroup
);
grGrpMemDelete.query();
//in case of dublicates.
grGrpMemDelete.deleteMultiple();
},
/**
* Retrieves all delegation entries with end after today for a user
* @return {boolean}
*/
_haveActiveDelegation: function(userRecord) {
var grGranDel = new GlideRecord("sys_granular_delegate");
grGranDel.addEncodedQuery(
"ends>javascript:gs.endOfToday()^delegate=" + userRecord.getUniqueValue()
);
grGranDel.query();
return grGranDel.next();
},
/**
* Returns true if user is assigned branch manager on 1 or more locations.
*
@Param {GlideRecord} userRecord
* @return {boolean}
*/
_isBranchManager: function(userRecord) {
var grLoc = new GlideRecord("cmn_location");
return grLoc.get("u_branch_manager", userRecord.getUniqueValue());
},
/**
* returns true if user is set as manager for 1 or more users.
*
@Param {GlideRecord} userRecord
* @returns {boolean}
*/
_isManager: function(userRecord) {
var grLoc = new GlideRecord('cmn_location');
var grUsr = new GlideRecord("sys_user");
grUsr.addEncodedQuery('manager=' + userRecord.getUniqueValue());
grUsr.query();
grLoc.addEncodedQuery('u_location_hq=true^sys_id=' + userRecord.location);
grLoc.query();
return grLoc.next() && grUsr.next();
},
/**
* returns true if user is active and have signed on
*
@Param {GlideRecord} userRecord
* @returns {boolean}
*/
_isActive: function(userRecord) {
return userRecord.active && userRecord.last_login;
},
/**
* returns true if user have "Regional Director" title
*
@Param {GlideRecord} userRecord
* @returns {boolean}
*/
_isRegionalDirector: function(userRecord) {
var grTitle = new GlideRecord("sys_user");
grTitle.addEncodedQuery('title='+ userRecord.title('Regional Director', 'Regionsdirektør'));
grTitle.query();
//if(grTitle.title=='Regional Director'|| grTitle.title=='Regionsdirektør')
gs.log("The list of stakeholders is: "+grTitle);
return grTitle.next();
},
type: "AssignApprover"
};