Table 7316 Warehouse Receipt Header, source in 29

Source29

src/Layers/W1/BaseApp/Warehouse/Document/WarehouseReceiptHeader.Table.al639 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.Warehouse.Document;

using Microsoft.Foundation.NoSeries;
using Microsoft.Inventory.Location;
using Microsoft.Warehouse.Comment;
using Microsoft.Warehouse.CrossDock;
using Microsoft.Warehouse.History;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Setup;
using Microsoft.Warehouse.Structure;

table 7316 "Warehouse Receipt Header"
{
    Caption = 'Warehouse Receipt Header';
    LookupPageID = "Warehouse Receipts";
    Permissions = TableData "Warehouse Receipt Line" = rd;
    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.';

            trigger OnValidate()
            begin
                WhseSetup.Get();
                if "No." <> xRec."No." then begin
                    NoSeries.TestManual(WhseSetup."Whse. Receipt Nos.");
                    "No. Series" := '';
                end;
            end;
        }
        field(2; "Location Code"; Code[10])
        {
            Caption = 'Location Code';
            ToolTip = 'Specifies the code of the location in which the items are being received.';
            TableRelation = Location where("Use As In-Transit" = const(false));

            trigger OnValidate()
            var
                WhseRcptLine: Record "Warehouse Receipt Line";
            begin
                if not WmsManagement.LocationIsAllowed("Location Code") then
                    Error(Text003, "Location Code");

                if "Location Code" <> xRec."Location Code" then begin
                    "Zone Code" := '';
                    "Bin Code" := '';
                    "Cross-Dock Zone Code" := '';
                    "Cross-Dock Bin Code" := '';
                    WhseRcptLine.SetRange("No.", "No.");
                    if not WhseRcptLine.IsEmpty() then
                        Error(
                          Text001,
                          FieldCaption("Location Code"));
                end;

                GetLocation("Location Code");
                Location.TestField("Require Receive");
                if Location."Bin Mandatory" then begin
                    Validate("Bin Code", Location."Receipt Bin Code");
                    Validate("Cross-Dock Bin Code", Location."Cross-Dock Bin Code");
                end;

                OnValidateLocationCodeOnAfterTransferLocationFields(Rec, xRec, Location);

                if UserId <> '' then begin
                    FilterGroup := 2;
                    SetRange("Location Code", "Location Code");
                    FilterGroup := 0;
                end;
            end;
        }
        field(3; "Assigned User ID"; Code[50])
        {
            Caption = 'Assigned User ID';
            ToolTip = 'Specifies the ID of the user who is responsible for the document.';
            DataClassification = EndUserIdentifiableInformation;
            TableRelation = "Warehouse Employee" where("Location Code" = field("Location Code"));

            trigger OnValidate()
            begin
                if "Assigned User ID" <> '' then begin
                    "Assignment Date" := Today;
                    "Assignment Time" := Time;
                end else begin
                    "Assignment Date" := 0D;
                    "Assignment Time" := 0T;
                end;
            end;
        }
        field(4; "Assignment Date"; Date)
        {
            Caption = 'Assignment Date';
            ToolTip = 'Specifies the date when the user was assigned the activity.';
            Editable = false;
        }
        field(5; "Assignment Time"; Time)
        {
            Caption = 'Assignment Time';
            ToolTip = 'Specifies the time when the user was assigned the activity.';
            Editable = false;
        }
        field(6; "Sorting Method"; Enum "Warehouse Receipt Sorting Method")
        {
            Caption = 'Sorting Method';
            ToolTip = 'Specifies the method by which the receipts are sorted.';

            trigger OnValidate()
            begin
                if "Sorting Method" <> xRec."Sorting Method" then
                    SortWhseDoc();
            end;
        }
        field(7; "No. Series"; Code[20])
        {
            Caption = 'No. Series';
            TableRelation = "No. Series";
        }
        field(8; "Zone Code"; Code[10])
        {
            Caption = 'Zone Code';
            ToolTip = 'Specifies the zone in which the items are being received if you are using directed put-away and pick.';
            TableRelation = Zone.Code where("Location Code" = field("Location Code"));

            trigger OnValidate()
            begin
                if "Zone Code" <> xRec."Zone Code" then begin
                    if "Zone Code" <> '' then begin
                        GetLocation("Location Code");
                        Location.TestField("Directed Put-away and Pick");
                    end;
                    "Bin Code" := '';
                    MessageIfReceiptLinesExist(FieldCaption("Zone Code"));
                end;
            end;
        }
        field(9; "Bin Code"; Code[20])
        {
            Caption = 'Bin Code';
            ToolTip = 'Specifies the bin where the items are picked or put away.';
            TableRelation = if ("Zone Code" = filter('')) Bin.Code where("Location Code" = field("Location Code"))
            else
            if ("Zone Code" = filter(<> '')) Bin.Code where("Location Code" = field("Location Code"),
                                                                               "Zone Code" = field("Zone Code"));

            trigger OnValidate()
            var
                Bin: Record Bin;
                WhseIntegrationMgt: Codeunit "Whse. Integration Management";
            begin
                if (xRec."Bin Code" <> "Bin Code") or ("Zone Code" = '') then begin
                    if "Bin Code" <> '' then begin
                        GetLocation("Location Code");
                        WhseIntegrationMgt.CheckBinTypeAndCode(
                            Database::"Warehouse Receipt Header", FieldCaption("Bin Code"), "Location Code", "Bin Code", 0);
                        Bin.Get("Location Code", "Bin Code");
                        "Zone Code" := Bin."Zone Code";
                    end;
                    MessageIfReceiptLinesExist(FieldCaption("Bin Code"));
                end;
            end;
        }
        field(10; "Document Status"; Option)
        {
            Caption = 'Document Status';
            ToolTip = 'Specifies the status of the warehouse receipt.';
            Editable = false;
            OptionCaption = ' ,Partially Received,Completely Received';
            OptionMembers = " ","Partially Received","Completely Received";
        }
        field(11; Comment; Boolean)
        {
            CalcFormula = exist("Warehouse Comment Line" where("Table Name" = const("Whse. Receipt"),
                                                                Type = const(" "),
                                                                "No." = field("No.")));
            Caption = 'Comment';
            Editable = false;
            FieldClass = FlowField;
        }
        field(12; "Posting Date"; Date)
        {
            Caption = 'Posting Date';
            ToolTip = 'Specifies the posting date of the warehouse receipt.';
        }
        field(13; "Vendor Shipment No."; Code[35])
        {
            Caption = 'Vendor Shipment No.';
            ToolTip = 'Specifies the vendor''s shipment number. It is inserted in the corresponding field on the source document during posting.';
        }
        field(16; "Cross-Dock Zone Code"; Code[10])
        {
            Caption = 'Cross-Dock Zone Code';
            TableRelation = Zone.Code where("Location Code" = field("Location Code"),
                                             "Cross-Dock Bin Zone" = const(true));

            trigger OnValidate()
            begin
                if "Cross-Dock Zone Code" <> xRec."Cross-Dock Zone Code" then begin
                    if "Cross-Dock Zone Code" <> '' then begin
                        GetLocation("Location Code");
                        Location.TestField("Directed Put-away and Pick");
                    end;
                    "Cross-Dock Bin Code" := '';
                    MessageIfReceiptLinesExist(FieldCaption("Cross-Dock Zone Code"));
                end;
            end;
        }
        field(17; "Cross-Dock Bin Code"; Code[20])
        {
            Caption = 'Cross-Dock Bin Code';
            TableRelation = if ("Cross-Dock Zone Code" = filter('')) Bin.Code where("Location Code" = field("Location Code"),
                                                                                   "Cross-Dock Bin" = const(true))
            else
            if ("Cross-Dock Zone Code" = filter(<> '')) Bin.Code where("Location Code" = field("Location Code"),
                                                                                                                                                 "Zone Code" = field("Cross-Dock Zone Code"),
                                                                                                                                                 "Cross-Dock Bin" = const(true));

            trigger OnValidate()
            var
                Bin: Record Bin;
            begin
                if (xRec."Cross-Dock Bin Code" <> "Cross-Dock Bin Code") or ("Cross-Dock Zone Code" = '') then begin
                    if "Cross-Dock Bin Code" <> '' then begin
                        GetLocation("Location Code");
                        Location.TestField("Bin Mandatory");
                        if "Cross-Dock Bin Code" = Location."Adjustment Bin Code" then
                            FieldError(
                              "Cross-Dock Bin Code",
                              StrSubstNo(
                                Text005,
                                Location.FieldCaption("Adjustment Bin Code"),
                                Location.TableCaption()));

                        Bin.Get("Location Code", "Cross-Dock Bin Code");
                        Bin.TestField("Cross-Dock Bin", true);
                        "Cross-Dock Zone Code" := Bin."Zone Code";
                    end;
                    MessageIfReceiptLinesExist(FieldCaption("Cross-Dock Bin Code"));
                end;
            end;
        }
        field(50; "Create Posted Header"; Boolean)
        {
            Caption = 'Create Posted Header';
        }
        field(51; "Receiving No."; Code[20])
        {
            Caption = 'Receiving No.';
        }
        field(62; "Last Receiving No."; Code[20])
        {
            Caption = 'Last Receiving No.';
            TableRelation = "Posted Whse. Receipt Header";
        }
        field(63; "Receiving No. Series"; Code[20])
        {
            Caption = 'Receiving No. Series';
            TableRelation = "No. Series";

            trigger OnLookup()
            begin
                WhseRcptHeader := Rec;
                WhseSetup.Get();
                WhseSetup.TestField("Posted Whse. Receipt Nos.");
                if NoSeries.LookupRelatedNoSeries(WhseSetup."Posted Whse. Receipt Nos.", WhseRcptHeader."Receiving No. Series") then
                    WhseRcptHeader.Validate(WhseRcptHeader."Receiving No. Series");
                Rec := WhseRcptHeader;
            end;

            trigger OnValidate()
            begin
                if "Receiving No. Series" <> '' then begin
                    WhseSetup.Get();
                    WhseSetup.TestField("Posted Whse. Receipt Nos.");
                    NoSeries.TestAreRelated(WhseSetup."Posted Whse. Receipt Nos.", "Receiving No. Series");
                end;
                TestField("Receiving No.", '');
            end;
        }
    }

    keys
    {
        key(Key1; "No.")
        {
            Clustered = true;
        }
        key(Key2; "Location Code")
        {
        }
    }

    fieldgroups
    {
    }

    trigger OnDelete()
    begin
        DeleteRelatedLines(true);
    end;

    trigger OnInsert()
    begin
        WhseSetup.Get();
        if "No." = '' then begin
            WhseSetup.TestField("Whse. Receipt Nos.");
                "No. Series" := WhseSetup."Whse. Receipt Nos.";
                if NoSeries.AreRelated("No. Series", xRec."No. Series") then
                    "No. Series" := xRec."No. Series";
                "No." := NoSeries.GetNextNo("No. Series", "Posting Date");
        end;

        if NoSeries.IsAutomatic(WhseSetup."Posted Whse. Receipt Nos.") then
            "Receiving No. Series" := WhseSetup."Posted Whse. Receipt Nos.";

        GetLocation("Location Code");
        Validate("Bin Code", Location."Receipt Bin Code");
        Validate("Cross-Dock Bin Code", Location."Cross-Dock Bin Code");
        "Posting Date" := WorkDate();

        OnAfterOnInsert(Rec, xRec, Location);
    end;

    trigger OnRename()
    begin
        Error(Text000, TableCaption);
    end;

    var
        Location: Record Location;
        WhseRcptHeader: Record "Warehouse Receipt Header";
        WhseSetup: Record "Warehouse Setup";
        WhseCommentLine: Record "Warehouse Comment Line";
        NoSeries: Codeunit "No. Series";
        WmsManagement: Codeunit "WMS Management";
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'You cannot rename a %1.';
        Text001: Label 'You cannot change the %1, because the document has one or more lines.';
        Text003: Label 'You are not allowed to use location code %1.';
        Text005: Label 'must not be the %1 of the %2';
        Text006: Label 'You have changed %1 on the %2, but it has not been changed on the existing Warehouse Receipt Lines.\';
#pragma warning restore AA0470
        Text007: Label 'You must update the existing Warehouse Receipt Lines manually.';
        Text008: Label 'The Whse. Receipt is not completely received.\Do you really want to delete the Whse. Receipt?';
        Text009: Label 'Cancelled.';
#pragma warning restore AA0074

    protected var
        HideValidationDialog: Boolean;

    procedure AssistEdit(OldWhseRcptHeader: Record "Warehouse Receipt Header"): Boolean
    begin
        WhseSetup.Get();
        WhseRcptHeader := Rec;
        WhseSetup.TestField("Whse. Receipt Nos.");
        if NoSeries.LookupRelatedNoSeries(
             WhseSetup."Whse. Receipt Nos.", OldWhseRcptHeader."No. Series", WhseRcptHeader."No. Series")
        then begin
            WhseRcptHeader."No." := NoSeries.GetNextNo(WhseRcptHeader."No. Series");
            Rec := WhseRcptHeader;
            exit(true);
        end;

        OnAfterAssistEdit(OldWhseRcptHeader);
    end;

    procedure SortWhseDoc()
    var
        WhseRcptLine: Record "Warehouse Receipt Line";
        SequenceNo: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSortWhseDoc(Rec, IsHandled);
        if IsHandled then
            exit;

        WhseRcptLine.SetRange("No.", "No.");
        GetLocation("Location Code");
        case "Sorting Method" of
            "Sorting Method"::Item:
                WhseRcptLine.SetCurrentKey("No.", "Item No.");
            "Sorting Method"::Document:
                WhseRcptLine.SetCurrentKey("No.", "Source Document", "Source No.");
            "Sorting Method"::"Shelf or Bin":
                if Location."Bin Mandatory" then
                    WhseRcptLine.SetCurrentKey("No.", "Bin Code")
                else
                    WhseRcptLine.SetCurrentKey("No.", "Shelf No.");
            "Sorting Method"::"Due Date":
                WhseRcptLine.SetCurrentKey("No.", "Due Date");
            else
                OnSortWhseDocOnCaseSortingMethodElse(Rec, WhseRcptLine);
        end;

        if WhseRcptLine.Find('-') then begin
            SequenceNo := 10000;
            repeat
                WhseRcptLine."Sorting Sequence No." := SequenceNo;
                WhseRcptLine.Modify();
                SequenceNo := SequenceNo + 10000;
            until WhseRcptLine.Next() = 0;
        end;
    end;

    procedure MessageIfReceiptLinesExist(ChangedFieldName: Text[80])
    var
        WhseRcptLine: Record "Warehouse Receipt Line";
    begin
        WhseRcptLine.SetRange("No.", "No.");
        if not WhseRcptLine.IsEmpty() then
            if not HideValidationDialog then
                Message(
                  StrSubstNo(
                    Text006, ChangedFieldName, TableCaption) + Text007);
    end;

    procedure DeleteRelatedLines(UseTableTrigger: Boolean)
    var
        CrossDockOpp: Record "Whse. Cross-Dock Opportunity";
        WhseRcptLine: Record "Warehouse Receipt Line";
        Confirmed: Boolean;
        SkipConfirm: Boolean;
    begin
        WhseRcptLine.SetRange("No.", "No.");
        if UseTableTrigger then begin
            if WhseRcptLine.Find('-') then begin
                repeat
                    OnBeforeDeleteWhseRcptRelatedLines(WhseRcptLine, SkipConfirm);
                    if (WhseRcptLine.Quantity <> WhseRcptLine."Qty. Outstanding") and
                       (WhseRcptLine."Qty. Outstanding" <> 0) and not SkipConfirm
                    then
                        if not Confirm(Text008, false) then
                            Error(Text009)
                        else
                            Confirmed := true;
                until (WhseRcptLine.Next() = 0) or Confirmed;
                WhseRcptLine.DeleteAll();
            end;
        end else
            WhseRcptLine.DeleteAll(UseTableTrigger);

        CrossDockOpp.SetRange("Source Template Name", '');
        CrossDockOpp.SetRange("Source Name/No.", "No.");
        CrossDockOpp.DeleteAll();

        WhseCommentLine.SetRange("Table Name", WhseCommentLine."Table Name"::"Whse. Receipt");
        WhseCommentLine.SetRange(Type, WhseCommentLine.Type::" ");
        WhseCommentLine.SetRange("No.", "No.");
        WhseCommentLine.DeleteAll();
    end;

    procedure GetHeaderStatus(SkipLineNo: Integer): Integer
    var
        WarehouseReceiptLine: Record "Warehouse Receipt Line";
    begin
        WarehouseReceiptLine.SetRange("No.", "No.");
        if SkipLineNo <> 0 then
            WarehouseReceiptLine.SetFilter("Line No.", '<>%1', SkipLineNo);

        WarehouseReceiptLine.SetRange(Status, WarehouseReceiptLine.Status::"Completely Received");
        if not WarehouseReceiptLine.IsEmpty() then begin
            WarehouseReceiptLine.SetFilter(Status, '<>%1', WarehouseReceiptLine.Status::"Completely Received");
            if not WarehouseReceiptLine.IsEmpty() then
                exit(WarehouseReceiptLine.Status::"Partially Received");

            exit(WarehouseReceiptLine.Status::"Completely Received");
        end else begin
            WarehouseReceiptLine.SetRange(Status, WarehouseReceiptLine.Status::"Partially Received");
            if not WarehouseReceiptLine.IsEmpty() then
                exit(WarehouseReceiptLine.Status::"Partially Received");
        end;

        exit(WarehouseReceiptLine.Status::" ");
    end;

    procedure LookupLocation(var WhseRcptHeader: Record "Warehouse Receipt Header")
    var
        Location: Record Location;
    begin
        Commit();
        Location.FilterGroup := 2;
        Location.SetRange(Code);
        if PAGE.RunModal(PAGE::"Locations with Warehouse List", Location) = ACTION::LookupOK then
            WhseRcptHeader.Validate("Location Code", Location.Code);
        Location.FilterGroup := 0;
    end;

    procedure GetLocation(LocationCode: Code[10]): Record Location
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetLocation(LocationCode, Rec, Location, IsHandled);
        if IsHandled then
            exit(Location);

        if LocationCode = '' then
            Location.GetLocationSetup(LocationCode, Location)
        else
            if Location.Code <> LocationCode then
                Location.Get(LocationCode);

        exit(Location);
    end;

    procedure SetHideValidationDialog(NewHideValidationDialog: Boolean)
    begin
        HideValidationDialog := NewHideValidationDialog;
    end;

    procedure FindFirstAllowedRec(Which: Text[1024]): Boolean
    var
        WhseRcptHeader: Record "Warehouse Receipt Header";
        WMSManagement: Codeunit "WMS Management";
    begin
        if Find(Which) then begin
            WhseRcptHeader := Rec;
            while true do begin
                if WMSManagement.LocationIsAllowedToView("Location Code") then
                    exit(true);

                if Next(1) = 0 then begin
                    Rec := WhseRcptHeader;
                    if Find(Which) then
                        while true do begin
                            if WMSManagement.LocationIsAllowedToView("Location Code") then
                                exit(true);

                            if Next(-1) = 0 then
                                exit(false);
                        end;
                end;
            end;
        end;
        exit(false);
    end;

    procedure FindNextAllowedRec(Steps: Integer): Integer
    var
        WhseRcptHeader: Record "Warehouse Receipt Header";
        WMSManagement: Codeunit "WMS Management";
        RealSteps: Integer;
        NextSteps: Integer;
    begin
        RealSteps := 0;
        if Steps <> 0 then begin
            WhseRcptHeader := Rec;
            repeat
                NextSteps := Next(Steps / Abs(Steps));
                if WMSManagement.LocationIsAllowedToView("Location Code") then begin
                    RealSteps := RealSteps + NextSteps;
                    WhseRcptHeader := Rec;
                end;
            until (NextSteps = 0) or (RealSteps = Steps);
            Rec := WhseRcptHeader;
            if not Find() then;
        end;
        exit(RealSteps);
    end;

    procedure ErrorIfUserIsNotWhseEmployee()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeErrorIfUserIsNotWhseEmployee("Location Code", IsHandled);
        if IsHandled then
            exit;

        WMSManagement.CheckUserIsWhseEmployee();
    end;

    procedure ReceiptLinesEditable() IsEditable: Boolean;
    begin
        IsEditable := true;

        OnAfterReceiptLinesEditable(Rec, IsEditable);
    end;

    procedure BinCodeMandatory(): Boolean;
    begin
        exit(GetLocation("Location Code")."Bin Mandatory");
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterAssistEdit(var WarehouseReceiptHeader: Record "Warehouse Receipt Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterOnInsert(var WarehouseReceiptHeader: Record "Warehouse Receipt Header"; var xWarehouseReceiptHeader: Record "Warehouse Receipt Header"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterReceiptLinesEditable(WarehouseReceiptHeader: Record "Warehouse Receipt Header"; var IsEditable: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteWhseRcptRelatedLines(var WhseRcptLine: Record "Warehouse Receipt Line"; var SkipConfirm: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetLocation(LocationCode: Code[10]; var WarehouseReceiptHeader: Record "Warehouse Receipt Header"; var Location: Record Location; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeErrorIfUserIsNotWhseEmployee(LocationCode: Code[10]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSortWhseDoc(var WarehouseReceiptHeader: Record "Warehouse Receipt Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSortWhseDocOnCaseSortingMethodElse(var WarehouseReceiptHeader: Record "Warehouse Receipt Header"; var WhseRcptLine: Record "Warehouse Receipt Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateLocationCodeOnAfterTransferLocationFields(var WarehouseReceiptHeader: Record "Warehouse Receipt Header"; xWarehouseReceiptHeader: Record "Warehouse Receipt Header"; Location: Record Location)
    begin
    end;
}