We've updated the ServiceNow Community Code of Conduct, adding guidelines around AI usage, professionalism, and content violations. Read more

In time sheet portal , Task tab only can see InProgress records

Anish9515
Tera Contributor

In time sheet portal , task tab i can see only in progress records 
This is OOB function , Please help me which widget can rework.

 

Anish9515_0-1735538320494.png

 

@Ankur Bawiskar

22 REPLIES 22

hi @Anish9515 ,,

 

these two line gives group information logged in user  

var timeCardGroupTaskSelector = new TimeCardGroupTaskSelector();
	data.userGroupIds = timeCardGroupTaskSelector.getGroups(data.userId);

 and getRecords() function to fetch the information and add to list

 

 

Thanks,

BK

If this information proves useful, kindly mark it as helpful or accepted solution.

Thanks,
BK

can we add  below query here state =2 ?
if
(gr.instanceOf('pm_project') || gr.instanceOf('pm_project_task') || gr.instanceOf('sn_audit_task') || gr.instanceOf('sn_audit_engagement') || gr.instanceOf('sn_audit_advanced_milestone') || gr.instanceOf('sn_audit_advanced_engagement_project') || gr.instanceOf('sn_grc_issue')) {
            var actualDatesQuery = 'work_startISNOTEMPTY^work_start<=' + weekEndsOnDateTime +
                '^work_endISEMPTY^ORwork_end>=' + weekStartsOnDateTime +
                '^assigned_to=' + data.userId + '^ORadditional_assignee_listLIKE' +
                data.userId;
            var plannedDatesQuery = '^NQwork_startISEMPTY^start_date<=' + weekEndsOnDateTime +
                '^end_date>=' + weekStartsOnDateTime + '^assigned_to=' +
                data.userId + '^ORadditional_assignee_listLIKE' +
                data.userId;
               
            var encodedQuery = actualDatesQuery + plannedDatesQuery ;
            gr.addEncodedQuery(encodedQuery);
        } 
 

Hi @Anish9515 ,

 

can you try this

(function ($sp) {
	data.userId = $sp.getParameter('sysparm_user_id') || gs.getUserID();
	
	var timesheetId = $sp.getParameter('sysparm_timesheet_id') || input.timesheetId;
	
	if (!timesheetId) {
		timesheetId = new TimeSheetFactory().getTimeSheet(data.userId);
	}
	data.timesheetId = timesheetId;
	
	var timesheet = new GlideRecord('time_sheet');
	
	timesheet.get(data.timesheetId);
	
	var timecardGr = new GlideRecord('time_card');
	
	timecardGr.newRecord();
	data.canCreateTimecards = timecardGr.canCreate();
	
	var dateObj = new GlideDate();
	
	dateObj.setValue(timesheet.getValue('week_starts_on'));
	
	var weekStart = dateObj.toString();
	var weekStartsOnDateTime = TimeCardUtil.getWeekStartsOnDateTimeForUser(weekStart, data.userId);
	
	dateObj.addDaysUTC(6);
	
	var weekEnd = dateObj.toString();
	var weekEndsOnDateTime = new GlideDateTime(weekStartsOnDateTime);
	
	weekEndsOnDateTime.addDaysUTC(7);
	
	//Hard allocated task ids
	var hardAllocatedTaskIds = [];
	var allocations = new GlideAggregate('resource_allocation');
	var sysTableFieldsMap = {};
	
	if (allocations.isValid()) {
		allocations.addQuery('user', data.userId);
		allocations.addQuery('booking_type', '1');
		allocations.addQuery('start_date', '<=', weekEnd);
		allocations.addQuery('end_date', '>=', weekStart);
		allocations.groupBy('task');
		allocations.query();
		
		while (allocations.next()) {
			hardAllocatedTaskIds.push(allocations.getValue('task'));
		}
	}
	
	var defaultTables = 'rm_epic,sn_safe_epic,incident,problem,change_request,rm_story,rm_scrum_task,pm_project,pm_project_task,rm_defect,rm_enhancement,dmn_demand_task,sn_audit_task,sn_audit_engagement,sn_audit_advanced_milestone,sn_audit_advanced_engagement_project,sn_grc_issue';
	var defaultLayout = {
		primary_field: 'short_description',
		secondary_fields: ['state', 'sys_updated_on'],
		tags: [{
			field: 'priority',
			colors: {
				'1': {
					bgColor: 'tomato',
					textColor: 'white'
				},
				'2': {
					bgColor: 'orange',
					textColor: 'white'
				}
			}
		}],
		sn_audit_engagement: { // Default layout for engagement time card
			primary_field: 'name',
			secondary_fields: ['state', 'sys_updated_on'],
			tags: [{
				field: 'priority',
				colors: {
					'1': {
						bgColor: 'tomato',
						textColor: 'white'
					},
					'2': {
						bgColor: 'orange',
						textColor: 'white'
					}
				}
			}]
		}
	};
	data.tables = input.tables || options.tables || defaultTables;
	data.layout = input.layout || options.layout || defaultLayout;
	data.ids = [];
	data.cards = [];
	data.taskFilters = {};
	data.groupTaskFilters = {};
	data.card_layouts = input.card_layouts || {};
	data.defaultLayout = defaultLayout;
	data.defaultFields = _getFieldsForLayout(defaultLayout);
	data.groupCards = [];
	data.userGroupIds = [];
	data.groupTaskIds = [];
	data.tableFieldLabelMap = {};
	data.sysIdMap = {};
	
	var timesheetPolicy = TimeSheetPolicy.getFromUserId(data.userId);
	data.isAllowMultipleRateTypes = timesheetPolicy.allowMultipleRatetypes();
	data.defaultRateType = timesheetPolicy.defaultRateType();
	var defaultRateTypeName;
	if (!gs.nil(data.defaultRateType)) {
		var defaultRateTypeRecord = new GlideRecord('rate_type');
		defaultRateTypeRecord.get(data.defaultRateType);
		defaultRateTypeName = defaultRateTypeRecord.getValue('name');
	}
	//group-start
	var timeCardGroupTaskSelector = new TimeCardGroupTaskSelector();
	data.userGroupIds = timeCardGroupTaskSelector.getGroups(data.userId);

	function getRecords(table) {
		table = table.trim();
		var gr = new GlideRecordSecure(table); //Get records
		if (!gr.isValid()) {
			return;
		}
		if (gr.instanceOf('pm_project') || gr.instanceOf('pm_project_task') || gr.instanceOf('sn_audit_task') || gr.instanceOf('sn_audit_engagement') || gr.instanceOf('sn_audit_advanced_milestone') || gr.instanceOf('sn_audit_advanced_engagement_project') || gr.instanceOf('sn_grc_issue')) {
			var actualDatesQuery = 'work_startISNOTEMPTY^work_start<=' + weekEndsOnDateTime +
				'^work_endISEMPTY^ORwork_end>=' + weekStartsOnDateTime +
				'^assigned_to=' + data.userId + '^ORadditional_assignee_listLIKE' +
				data.userId;
			var plannedDatesQuery = '^NQwork_startISEMPTY^start_date<=' + weekEndsOnDateTime +
				'^end_date>=' + weekStartsOnDateTime + '^assigned_to=' +
				data.userId + '^ORadditional_assignee_listLIKE' +
				data.userId;
			var encodedQuery = actualDatesQuery + plannedDatesQuery;
			gr.addEncodedQuery(encodedQuery);
		} else {
			gr.addEncodedQuery('assigned_to=' + data.userId + '^sys_created_on<=' + weekEndsOnDateTime + '^active=true^state=2');
			var gr_part1 = new GlideRecordSecure(table);
			gr_part1.addEncodedQuery('assigned_to=' + data.userId + '^sys_created_on<=' + weekEndsOnDateTime + '^closed_atBETWEEN' + weekStartsOnDateTime + '@' + weekEndsOnDateTime);
			gr_part1.query();
			_addRecordsToList(gr_part1, false);
			var gr_part2 = new GlideRecordSecure(table);
			gr_part2.addEncodedQuery('state=2^additional_assignee_listLIKE' + data.userId + '^sys_created_on<=' + weekEndsOnDateTime + '^active=true');
			gr_part2.query();
			_addRecordsToList(gr_part2, false);
			var gr_part3 = new GlideRecordSecure(table);
			gr_part3.addEncodedQuery('state=2^additional_assignee_listLIKE' + data.userId + '^sys_created_on<=' + weekEndsOnDateTime + '^closed_atBETWEEN' + weekStartsOnDateTime + '@' + weekEndsOnDateTime);
			gr_part3.query();
			_addRecordsToList(gr_part3, false);
		}
		gr.query();
		_addRecordsToList(gr, false);
	}

	function fetchGroupTasks() {
		for (var j = 0; j < tables.length; j++) {
			var tableForGroupTasks = tables[j].trim();
			var groupTasks = timeCardGroupTaskSelector.getTasksInTwoDatesByUserGroups(tableForGroupTasks, weekStartsOnDateTime, weekEndsOnDateTime, data.userGroupIds);
			_addRecordsToList(groupTasks, true);
		}
	}
	//Get Unassigned Tasks for which timecard has been logged
	var unassignedTaskIds = [];

	function getUnassignedTask() {
		var timecards = new GlideAggregate('time_card');
		timecards.addQuery('time_sheet', timesheetId);
		timecards.addEncodedQuery('taskISNOTEMPTY');
		timecards.addQuery('task', 'NOT IN', data.ids);
		timecards.query();
		while (timecards.next()) {
			unassignedTaskIds.push(timecards.getValue('task'));
		}
	}
	var otherTaskIds = [];
	//Get Hard Allocated Tasks
	function getHardAllocatedTasks() {
		var tasks = new GlideRecordSecure('task');
		tasks.addQuery('sys_id', 'IN', otherTaskIds.join(','));
		tasks.query();
		_addRecordsToList(tasks, false);
	}
	var tables = data.tables.split(',');
	if (input.fetchGroupTasks) {
		fetchGroupTasks();
		data.groupTasksFetched = true;
	} else {
		//group-end
		for (var i = 0; i < tables.length; i++) {
			var table = tables[i];
			//Get records
			getRecords(table);
		}
		getUnassignedTask();
		otherTaskIds = hardAllocatedTaskIds.concat(unassignedTaskIds);
		getHardAllocatedTasks();
		data.tasksFetched = true;
	}
	data.taskFilters.all_tasks = {};
	data.taskFilters.all_tasks.label = gs.getMessage('All Tasks');
	data.taskFilters.all_tasks.value = '';
	data.taskFilters.all_tasks.count = data.cards.length;
	data.groupTaskFilters.all_tasks = {};
	data.groupTaskFilters.all_tasks.label = gs.getMessage('All Tasks');
	data.groupTaskFilters.all_tasks.value = '';
	data.groupTaskFilters.all_tasks.count = data.groupCards.length;
	var timecardGr = new GlideRecord('time_card');
	var choiceList = GlideChoiceList.getChoiceList('time_card', 'category');
	choiceList.removeNone();
	data.categories = JSON.parse(choiceList.toJSON());
	data.categories = data.categories.filter(function (category) {
		return category.value !== 'task_work' && category.value !== 'project_work';
	});
	for (var index in data.categories) {
		var category = data.categories[index];
		category.quickAdd = {};
		category.quickAdd.daySelected = 'all';
		if (data.isAllowMultipleRateTypes && !gs.nil(data.defaultRateType)) {
			category.rateType = {
				displayValue: defaultRateTypeName,
				value: data.defaultRateType
			};
		}
	}

	function _addRecordsToList(gr, isGroupTask) {
		while (gr.next()) {
			var record = {};
			var sysClassName = gr.getValue('sys_class_name') || gr.getTableName();
			record.sys_class_name = sysClassName;
			record.sys_id = gr.getValue('sys_id');
			var fieldsObject = _addLayoutAndGetFieldsForTable(sysClassName);
			record.display_fields = fieldsObject.fields;
			
			/* Include parent to searchable display fields */
			if (sysClassName === 'pm_project_task' || sysClassName === 'dmn_demand_task')
				record.display_fields += ',parent';
			
			record.quickAdd = {};
			record.quickAdd.daySelected = 'all';
			if (gr.instanceOf('pm_project') || gr.instanceOf('pm_project_task')) {
				// gr in this scope is GlideRecordSecure
				// We require to fetch project/project_tasks top value without having project_user role.
				var table = gr.getRecordClassName();	
				var glideRec = new GlideRecord(table);
				
				glideRec.get(gr.sys_id);
				
				// timecardReportingPref will be instance of GlideElement. Hence toString.
				var timecardReportingPref = glideRec.top_task.time_card_preference.toString();
				if (timecardReportingPref == 'no_time_card') {
					record.hideQuickAdd = true;
					record.hideAddToTimesheet = true;
					record.noTimeReporting = true;
				} else if ((timecardReportingPref === 'project_task' && gr.instanceOf('pm_project')) || (timecardReportingPref === 'project' && gr.instanceOf('pm_project_task')))
					continue;
			}
			record.disabled = record.noTimeReporting || !data.canCreateTimecards;
			if (gr.instanceOf('pm_project')) {
				record.quickAdd.showProjectCategory = true;
			}
			if (gr.instanceOf('pm_project_task') || gr.instanceOf('dmn_demand_task')) {
				record.parent = TimeCardUtil.getParentTableData(gr);
			}
			if (data.isAllowMultipleRateTypes && !gs.nil(data.defaultRateType)) {
				record.rateType = {
					displayValue: defaultRateTypeName,
					value: data.defaultRateType
				};
			}
			//$sp.getRecordElements(record, gr, fieldsObject.fields);
			for (var index = 0; index < fieldsObject.fieldsArray.length; index++) {
				var field = fieldsObject.fieldsArray[index];
				record[field] = {
					value: gr.getValue(field),
					display_value: gr.getDisplayValue(field),
					label: getLable(gr, field, sysClassName)
				}
			}
			if (!data.sysIdMap[record.sys_id]) {
				data.sysIdMap[record.sys_id] = record.sys_id;
				data.ids.push(record.sys_id);
				
				var labelGr = new GlideRecord(record.sys_class_name);
				
				if (isGroupTask) {
					data.groupCards.push(record);
					if (!data.groupTaskFilters[sysClassName]) {
						data.groupTaskFilters[sysClassName] = {};
						data.groupTaskFilters[sysClassName].label = labelGr.getPlural();
						data.groupTaskFilters[sysClassName].value = sysClassName;
						data.groupTaskFilters[sysClassName].count = 0;
					}
					data.groupTaskFilters[sysClassName].count++;
				} else {
					data.cards.push(record);
					if (!data.taskFilters[sysClassName]) {
						data.taskFilters[sysClassName] = {};
						data.taskFilters[sysClassName].label = labelGr.getPlural();
						data.taskFilters[sysClassName].value = sysClassName;
						data.taskFilters[sysClassName].count = 0;
					}
					data.taskFilters[sysClassName].count++;
				}
			}
		}
	}

	function getLable(gr, field, table) {
		var key = table + '_' + field;
		if (data.tableFieldLabelMap[key]) {
			return data.tableFieldLabelMap[key];
		}
		var gelm = gr.getElement(field);
		var label = gelm ? gelm.getLabel() : '';
		data.tableFieldLabelMap[key] = label;
		return label;
	}

	function _addLayoutAndGetFieldsForTable(table) {
		if (sysTableFieldsMap[table]) {
			return sysTableFieldsMap[table];
		}
		var layout = data.layout[table];
		var fields = '';
		if (!layout) {
			layout = data.defaultLayout;
			fields = data.defaultFields;
		} else {
			fields = _getFieldsForLayout(layout);
		}
		if (!data.card_layouts[table]) {
			data.card_layouts[table] = layout;
		}
		sysTableFieldsMap[table] = {
			fields: fields,
			fieldsArray: fields.split(',')
		};
		return sysTableFieldsMap[table];
	}

	function _getFieldsForLayout(layout) {
		var fieldsArr = [];
		fieldsArr.push(layout.primary_field || 'short_description');
		if (layout.secondary_fields) {
			fieldsArr = fieldsArr.concat(layout.secondary_fields);
		}
		var tags = layout.tags;
		
		for (var i = 0; i < tags.length; i++) {
			fieldsArr.push(tags[i].field);
		}
		return 'number,' + fieldsArr.join(',');
	}
	if (!input) {
		new TimecardUsageAnalytics().workerPortalLaunch(data.cards.length);
	}
	data.messages = {};
	data.messages.selectProjectCategory = gs.getMessage('Select Project Category');
	data.messages.noMatchesFound = gs.getMessage('No matches found');
	data.messages.loadingFailed = gs.getMessage('Loading failed');
	data.messages.loadingMoreResults = gs.getMessage('Loading more results…');
	data.messages.searching = gs.getMessage('Searching…');
	data.messages.selectDay = gs.getMessage('Select Day');
	data.messages.noTaskAssignments = gs.getMessage('No task assignments found');
	data.maxVisibleTasks = options.maxVisibleTasks || -1;
	data.maxVisibleGroupTasks = options.maxVisibleGroupTasks || -1;
	data.disableTaskSelectorSync = options.disableTaskSelectorSync || false;
	data.showDuplicateCards = options.showDuplicateCards || false;
	
	if (data.cards.length === 0) {
		data.cardsNum = data.messages.noTaskAssignments;
	} else {
		data.cardsNum = data.messages.noMatchesFound;
	}
	if (data.groupCards.length == 0) {
		data.groupCardsNum = data.messages.noTaskAssignments;
	} else {
		data.groupCardsNum = data.messages.noMatchesFound;
	}
})($sp);
If this information proves useful, kindly mark it as helpful or accepted solution.

Thanks,
BK