Table 7332 Whse. Internal Put-away Line, source in 29

Source29

src/Layers/W1/BaseApp/Warehouse/InternalDocument/WhseInternalPutawayLine.Table.al926 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.InternalDocument;

using Microsoft.Foundation.UOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Warehouse.Activity;
using Microsoft.Warehouse.Ledger;
using Microsoft.Warehouse.Request;
using Microsoft.Warehouse.Structure;
using Microsoft.Warehouse.Tracking;
using Microsoft.Warehouse.Worksheet;

table 7332 "Whse. Internal Put-away Line"
{
    Caption = 'Whse. Internal Put-away Line';
    LookupPageID = "Whse. Internal Put-away Lines";
    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.';
            Editable = false;
        }
        field(2; "Line No."; Integer)
        {
            Caption = 'Line No.';
            ToolTip = 'Specifies the number of the line.';
            Editable = false;
        }
        field(10; "Location Code"; Code[10])
        {
            Caption = 'Location Code';
            ToolTip = 'Specifies the code for the location of the internal put-away line.';
            Editable = false;
            TableRelation = Location;

            trigger OnValidate()
            begin
                GetLocation("Location Code");
            end;
        }
        field(11; "Shelf No."; Code[10])
        {
            Caption = 'Shelf No.';
            ToolTip = 'Specifies the shelf number that is recorded on the item card or the stockkeeping unit card of the item being moved.';
        }
        field(12; "From Bin Code"; Code[20])
        {
            Caption = 'From Bin Code';
            ToolTip = 'Specifies the bin from which the items to be put away should be taken.';

            trigger OnLookup()
            begin
                SelectLookUp(FieldNo("From Bin Code"));
            end;

            trigger OnValidate()
            var
                BinContent: Record "Bin Content";
            begin
                TestReleased();
                if xRec."From Bin Code" <> "From Bin Code" then
                    if "From Bin Code" <> '' then begin
                        GetLocation("Location Code");
                        Location.TestField("Bin Mandatory");
                        if "From Bin Code" = Location."Adjustment Bin Code" then
                            FieldError(
                              "From Bin Code",
                              StrSubstNo(
                                Text000, Location.FieldCaption("Adjustment Bin Code"),
                                Location.TableCaption()));
                        if Location."Directed Put-away and Pick" then
                            CheckBlocking(BinContent);
                    end;
            end;
        }
        field(13; "From Zone Code"; Code[10])
        {
            Caption = 'From Zone Code';
            ToolTip = 'Specifies the zone from which the items to be put away should be taken.';

            trigger OnLookup()
            begin
                SelectLookUp(FieldNo("From Zone Code"));
                Location.TestField("Directed Put-away and Pick");
            end;

            trigger OnValidate()
            begin
                TestReleased();
                if "From Zone Code" <> xRec."From Zone Code" then begin
                    GetLocation("Location Code");
                    Location.TestField("Directed Put-away and Pick");
                    "From Bin Code" := '';
                end;
            end;
        }
        field(14; "Item No."; Code[20])
        {
            Caption = 'Item No.';
            ToolTip = 'Specifies the number of the item that you want to put away and have entered on the line.';

            trigger OnLookup()
            begin
                SelectLookUp(FieldNo("Item No."));
            end;

            trigger OnValidate()
            begin
                TestReleased();
                TestField("Qty. Put Away", 0);
                if "Item No." <> xRec."Item No." then
                    "Variant Code" := '';

                SetItemFields();

                if WhseInternalPutAwayHeader.Get("No.") then begin
                    if "Location Code" = '' then
                        Validate("Location Code", WhseInternalPutAwayHeader."Location Code");
                    if "From Zone Code" = '' then
                        Validate("From Zone Code", WhseInternalPutAwayHeader."From Zone Code");
                    if "From Bin Code" = '' then
                        Validate("From Bin Code", WhseInternalPutAwayHeader."From Bin Code");
                end;
            end;
        }
        field(15; Quantity; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity';
            ToolTip = 'Specifies the quantity that should be put away.';
            DecimalPlaces = 0 : 5;
            MinValue = 0;

            trigger OnValidate()
            var
                DocStatus: Option;
            begin
                TestReleased();
                TestField("Qty. Put Away", 0);
                CalcFields("Put-away Qty.");
                if Quantity < "Qty. Put Away" + "Put-away Qty." then
                    FieldError(Quantity, StrSubstNo(Text001, "Qty. Put Away" + "Put-away Qty."));

                "Qty. (Base)" :=
                    UOMMgt.CalcBaseQty("Item No.", "Variant Code", "Unit of Measure Code", Quantity, "Qty. per Unit of Measure");
                if CurrFieldNo = FieldNo(Quantity) then
                    CheckBinContentQty();

                Validate("Qty. Outstanding", (Quantity - "Qty. Put Away"));
                Status := CalcStatusPutAwayLine();
                if Status <> xRec.Status then begin
                    GetInternalPutAwayHeader("No.");
                    DocStatus := WhseInternalPutAwayHeader.GetDocumentStatus(0);
                    if DocStatus <> WhseInternalPutAwayHeader."Document Status" then begin
                        WhseInternalPutAwayHeader.Validate("Document Status", DocStatus);
                        WhseInternalPutAwayHeader.Modify();
                    end;
                end;
            end;
        }
        field(16; "Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(19; "Qty. Outstanding"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Outstanding';
            ToolTip = 'Specifies the quantity that still needs to be handled.';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            begin
                "Qty. Outstanding (Base)" :=
                    UOMMgt.CalcBaseQty("Item No.", "Variant Code", "Unit of Measure Code", "Qty. Outstanding", "Qty. per Unit of Measure");
            end;
        }
        field(20; "Qty. Outstanding (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Outstanding (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(23; "Qty. Put Away"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Put Away';
            ToolTip = 'Specifies the quantity of the line that is registered as put away.';
            DecimalPlaces = 0 : 5;
            Editable = false;

            trigger OnValidate()
            begin
                "Qty. Put Away (Base)" :=
                    UOMMgt.CalcBaseQty("Item No.", "Variant Code", "Unit of Measure Code", "Qty. Put Away", "Qty. per Unit of Measure");
            end;
        }
        field(24; "Qty. Put Away (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Put Away (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(25; "Put-away Qty."; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Warehouse Activity Line"."Qty. Outstanding" where("Activity Type" = const("Put-away"),
                                                                                  "Whse. Document Type" = const("Internal Put-away"),
                                                                                  "Whse. Document No." = field("No."),
                                                                                  "Whse. Document Line No." = field("Line No."),
                                                                                  "Unit of Measure Code" = field("Unit of Measure Code"),
                                                                                  "Action Type" = filter(" " | Take),
                                                                                  "Original Breakbulk" = const(false)));
            Caption = 'Put-away Qty.';
            ToolTip = 'Specifies the quantity in the put-away instructions that is assigned to be put away.';
            DecimalPlaces = 0 : 5;
            Editable = false;
            FieldClass = FlowField;
        }
        field(26; "Put-away Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Warehouse Activity Line"."Qty. Outstanding (Base)" where("Activity Type" = const("Put-away"),
                                                                                         "Whse. Document Type" = const("Internal Put-away"),
                                                                                         "Whse. Document No." = field("No."),
                                                                                         "Whse. Document Line No." = field("Line No."),
                                                                                         "Action Type" = filter(" " | Take),
                                                                                         "Original Breakbulk" = const(false)));
            Caption = 'Put-away Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
            FieldClass = FlowField;
        }
        field(27; Status; Option)
        {
            Caption = 'Status';
            Editable = false;
            OptionCaption = ' ,Partially Put Away,Completely Put Away';
            OptionMembers = " ","Partially Put Away","Completely Put Away";
        }
        field(29; "Unit of Measure Code"; Code[10])
        {
            Caption = 'Unit of Measure Code';
            ToolTip = 'Specifies how each unit of the item or resource is measured, such as in pieces or hours. By default, the value in the Base Unit of Measure field on the item or resource card is inserted.';
            Editable = false;

            trigger OnLookup()
            begin
                SelectLookUp(FieldNo("Unit of Measure Code"));
            end;

            trigger OnValidate()
            begin
                if "Item No." <> '' then begin
                    GetItemUnitOfMeasure();
                    "Qty. per Unit of Measure" := ItemUnitOfMeasure."Qty. per Unit of Measure";
                end else
                    "Qty. per Unit of Measure" := 1;

                Validate(Quantity);
                Validate("Qty. Outstanding");
            end;
        }
        field(30; "Qty. per Unit of Measure"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. per Unit of Measure';
            ToolTip = 'Specifies the number of base units of measure, that are in the unit of measure, specified for the item on the line.';
            DecimalPlaces = 0 : 5;
            Editable = false;
            InitValue = 1;
        }
        field(31; "Variant Code"; Code[10])
        {
            Caption = 'Variant Code';
            ToolTip = 'Specifies the variant of the item on the line.';
            Editable = true;
            TableRelation = "Item Variant".Code where("Item No." = field("Item No."));

            trigger OnLookup()
            begin
                SelectLookUp(FieldNo("Variant Code"));
            end;

            trigger OnValidate()
            var
                ItemVariant: Record "Item Variant";
            begin
                if Rec."Variant Code" = '' then
                    Validate("Item No.")
                else begin
                    ItemVariant.Get("Item No.", "Variant Code");
                    Description := ItemVariant.Description;
                end;
            end;
        }
        field(32; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies the description of the item on the line.';
        }
        field(33; "Description 2"; Text[50])
        {
            Caption = 'Description 2';
            ToolTip = 'Specifies information in addition to the description.';
        }
        field(35; "Sorting Sequence No."; Integer)
        {
            Caption = 'Sorting Sequence No.';
            Editable = false;
        }
        field(36; "Due Date"; Date)
        {
            Caption = 'Due Date';
            ToolTip = 'Specifies the date when the warehouse activity must be completed.';
        }
        field(37; Cubage; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Cubage';
            DecimalPlaces = 0 : 5;
        }
        field(38; Weight; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Weight';
            DecimalPlaces = 0 : 5;
        }
    }

    keys
    {
        key(Key1; "No.", "Line No.")
        {
            Clustered = true;
        }
        key(Key2; "No.", "Item No.")
        {
            MaintainSQLIndex = false;
        }
        key(Key3; "No.", "From Bin Code")
        {
            MaintainSQLIndex = false;
        }
        key(Key4; "No.", "Shelf No.")
        {
            MaintainSQLIndex = false;
        }
        key(Key5; "No.", "Sorting Sequence No.")
        {
        }
        key(Key6; "No.", "Due Date")
        {
            MaintainSQLIndex = false;
        }
        key(Key7; "Item No.", "From Bin Code", "Location Code", "Unit of Measure Code", "Variant Code")
        {
            MaintainSIFTIndex = false;
            SumIndexFields = "Qty. (Base)";
        }
    }

    fieldgroups
    {
    }

    trigger OnDelete()
    var
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        DocStatus: Option;
    begin
        TestReleased();

        if ("Qty. Put Away" > 0) and (Quantity > "Qty. Put Away") then
            if not HideValidationDialog then
                if not Confirm(
                     StrSubstNo(
                       Text004,
                       FieldCaption("Qty. Put Away"), "Qty. Put Away",
                       FieldCaption(Quantity), Quantity, TableCaption), false)
                then
                    Error(Text005);

        ItemTrackingMgt.DeleteWhseItemTrkgLines(
          Database::"Whse. Internal Put-away Line", 0, "No.", '', 0, "Line No.", "Location Code", true);

        DocStatus :=
          WhseInternalPutAwayHeader.GetDocumentStatus("Line No.");
        if DocStatus <> WhseInternalPutAwayHeader."Document Status" then begin
            WhseInternalPutAwayHeader.Validate("Document Status", DocStatus);
            WhseInternalPutAwayHeader.Modify();
        end;
    end;

    trigger OnInsert()
    begin
        TestField("Item No.");
        "Sorting Sequence No." := GetSortSeqNo();
    end;

    trigger OnModify()
    begin
        TestField("Item No.");
        xRec.TestField("Qty. Put Away", 0);
        "Sorting Sequence No." := GetSortSeqNo();
    end;

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

    var
        WhseInternalPutAwayHeader: Record "Whse. Internal Put-away Header";
        Location: Record Location;
        Item: Record Item;
        ItemUnitOfMeasure: Record "Item Unit of Measure";
        UOMMgt: Codeunit "Unit of Measure Management";
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'must not be the %1 of the %2';
        Text001: Label 'must be greater than %1';
        Text002: Label 'must not be greater than %1 units';
        Text003: Label 'You cannot rename a %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        LastLineNo: Integer;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text004: Label '%1 = %2 is less than the %3 = %4.\Do you really want to delete the %5?';
#pragma warning restore AA0470
        Text005: Label 'Cancelled.';
        Text006: Label 'Nothing to handle.';
#pragma warning restore AA0074

    protected var
        HideValidationDialog: Boolean;

    procedure SetUpNewLine(LastWhseInternalPutAwayLine: Record "Whse. Internal Put-away Line")
    var
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
    begin
        GetInternalPutAwayHeader("No.");
        WhseInternalPutAwayLine.SetRange("No.", WhseInternalPutAwayHeader."No.");
        if not WhseInternalPutAwayLine.IsEmpty() then
            LastLineNo := LastWhseInternalPutAwayLine."Line No."
        else
            LastLineNo := 0;
        "Line No." := GetNextLineNo();
        Validate("Location Code", WhseInternalPutAwayHeader."Location Code");
        "From Zone Code" := WhseInternalPutAwayHeader."From Zone Code";
        "From Bin Code" := WhseInternalPutAwayHeader."From Bin Code";
        "Due Date" := WhseInternalPutAwayHeader."Due Date";
    end;

    local procedure TestReleased()
    begin
        TestField("No.");
        GetInternalPutAwayHeader("No.");
        WhseInternalPutAwayHeader.TestField(Status, 0);
    end;

    local procedure SetItemFields()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetItemFields(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Item No." <> '' then begin
            GetItemUnitOfMeasure();
            Description := Item.Description;
            "Description 2" := Item."Description 2";
            "Shelf No." := Item."Shelf No.";
            Validate("Unit of Measure Code", ItemUnitOfMeasure.Code);
        end else begin
            Description := '';
            "Description 2" := '';
            "Variant Code" := '';
            "Shelf No." := '';
            Validate("Unit of Measure Code", '');
        end;
    end;

    procedure CalcStatusPutAwayLine(): Integer
    begin
        if (Quantity <> 0) and (Quantity = "Qty. Put Away") then
            exit(Status::"Completely Put Away");
        if "Qty. Put Away" > 0 then
            exit(Status::"Partially Put Away");
        exit(Status::" ");
    end;

    protected procedure CheckBinContentQty()
    var
        BinContent: Record "Bin Content";
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
        AvailQtyBase: Decimal;
    begin
        GetLocation("Location Code");

        if Location."Bin Mandatory" and
           ("Location Code" <> '') and ("From Bin Code" <> '') and
           ("Item No." <> '') and ("Unit of Measure Code" <> '')
        then begin
            if Location."Directed Put-away and Pick" then
                CheckBlocking(BinContent);
            AvailQtyBase := BinContent.CalcQtyAvailToTake(0);
            WhseInternalPutAwayLine.SetCurrentKey(
              "Item No.", "From Bin Code", "Location Code", "Unit of Measure Code", "Variant Code");
            WhseInternalPutAwayLine.SetRange("Item No.", "Item No.");
            WhseInternalPutAwayLine.SetRange("From Bin Code", "From Bin Code");
            WhseInternalPutAwayLine.SetRange("Location Code", "Location Code");
            WhseInternalPutAwayLine.SetRange("Unit of Measure Code", "Unit of Measure Code");
            WhseInternalPutAwayLine.SetRange("Variant Code", "Variant Code");
            WhseInternalPutAwayLine.SetFilter("Line No.", '<>%1', "Line No.");
            OnCheckBinContentQtyOnAfterWhseInternalPutAwayLineSetFilter(Rec, WhseInternalPutAwayLine);
            WhseInternalPutAwayLine.CalcSums("Qty. (Base)");
            if AvailQtyBase - WhseInternalPutAwayLine."Qty. (Base)" < "Qty. (Base)" then
                FieldError(
                  "Qty. (Base)",
                  StrSubstNo(
                    Text002, AvailQtyBase - WhseInternalPutAwayLine."Qty. (Base)"));
        end;
    end;

    local procedure CheckBlocking(var BinContent: Record "Bin Content")
    var
        Bin: Record Bin;
        BinType: Record "Bin Type";
    begin
        if BinContent.Get(
             "Location Code", "From Bin Code", "Item No.", "Variant Code", "Unit of Measure Code")
        then begin
            if BinContent."Bin Type Code" <> '' then
                if BinType.Get(Bin."Bin Type Code") then
                    BinType.TestField(Receive, false);
            if BinContent."Block Movement" in [
                                               BinContent."Block Movement"::Outbound, BinContent."Block Movement"::All]
            then
                BinContent.FieldError("Block Movement");

            "From Zone Code" := BinContent."Zone Code";
        end else begin
            Bin.Get("Location Code", "From Bin Code");
            if Bin."Bin Type Code" <> '' then
                if BinType.Get(Bin."Bin Type Code") then
                    BinType.TestField(Receive, false);

            if Bin."Block Movement" in [
                                        Bin."Block Movement"::Outbound, Bin."Block Movement"::All]
            then
                Bin.FieldError("Block Movement");
            "From Zone Code" := Bin."Zone Code";
        end;

        OnAfterCheckBlocking(Rec);
    end;

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

    local procedure GetItemUnitOfMeasure()
    begin
        GetItem();
        Item.TestField("No.");
        if (Item."No." <> ItemUnitOfMeasure."Item No.") or
           ("Unit of Measure Code" <> ItemUnitOfMeasure.Code)
        then
            if not ItemUnitOfMeasure.Get(Item."No.", "Unit of Measure Code") then
                ItemUnitOfMeasure.Get(Item."No.", Item."Base Unit of Measure");
    end;

    local procedure GetItem()
    begin
        if Item."No." <> "Item No." then
            Item.Get("Item No.");
    end;

    local procedure GetLocation(LocationCode: Code[10])
    begin
        if LocationCode = '' then
            Clear(Location)
        else
            if Location.Code <> LocationCode then
                Location.Get(LocationCode);
    end;

    local procedure GetInternalPutAwayHeader(InternalPutAwayNo: Code[20])
    begin
        if InternalPutAwayNo <> '' then
            WhseInternalPutAwayHeader.Get(InternalPutAwayNo);
    end;

    local procedure LookUpBinContent()
    var
        BinContent: Record "Bin Content";
    begin
        BinContent.FilterGroup(2);
        BinContent.SetRange("Location Code", "Location Code");
        BinContent.FilterGroup(0);
        BinContent."Location Code" := "Location Code";
        BinContent."Zone Code" := "From Zone Code";
        BinContent."Bin Code" := "From Bin Code";
        BinContent."Item No." := "Item No.";
        if "Variant Code" <> '' then begin
            TestField("Item No.");
            BinContent."Variant Code" := "Variant Code";
        end;
        if "Unit of Measure Code" <> '' then begin
            TestField("Item No.");
            BinContent."Unit of Measure Code" := "Unit of Measure Code";
        end;
        OnLookupBinContentOnBeforeRunPage(Rec, BinContent);
        if PAGE.RunModal(0, BinContent) = ACTION::LookupOK then begin
            if BinContent."Block Movement" in [
                                               BinContent."Block Movement"::Outbound, BinContent."Block Movement"::All]
            then
                BinContent.FieldError("Block Movement");
            Validate("Location Code", BinContent."Location Code");
            Validate(Quantity, 0);
            Validate("From Bin Code", BinContent."Bin Code");
            Validate("Item No.", BinContent."Item No.");
            Validate("Variant Code", BinContent."Variant Code");
            Validate("Unit of Measure Code", BinContent."Unit of Measure Code");
        end;

        OnAfterLookUpBinContent(Rec, BinContent);
    end;

    procedure CreatePutAwayDoc(var WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line")

    begin
        GetInternalPutAwayHeader("No.");
        WhseInternalPutAwayHeader.CheckPutawayRequired(WhseInternalPutAwayLine."Location Code");
        WhseInternalPutAwayHeader.TestField(
          Status, WhseInternalPutAwayHeader.Status::Released);
        WhseInternalPutAwayLine.SetFilter(Quantity, '>0');
        WhseInternalPutAwayLine.SetFilter(
          Status, '<>%1', WhseInternalPutAwayLine.Status::"Completely Put Away");
        if WhseInternalPutAwayLine.Find('-') then
            RunCreatePutAwayFromWhseSource()
        else
            if not HideValidationDialog then
                Message(Text006);
    end;

    local procedure RunCreatePutAwayFromWhseSource()
    var
        CreatePutAwayFromWhseSource: Report "Whse.-Source - Create Document";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeRunCreatePutAwayFromWhseSource(WhseInternalPutAwayHeader, HideValidationDialog, IsHandled);
        if IsHandled then
            exit;

        CreatePutAwayFromWhseSource.SetWhseInternalPutAway(WhseInternalPutAwayHeader);
        CreatePutAwayFromWhseSource.SetHideValidationDialog(HideValidationDialog);
        CreatePutAwayFromWhseSource.UseRequestPage(not HideValidationDialog);
        CreatePutAwayFromWhseSource.RunModal();
        CreatePutAwayFromWhseSource.GetResultMessage(1);
    end;

    local procedure SelectLookUp(CurrentFieldNo: Integer)
    var
        ItemVariant: Record "Item Variant";
    begin
        GetLocation("Location Code");
        if Location."Bin Mandatory" then
            LookUpBinContent()
        else begin
            if CurrentFieldNo = FieldNo("From Zone Code") then
                Location.TestField("Bin Mandatory");
            if CurrentFieldNo = FieldNo("From Bin Code") then
                Location.TestField("Bin Mandatory");
            if CurrentFieldNo = FieldNo("Item No.") then begin
                Item."No." := "Item No.";
                if PAGE.RunModal(0, Item) = ACTION::LookupOK then
                    Validate("Item No.", Item."No.");
            end;
            if CurrentFieldNo = FieldNo("Variant Code") then begin
                TestField("Item No.");
                ItemVariant.FilterGroup(2);
                ItemVariant.SetRange("Item No.", "Item No.");
                ItemVariant.FilterGroup(0);
                ItemVariant."Item No." := "Item No.";
                ItemVariant.Code := "Variant Code";
                if PAGE.RunModal(0, ItemVariant) = ACTION::LookupOK then
                    Validate("Variant Code", ItemVariant.Code);
            end;
            if CurrentFieldNo = FieldNo("Unit of Measure Code") then begin
                TestField("Item No.");
                ItemUnitOfMeasure.FilterGroup(2);
                ItemUnitOfMeasure.SetRange("Item No.", "Item No.");
                ItemUnitOfMeasure.FilterGroup(0);
                ItemUnitOfMeasure."Item No." := "Item No.";
                ItemUnitOfMeasure.Code := "Unit of Measure Code";
                if PAGE.RunModal(0, ItemUnitOfMeasure) = ACTION::LookupOK then
                    Validate("Unit of Measure Code", ItemUnitOfMeasure.Code);
            end;
        end;
    end;

    procedure OpenItemTrackingLines()
    var
        TempWhseWorksheetLine: Record "Whse. Worksheet Line" temporary;
        WhseItemTrackingLines: Page "Whse. Item Tracking Lines";
    begin
        OnBeforeOpenItemTrackingLines(Rec);

        TestField("Item No.");
        TestField("Qty. (Base)");
        TempWhseWorksheetLine.InitNewLineWithItem(
          "Warehouse Worksheet Document Type"::"Internal Put-away", "No.", "Line No.",
          "Location Code", "Item No.", "Variant Code",
          "Qty. (Base)", "Qty. (Base)" - "Qty. Put Away (Base)" - "Put-away Qty. (Base)", "Qty. per Unit of Measure");

        OnOpenItemTrackingLinesOnBeforeSetSource(Rec, TempWhseWorksheetLine);
        WhseItemTrackingLines.SetSource(TempWhseWorksheetLine, Database::"Whse. Internal Put-away Line");
        WhseItemTrackingLines.RunModal();
        Clear(WhseItemTrackingLines);
    end;

    local procedure GetNextLineNo(): Integer
    var
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
        HigherLineNo: Integer;
        LowerLineNo: Integer;
    begin
        WhseInternalPutAwayLine.SetRange("No.", WhseInternalPutAwayHeader."No.");
        if WhseInternalPutAwayHeader."Sorting Method" <> WhseInternalPutAwayHeader."Sorting Method"::None then
            exit(GetLastLineNo() + 10000);

        WhseInternalPutAwayLine."No." := WhseInternalPutAwayHeader."No.";
        WhseInternalPutAwayLine."Line No." := LastLineNo;
        if WhseInternalPutAwayLine.Find('<') then
            LowerLineNo := WhseInternalPutAwayLine."Line No."
        else
            if WhseInternalPutAwayLine.Find('>') then
                exit(LastLineNo div 2)
            else
                exit(LastLineNo + 10000);

        WhseInternalPutAwayLine."No." := WhseInternalPutAwayHeader."No.";
        WhseInternalPutAwayLine."Line No." := LastLineNo;
        if WhseInternalPutAwayLine.Find('>') then
            HigherLineNo := LastLineNo
        else
            exit(LastLineNo + 10000);
        exit(LowerLineNo + (HigherLineNo - LowerLineNo) div 2);
    end;

    local procedure GetLastLineNo(): Integer
    var
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
    begin
        WhseInternalPutAwayLine.SetRange("No.", WhseInternalPutAwayHeader."No.");
        if WhseInternalPutAwayLine.FindLast() then
            exit(WhseInternalPutAwayLine."Line No.");
        exit(0);
    end;

    local procedure GetSortSeqNo(): Integer
    var
        WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line";
        HigherSeqNo: Integer;
        LowerSeqNo: Integer;
        LastSeqNo: Integer;
    begin
        GetInternalPutAwayHeader("No.");

        WhseInternalPutAwayLine.SetRange("No.", "No.");
        case WhseInternalPutAwayHeader."Sorting Method" of
            WhseInternalPutAwayHeader."Sorting Method"::None:
                WhseInternalPutAwayLine.SetCurrentKey("No.", "Line No.");
            WhseInternalPutAwayHeader."Sorting Method"::Item:
                WhseInternalPutAwayLine.SetCurrentKey("No.", "Item No.");
            WhseInternalPutAwayHeader."Sorting Method"::"Shelf or Bin":
                begin
                    GetLocation("Location Code");
                    if Location."Bin Mandatory" then
                        WhseInternalPutAwayLine.SetCurrentKey("No.", "From Bin Code")
                    else
                        WhseInternalPutAwayLine.SetCurrentKey("No.", "Shelf No.");
                end;
            WhseInternalPutAwayHeader."Sorting Method"::"Due Date":
                WhseInternalPutAwayLine.SetCurrentKey("No.", "Due Date");
            else
                exit("Line No.");
        end;

        WhseInternalPutAwayLine := Rec;
        LastSeqNo := GetLastSeqNo(WhseInternalPutAwayLine);
        if WhseInternalPutAwayLine.Find('<') then
            LowerSeqNo := WhseInternalPutAwayLine."Sorting Sequence No."
        else
            if WhseInternalPutAwayLine.Find('>') then
                exit(WhseInternalPutAwayLine."Sorting Sequence No." div 2)
            else
                LowerSeqNo := 10000;

        WhseInternalPutAwayLine := Rec;
        if WhseInternalPutAwayLine.Find('>') then
            HigherSeqNo := WhseInternalPutAwayLine."Sorting Sequence No."
        else
            if WhseInternalPutAwayLine.Find('<') then
                exit(LastSeqNo + 10000)
            else
                HigherSeqNo := LastSeqNo;
        exit(LowerSeqNo + (HigherSeqNo - LowerSeqNo) div 2);
    end;

    local procedure GetLastSeqNo(WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line"): Integer
    begin
        WhseInternalPutAwayLine.SetRecFilter();
        WhseInternalPutAwayLine.SetRange("Line No.");
        WhseInternalPutAwayLine.SetCurrentKey("No.", "Sorting Sequence No.");
        if WhseInternalPutAwayLine.FindLast() then
            exit(WhseInternalPutAwayLine."Sorting Sequence No.");
        exit(0);
    end;

    procedure SetItemTrackingLines(WhseEntry: Record "Warehouse Entry"; QtyToEmpty: Decimal)
    var
        TempWhseWorksheetLine: Record "Whse. Worksheet Line" temporary;
        WhseItemTrackingLines: Page "Whse. Item Tracking Lines";
    begin
        TestField("Item No.");
        TestField("Qty. (Base)");
        TempWhseWorksheetLine.InitNewLineWithItem(
          "Warehouse Worksheet Document Type"::"Internal Put-away", "No.", "Line No.",
          "Location Code", "Item No.", "Variant Code",
          "Qty. (Base)", "Qty. (Base)" - "Qty. Put Away (Base)" - "Put-away Qty. (Base)", "Qty. per Unit of Measure");

        Clear(WhseItemTrackingLines);
        OnSetItemTrackingLinesOnBeforeSetSource(Rec, TempWhseWorksheetLine);
        WhseItemTrackingLines.SetSource(TempWhseWorksheetLine, Database::"Whse. Internal Put-away Line");
        WhseItemTrackingLines.InsertItemTrackingLine(TempWhseWorksheetLine, WhseEntry, QtyToEmpty);
    end;

    procedure CheckCurrentLineQty()
    var
        BinContent: Record "Bin Content";
        AvailQtyBase: Decimal;
    begin
        GetLocation("Location Code");

        if Location."Bin Mandatory" and
           ("Location Code" <> '') and ("From Bin Code" <> '') and
           ("Item No." <> '') and ("Unit of Measure Code" <> '')
        then begin
            if Location."Directed Put-away and Pick" then
                CheckBlocking(BinContent);
            AvailQtyBase := BinContent.CalcQtyAvailToTake(0);
            if AvailQtyBase < "Qty. (Base)" then
                FieldError("Qty. (Base)", StrSubstNo(Text002, AvailQtyBase));
        end;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOpenItemTrackingLines(var WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupBinContentOnBeforeRunPage(var WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line"; var BinContent: Record "Bin Content")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckBinContentQtyOnAfterWhseInternalPutAwayLineSetFilter(var WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line"; var FilteredWhseInternalPutawayLine: Record "Whse. Internal Put-away Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnOpenItemTrackingLinesOnBeforeSetSource(var WhseInternalPutAwayLine: Record "Whse. Internal Put-away Line"; var WhseWorksheetLine: Record "Whse. Worksheet Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetItemTrackingLinesOnBeforeSetSource(var WhseInternalPutawayLine: Record "Whse. Internal Put-away Line"; var TempWhseWorksheetLine: Record "Whse. Worksheet Line" temporary);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCheckBlocking(var WhseInternalPutawayLine: Record "Whse. Internal Put-away Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterLookUpBinContent(var WhseInternalPutawayLine: Record "Whse. Internal Put-away Line"; BinContent: Record "Bin Content")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetItemFields(var WhseInternalPutawayLine: Record "Whse. Internal Put-away Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeRunCreatePutAwayFromWhseSource(var WhseInternalPutAwayHeader: Record "Whse. Internal Put-away Header"; HideValidationDialog: Boolean; var IsHandled: Boolean)
    begin
    end;
}