Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

how to not generate timecards for user who has ITIL ?

prash4
Tera Expert

I have a requirement where timecard should not generate for below conditions:

 

  • Users with ITIL role, even if they have timecard roles.

  • Users whose Job Level is any of: Manager, Executive, Supervisor, Director.

 

Schedule job: (auto generate timecard)

 /sysauto_script.do?sys_id=6bb0d6eb9350220064f572edb67ffb28&sysparm_view=&sysparm_domain=null&sysparm_domain_scope=null&sysparm_record_row=4&sysparm_record_rows=4&sysparm_record_list=nameSTARTSWITHauto%5eORDERBYrun_time

 

// One of the following values
// TimeCardConstants.CURRENT_WEEK
// TimeCardConstants.NEXT_WEEK
// TimeCardConstants.LAST_WEEK
var runFor = TimeCardConstants.CURRENT_WEEK;

// Comma separated group sys ids or group names. TimeSheet/TimeCards will be auto generated for time card users in the given groups.
var includeGroups = [];
var excludeGroups = [];

var generator = new TimeCardGenerator();
generator.generateFromConfig(runFor, includeGroups, excludeGroups);

 

 

Script include:  sys_script_include.do?sys_id=8e7a020e9373120064f572edb67ffbf6

script include name (Timecard generator) 


var TimeCardGenerator = Class.create();
TimeCardGenerator.prototype = {
initialize: function() {
this._topTaskPreferences = {};
this._timeSheetPolicies = {};
},

generateFromConfig: function(runFor, includeGroups, excludeGroups) {
if (runFor != TimeCardConstants.CURRENT_WEEK && runFor != TimeCardConstants.NEXT_WEEK && runFor != TimeCardConstants.LAST_WEEK) {
gs.error("Invalid runFor configuration");
return;
}

var noGroupFilter = (JSUtil.nil(includeGroups) || includeGroups.length == 0) && (JSUtil.nil(excludeGroups) || excludeGroups.length == 0);
if (noGroupFilter) {
gs.warn("Generating time sheets/time cards for all users may take a long time");
}

var timeCardUserRoleId = TimeCardUtil.getTimeCardUserRoleId();

var gr = new GlideRecord('sys_user_has_role');
gr.addQuery('role', timeCardUserRoleId);
gr.addQuery('state', 'active');
gr.addQuery('user.active', true);
if (!noGroupFilter) {
var sq = gr.addJoinQuery('sys_user_grmember', 'user', 'user');
if (JSUtil.notNil(includeGroups) && includeGroups.length > 0)
sq.addCondition('group', 'IN', includeGroups.join(',')).addOrCondition('group.name', 'IN', includeGroups.join(','));
if (JSUtil.notNil(excludeGroups) && excludeGroups.length > 0)
sq.addCondition('group', 'NOT IN', excludeGroups.join(',')).addCondition('group.name', 'NOT IN', excludeGroups.join(','));
}
gr.query();

var users = [];
var arrayUtil = new ArrayUtil();
while (gr.next()) {
var userId = gr.getValue('user');
if (arrayUtil.contains(users, userId))
continue;

users.push(userId);
if(this.shouldGenerateTimeCardsForUser(userId)){
var weekStartsOn;
if (runFor == TimeCardConstants.CURRENT_WEEK)
weekStartsOn = TimeCardUtil.getStartOfCurrentWeek(userId);
else if (runFor == TimeCardConstants.NEXT_WEEK)
weekStartsOn = TimeCardUtil.getStartOfNextWeek(userId);
else if (runFor == TimeCardConstants.LAST_WEEK)
weekStartsOn = TimeCardUtil.getStartOfLastWeek(userId);

gs.info("Generating time cards for user with sys id : " + userId);
this.generate(weekStartsOn, userId);
}
}
},

shouldGenerateTimeCardsForUser: function(userId){
var timeSheetPolicy = TimeSheetPolicy.getFromUserId(userId);
var timeSheetPolicyId = timeSheetPolicy.sysId();
var autoGenerateTimeCardSettingValue = false;
if(JSUtil.nil(this._timeSheetPolicies[timeSheetPolicyId])){
autoGenerateTimeCardSettingValue = timeSheetPolicy.autoGenerateTimeCards();
this._timeSheetPolicies[timeSheetPolicyId] = autoGenerateTimeCardSettingValue;
}else{
autoGenerateTimeCardSettingValue = this._timeSheetPolicies[timeSheetPolicyId];
}
return autoGenerateTimeCardSettingValue;
},

// Optional timeSheetId
generate: function(weekStartsOn, userId, timeSheetId, tables) {
if (JSUtil.nil(timeSheetId)) {
var factory = new TimeSheetFactory();
timeSheetId = factory.getTimeSheet(userId, weekStartsOn);
}

var taskIdsForExistingTimeCards = this._getTaskIdsForExistingTimeCards(timeSheetId);

var weekStartsOnDateTimeForUser = TimeCardUtil.getWeekStartsOnDateTimeForUser(weekStartsOn, userId);
var plannedTasks = this._getPlannedTasksForUser(weekStartsOnDateTimeForUser, userId, taskIdsForExistingTimeCards);
var tablesForTimeCard = tables ? tables.replaceAll('"', '').split(",") : [];
return this._createTimeCard(weekStartsOn, userId, plannedTasks, timeSheetId, taskIdsForExistingTimeCards, tablesForTimeCard);
},

_getPlannedTasksForUser: function(weekStartsOnDateTime, userId, taskIdsForExistingTimeCards) {
var weekEndsOnDateTime = new GlideDateTime(weekStartsOnDateTime);
weekEndsOnDateTime.addDaysUTC(7);

var actualDatesQuery = 'work_startISNOTEMPTY^work_start<=' + weekEndsOnDateTime.getValue() + '^work_endISEMPTY^ORwork_end>=' + weekStartsOnDateTime.getValue() + '^assigned_to=' + userId + '^ORadditional_assignee_listLIKE' + userId;
var plannedDatesQuery = '^NQwork_startISEMPTY^start_date<=' + weekEndsOnDateTime.getValue() + '^end_date>=' + weekStartsOnDateTime.getValue() + '^assigned_to=' + userId + '^ORadditional_assignee_listLIKE' + userId;

var hardAllocatedTaskIds = [];
var allocations = new GlideAggregate('resource_allocation');
if(allocations.isValid()){
allocations.addQuery('user', userId);
allocations.addQuery('booking_type', '1');
allocations.addQuery('start_date', '<=', weekEndsOnDateTime);
allocations.addQuery('end_date', '>=', weekStartsOnDateTime);
allocations.groupBy('task');
allocations.query();
while(allocations.next()){
hardAllocatedTaskIds.push(allocations.getValue('task'));
}
}

var hardAllocatedTasksQuery = '^NQsys_idIN' + hardAllocatedTaskIds.join(",");

if (JSUtil.notNil(taskIdsForExistingTimeCards)) {
var taskIdsStr = taskIdsForExistingTimeCards.join(',');
actualDatesQuery = actualDatesQuery + '^sys_idNOT IN' + taskIdsStr;
plannedDatesQuery = plannedDatesQuery + '^sys_idNOT IN' + taskIdsStr;
hardAllocatedTasksQuery = hardAllocatedTasksQuery + '^sys_idNOT IN' + taskIdsStr;
}

var encodedQuery = actualDatesQuery + plannedDatesQuery + hardAllocatedTasksQuery;

var gr = new GlideRecord('planned_task');
gr.addEncodedQuery(encodedQuery);
gr.query();
return gr;
},

_getTaskIdsForExistingTimeCards: function(timeSheetId) {
var timeSheet = new TimeSheet(timeSheetId);
var taskIdsForExistingTimeCards = timeSheet.getTaskIds();
return taskIdsForExistingTimeCards;
},

_createTimeCard: function(weekStartsOn, userId, tasks, timeSheetId, taskIdsForExistingTimeCards, tablesForTimeCard) {
var timecardsCreated = 0;
var arrayUtil = new ArrayUtil();
var domainId = TimeCardUtil.getUserDomainId(userId);
var timesheetPolicy = TimeSheetPolicy.getFromUserId(userId);
var isAllowMultipleRateTypes = timesheetPolicy.allowMultipleRatetypes();
var defaultRateType = timesheetPolicy.defaultRateType();
while (tasks.next()) {
if (!this._timeCardAllowedForTask(tasks, tablesForTimeCard))
continue;

var taskId = this._getTaskIdForTimeCard(tasks);

if (arrayUtil.contains(taskIdsForExistingTimeCards, taskId))
continue;
taskIdsForExistingTimeCards.push(taskId);
var gr = new GlideRecord('time_card');
gr.setValue('user', userId);
gr.setValue('week_starts_on', weekStartsOn);
gr.setValue('task', taskId);
var category = 'task_work';
if (tasks.instanceOf('pm_project_task') || tasks.instanceOf('pm_project'))
category = 'project_work';
gr.setValue('category', category);
if (JSUtil.notNil(timeSheetId))
gr.setValue('time_sheet', timeSheetId);
if(JSUtil.notNil(domainId))
gr.setValue('sys_domain', domainId);
if(isAllowMultipleRateTypes)
gr.setValue('rate_type', defaultRateType);
var id = gr.insert();
if(JSUtil.notNil(id))
timecardsCreated++;
}
return timecardsCreated;
},

_timeCardAllowedForTask: function(task, tablesForTimeCard) {
if(tablesForTimeCard && tablesForTimeCard.length && tablesForTimeCard.indexOf(task.getValue('sys_class_name')) == -1) {
return false;
} else if (task.instanceOf('pm_project_task') || task.instanceOf('pm_project')) {
var project = task.top_task.getRefRecord();
if (project.getValue('time_card_preference') == 'no_time_card')
return false;
}
return true;
},

_getTaskIdForTimeCard: function(taskRecord) {
var taskId = taskRecord.getValue('sys_id');
var topTaskId = taskRecord.getValue('top_task');
if(JSUtil.notNil(topTaskId) && this._useTopTask(taskRecord.top_task.getRefRecord()))
taskId = topTaskId;
return taskId;
},

_useTopTask: function(topTask) {
var topTaskId = topTask.getValue('sys_id');
if (JSUtil.nil(this._topTaskPreferences[topTaskId]))
this._topTaskPreferences[topTaskId] = (topTask.getValue('time_card_preference') == 'project');
return this._topTaskPreferences[topTaskId];
},

type: 'TimeCardGenerator'
};

 

0 REPLIES 0