Table 950 Time Sheet Header
- App
- Base Application
- Namespace
- Microsoft.Projects.TimeSheet
- Versions
- 17-28
Fields, 28Keys, 4Procedures, 6Events, 2
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Projects/TimeSheet/TimeSheetHeader.Table.al455 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 Microsoft.Projects.Resources.Setup;
using System.Security.User;
table 950 "Time Sheet Header"
{
Caption = 'Time Sheet Header';
DataClassification = CustomerContent;
fields
{
field(1; "No."; Code[20])
{
Caption = 'No.';
ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
}
field(3; "Starting Date"; Date)
{
Caption = 'Starting Date';
ToolTip = 'Specifies the starting date for a time sheet.';
}
field(4; "Ending Date"; Date)
{
Caption = 'Ending Date';
ToolTip = 'Specifies the ending date for a time sheet.';
}
field(5; "Resource No."; Code[20])
{
Caption = 'Resource No.';
ToolTip = 'Specifies the number of the resource for the time sheet.';
TableRelation = Resource;
trigger OnValidate()
var
IsHandled: Boolean;
begin
ResourcesSetup.Get();
if "Resource No." <> '' then begin
Resource.Get("Resource No.");
CheckResourcePrivacyBlocked(Resource);
IsHandled := false;
OnValidateResourceNoOnBeforeTestFields(Resource, IsHandled);
if IsHandled then
exit;
Resource.TestField(Blocked, false);
Resource.TestField("Time Sheet Owner User ID");
Resource.TestField("Time Sheet Approver User ID");
"Owner User ID" := Resource."Time Sheet Owner User ID";
"Approver User ID" := Resource."Time Sheet Approver User ID";
end;
end;
}
field(6; "Resource Name"; Text[100])
{
Caption = 'Resource Name';
ToolTip = 'Specifies the name of the resource for the time sheet.';
FieldClass = FlowField;
CalcFormula = lookup(Resource.Name where("No." = field("Resource No.")));
Editable = false;
}
field(7; "Owner User ID"; Code[50])
{
Caption = 'Owner User ID';
DataClassification = EndUserIdentifiableInformation;
TableRelation = "User Setup";
}
field(8; "Approver User ID"; Code[50])
{
Caption = 'Approver User ID';
DataClassification = EndUserIdentifiableInformation;
TableRelation = "User Setup";
}
field(10; Description; Text[100])
{
Caption = 'Description';
ToolTip = 'Specifies the description for a time sheet.';
DataClassification = CustomerContent;
}
field(11; "Unit of Measure"; Code[10])
{
CalcFormula = lookup(Resource."Base Unit of Measure" where("No." = field("Resource No.")));
Caption = 'Unit of Measure';
FieldClass = FlowField;
Editable = false;
}
field(12; "Open Exists"; Boolean)
{
CalcFormula = exist("Time Sheet Line" where("Time Sheet No." = field("No."),
Status = const(Open)));
Caption = 'Open Exists';
ToolTip = 'Specifies if there are time sheet lines with the status Open.';
Editable = false;
FieldClass = FlowField;
}
field(13; "Submitted Exists"; Boolean)
{
CalcFormula = exist("Time Sheet Line" where("Time Sheet No." = field("No."),
Status = const(Submitted)));
Caption = 'Submitted Exists';
ToolTip = 'Specifies if there are time sheet lines with the status Submitted.';
Editable = false;
FieldClass = FlowField;
}
field(14; "Rejected Exists"; Boolean)
{
CalcFormula = exist("Time Sheet Line" where("Time Sheet No." = field("No."),
Status = const(Rejected)));
Caption = 'Rejected Exists';
ToolTip = 'Specifies whether there are time sheet lines with the status Rejected.';
Editable = false;
FieldClass = FlowField;
}
field(15; "Approved Exists"; Boolean)
{
CalcFormula = exist("Time Sheet Line" where("Time Sheet No." = field("No."),
Status = const(Approved)));
Caption = 'Approved Exists';
ToolTip = 'Specifies whether there are time sheet lines with the status Approved.';
Editable = false;
FieldClass = FlowField;
}
field(16; "Posted Exists"; Boolean)
{
CalcFormula = exist("Time Sheet Posting Entry" where("Time Sheet No." = field("No.")));
Caption = 'Posted Exists';
ToolTip = 'Specifies whether there are time sheet lines with the status Posted.';
Editable = false;
FieldClass = FlowField;
}
field(18; "Lines Exist"; Boolean)
{
CalcFormula = exist("Time Sheet Line" where("Time Sheet No." = field("No.")));
Caption = 'Lines Exist';
Editable = false;
FieldClass = FlowField;
}
field(20; Quantity; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Detail".Quantity where("Time Sheet No." = field("No."),
Status = field("Status Filter"),
"Job No." = field("Job No. Filter"),
"Job Task No." = field("Job Task No. Filter"),
Date = field("Date Filter"),
Posted = field("Posted Filter"),
Type = field("Type Filter")));
Caption = 'Quantity';
ToolTip = 'Specifies the total number of hours that are registered on the time sheet.';
FieldClass = FlowField;
}
field(21; "Posted Quantity"; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Posting Entry".Quantity where("Time Sheet No." = field("No.")));
Caption = 'Posted Quantity';
FieldClass = FlowField;
}
field(26; Comment; Boolean)
{
CalcFormula = exist("Time Sheet Comment Line" where("No." = field("No."),
"Time Sheet Line No." = const(0)));
Caption = 'Comment';
ToolTip = 'Specifies that a comment about this document has been entered.';
Editable = false;
FieldClass = FlowField;
}
field(30; "Status Filter"; Enum "Time Sheet Status")
{
Caption = 'Status Filter';
FieldClass = FlowFilter;
}
field(31; "Job No. Filter"; Code[20])
{
Caption = 'Project No. Filter';
FieldClass = FlowFilter;
}
field(32; "Job Task No. Filter"; Code[20])
{
Caption = 'Project Task No. Filter';
FieldClass = FlowFilter;
}
field(33; "Date Filter"; Date)
{
Caption = 'Date Filter';
FieldClass = FlowFilter;
}
field(34; "Posted Filter"; Boolean)
{
Caption = 'Posted Filter';
FieldClass = FlowFilter;
}
field(35; "Type Filter"; Enum "Time Sheet Line Type")
{
Caption = 'Type Filter';
FieldClass = FlowFilter;
}
field(40; "Quantity Open"; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Detail".Quantity where("Time Sheet No." = field("No."),
Status = const(Open)));
Caption = 'Quantity Open';
ToolTip = 'Specifies the total number of hours with the status Open on the time sheet.';
Editable = false;
FieldClass = FlowField;
}
field(41; "Quantity Submitted"; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Detail".Quantity where("Time Sheet No." = field("No."),
Status = const(Submitted)));
Caption = 'Quantity Submitted';
ToolTip = 'Specifies the total number of hours with the status Submitted on the time sheet.';
Editable = false;
FieldClass = FlowField;
}
field(42; "Quantity Approved"; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Detail".Quantity where("Time Sheet No." = field("No."),
Status = const(Approved)));
Caption = 'Quantity Approved';
ToolTip = 'Specifies the total number of hours with the status Approved on the time sheet.';
Editable = false;
FieldClass = FlowField;
}
field(43; "Quantity Rejected"; Decimal)
{
AutoFormatType = 0;
CalcFormula = sum("Time Sheet Detail".Quantity where("Time Sheet No." = field("No."),
Status = const(Rejected)));
Caption = 'Quantity Rejected';
ToolTip = 'Specifies the total number of hours with the status Rejected on the time sheet.';
Editable = false;
FieldClass = FlowField;
}
}
keys
{
key(Key1; "No.")
{
Clustered = true;
}
key(Key2; "Resource No.", "Starting Date")
{
}
key(Key3; "Owner User ID")
{
}
key(Key4; "Approver User ID")
{
}
}
fieldgroups
{
fieldgroup(DropDown; "No.", "Starting Date", "Ending Date", "Resource No.")
{
}
fieldgroup(Brick; "No.", "Starting Date", "Ending Date", "Resource No.", Quantity)
{
}
}
trigger OnDelete()
var
TimeSheetCommentLine: Record "Time Sheet Comment Line";
begin
if "Resource No." <> '' then begin
Resource.Get("Resource No.");
CheckResourcePrivacyBlocked(Resource);
Resource.TestField(Blocked, false);
end;
TimeSheetLine.SetRange("Time Sheet No.", "No.");
TimeSheetLine.DeleteAll(true);
TimeSheetCommentLine.SetRange("No.", "No.");
TimeSheetCommentLine.SetRange("Time Sheet Line No.", 0);
TimeSheetCommentLine.DeleteAll();
RemoveFromMyTimeSheets();
end;
trigger OnInsert()
begin
if "Resource No." <> '' then begin
Resource.Get("Resource No.");
CheckResourcePrivacyBlocked(Resource);
Resource.TestField(Blocked, false);
if Resource."Time Sheet Owner User ID" <> '' then
AddToMyTimeSheets(Resource."Time Sheet Owner User ID");
end;
end;
trigger OnModify()
begin
if "Resource No." <> '' then begin
Resource.Get("Resource No.");
CheckResourcePrivacyBlocked(Resource);
Resource.TestField(Blocked, false);
end;
end;
trigger OnRename()
begin
if "Resource No." <> '' then begin
Resource.Get("Resource No.");
CheckResourcePrivacyBlocked(Resource);
Resource.TestField(Blocked, false);
end;
end;
var
Resource: Record Resource;
ResourcesSetup: Record "Resources Setup";
TimeSheetLine: Record "Time Sheet Line";
TimeSheetMgt: Codeunit "Time Sheet Management";
#pragma warning disable AA0074
#pragma warning disable AA0470
Text001: Label '%1 does not contain lines.';
#pragma warning restore AA0470
Text002: Label 'No time sheets are available. The time sheet administrator must create time sheets before you can access them in this window.';
#pragma warning restore AA0074
PrivacyBlockedErr: Label 'You cannot use resource %1 because they are marked as blocked due to privacy.', Comment = '%1=resource no.';
procedure CalcQtyWithStatus(Status: Enum "Time Sheet Status"): Decimal
begin
SetRange("Status Filter", Status);
CalcFields(Quantity);
exit(Quantity);
end;
procedure Check()
begin
TimeSheetLine.SetRange("Time Sheet No.", "No.");
if TimeSheetLine.FindSet() then
repeat
CheckTimeSheetLine(TimeSheetLine);
until TimeSheetLine.Next() = 0
else
Error(Text001, "No.");
end;
local procedure CheckTimeSheetLine(TimeSheetLine: Record "Time Sheet Line")
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCheckTimeSheetLine(TimeSheetLine, IsHandled);
if IsHandled then
exit;
TimeSheetLine.TestField(Status, TimeSheetLine.Status::Approved);
TimeSheetLine.TestField(Posted, true);
end;
procedure GetLastLineNo(): Integer
begin
TimeSheetLine.Reset();
TimeSheetLine.SetRange("Time Sheet No.", "No.");
if TimeSheetLine.FindLast() then;
exit(TimeSheetLine."Line No.");
end;
procedure FindLastTimeSheetNo(FilterFieldNo: Integer): Code[20]
begin
Reset();
SetCurrentKey("Resource No.", "Starting Date");
TimeSheetMgt.FilterTimeSheets(Rec, FilterFieldNo);
SetFilter("Starting Date", '%1..', WorkDate());
if FindFirst() then
exit("No.");
SetRange("Starting Date");
SetRange("Ending Date");
if FindLast() then
exit("No.");
Error(Text002);
end;
procedure FindCurrentTimeSheetNo(FilterFieldNo: Integer): Code[20]
begin
Reset();
SetCurrentKey("Resource No.", "Starting Date");
TimeSheetMgt.FilterTimeSheets(Rec, FilterFieldNo, true);
if Rec.IsEmpty then
Error(Text002);
SetFilter("Starting Date", '..%1', WorkDate());
if FindLast() then
exit("No.");
end;
procedure FindTimeSheetList(FilterFieldNo: Integer): Code[20]
begin
Reset();
SetCurrentKey("Resource No.", "Starting Date");
TimeSheetMgt.FilterTimeSheets(Rec, FilterFieldNo);
end;
local procedure AddToMyTimeSheets(UserID: Code[50])
var
MyTimeSheets: Record "My Time Sheets";
begin
MyTimeSheets.Init();
MyTimeSheets."User ID" := UserId;
MyTimeSheets."Time Sheet No." := "No.";
MyTimeSheets."Start Date" := "Starting Date";
MyTimeSheets."End Date" := "Ending Date";
MyTimeSheets.Comment := Comment;
MyTimeSheets.Insert();
end;
local procedure RemoveFromMyTimeSheets()
var
MyTimeSheets: Record "My Time Sheets";
begin
MyTimeSheets.SetRange("Time Sheet No.", "No.");
if MyTimeSheets.FindFirst() then
MyTimeSheets.DeleteAll();
end;
local procedure CheckResourcePrivacyBlocked(Resource: Record Resource)
begin
if Resource."Privacy Blocked" then
Error(PrivacyBlockedErr, Resource."No.");
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeCheckTimeSheetLine(TimeSheetLine: Record "Time Sheet Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnValidateResourceNoOnBeforeTestFields(Resource: Record Resource; var IsHandled: Boolean)
begin
end;
}