Table 5510 Employee Time Reg Buffer

App
Base Application
Namespace
Microsoft.Integration.Graph
Versions
17-28

Fields, 15Keys, 1Procedures, 7

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Integration/Graph/EmployeeTimeRegBuffer.Table.al423 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.Integration.Graph;

using Microsoft.Foundation.UOM;
using Microsoft.HumanResources.Employee;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Projects.TimeSheet;
using System.Utilities;

table 5510 "Employee Time Reg Buffer"
{
    Caption = 'Employee Time Reg Buffer';
    ReplicateData = false;
    TableType = Temporary;
    DataClassification = CustomerContent;

    fields
    {
        field(2; "Line No"; Integer)
        {
            Caption = 'Line No';
            DataClassification = SystemMetadata;
        }
        field(3; Date; Date)
        {
            Caption = 'Date';
            DataClassification = SystemMetadata;
            NotBlank = true;
        }
        field(6; "Job No."; Code[20])
        {
            DataClassification = SystemMetadata;
            TableRelation = "Job";
        }
        field(7; "Job Task No."; Code[20])
        {
            DataClassification = SystemMetadata;
            TableRelation = "Job Task"."Job Task No." where("Job No." = field("Job No."));
        }
        field(9; "Cause of Absence Code"; Code[10])
        {
            DataClassification = SystemMetadata;
        }
        field(15; Quantity; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity';
            DataClassification = SystemMetadata;
            NotBlank = true;
        }
        field(20; Status; Enum "Employee Time Reg. Status")
        {
            Caption = 'Status';
            DataClassification = SystemMetadata;
        }
        field(21; "Employee No"; Code[20])
        {
            Caption = 'Employee No';
            DataClassification = SystemMetadata;
        }
        field(480; "Dimension Set ID"; Integer)
        {
            Caption = 'Dimension Set ID';
            DataClassification = SystemMetadata;
        }
        field(5407; "Unit of Measure Code"; Code[10])
        {
            Caption = 'Unit of Measure Code';
            DataClassification = SystemMetadata;
            TableRelation = "Unit of Measure";
            ValidateTableRelation = false;
        }
        field(7999; "Employee Id"; Guid)
        {
            Caption = 'Employee Id';
            DataClassification = SystemMetadata;
            NotBlank = true;

            trigger OnValidate()
            var
                Employee: Record Employee;
                Resource: Record Resource;
            begin
                if not Employee.GetBySystemId(Rec."Employee Id") then
                    Error(CouldNotFindEmployeeErr);

                GraphMgtTimeRegistration.InitUserSetup();
                if not Resource.Get(Employee."Resource No.") then begin
                    GraphMgtTimeRegistration.CreateResourceToUseTimeSheet(Resource);
                    Employee.Validate("Resource No.", Resource."No.");
                    Employee.Modify();
                end else
                    GraphMgtTimeRegistration.ModifyResourceToUseTimeSheet(Resource);
            end;
        }
        field(8000; Id; Guid)
        {
            Caption = 'Id';
            DataClassification = SystemMetadata;
            Editable = false;
        }
        field(8001; "Last Modified Date Time"; DateTime)
        {
            Caption = 'Last Modified Date Time';
            DataClassification = SystemMetadata;
            Editable = false;
        }
        field(9032; "Unit of Measure Id"; Guid)
        {
            Caption = 'Unit of Measure Id';
            DataClassification = SystemMetadata;
        }
        field(8002; "Job Id"; Guid)
        {
            Caption = 'Project Id';
            DataClassification = SystemMetadata;
        }
    }

    keys
    {
        key(Key1; Id)
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    trigger OnInsert()
    begin
        if not IsTemporary then
            Error(RecordMustBeTemporaryErr);
    end;

    var
        GraphMgtTimeRegistration: Codeunit "Graph Mgt - Time Registration";
        CouldNotFindEmployeeErr: Label 'The employee cannot be found.', Locked = true;
        RecordMustBeTemporaryErr: Label 'Employee Time Reg Buffer must be used as a temporary record.', Locked = true;
        FiltersMustBeSpecifiedErr: Label 'A filter must be specified. The filter could be for the date, employeeId or id.', Locked = true;
        DateFilterIsInvalidErr: Label 'The date filter is invalid. The date filter must be a valid range with maximum %1 days.', Locked = true;
        EmployeeFilterOneEmployeeOnlyErr: Label 'You can only search for one employee using the employee filter.';

    [Scope('Cloud')]
    procedure PropagateInsert()
    var
        Employee: Record Employee;
        TimeSheetLine: Record "Time Sheet Line";
        TimeSheetDetail: Record "Time Sheet Detail";
        Resource: Record Resource;
        UnitOfMeasure: Record "Unit of Measure";
        TimeSheetHeaderNo: Code[20];
    begin
        if not IsTemporary then
            Error(RecordMustBeTemporaryErr);

        Employee.Get("Employee No");

        TimeSheetHeaderNo := GraphMgtTimeRegistration.GetTimeSheetHeader(Employee."Resource No.", CalcDate('<-CW>', Date));

        GraphMgtTimeRegistration.GetTimeSheetLineWithEmptyDate(TimeSheetLine, TimeSheetHeaderNo, Date);

        GraphMgtTimeRegistration.AddTimeSheetDetailWithDimensionSetAndJob(TimeSheetDetail, TimeSheetLine, Date, Quantity, "Dimension Set ID", "Job Id");

        TimeSheetDetail.Validate("Job Task No.", "Job Task No.");

        TransferFields(TimeSheetDetail, true);
        Id := TimeSheetDetail.SystemId;

        "Employee No" := Employee."No.";
        "Employee Id" := Employee.SystemId;
        if Resource.Get(Employee."Resource No.") then
            "Unit of Measure Code" := Resource."Base Unit of Measure";
        if UnitOfMeasure.Get(Resource."Base Unit of Measure") then
            "Unit of Measure Id" := UnitOfMeasure.SystemId;
    end;

    [Scope('Cloud')]
    procedure PropagateModify()
    var
        TimeSheetDetail: Record "Time Sheet Detail";
        RecordModified: Boolean;
    begin
        if Quantity <> xRec.Quantity then begin
            TimeSheetDetail.GetBySystemId(Rec.Id);
            TimeSheetDetail.Validate(Quantity, Quantity);
            RecordModified := true;
        end;
        if "Dimension Set ID" <> xRec."Dimension Set ID" then begin
            if not RecordModified then begin
                TimeSheetDetail.GetBySystemId(Id);
                TimeSheetDetail.FindFirst();
                RecordModified := true;
            end;
            TimeSheetDetail.Validate("Dimension Set ID", "Dimension Set ID");
        end;
        if "Job Id" <> xRec."Job Id" then begin
            if not RecordModified then begin
                TimeSheetDetail.GetBySystemId(Id);
                RecordModified := true;
            end;
            TimeSheetDetail.Validate("Job Id", "Job Id");
            TimeSheetDetail.Validate("Job No.", "Job No.");
        end;
        if RecordModified then begin
            TimeSheetDetail.Modify(true);
            TransferFields(TimeSheetDetail);
            Id := TimeSheetDetail.SystemId;

        end;
    end;

    [Scope('Cloud')]
    procedure PropagateDelete()
    var
        TimeSheetDetail: Record "Time Sheet Detail";
    begin
        TimeSheetDetail.GetBySystemId(Id);
        TimeSheetDetail.Delete(true);
    end;

    [Scope('Cloud')]
    procedure LoadRecords(IdFilter: Text; DateFilter: Text; EmployeeIdFilter: Text)
    var
        Employee: Record Employee;
        Calendar: Record Date;
        FirstDate: Date;
        LastDate: Date;
    begin
        if IdFilter <> '' then begin
            LoadRecordFromId(IdFilter);
            exit;
        end;

        if EmployeeIdFilter <> '' then begin
            Employee.SetFilter(SystemId, EmployeeIdFilter);
            if Employee.Count > 1 then
                Error(EmployeeFilterOneEmployeeOnlyErr);
            LoadRecordsFromEmployee(EmployeeIdFilter);
            exit;
        end;

        if DateFilter <> '' then begin
            Calendar.SetRange("Period Type", Calendar."Period Type"::Date);
            Calendar.SetFilter("Period Start", DateFilter);
            if Calendar.FindFirst() then begin
                FirstDate := Calendar."Period Start";
                Calendar.FindLast();
                LastDate := Calendar."Period Start";
            end else
                Error(DateFilterIsInvalidErr, MaxDateFilterRange());
            if LastDate - FirstDate > MaxDateFilterRange() then
                Error(DateFilterIsInvalidErr, MaxDateFilterRange());
            LoadRecordsFromTSDetails(DateFilter);
            exit;
        end;

        Error(FiltersMustBeSpecifiedErr);
    end;

    [Scope('OnPrem')]
    procedure LoadRecordFromId(IdFilter: Text)
    var
        TimeSheetHeader: Record "Time Sheet Header";
        TimeSheetLine: Record "Time Sheet Line";
        TimeSheetDetail: Record "Time Sheet Detail";
        Employee: Record Employee;
        Resource: Record Resource;
        UnitOfMeasure: Record "Unit of Measure";
    begin
        TimeSheetDetail.SetFilter(SystemId, IdFilter);
        if not TimeSheetDetail.FindFirst() then
            exit;

        TimeSheetLine.Get(TimeSheetDetail."Time Sheet No.", TimeSheetDetail."Time Sheet Line No.");
        if TimeSheetLine.Type <> TimeSheetLine.Type::Resource then
            exit;

        TimeSheetHeader.Get(TimeSheetDetail."Time Sheet No.");
        Employee.SetRange("Resource No.", TimeSheetHeader."Resource No.");
        if not Employee.FindFirst() or not Resource.Get(TimeSheetHeader."Resource No.") then
            exit;

        TransferFields(TimeSheetDetail, true);
        Id := TimeSheetDetail.SystemId;

        "Line No" := TimeSheetDetail."Time Sheet Line No.";
        "Employee No" := Employee."No.";
        "Employee Id" := Employee.SystemId;
        if UnitOfMeasure.Get(Resource."Base Unit of Measure") then begin
            "Unit of Measure Code" := UnitOfMeasure.Code;
            "Unit of Measure Id" := UnitOfMeasure.SystemId;
        end;

        Insert(true);
    end;

    [Scope('OnPrem')]
    procedure LoadRecordsFromEmployee(EmployeeIdFilter: Text)
    var
        TimeSheetHeader: Record "Time Sheet Header";
        TimeSheetLine: Record "Time Sheet Line";
        TimeSheetDetail: Record "Time Sheet Detail";
        Employee: Record Employee;
        Resource: Record Resource;
        UnitOfMeasure: Record "Unit of Measure";
        UnitOfMeasureFound: Boolean;
    begin
        Employee.SetFilter(SystemId, EmployeeIdFilter);
        if not Employee.FindFirst() then
            exit;

        if not Resource.Get(Employee."Resource No.") then
            exit;

        TimeSheetHeader.SetRange("Resource No.", Resource."No.");
        if not TimeSheetHeader.FindSet() then
            exit;

        if UnitOfMeasure.Get(Resource."Base Unit of Measure") then
            UnitOfMeasureFound := true;

        repeat
            TimeSheetLine.SetRange("Time Sheet No.", TimeSheetHeader."No.");
            TimeSheetLine.SetRange(Type, TimeSheetLine.Type::Resource);
            if TimeSheetLine.FindSet() then
                repeat
                    TimeSheetDetail.SetRange("Time Sheet No.", TimeSheetHeader."No.");
                    TimeSheetDetail.SetRange("Time Sheet Line No.", TimeSheetLine."Line No.");
                    if TimeSheetDetail.FindSet() then
                        repeat
                            TransferFields(TimeSheetDetail, true);
                            Id := TimeSheetDetail.SystemId;
                            "Line No" := TimeSheetDetail."Time Sheet Line No.";
                            "Employee No" := Employee."No.";
                            "Employee Id" := Employee.SystemId;
                            if UnitOfMeasureFound then begin
                                "Unit of Measure Id" := UnitOfMeasure.SystemId;
                                "Unit of Measure Code" := UnitOfMeasure.Code;
                            end;
                            Insert(true);
                        until TimeSheetDetail.Next() = 0;
                until TimeSheetLine.Next() = 0;
        until TimeSheetHeader.Next() = 0;
    end;

    [Scope('OnPrem')]
    procedure LoadRecordsFromTSDetails(DateFilter: Text)
    var
        TimeSheetHeader: Record "Time Sheet Header";
        TimeSheetLine: Record "Time Sheet Line";
        TimeSheetDetail: Record "Time Sheet Detail";
        Employee: Record Employee;
        Resource: Record Resource;
        UnitOfMeasure: Record "Unit of Measure";
        PrevTimeSheetHeaderNo: Code[20];
        HeaderFound: Boolean;
        PrevResourceNo: Code[20];
        ResourceFound: Boolean;
        UnitOfMeasureFound: Boolean;
    begin
        TimeSheetDetail.SetFilter(Date, DateFilter);
        if not TimeSheetDetail.FindSet() then
            exit;

        PrevResourceNo := '';
        PrevTimeSheetHeaderNo := '';
        repeat
            TimeSheetLine.Get(TimeSheetDetail."Time Sheet No.", TimeSheetDetail."Time Sheet Line No.");
            if TimeSheetLine.Type = TimeSheetLine.Type::Resource then begin
                HeaderFound := false;
                if PrevTimeSheetHeaderNo = TimeSheetDetail."Time Sheet No." then
                    HeaderFound := true
                else
                    if TimeSheetHeader.Get(TimeSheetDetail."Time Sheet No.") then begin
                        PrevTimeSheetHeaderNo := TimeSheetHeader."No.";
                        HeaderFound := true;
                    end;

                if HeaderFound then begin
                    ResourceFound := false;
                    Employee.SetRange("Resource No.", TimeSheetHeader."Resource No.");
                    if PrevResourceNo = TimeSheetHeader."Resource No." then
                        ResourceFound := true
                    else
                        if Employee.FindFirst() and Resource.Get(TimeSheetHeader."Resource No.") then begin
                            PrevResourceNo := TimeSheetHeader."Resource No.";
                            ResourceFound := true;
                            UnitOfMeasureFound := false;
                            if UnitOfMeasure.Get(Resource."Base Unit of Measure") then
                                UnitOfMeasureFound := true;
                        end;
                    if ResourceFound then begin
                        TransferFields(TimeSheetDetail, true);
                        Id := TimeSheetDetail.SystemId;

                        "Line No" := TimeSheetDetail."Time Sheet Line No.";
                        "Employee No" := Employee."No.";
                        "Employee Id" := Employee.SystemId;
                        if UnitOfMeasureFound then begin
                            "Unit of Measure Code" := UnitOfMeasure.Code;
                            "Unit of Measure Id" := UnitOfMeasure.SystemId;
                        end;
                        Insert(true);
                    end;
                end;
            end;
        until TimeSheetDetail.Next() = 0;
    end;

    local procedure MaxDateFilterRange(): Integer
    begin
        exit(70);
    end;
}