Page 973 Time Sheet Card, source in 29
Source29
src/Layers/W1/BaseApp/Projects/TimeSheet/TimeSheetCard.Page.al514 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.Projects.TimeSheet;
using Microsoft.Projects.Resources.Resource;
using System.Security.User;
page 973 "Time Sheet Card"
{
PageType = Document;
RefreshOnActivate = true;
SourceTable = "Time Sheet Header";
Caption = 'Time Sheet';
InsertAllowed = false;
DataCaptionExpression = GetDataCaption();
layout
{
area(Content)
{
group(General)
{
Caption = 'General';
field("No."; Rec."No.")
{
ApplicationArea = Jobs;
Editable = false;
Importance = Additional;
}
field("Starting Date"; Rec."Starting Date")
{
ApplicationArea = Jobs;
Editable = false;
Importance = Additional;
}
field("Ending Date"; Rec."Ending Date")
{
ApplicationArea = Jobs;
Editable = false;
Importance = Additional;
}
field("Resource No."; Rec."Resource No.")
{
ApplicationArea = Jobs;
Editable = false;
}
field("Resource Name"; Rec."Resource Name")
{
ApplicationArea = Jobs;
Editable = false;
Visible = false;
}
field(Description; Rec.Description)
{
ApplicationArea = Jobs;
ToolTip = 'Specifies the description for the time sheet.';
Importance = Additional;
}
}
part(TimeSheetLines; "Time Sheet Lines Subform")
{
ApplicationArea = Basic, Suite;
SubPageLink = "Time Sheet No." = field("No.");
UpdatePropagation = Both;
}
}
area(factboxes)
{
part(TimeSheetStatusFactBox; "Time Sheet Status FactBox")
{
ApplicationArea = Jobs;
Caption = 'Time Sheet Status';
}
part(ActualSchedSummaryFactBox; "Actual/Sched. Summary FactBox")
{
ApplicationArea = Jobs;
Caption = 'Actual/Budgeted Summary';
Visible = true;
}
part(TimeSheetLineDetailsFactBox; "TimeSheet Line Details FactBox")
{
ApplicationArea = Basic, Suite;
Provider = TimeSheetLines;
SubPageLink = "Time Sheet No." = field("Time Sheet No."), "Line No." = field("Line No.");
}
}
}
actions
{
area(navigation)
{
action(TimeSheetComments)
{
ApplicationArea = Comments;
Caption = 'Comments';
Image = ViewComments;
RunObject = Page "Time Sheet Comment Sheet";
RunPageLink = "No." = field("No."),
"Time Sheet Line No." = const(0);
ToolTip = 'View comments about the time sheet.';
}
}
area(processing)
{
action(Submit)
{
ApplicationArea = Jobs;
Caption = '&Submit';
Image = ReleaseDoc;
Enabled = SubmitEnabled;
Visible = not ManagerTimeSheet;
ShortCutKey = 'F9';
ToolTip = 'Submit all open time sheet lines for approval. Each line must have a Type defined. For dedicated line approval select the Submit action on the lines section.';
trigger OnAction()
begin
SubmitLines();
end;
}
action(ReopenSubmitted)
{
ApplicationArea = Jobs;
Caption = '&Reopen';
Image = ReOpen;
Enabled = ReopenSubmittedEnabled;
Visible = not ManagerTimeSheet;
ToolTip = 'Reopen all submitted or rejected time sheet lines. Each line must have a Type defined. For dedicated line reopen select the Reopen action on the lines section.';
trigger OnAction()
begin
ReopenSubmittedLines();
end;
}
action(Approve)
{
ApplicationArea = Jobs;
Caption = '&Approve';
Image = ReleaseDoc;
Enabled = ApproveEnabled;
Visible = ManagerTimeSheet;
ToolTip = 'Approve all submitted time sheet lines. Each line must have a Type defined. For dedicated line approval select the Approve action on the lines section.';
trigger OnAction()
begin
ApproveLines();
end;
}
action(ReopenApproved)
{
ApplicationArea = Jobs;
Caption = '&Reopen';
Image = ReOpen;
Enabled = ReopenApprovedEnabled;
Visible = ManagerTimeSheet;
ToolTip = 'Reopen all approved or rejected time sheet lines. Each line must have a Type defined. For dedicated line reopen select the Reopen action on the lines section.';
trigger OnAction()
begin
ReopenApprovedLines();
end;
}
action(Reject)
{
ApplicationArea = Jobs;
Caption = 'Reject';
Image = Reject;
Enabled = ApproveEnabled;
Visible = ManagerTimeSheet;
ToolTip = 'Reject all submitted time sheet lines. Each line must have a Type defined. For dedicated line rejection select the Reject action on the lines section.';
trigger OnAction()
begin
RejectLines();
end;
}
group("F&unctions")
{
Caption = 'F&unctions';
Image = "Action";
action(CopyLinesFromTS)
{
ApplicationArea = Jobs;
Caption = 'Copy lines from time sheet';
Image = Copy;
ToolTip = 'Copy information from the selected time sheet, such as type and description, and then modify the lines. If a line is related to a project, the project number is copied.';
Visible = not ManagerTimeSheet;
trigger OnAction()
begin
TimeSheetMgt.SelectAndCopyTimeSheetLines(Rec, false);
end;
}
action(CopyLinesFromTSWithComments)
{
ApplicationArea = Jobs;
Caption = 'Copy lines from time sheet with comments';
Image = Copy;
ToolTip = 'Copy information from the selected time sheet, such as type and description, and then modify the lines. If a line is related to a project, the project number is copied. Comments will be copied as well.';
Visible = not ManagerTimeSheet;
trigger OnAction()
begin
TimeSheetMgt.SelectAndCopyTimeSheetLines(Rec, true);
end;
}
action(CreateLinesFromJobPlanning)
{
ApplicationArea = Jobs;
Caption = 'Create lines from &project planning';
Image = CreateLinesFromJob;
ToolTip = 'Create time sheet lines that are based on project planning lines.';
Visible = not ManagerTimeSheet;
trigger OnAction()
begin
TimeSheetMgt.CheckCreateLinesFromJobPlanning(Rec);
end;
}
}
}
area(Promoted)
{
group(Category_Process)
{
Caption = 'Process', Comment = 'Generated from the PromotedActionCategories property index 1.';
actionref(ReopenSubmitted_Promoted; ReopenSubmitted)
{
}
actionref(ReopenApproved_Promoted; ReopenApproved)
{
}
actionref(Submit_Promoted; Submit)
{
}
actionref(Approve_Promoted; Approve)
{
}
actionref(Reject_Promoted; Reject)
{
}
actionref(TimeSheetComments_Promoted; TimeSheetComments)
{
}
}
group(Category_Prepare)
{
Caption = 'Prepare';
group(Category_CopyTSLines)
{
Caption = 'Copy lines from time sheet';
ShowAs = SplitButton;
actionref(SelectAndCopyLinesFromTS_Promoted; CopyLinesFromTS)
{
}
actionref(SelectAndCopyLinesFromTSWithComments_Promoted; CopyLinesFromTSWithComments)
{
}
}
actionref(CreateLinesFromJobPlanning_Promoted; CreateLinesFromJobPlanning)
{
}
}
}
}
trigger OnOpenPage()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeOnOpenPage(Rec, IsHandled);
if not IsHandled then begin
CheckSetDefaultOwnerFilter();
RemoveFilterFromLinesExistField();
end;
OnAfterOnOpenPage(Rec);
end;
trigger OnAfterGetCurrRecord()
begin
CurrPage.TimeSheetLines.Page.SetColumns(Rec."No.");
UpdateControls();
end;
var
TimeSheetMgt: Codeunit "Time Sheet Management";
TimeSheetApprovalMgt: Codeunit "Time Sheet Approval Management";
RefActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject;
EmploymentQst: Label 'Time Sheet: %1 for dates prior to the Employment Date: %2 for Resource user.Do you still want to submit open lines?', Comment = '%1=Time Sheet No; %2= Resource Employment Date';
protected var
SubmitEnabled: Boolean;
ReopenSubmittedEnabled: Boolean;
ReopenApprovedEnabled: Boolean;
ApproveEnabled: Boolean;
ManagerTimeSheet: Boolean;
procedure SetManagerTimeSheetMode()
begin
ManagerTimeSheet := true;
CurrPage.TimeSheetLines.Page.SetManagerTimeSheetMode();
end;
local procedure CheckSetDefaultOwnerFilter()
var
UserSetup: Record "User Setup";
begin
if UserSetup.Get(UserId) then;
if not UserSetup."Time Sheet Admin." then begin
Rec.FilterGroup(2);
if (Rec.GetFilter("Owner User ID") = '') and (Rec.GetFilter("Approver User ID") = '') then
TimeSheetMgt.FilterTimeSheets(Rec, Rec.FieldNo("Owner User ID"));
Rec.FilterGroup(0);
end;
end;
local procedure UpdateControls()
var
TimeSheetLine: Record "Time Sheet Line";
begin
CurrPage.ActualSchedSummaryFactBox.PAGE.UpdateData(Rec);
CurrPage.TimeSheetStatusFactBox.PAGE.UpdateData(Rec);
FilterAllLines(TimeSheetLine, RefActionType::Submit);
SubmitEnabled := not TimeSheetLine.IsEmpty();
FilterAllLines(TimeSheetLine, RefActionType::ReopenSubmitted);
ReopenSubmittedEnabled := not TimeSheetLine.IsEmpty();
FilterAllLines(TimeSheetLine, RefActionType::Approve);
ApproveEnabled := not TimeSheetLine.IsEmpty();
FilterAllLines(TimeSheetLine, RefActionType::ReopenApproved);
ReopenApprovedEnabled := not TimeSheetLine.IsEmpty();
end;
protected procedure Process(ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)
var
TimeSheetLine: Record "Time Sheet Line";
TimeSheetAction: Enum "Time Sheet Action";
begin
FilterAllLines(TimeSheetLine, ActionType);
OnProcessOnAfterTimeSheetLinesFiltered(TimeSheetLine, ActionType);
if TimeSheetLine.FindSet() then
repeat
TimeSheetApprovalMgt.ProcessAction(TimeSheetLine, ActionType);
until TimeSheetLine.Next() = 0
else begin
case ActionType of
RefActionType::Submit:
TimeSheetAction := TimeSheetAction::Submit;
RefActionType::ReopenSubmitted:
TimeSheetAction := TimeSheetAction::"Reopen Submitted";
RefActionType::Approve:
TimeSheetAction := TimeSheetAction::Approve;
RefActionType::ReopenApproved:
TimeSheetAction := TimeSheetAction::"Reopen Approved";
RefActionType::Reject:
TimeSheetAction := TimeSheetAction::Reject;
end;
TimeSheetApprovalMgt.NoTimeSheetLinesToProcess(TimeSheetAction);
end;
CurrPage.Update(true);
OnAfterProcess(Rec, ActionType);
end;
local procedure SubmitLines()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeSubmitLines(Rec, IsHandled);
if IsHandled then
exit;
if not CheckResourceEmployment(RefActionType::Submit, Rec."Resource No.") then
if TimeSheetApprovalMgt.ConfirmAction(RefActionType::Submit) then
Process(RefActionType::Submit);
end;
local procedure ApproveLines()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeApproveLines(Rec, IsHandled);
if IsHandled then
exit;
if not CheckResourceEmployment(RefActionType::Approve, Rec."Resource No.") then
if TimeSheetApprovalMgt.ConfirmAction(RefActionType::Approve) then
Process(RefActionType::Approve);
end;
local procedure RejectLines()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeRejectLines(Rec, IsHandled);
if IsHandled then
exit;
if TimeSheetApprovalMgt.ConfirmAction(RefActionType::Reject) then
Process(RefActionType::Reject);
end;
local procedure ReopenSubmittedLines()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeReopenLines(Rec, IsHandled);
if IsHandled then
exit;
if TimeSheetApprovalMgt.ConfirmAction(RefActionType::ReopenSubmitted) then
Process(RefActionType::ReopenSubmitted);
end;
local procedure ReopenApprovedLines()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeReopenLines(Rec, IsHandled);
if IsHandled then
exit;
if TimeSheetApprovalMgt.ConfirmAction(RefActionType::ReopenApproved) then
Process(RefActionType::ReopenApproved);
end;
local procedure CheckResourceEmployment(ActionType: Option Submit,Reopen,Approve,ReopenApproved,Reject; ResourceNo: Code[20]): Boolean
var
Resource: Record Resource;
begin
if Resource.Get(ResourceNo) then
if Resource."Employment Date" <> 0D then
if Resource."Employment Date" > Rec."Starting Date" then begin
if Confirm(EmploymentQst, false, Rec."No.", Resource."Employment Date") then
Process(ActionType);
exit(true);
end;
exit(false)
end;
protected procedure FilterAllLines(var TimeSheetLine: Record "Time Sheet Line"; ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)
begin
TimeSheetLine.SetRange("Time Sheet No.", Rec."No.");
TimeSheetMgt.FilterAllTimeSheetLines(TimeSheetLine, ActionType);
end;
local procedure RemoveFilterFromLinesExistField()
begin
if Rec.GetFilter("Lines Exist") <> '' then
Rec.SetRange("Lines Exist");
end;
local procedure GetDataCaption(): Text
begin
exit(TimeSheetMgt.GetTimeSheetDataCaption(Rec));
end;
[IntegrationEvent(false, false)]
local procedure OnProcessOnAfterTimeSheetLinesFiltered(var TimeSheetLine: Record "Time Sheet Line"; ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterProcess(var TimeSheetHeader: Record "Time Sheet Header"; ActionType: Option Submit,ReopenSubmitted,Approve,ReopenApproved,Reject)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterOnOpenPage(var TimeSheetHeader: Record "Time Sheet Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeReopenLines(var TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeSubmitLines(var TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeApproveLines(var TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeRejectLines(var TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeOnOpenPage(var TimeSheetHeader: Record "Time Sheet Header"; var IsHandled: Boolean);
begin
end;
}