Codeunit 1174 User Task Management, source in 29
Source29
src/Layers/W1/BaseApp/Modules/Foundation/UserTask/UserTaskManagement.Codeunit.al173 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Foundation.Task;
codeunit 1174 "User Task Management"
{
// // Code unit to manage user tasks / user tasks groups.
// // Due date filter options :-
// // NONE :- All pending tasks assigned to logged in user or their groups.
// // TODAY :- All pending tasks assigned to logged in user or their groups due today.
// // THIS_WEEK :- All pending tasks assigned to logged in user or their groups due this week.
trigger OnRun()
begin
end;
var
UserTaskGroupMember: Record "User Task Group Member";
DueDateFilterOptions: Option "NONE",TODAY,THIS_WEEK;
procedure GetMyPendingUserTasksCount(): Integer
begin
// Gets total count of user tasks assgined to logged in user.
// This includes tasks assigned to the user and their groups.
exit(CalculateUserTasksCount(DueDateFilterOptions::NONE));
end;
procedure GetMyPendingUserTasksCountDueToday(): Integer
begin
// Gets total count of user tasks assgined to logged in user.
// This includes tasks assigned to the user and their groups due today.
exit(CalculateUserTasksCount(DueDateFilterOptions::TODAY));
end;
procedure GetMyPendingUserTasksCountDueThisWeek(): Integer
begin
// Gets total count of user tasks assgined to logged in user.
// This includes tasks assigned to the user and their groups due this week.
exit(CalculateUserTasksCount(DueDateFilterOptions::THIS_WEEK));
end;
procedure SetFiltersToShowMyUserTasks(var UserTask: Record "User Task"; DueDateFilterOption: Integer)
var
MyTasksUserGroups: Text;
begin
MyTasksUserGroups := GetMyTasksUserGroupsAsFilterText();
if MyTasksUserGroups <> '' then begin
UserTask.FilterGroup(-1);
UserTask.SetFilter("User Task Group Assigned To", MyTasksUserGroups);
UserTask.SetRange("Assigned To", UserSecurityId());
end else begin
UserTask.FilterGroup(2);
UserTask.SetRange("Assigned To", UserSecurityId());
end;
UserTask.FilterGroup(2);
UserTask.SetFilter("Percent Complete", '<>100');
UserTask.FilterGroup(0);
case DueDateFilterOption of
DueDateFilterOptions::NONE:
UserTask.SetRange("Due DateTime");
DueDateFilterOptions::THIS_WEEK:
UserTask.SetFilter("Due DateTime", '<>%1 & <=%2', 0DT, CreateDateTime(CalcDate('<CW>'), 0T));
DueDateFilterOptions::TODAY:
UserTask.SetFilter("Due DateTime", '<>%1 & <=%2', 0DT, CurrentDateTime);
end;
end;
procedure CompleteTasks(var UserTask: Record "User Task")
begin
if UserTask.FindSet(true) then
repeat
UserTask.SetCompleted();
UserTask.Modify();
until UserTask.Next() = 0;
end;
[EventSubscriber(ObjectType::Table, Database::"User Task Group", 'OnAfterDeleteEvent', '', false, false)]
local procedure OnAfterDeleteUserTaskGroup(var Rec: Record "User Task Group"; RunTrigger: Boolean)
var
UserTask: Record "User Task";
begin
if Rec.IsTemporary() then
exit;
UserTask.SetRange("User Task Group Assigned To", Rec.Code);
// empty out 'user task group assigned to' for the tasks that were assigned to the user task group that is being deleted
UserTask.ModifyAll("User Task Group Assigned To", '');
end;
local procedure CalculateUserTasksCount(DueDateFilterOption: Integer): Integer
var
UserTask: Record "User Task";
begin
UserTask.Reset();
SetFiltersToShowMyUserTasks(UserTask, DueDateFilterOption);
exit(UserTask.Count);
end;
local procedure GetMyTasksUserGroupsAsFilterText(): Text
var
FilterTxt: Text;
begin
// Returns a text contaning all the groups that logged in user belong to which can be used for setting filter
// Example - If user belongs to 'A' and 'C' user tasks groups this function will return 'A|C' as filter text.
UserTaskGroupMember.Reset();
UserTaskGroupMember.SetRange("User Security ID", UserSecurityId());
if UserTaskGroupMember.FindSet() then
repeat
FilterTxt := FilterTxt + UserTaskGroupMember."User Task Group Code" + '|';
until UserTaskGroupMember.Next() = 0;
// delete last char (|) to create a filter string
if StrLen(FilterTxt) > 1 then
FilterTxt := DelStr(FilterTxt, StrLen(FilterTxt), 1);
exit(FilterTxt);
end;
internal procedure FindRec(var UserTask: Record "User Task"; var FilteredUserTask: Record "User Task"; Which: Text): Boolean
var
Found: Boolean;
i: Integer;
begin
for i := 1 to StrLen(Which) do begin
Found := UserTask.Find(Which[i]);
if Found then
while Found and not ValidateAgainstFilteredRecord(UserTask, FilteredUserTask) do
case Which[i] of
'=':
Found := false;
'<', '>':
Found := UserTask.Find(Which[i]);
'-':
Found := UserTask.Next() <> 0;
'+':
Found := UserTask.Next(-1) <> 0;
end;
if Found then
exit(true);
end;
exit(false);
end;
internal procedure NextRec(var UserTask: Record "User Task"; var FilteredUserTask: Record "User Task"; Steps: Integer) ResultSteps: Integer
var
Step: Integer;
begin
if Steps > 0 then
Step := 1
else
Step := -1;
ResultSteps := UserTask.Next(Step);
if ResultSteps = 0 then
exit(0);
while (ResultSteps <> 0) and not ValidateAgainstFilteredRecord(UserTask, FilteredUserTask) do
ResultSteps := UserTask.Next(Step);
exit(ResultSteps);
end;
local procedure ValidateAgainstFilteredRecord(var UserTask: Record "User Task"; var FilteredUserTask: Record "User Task"): Boolean
begin
FilteredUserTask.ID := UserTask.ID;
exit(FilteredUserTask.Find());
end;
}