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