In time sheet portal , Task tab only can see InProgress records
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-29-2024 10:03 PM
In time sheet portal , task tab i can see only in progress records
This is OOB function , Please help me which widget can rework.
22 REPLIES 22
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-06-2025 03:10 AM
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
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-06-2025 03:21 AM
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')) {
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);
}
Options
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-06-2025 03:31 AM
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);