Codeunit 6516 Package Management, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Tracking/PackageManagement.Codeunit.al2111 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.Inventory.Tracking;

using Microsoft.Foundation.Navigate;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Posting;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Journal;
using Microsoft.Projects.Project.Ledger;
using Microsoft.Projects.Project.Planning;
using Microsoft.Utilities;
using Microsoft.Warehouse.Activity;
using Microsoft.Warehouse.Activity.History;
using Microsoft.Warehouse.Availability;
using Microsoft.Warehouse.History;
using Microsoft.Warehouse.InventoryDocument;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Ledger;
using Microsoft.Warehouse.Structure;
using Microsoft.Warehouse.Tracking;

codeunit 6516 "Package Management"
{

    var
        InventoryNotAvailableErr: Label '%1 %2 is not available in inventory, it has already been reserved for another document, or the quantity available is lower than the quantity to handle specified on the line.', Comment = '%1 = Package No. Caption; %2 = Package No. Value';
        InventoryNotAvailableOrReservedErr: Label '%1 %2 is not available on inventory or it has already been reserved for another document.', Comment = '%1 = Package No. Caption; %2 = Package No. Value';
        MustNotBeErr: Label 'must not be %1', Comment = '%1 = bin quantity';
        ListTxt: Label '%1 List', Comment = '%1 - field caption';
        AvailabilityTxt: Label '%1 %2 - Availability', Comment = '%1 - tracking field caption, %2 - field value';
        PackageNoRequiredErr: Label 'You must assign a package number for item %1.', Comment = '%1 - Item No.';
        LineNoTxt: Label ' Line No. = ''%1''.', Comment = '%1 - Line No.';
        CannotBeFullyAppliedErr: Label 'Item Tracking Serial No. %1 Lot No. %2 Package No. %3 for Item No. %4 Variant %5 cannot be fully applied.', Comment = '%1 - Serial No., %2  - Lot No., %3 - Package No., %4 - Item No., %5 - Variant Code';


    // Tracking Specification subscribers

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterClearTracking', '', false, false)]
    local procedure TrackingSpecificationClearTracking(var TrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification."Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure TrackingSpecificationClearTrackingFilter(var TrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingBlank', '', false, false)]
    local procedure TrackingSpecificationSetTrackingBlank(var TrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification."Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromTrackingSpec', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromTrackingSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification."Package No." := FromTrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyNewTrackingFromTrackingSpec', '', false, false)]
    local procedure TrackingSpecificationCopyNewTrackingFromTrackingSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification."New Package No." := FromTrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyNewTrackingFromNewTrackingSpec', '', false, false)]
    local procedure TrackingSpecificationCopyNewTrackingFromNewTrackingSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification."New Package No." := FromTrackingSpecification."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromEntrySummary', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromEntrySummary(var TrackingSpecification: Record "Tracking Specification"; EntrySummary: Record "Entry Summary")
    begin
        TrackingSpecification."Package No." := EntrySummary."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromItemLedgEntry(var TrackingSpecification: Record "Tracking Specification"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        TrackingSpecification."Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromItemTrackingSetup', '', false, false)]
    local procedure TrackingSpecificationOnAfterCopyTrackingFromItemTrackingSetup(var TrackingSpecification: Record "Tracking Specification"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        TrackingSpecification."Package No." := ItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromReservEntry(var TrackingSpecification: Record "Tracking Specification"; ReservEntry: Record "Reservation Entry")
    begin
        TrackingSpecification."Package No." := ReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromWhseActivityLine(var TrackingSpecification: Record "Tracking Specification"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        TrackingSpecification."Package No." := WhseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure TrackingSpecificationCopyTrackingFromWhseItemTrackingLine(var TrackingSpecification: Record "Tracking Specification"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        TrackingSpecification."Package No." := WhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterBlank', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterBlank(var TrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.SetRange("Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromEntrySummary', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromEntrySummary(var TrackingSpecification: Record "Tracking Specification"; EntrySummary: Record "Entry Summary")
    begin
        TrackingSpecification.SetRange("Package No.", EntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromItemJnlLine', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromItemJnlLine(var TrackingSpecification: Record "Tracking Specification"; ItemJournalLine: Record "Item Journal Line")
    begin
        TrackingSpecification.SetRange("Package No.", ItemJournalLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromItemLedgEntry', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromItemLedgEntry(var TrackingSpecification: Record "Tracking Specification"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        TrackingSpecification.SetRange("Package No.", ItemLedgerEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromItemTrackingSetup(var TrackingSpecification: Record "Tracking Specification"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        TrackingSpecification.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromReservEntry', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromReservEntry(var TrackingSpecification: Record "Tracking Specification"; ReservationEntry: Record "Reservation Entry")
    begin
        TrackingSpecification.SetRange("Package No.", ReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetNewTrackingFilterFromNewReservEntry', '', false, false)]
    local procedure TrackingSpecificationSetNewTrackingFilterFromNewReservEntry(var TrackingSpecification: Record "Tracking Specification"; ReservationEntry: Record "Reservation Entry")
    begin
        TrackingSpecification.SetRange("New Package No.", ReservationEntry."New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetNewTrackingFilterFromNewTrackingSpec', '', false, false)]
    local procedure TrackingSpecificationSetNewTrackingFilterFromNewTrackingSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.SetRange("New Package No.", FromTrackingSpecification."New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromTrackingSpec', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromTrackingSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.SetRange("Package No.", FromTrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetTrackingFilterFromWhseActivityLine', '', false, false)]
    local procedure TrackingSpecificationSetTrackingFilterFromWhseActivityLine(var TrackingSpecification: Record "Tracking Specification"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        TrackingSpecification.SetRange("Package No.", WhseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterTestTrackingFieldsAreBlank', '', false, false)]
    local procedure TrackingSpecificationTestTrackingFieldsAreBlank(var TrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.TestField("Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterTrackingExist', '', false, false)]
    local procedure TrackingSpecificationTrackingExist(var TrackingSpecification: Record "Tracking Specification"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (TrackingSpecification."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterNewTrackingExist', '', false, false)]
    local procedure TrackingSpecificationNewTrackingExist(var TrackingSpecification: Record "Tracking Specification"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (TrackingSpecification."New Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterHasSameTracking', '', false, false)]
    local procedure TrackingSpecificationHasSameTracking(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (TrackingSpecification."Package No." = FromTrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterNonSerialTrackingExists', '', false, false)]
    local procedure TrackingSpecificationOnAfterNonSerialTrackingExists(TrackingSpecification: Record "Tracking Specification"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (TrackingSpecification."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Tracking Specification", 'OnAfterSetNonSerialTrackingFilterFromSpec', '', false, false)]
    local procedure TrackingSpecificationOnAfterSetNonSerialTrackingFilterFromSpec(var TrackingSpecification: Record "Tracking Specification"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        TrackingSpecification.SetRange("Package No.", FromTrackingSpecification."Package No.");
    end;

    // Reservation Entry subscribers

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterHasSameTracking', '', false, false)]
    local procedure ReservationEntryHasSameTracking(ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (ReservationEntry."Package No." = FromReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterHasSameNewTracking', '', false, false)]
    local procedure ReservationEntryHasSameNewTracking(ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (ReservationEntry."New Package No." = FromReservationEntry."New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterHasSameTrackingWithSpec', '', false, false)]
    local procedure ReservationEntryHasSamesTrackingWithSpec(ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (ReservationEntry."Package No." = TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterClearTracking', '', false, false)]
    local procedure ReservationEntryClearTracking(var ReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry."Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterClearNewTracking', '', false, false)]
    local procedure ReservationEntryClearNewTracking(var ReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry."New Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure ReservationEntryClearTrackingFilter(var ReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromItemLedgEntry(var ReservationEntry: Record "Reservation Entry"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ReservationEntry."Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromItemTrackingSetup', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromItemTrackingSetup(var ReservationEntry: Record "Reservation Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ReservationEntry."Package No." := ItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromInvtProfile', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromInvtProfile(var ReservationEntry: Record "Reservation Entry"; InventoryProfile: Record "Inventory Profile")
    begin
        ReservationEntry."Package No." := InventoryProfile."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromReservEntry(var ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry."Package No." := FromReservationEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromReservEntryNewTracking', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromReservEntryNewTracking(var ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry."Package No." := FromReservationEntry."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromTrackingSpec', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromTrackingSpec(var ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        ReservationEntry."Package No." := TrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromWhseActivLine', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromWhseActivLine(var ReservationEntry: Record "Reservation Entry"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        ReservationEntry."Package No." := WarehouseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromWhseEntry', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromWhseEntry(var ReservationEntry: Record "Reservation Entry"; WhseEntry: Record "Warehouse Entry")
    begin
        ReservationEntry."Package No." := WhseEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure ReservationEntryCopyTrackingFromWhseItemTrackingLine(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        ReservationEntry."Package No." := WhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetNewTrackingFromItemJnlLine', '', false, false)]
    local procedure ReservationEntryCopyNewTrackingFromItemJnlLine(var ReservationEntry: Record "Reservation Entry"; ItemJournalLine: Record "Item Journal Line")
    begin
        ReservationEntry."New Package No." := ItemJournalLine."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetNewTrackingFromTrackingSpecification', '', false, false)]
    local procedure ReservationEntrySetNewTrackingFromTrackingSpecification(var ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        ReservationEntry."New Package No." := TrackingSpecification."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyNewTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure ReservationEntryCopyNewTrackingFromWhseItemTrackingLine(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        ReservationEntry."New Package No." := WhseItemTrackingLine."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFiltersToReservEntry', '', false, false)]
    local procedure ReservationEntryCopyTrackingFiltersToReservEntry(var ReservEntry: Record "Reservation Entry"; var FilterReservEntry: Record "Reservation Entry")
    begin
        ReservEntry.CopyFilter("Package No.", FilterReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterFilterLinesForTracking', '', false, false)]
    local procedure ReservationEntryFilterLinesForTracking(var ReservEntry: Record "Reservation Entry"; CalcReservEntry: Record "Reservation Entry"; Positive: Boolean)
    var
        FieldFilter: Text;
    begin
        if CalcReservEntry.FieldFilterNeeded(FieldFilter, Positive, "Item Tracking Type"::"Package No.") then
            ReservEntry.SetFilter("Package No.", FieldFilter);
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterBlank', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterBlank(var ReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry.SetRange("Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromEntrySummaryIfNotBlank', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromEntrySummaryIfNotBlank(var ReservationEntry: Record "Reservation Entry"; EntrySummary: Record "Entry Summary")
    begin
        if EntrySummary."Package No." <> '' then
            ReservationEntry.SetRange("Package No.", EntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromItemJnlLine', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromItemJnlLine(var ReservationEntry: Record "Reservation Entry"; ItemJournalLine: Record "Item Journal Line")
    begin
        ReservationEntry.SetRange("Package No.", ItemJournalLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromItemLedgEntry', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromItemLedgEntry(var ReservationEntry: Record "Reservation Entry"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        ReservationEntry.SetRange("Package No.", ItemLedgEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromTrackingSetup(var ReservationEntry: Record "Reservation Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ReservationEntry.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromTrackingSetupIfNotBlank(var ReservationEntry: Record "Reservation Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No." <> '' then
            ReservationEntry.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromReservEntry', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromReservEntry(var ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry.SetRange("Package No.", FromReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetNewTrackingFilterFromNewReservEntry', '', false, false)]
    local procedure ReservationEntrySetNewTrackingFilterFromNewReservEntry(var ReservationEntry: Record "Reservation Entry"; FromReservationEntry: Record "Reservation Entry")
    begin
        ReservationEntry.SetRange("New Package No.", FromReservationEntry."New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromTrackingSpec', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromTrackingSpec(var ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        ReservationEntry.SetRange("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromSpecIfNotBlank', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromSpecIfNotBlank(var ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        if TrackingSpecification."Package No." <> '' then
            ReservationEntry.SetRange("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseActivityLine', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseActivityLine(var ReservationEntry: Record "Reservation Entry"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        ReservationEntry.SetRange("Package No.", WhseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseJnlLine', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseJnlLine(var ReservationEntry: Record "Reservation Entry"; WhseJournalLine: Record "Warehouse Journal Line")
    begin
        ReservationEntry.SetRange("Package No.", WhseJournalLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseSpec', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseSpec(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        ReservationEntry.SetRange("Package No.", WhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseActivityLineIfRequired', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseActivityLineIfRequired(var ReservationEntry: Record "Reservation Entry"; WhseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            ReservationEntry.SetRange("Package No.", WhseActivityLine."Package No.")
        else
            ReservationEntry.SetFilter("Package No.", '%1|%2', WhseActivityLine."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseItemTrackingSetupNotBlankIfRequired', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseItemTrackingSetupNotBlankIfRequired(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            ReservationEntry.SetFilter("Package No.", '<>%1', '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromWhseItemTrackingSetupIfRequired', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromWhseItemTrackingSetupIfRequired(var ReservationEntry: Record "Reservation Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                ReservationEntry.SetRange("Package No.", WhseItemTrackingSetup."Package No.")
            else
                ReservationEntry.SetFilter("Package No.", '%1|%2', WhseItemTrackingSetup."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterToItemIfRequired', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterToItemIfRequired(ReservationEntry: Record "Reservation Entry"; var Item: Record Item)
    begin
        if ReservationEntry."Package No." <> '' then
            Item.SetRange("Package No. Filter", ReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterGetItemTrackingEntryType', '', false, false)]
    local procedure ReservationEntryGetItemTrackingEntryType(ReservationEntry: Record "Reservation Entry"; var TrackingEntryType: Enum "Item Tracking Entry Type")
    begin
        if ReservationEntry."Package No." = '' then
            exit;

        case true of
            (ReservationEntry."Lot No." = '') and (ReservationEntry."Serial No." = ''):
                TrackingEntryType := "Item Tracking Entry Type"::"Package No.";
            (ReservationEntry."Lot No." <> '') and (ReservationEntry."Serial No." = ''):
                TrackingEntryType := "Item Tracking Entry Type"::"Lot and Package No.";
            (ReservationEntry."Lot No." = '') and (ReservationEntry."Serial No." <> ''):
                TrackingEntryType := "Item Tracking Entry Type"::"Serial and Package No.";
            (ReservationEntry."Lot No." <> '') and (ReservationEntry."Serial No." <> ''):
                TrackingEntryType := "Item Tracking Entry Type"::"Lot and Serial and Package No.";
        end;
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterTrackingExists', '', false, false)]
    local procedure ReservationEntryTrackingExists(ReservationEntry: Record "Reservation Entry"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (ReservationEntry."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterNewTrackingExists', '', false, false)]
    local procedure ReservationEntryNewTrackingExists(ReservationEntry: Record "Reservation Entry"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (ReservationEntry."New Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterGetTrackingText', '', false, false)]
    local procedure ReservationEntryGetTrackingText(ReservationEntry: Record "Reservation Entry"; var TrackingText: Text)
    begin
        TrackingText := TrackingText + ' ' + ReservationEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyNewTrackingFromReservEntry', '', false, false)]
    local procedure ReservationEntryCopyNewTrackingFromReservEntry(var ReservationEntry: Record "Reservation Entry"; FromReservEntry: Record "Reservation Entry")
    begin
        ReservationEntry."New Package No." := FromReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterCopyTrackingFilterFromItemLedgEntry', '', false, false)]
    local procedure ReservationEntryCopyTrackingFilterFromItemLedgEntry(var ReservationEntry: Record "Reservation Entry"; var ItemLedgEntry: Record "Item Ledger Entry")
    begin
        ItemLedgEntry.CopyFilter("Package No.", ReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterSetTrackingFilterFromTrackingSpecIfNotBlank', '', false, false)]
    local procedure ReservationEntrySetTrackingFilterFromTrackingSpecIfNotBlank(var ReservationEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        if TrackingSpecification."Package No." <> '' then
            ReservationEntry.SetRange("Package No.", TrackingSpecification."Package No.")
        else
            ReservationEntry.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnAfterNonSerialTrackingExists', '', false, false)]
    local procedure ReservationEntryOnAfterNonSerialTrackingExists(ReservationEntry: Record "Reservation Entry"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (ReservationEntry."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Reservation Entry", 'OnFieldFilterNeededOnItemTrackingTypeElseCase', '', false, false)]
    local procedure ReservationEntryOnFieldFilterNeededOnItemTrackingTypeElseCase(ReservationEntry: Record "Reservation Entry"; ItemTrackingCode: Record "Item Tracking Code"; ItemTrackingType: Enum "Item Tracking Type"; var FieldValue: Code[50]; var IsSpecificTracking: Boolean; var IsHandled: Boolean)
    begin
        if ItemTrackingType <> ItemTrackingType::"Package No." then
            exit;

        IsHandled := true;
        IsSpecificTracking := ItemTrackingCode."Package Specific Tracking";
        if IsSpecificTracking then
            FieldValue := ReservationEntry."Package No.";
    end;

    // Item Ledger Entry subscribers

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterTrackingExists', '', false, false)]
    local procedure ItemLedgerEntryTrackingExists(ItemLedgerEntry: Record "Item Ledger Entry"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (ItemLedgerEntry."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterCopyTrackingFromItemJnlLine', '', false, false)]
    local procedure ItemLedgerEntryCopyTrackingFromItemJnlLine(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemJnlLine: Record "Item Journal Line")
    begin
        ItemLedgerEntry."Package No." := ItemJnlLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterCopyTrackingFromNewItemJnlLine', '', false, false)]
    local procedure ItemLedgerEntryCopyTrackingFromNewItemJnlLine(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemJnlLine: Record "Item Journal Line")
    begin
        ItemLedgerEntry."Package No." := ItemJnlLine."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromItemLedgEntry', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromItemLedgEntry(var ItemLedgerEntry: Record "Item Ledger Entry"; FromItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemLedgerEntry.SetRange("Package No.", FromItemLedgerEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromItemJournalLine', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromItemJournalLine(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemJournalLine: Record "Item Journal Line")
    begin
        ItemLedgerEntry.SetRange("Package No.", ItemJournalLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromItemTrackingSetup(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ItemLedgerEntry.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromItemTrackingSetupIfNotBlank(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No." <> '' then
            ItemLedgerEntry.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromSpec', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromSpec(var ItemLedgerEntry: Record "Item Ledger Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemLedgerEntry.SetRange("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure ItemLedgerEntryClearTrackingFilter(var ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemLedgerEntry.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterBlank', '', false, false)]
    local procedure ItemLedgerEntryOnAfterSetTrackingFilterBlank(var ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemLedgerEntry.SetRange("Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterTestTrackingEqualToTrackingSpec', '', false, false)]
    local procedure ItemLedgerEntryTestTrackingEqualToTrackingSpec(ItemLedgerEntry: Record "Item Ledger Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemLedgerEntry.TestField("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure ItemLedgerEntrySetTrackingFilterFromItemTrackingSetupIfRequired(var ItemLedgerEntry: Record "Item Ledger Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" then
            ItemLedgerEntry.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Ledger Entry", 'OnAfterFilterLinesForTracking', '', false, false)]
    local procedure ItemLedgerEntryFilterLinesForTracking(var ItemLedgerEntry: Record "Item Ledger Entry"; CalcReservEntry: Record "Reservation Entry"; Positive: Boolean)
    var
        FieldFilter: Text;
    begin
        if CalcReservEntry.FieldFilterNeeded(FieldFilter, Positive, "Item Tracking Type"::"Package No.") then
            ItemLedgerEntry.SetFilter("Package No.", FieldFilter);
    end;

    // Job Ledger Entry subscribers

    [EventSubscriber(ObjectType::Table, Database::"Job Ledger Entry", 'OnAfterCopyTrackingFromJobJnlLine', '', false, false)]
    local procedure JobLedgerEntryCopyTrackingFromJobJnlLine(var JobLedgerEntry: Record "Job Ledger Entry"; JobJnlLine: Record "Job Journal Line")
    begin
        JobLedgerEntry."Package No." := JobJnlLine."Package No.";
    end;

    // Job Journal Line subscribers

    [EventSubscriber(ObjectType::Table, Database::"Job Journal Line", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure JobJournalLineCopyTrackingFromItemLedgEntry(var JobJournalLine: Record "Job Journal Line"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        JobJournalLine."Package No." := ItemLedgEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Job Journal Line", 'OnAfterCopyTrackingFromJobPlanningLine', '', false, false)]
    local procedure JobJournalLineCopyTrackingFromJobPlanningLine(var JobJournalLine: Record "Job Journal Line"; JobPlanningLine: Record "Job Planning Line")
    begin
        JobPlanningLine."Package No." := JobPlanningLine."Package No.";
    end;

    // Job Planning Line subscribers

    [EventSubscriber(ObjectType::Table, Database::"Job Planning Line", 'OnAfterCopyTrackingFromJobJnlLine', '', false, false)]
    local procedure JobPlanningLineCopyTrackingFromJobPlanningLine(var JobPlanningLine: Record "Job Planning Line"; JobJnlLine: Record "Job Journal Line")
    begin
        JobPlanningLine."Package No." := JobJnlLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Job Planning Line", 'OnAfterCopyTrackingFromJobLedgEntry', '', false, false)]
    local procedure JobPlanningLineCopyTrackingFromJobLedgEntry(var JobPlanningLine: Record "Job Planning Line"; JobLedgEntry: Record "Job Ledger Entry")
    begin
        JobPlanningLine."Package No." := JobLedgEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Job Planning Line", 'OnAfterClearTracking', '', false, false)]
    local procedure JobPlanningLineClearTracking(var JobPlanningLine: Record "Job Planning Line")
    begin
        JobPlanningLine."Package No." := '';
    end;

    // "Job Link Usage" codeunit subscribers

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Job Link Usage", 'HandleMatchUsageSpecifiedJobPlanningLineOnAfterCalcPartialJobPlanningLineQuantityPosting', '', false, false)]
    local procedure HandleMatchUsageSpecifiedJobPlanningLineOnAfterCalcPartialJobPlanningLineQuantityPosting(JobPlanningLine: Record "Job Planning Line"; JobJournalLine: Record "Job Journal Line"; JobLedgerEntry: Record "Job Ledger Entry"; var PartialJobPlanningLineQuantityPosting: Boolean)
    begin
        PartialJobPlanningLineQuantityPosting := PartialJobPlanningLineQuantityPosting or (JobLedgerEntry."Package No." <> '');
    end;

    // Entry Summary subscribers

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterHasSameTracking', '', false, false)]
    local procedure EntrySummaryHasSameTracking(ToEntrySummary: Record "Entry Summary"; FromEntrySummary: Record "Entry Summary"; var SameTracking: Boolean)
    begin
        SameTracking := SameTracking and (ToEntrySummary."Package No." = FromEntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterHasNonSerialTracking', '', false, false)]
    local procedure EntrySummaryOnAfterHasNonSerialTracking(EntrySummary: Record "Entry Summary"; var NonSerialTracking: Boolean)
    begin
        NonSerialTracking := NonSerialTracking or (EntrySummary."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterCopyTrackingFromItemTrackingSetup', '', false, false)]
    local procedure EntrySummaryCopyTrackingFromItemTrackingSetup(var ToEntrySummary: Record "Entry Summary"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ToEntrySummary."Package No." := ItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure EntrySummaryCopyTrackingFromReservEntry(var ToEntrySummary: Record "Entry Summary"; FromReservEntry: Record "Reservation Entry")
    begin
        ToEntrySummary."Package No." := FromReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterCopyTrackingFromSpec', '', false, false)]
    local procedure EntrySummaryCopyTrackingFromSpec(var ToEntrySummary: Record "Entry Summary"; TrackingSpecification: Record "Tracking Specification")
    begin
        ToEntrySummary."Package No." := TrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetTrackingFilterFromEntrySummary', '', false, false)]
    local procedure EntrySummarySetTrackingFilterFromEntrySummary(var ToEntrySummary: Record "Entry Summary"; FromEntrySummary: Record "Entry Summary")
    begin
        ToEntrySummary.SetRange("Package No.", FromEntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure EntrySummarySetTrackingFilterFromItemTrackingSetup(var ToEntrySummary: Record "Entry Summary"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ToEntrySummary.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure EntrySummarySetTrackingFilterFromItemTrackingSetupIfRequired(var ToEntrySummary: Record "Entry Summary"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ToEntrySummary.SetRange("Package No.");
        if ItemTrackingSetup."Package No. Required" then
            ToEntrySummary.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetTrackingFilterFromReservEntry', '', false, false)]
    local procedure EntrySummarySetTrackingFilterFromReservEntry(var ToEntrySummary: Record "Entry Summary"; FromReservEntry: Record "Reservation Entry")
    begin
        ToEntrySummary.SetRange("Package No.", FromReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetTrackingFilterFromSpec', '', false, false)]
    local procedure EntrySummarySetTrackingFilterFromSpec(var ToEntrySummary: Record "Entry Summary"; FromTrackingSpecification: Record "Tracking Specification")
    begin
        ToEntrySummary.SetRange("Package No.", FromTrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetNonSerialTrackingFilterFromEntrySummary', '', false, false)]
    local procedure EntrySummaryOnAfterSetNonSerialTrackingFilterFromEntrySummary(var ToEntrySummary: Record "Entry Summary"; FromEntrySummary: Record "Entry Summary")
    begin
        ToEntrySummary.SetRange("Package No.", FromEntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterSetNonSerialTrackingFilterFromReservEntry', '', false, false)]
    local procedure EntrySummaryOnAfterSetNonSerialTrackingFilterFromReservEntry(var ToEntrySummary: Record "Entry Summary"; FromReservEntry: Record "Reservation Entry")
    begin
        ToEntrySummary.SetRange("Package No.", FromReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Entry Summary", 'OnAfterHasSameNonSerialTracking', '', false, false)]
    local procedure EntrySummaryOnAfterHasSameNonSerialTracking(ToEntrySummary: Record "Entry Summary"; FromEntrySummary: Record "Entry Summary"; var SameTracking: Boolean)
    begin
        SameTracking := SameTracking and (ToEntrySummary."Package No." = FromEntrySummary."Package No.");
    end;

    // Item Journal Line subscribers

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterClearTracking', '', false, false)]
    local procedure ItemJournalLineClearTracking(var ItemJournalLine: Record "Item Journal Line")
    begin
        ItemJournalLine."Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure ItemJournalLineCopyTrackingFromItemLedgEntry(var ItemJournalLine: Record "Item Journal Line"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        ItemJournalLine."Package No." := ItemLedgEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCopyTrackingFromSpec', '', false, false)]
    local procedure ItemJournalLineCopyTrackingFromSpec(var ItemJournalLine: Record "Item Journal Line"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemJournalLine."Package No." := TrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCopyNewTrackingFromNewSpec', '', false, false)]
    local procedure ItemJournalLineCopyNewTrackingFromNewSpec(var ItemJournalLine: Record "Item Journal Line"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemJournalLine."New Package No." := TrackingSpecification."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterTrackingExists', '', false, false)]
    local procedure ItemJournalLineTrackingExists(var ItemJournalLine: Record "Item Journal Line"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (ItemJournalLine."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterHasSameNewTracking', '', false, false)]
    local procedure ItemJournalLineHasSameNewTracking(ItemJournalLine: Record "Item Journal Line"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (ItemJournalLine."Package No." = ItemJournalLine."New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckTrackingIsEmpty', '', false, false)]
    local procedure ItemJournalLineCheckTrackingIsEmpty(ItemJournalLine: Record "Item Journal Line")
    begin
        ItemJournalLine.TestField("Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckNewTrackingIsEmpty', '', false, false)]
    local procedure ItemJournalLineCheckNewTrackingIsEmpty(ItemJournalLine: Record "Item Journal Line")
    begin
        ItemJournalLine.TestField("New Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckTrackingEqualItemLedgEntry', '', false, false)]
    local procedure ItemJournalLineCheckTrackingEqualItemLedgEntry(ItemJournalLine: Record "Item Journal Line"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemJournalLine.TestField("Package No.", ItemLedgerEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckTrackingEqualTrackingSpecification', '', false, false)]
    local procedure ItemJournalLineCheckTrackingEqualTrackingSpecification(ItemJournalLine: Record "Item Journal Line"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemJournalLine.TestField("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckTrackingIfRequired', '', false, false)]
    local procedure ItemJournalLineOnAfterCheckTrackingIfRequired(ItemJournalLine: Record "Item Journal Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" then
            ItemJournalLine.TestField("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckNewTrackingIfRequired', '', false, false)]
    local procedure ItemJournalLineOnAfterCheckNewTrackingIfRequired(ItemJournalLine: Record "Item Journal Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" then
            ItemJournalLine.TestField("New Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCheckTrackingIfRequiredNotBlank', '', false, false)]
    local procedure ItemJournalLineOnAfterCheckTrackingIfRequiredNotBlank(ItemJournalLine: Record "Item Journal Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" and (ItemJournalLine."Package No." = '') then
            Error(PackageNoRequiredErr, ItemJournalLine."Item No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterCopyNewTrackingFromOldItemLedgerEntry', '', false, false)]
    local procedure ItemJournalLineOnAfterCopyNewTrackingFromOldItemLedgerEntry(var ItemJournalLine: Record "Item Journal Line"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemJournalLine."New Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Journal Line", 'OnAfterSetTrackingFilterFromItemLedgerEntry', '', false, false)]
    local procedure ItemJournalLineOnAfterSetTrackingFilterFromItemLedgerEntry(var ItemJournalLine: Record "Item Journal Line"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemJournalLine.SetRange("Package No.", ItemLedgerEntry."Package No.");
    end;

    // Item Entry Relation

    [EventSubscriber(ObjectType::Table, Database::"Item Entry Relation", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure ItemEntryRelationCopyTrackingFromItemLedgEntry(var ItemEntryRelation: Record "Item Entry Relation"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemEntryRelation."Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Entry Relation", 'OnAfterCopyTrackingFromItemJnlLine', '', false, false)]
    local procedure ItemEntryRelationCopyTrackingFromItemJnlLine(var ItemEntryRelation: Record "Item Entry Relation"; ItemJnlLine: Record "Item Journal Line")
    begin
        ItemEntryRelation."Package No." := ItemJnlLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Entry Relation", 'OnAfterCopyTrackingFromSpec', '', false, false)]
    local procedure ItemEntryRelationCopyTrackingFromSpec(var ItemEntryRelation: Record "Item Entry Relation"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemEntryRelation."Package No." := TrackingSpecification."Package No.";
    end;

    // Item Tracking Setup subscribers

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromEntrySummary', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromEntrySummary(var ItemTrackingSetup: Record "Item Tracking Setup"; EntrySummary: Record "Entry Summary")
    begin
        ItemTrackingSetup."Package No." := EntrySummary."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromBinContentBuffer', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromBinContentBuffer(var ItemTrackingSetup: Record "Item Tracking Setup"; BinContentBuffer: Record "Bin Content Buffer")
    begin
        ItemTrackingSetup."Package No." := BinContentBuffer."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemLedgerEntry', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromItemLedgerEntry(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        ItemTrackingSetup."Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemJnlLine', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromItemJnlLine(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemJnlLine: Record "Item Journal Line")
    begin
        ItemTrackingSetup."Package No." := ItemJnlLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemTrackingSetup', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromItemTrackingSetup(var ItemTrackingSetup: Record "Item Tracking Setup"; FromItemTrackingSetup: Record "Item Tracking Setup")
    begin
        ItemTrackingSetup."Package No." := FromItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromReservEntry(var ItemTrackingSetup: Record "Item Tracking Setup"; ReservEntry: Record "Reservation Entry")
    begin
        ItemTrackingSetup."Package No." := ReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromTrackingSpec', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromTrackingSpec(var ItemTrackingSetup: Record "Item Tracking Setup"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemTrackingSetup."Package No." := TrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", OnAfterCopyTrackingFromPostedInvtPickLine, '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromPostedInvtPickLine(var ItemTrackingSetup: Record "Item Tracking Setup"; PostedInvtPickLine: Record "Posted Invt. Pick Line")
    begin
        ItemTrackingSetup."Package No." := PostedInvtPickLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromWhseActivityLine(var ItemTrackingSetup: Record "Item Tracking Setup"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        ItemTrackingSetup."Package No." := WhseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromWhseEntry', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromWhseEntry(var ItemTrackingSetup: Record "Item Tracking Setup"; WhseEntry: Record "Warehouse Entry")
    begin
        ItemTrackingSetup."Package No." := WhseEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromWhseItemTrackingLine(var ItemTrackingSetup: Record "Item Tracking Setup"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        ItemTrackingSetup."Package No." := WhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterGetNonWarehouseTrackingRequirements', '', false, false)]
    local procedure ItemTrackingSetupGetNonWarehouseTrackingRequirements(var NonWhseItemTrackingSetup: Record "Item Tracking Setup";
                                                                         WhseItemTrackingSetup: Record "Item Tracking Setup";
                                                                         ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        NonWhseItemTrackingSetup."Serial No. Required" :=
            ItemTrackingSetup."Serial No. Required" and
            not WhseItemTrackingSetup."Serial No. Required" and
            (WhseItemTrackingSetup."Lot No. Required" or WhseItemTrackingSetup."Package No. Required");

        NonWhseItemTrackingSetup."Lot No. Required" :=
            ItemTrackingSetup."Lot No. Required" and
            not WhseItemTrackingSetup."Lot No. Required" and
            (WhseItemTrackingSetup."Serial No. Required" or WhseItemTrackingSetup."Package No. Required");

        NonWhseItemTrackingSetup."Package No. Required" :=
            ItemTrackingSetup."Package No. Required" and
            not WhseItemTrackingSetup."Package No. Required" and
            (WhseItemTrackingSetup."Serial No. Required" or WhseItemTrackingSetup."Lot No. Required");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterSetTrackingFilterForItem', '', false, false)]
    local procedure ItemTrackingSetupSetTrackingFilterForItem(ItemTrackingSetup: Record "Item Tracking Setup"; var Item: Record Item)
    begin
        if ItemTrackingSetup."Package No." <> '' then
            Item.SetRange("Package No. Filter", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterTrackingExists', '', false, false)]
    local procedure ItemTrackingSetupTrackingExists(ItemTrackingSetup: Record "Item Tracking Setup"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (ItemTrackingSetup."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterTrackingRequired', '', false, false)]
    local procedure ItemTrackingSetupTrackingRequired(ItemTrackingSetup: Record "Item Tracking Setup"; var IsTrackingRequired: Boolean)
    begin
        IsTrackingRequired := IsTrackingRequired or ItemTrackingSetup."Package No. Required";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCheckTrackingMismatch', '', false, false)]
    local procedure ItemTrackingSetupCheckTrackingMismatch(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemTrackingCode: Record "Item Tracking Code"; TrackingSpecification: Record "Tracking Specification")
    begin
        if ItemTrackingSetup."Package No." <> '' then
            ItemTrackingSetup."Package No. Mismatch" :=
                ItemTrackingCode."Package Specific Tracking" and (TrackingSpecification."Package No." <> ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemTrackingCodeSpecificTracking', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromItemTrackingCodeSpecificTracking(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemTrackingCode: Record "Item Tracking Code")
    begin
        ItemTrackingSetup."Package No. Required" := ItemTrackingCode."Package Specific Tracking";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemTrackingCodeWarehouseTracking', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromItemTrackingCodeWarehouseTracking(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemTrackingCode: Record "Item Tracking Code")
    begin
        ItemTrackingSetup."Package No. Required" := ItemTrackingCode."Package Warehouse Tracking";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromNewTrackingSpec', '', false, false)]
    local procedure ItemTrackingSetupCopyTrackingFromNewTrackingSpec(var ItemTrackingSetup: Record "Item Tracking Setup"; TrackingSpecification: Record "Tracking Specification")
    begin
        ItemTrackingSetup."Package No." := TrackingSpecification."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterCopyTrackingFromItemTracingBuffer', '', false, false)]
    local procedure ItemTrackingSetupOnAfterCopyTrackingFromItemTracingBuffer(var ItemTrackingSetup: Record "Item Tracking Setup"; ItemTracingBuffer: Record "Item Tracing Buffer")
    begin
        ItemTrackingSetup."Package No." := ItemTracingBuffer."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterTrackingMismatch', '', false, false)]
    local procedure ItemTrackingSetupOnAfterTrackingMismatch(ItemTrackingSetup: Record "Item Tracking Setup"; var IsTrackingMismatch: Boolean)
    begin
        IsTrackingMismatch := IsTrackingMismatch or ItemTrackingSetup."Package No. Mismatch";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Setup", 'OnAfterSpecificTracking', '', false, false)]
    local procedure ItemTrackingSetupOnAfterSpecificTracking(ItemTrackingSetup: Record "Item Tracking Setup"; var IsSpecificTracking: Boolean)
    begin
        IsSpecificTracking := IsSpecificTracking or ((ItemTrackingSetup."Package No." <> '') and ItemTrackingSetup."Package No. Required");
    end;

    // Item Tracking Code

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Code", 'OnAfterIsSpecific', '', false, false)]
    local procedure ItemTrackingCodeIsSpecific(ItemTrackingCode: Record "Item Tracking Code"; var Specific: Boolean)
    begin
        Specific := Specific or ItemTrackingCode."Package Specific Tracking";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Code", 'OnAfterIsSpecificTrackingChanged', '', false, false)]
    local procedure ItemTrackingCodeIsSameSpecificTracking(ItemTrackingCode: Record "Item Tracking Code"; ItemTrackingCode2: Record "Item Tracking Code"; var TrackingChanged: Boolean)
    begin
        TrackingChanged := TrackingChanged or (ItemTrackingCode."Package Specific Tracking" <> ItemTrackingCode2."Package Specific Tracking");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Code", 'OnAfterIsWarehouseTracking', '', false, false)]
    local procedure ItemTrackingCodeIsWarehouseTracking(ItemTrackingCode: Record "Item Tracking Code"; var WarehouseTracking: Boolean)
    begin
        WarehouseTracking := WarehouseTracking or ItemTrackingCode."Package Warehouse Tracking";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Item Tracking Code", 'OnAfterIsWarehouseTrackingChanged', '', false, false)]
    local procedure ItemTrackingCodeIsSameWarehouseTracking(ItemTrackingCode: Record "Item Tracking Code"; ItemTrackingCode2: Record "Item Tracking Code"; var TrackingChanged: Boolean)
    begin
        TrackingChanged := TrackingChanged or (ItemTrackingCode."Package Warehouse Tracking" <> ItemTrackingCode2."Package Warehouse Tracking");
    end;

    // Warehouse Activity Line subscribers

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterTrackingExists', '', false, false)]
    local procedure WhseActivityLineTrackingExists(WarehouseActivityLine: Record "Warehouse Activity Line"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (WarehouseActivityLine."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterTrackingFilterExists', '', false, false)]
    local procedure WhseActivityLineTrackingFilterExists(WarehouseActivityLine: Record "Warehouse Activity Line"; var IsTrackingFilterExist: Boolean)
    begin
        IsTrackingFilterExist := IsTrackingFilterExist or (WarehouseActivityLine.GetFilter("Package No.") <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterClearTracking', '', false, false)]
    local procedure WhseActivityLineClearTracking(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseActivityLine."Package No." := '';
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure WhseActivityLineClearTrackingFilter(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseActivityLine.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterCopyTrackingFromSpec', '', false, false)]
    local procedure WhseActivityLineCopyTrackingFromSpec(var WarehouseActivityLine: Record "Warehouse Activity Line"; TrackingSpecification: Record "Tracking Specification")
    begin
        WarehouseActivityLine."Package No." := TrackingSpecification."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterCopyTrackingFromItemTrackingSetup', '', false, false)]
    local procedure WhseActivityLineCopyTrackingFromItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        WarehouseActivityLine."Package No." := WhseItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterCopyTrackingFromPostedWhseRcptLine', '', false, false)]
    local procedure WhseActivityLineCopyTrackingFromPostedWhseRcptLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; PostedWhseRcptLine: Record "Posted Whse. Receipt Line")
    begin
        WarehouseActivityLine."Package No." := PostedWhseRcptLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure WhseActivityLineCopyTrackingFromWhseItemTrackingLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        WarehouseActivityLine."Package No." := WhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure WhseActivityLineCopyTrackingFromWhseActivityLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; FromWarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseActivityLine."Package No." := FromWarehouseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterHasRequiredTracking', '', false, false)]
    local procedure WhseActivityLineHasRequiredTracking(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var Result: Boolean)
    begin
        if WhseItemTrackingSetup."Package No. Required" <> (WarehouseActivityLine."Package No." <> '') then
            Result := false;
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterIfNotEmpty', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterIfNotEmpty(var WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        if WarehouseActivityLine."Package No." <> '' then
            WarehouseActivityLine.SetRange("Package No.", WarehouseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromBinContent', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromBinContent(var WarehouseActivityLine: Record "Warehouse Activity Line"; var BinContent: Record "Bin Content")
    begin
        WarehouseActivityLine.SetFilter("Package No.", BinContent.GetFilter("Package No. Filter"));
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromBinContentBuffer', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromBinContentBuffer(var WarehouseActivityLine: Record "Warehouse Activity Line"; var BinContentBuffer: Record "Bin Content Buffer")
    begin
        WarehouseActivityLine.SetRange("Package No.", BinContentBuffer."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        WarehouseActivityLine.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromReservEntry', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromReservEntry(var WarehouseActivityLine: Record "Warehouse Activity Line"; ReservEntry: Record "Reservation Entry")
    begin
        WarehouseActivityLine.SetRange("Package No.", ReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromReservEntryIfRequired', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromReservEntryIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; ReservEntry: Record "Reservation Entry")
    begin
        if ReservEntry."Package No." <> '' then
            WarehouseActivityLine.SetRange("Package No.", ReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromWhseItemTrackingLineIfNotBlank', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromWhseItemTrackingLineIfNotBlank(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        if WhseItemTrackingLine."Package No." <> '' then
            WarehouseActivityLine.SetRange("Package No.", WhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromWhseActivityLine', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromWhseActivityLine(var WarehouseActivityLine: Record "Warehouse Activity Line"; FromWarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseActivityLine.SetRange("Package No.", FromWarehouseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromWhseItemTrackingSetup', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromWhseItemTrackingSetup(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WarehouseActivityLine.SetRange("Package No.", WhseItemTrackingSetup."Package No.")
        else
            WarehouseActivityLine.SetFilter("Package No.", '%1|%2', WhseItemTrackingSetup."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterFromWhseItemTrackingSetupifNotBlank', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterFromWhseItemTrackingSetupifNotBlank(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                WarehouseActivityLine.SetRange("Package No.", WhseItemTrackingSetup."Package No.")
            else
                WarehouseActivityLine.SetFilter("Package No.", '%1|%2', WhseItemTrackingSetup."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterToItemIfRequired', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterToItemIfRequired(var Item: Record Item; var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WarehouseActivityLine."Package No." <> '' then begin
            if WhseItemTrackingSetup."Package No. Required" then
                Item.SetRange("Package No. Filter", WarehouseActivityLine."Package No.")
            else
                Item.SetFilter("Package No. Filter", '%1|%2', WarehouseActivityLine."Package No.", '')
        end else
            Item.SetRange("Package No. Filter");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterToItemLedgEntryIfRequired', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterToItemLedgEntryIfRequired(var ItemLedgerEntry: Record "Item Ledger Entry"; var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WarehouseActivityLine."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                ItemLedgerEntry.SetRange("Package No.", WarehouseActivityLine."Package No.")
            else
                ItemLedgerEntry.SetFilter("Package No.", '%1|%2', WarehouseActivityLine."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterSetTrackingFilterToWhseEntryIfRequired', '', false, false)]
    local procedure WhseActivityLineSetTrackingFilterToWhseEntryIfRequired(var WhseEntry: Record "Warehouse Entry"; var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WarehouseActivityLine."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                WhseEntry.SetRange("Package No.", WarehouseActivityLine."Package No.")
            else
                WhseEntry.SetFilter("Package No.", '%1|%2', WarehouseActivityLine."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterTestTrackingIfRequired', '', false, false)]
    local procedure WhseActivityLineTestTrackingIfRequired(var WarehouseActivityLine: Record "Warehouse Activity Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WarehouseActivityLine.TestField("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnAfterLookupTrackingSummary', '', false, false)]
    local procedure WhseActivityLineLookupTrackingSummary(var WarehouseActivityLine: Record "Warehouse Activity Line"; var TempTrackingSpecification: Record "Tracking Specification"; TrackingType: Enum "Item Tracking Type")
    begin
        if TrackingType <> TrackingType::"Package No." then
            exit;

        if TempTrackingSpecification."Package No." <> '' then begin
            WarehouseActivityLine.Validate("Package No.", TempTrackingSpecification."Package No.");
            WarehouseActivityLine.Modify();
        end;
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnLookUpTrackingSummaryOnAfterAssignSerialNoTracking', '', false, false)]
    local procedure WhseActivityLineOnLookUpTrackingSummaryOnAfterAssignSerialNoTracking(var WarehouseActivityLine: Record "Warehouse Activity Line"; TempTrackingSpecification: Record "Tracking Specification")
    begin
        WarehouseActivityLine.Validate("Package No.", TempTrackingSpecification."Package No.");
    end;

    // Bin Content

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterClearTrackingFilters', '', false, false)]
    local procedure BinContentClearTrackingFilters(var BinContent: Record "Bin Content")
    begin
        BinContent.SetRange("Package No. Filter");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromTrackingSpecification', '', false, false)]
    local procedure BinContentSetTrackingFilterFromTrackingSpecification(var BinContent: Record "Bin Content"; TrackingSpecification: Record "Tracking Specification")
    begin
        BinContent.SetRange("Package No. Filter", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromWhsEntryIfNotBlank', '', false, false)]
    local procedure BinContentSetTrackingFilterFromWhseEntryIfNotBlank(var BinContent: Record "Bin Content"; WarehouseEntry: Record "Warehouse Entry")
    begin
        if WarehouseEntry."Package No." <> '' then
            BinContent.SetRange("Package No. Filter", WarehouseEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromWhseActivityLineIfNotBlank', '', false, false)]
    local procedure BinContentSetTrackingFilterFromWhseActivityLineIfNotBlank(var BinContent: Record "Bin Content"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        if WhseActivityLine."Package No." <> '' then
            BinContent.SetRange("Package No. Filter", WhseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromWhseItemTrackingLine', '', false, false)]
    local procedure BinContentSetTrackingFilterFromWhseItemTrackingLine(var BinContent: Record "Bin Content"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        BinContent.SetRange("Package No. Filter", WhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromWhseItemTrackingSetup', '', false, false)]
    local procedure BinContentSetTrackingFilterFromWhseItemTrackingSetup(var BinContent: Record "Bin Content"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        BinContent.SetRange("Package No. Filter", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank', '', false, false)]
    local procedure BinContentSetTrackingFilterFromItemTrackingSetupIfBlank(var BinContent: Record "Bin Content"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            BinContent.SetRange("Package No. Filter", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure BinContentSetTrackingFilterFromItemTrackingSetupIfRequired(var BinContent: Record "Bin Content"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            BinContent.SetRange("Package No. Filter", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlankIfRequired', '', false, false)]
    local procedure BinContentSetTrackingFilterFromItemTrackingSetupifNotBlankIfRequired(var BinContent: Record "Bin Content"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                BinContent.SetRange("Package No. Filter", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequiredWithBlank', '', false, false)]
    local procedure BinContentSetTrackingFilterFromItemTrackingSetupIfRequiredWithBlank(var BinContent: Record "Bin Content"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            BinContent.SetRange("Package No. Filter", WhseItemTrackingSetup."Package No.")
        else
            BinContent.SetFilter("Package No. Filter", '%1|%2', WhseItemTrackingSetup."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromBinContentBufferIfRequired', '', false, false)]
    local procedure BinContentSetTrackingFilterFromBinContentBufferIfRequired(var BinContent: Record "Bin Content"; BinContentBuffer: Record "Bin Content Buffer"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            BinContent.SetRange("Package No. Filter", BinContentBuffer."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterTrackingFiltersExist', '', false, false)]
    local procedure BinContentTrackingFiltersExist(var BinContent: Record "Bin Content"; var IsTrackingFiltersExist: Boolean)
    begin
        IsTrackingFiltersExist := IsTrackingFiltersExist or (BinContent.GetFilter("Package No. Filter") <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfWhseRequiredIfNotBlank', '', false, false)]
    local procedure BinContentSetTrackingFilterFromItemTrackingSetupIfWhseRequiredIfNotBlank(var BinContent: Record "Bin Content"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" then
            if ItemTrackingSetup."Package No." <> '' then
                BinContent.SetRange("Package No. Filter", ItemTrackingSetup."Package No.");
    end;

    // Bin Content Buffer

    [EventSubscriber(ObjectType::Table, Database::"Bin Content Buffer", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure BinContentBufferCopyTrackingFromWhseActivityLine(var BinContentBuffer: Record "Bin Content Buffer"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        BinContentBuffer."Package No." := WhseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Bin Content Buffer", 'OnAfterCopyTrackingFromWhseItemTrackingSetup', '', false, false)]
    local procedure BinContentBufferCopyTrackingFromWhseItemTrackingSetup(var BinContentBuffer: Record "Bin Content Buffer"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        BinContentBuffer."Package No." := WhseItemTrackingSetup."Package No.";
    end;

    // Whse. Get Bin Content report

    [EventSubscriber(ObjectType::Report, Report::"Whse. Get Bin Content", 'OnInsertTempTrackingSpecOnAfterAssignTracking', '', false, false)]
    local procedure WhseGetBinContentOnInsertTempTrackingSpecOnAfterAssignTracking(var TempTrackingSpecification: Record "Tracking Specification"; WarehouseEntry: Record "Warehouse Entry")
    begin
        TempTrackingSpecification.Validate("Package No.", WarehouseEntry."Package No.");
        TempTrackingSpecification."New Package No." := WarehouseEntry."Package No.";
    end;

    // Warehouse Entry

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure WarehouseEntryClearTrackingFilter(var WarehouseEntry: Record "Warehouse Entry")
    begin
        WarehouseEntry.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterCopyTrackingFromWhseEntry', '', false, false)]
    local procedure WarehouseEntryCopyTrackingFromWhseEntry(var WarehouseEntry: Record "Warehouse Entry"; FromWarehouseEntry: Record "Warehouse Entry")
    begin
        WarehouseEntry."Package No." := FromWarehouseEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterCopyTrackingFromWhseJnlLine', '', false, false)]
    local procedure WarehouseEntryCopyTrackingFromWhseJnlLine(var WarehouseEntry: Record "Warehouse Entry"; WarehouseJournalLine: Record "Warehouse Journal Line")
    begin
        WarehouseEntry."Package No." := WarehouseJournalLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterCopyTrackingFromNewWhseJnlLine', '', false, false)]
    local procedure WarehouseEntryCopyTrackingFromNewWhseJnlLine(var WarehouseEntry: Record "Warehouse Entry"; WarehouseJournalLine: Record "Warehouse Journal Line")
    begin
        if WarehouseJournalLine."New Package No." <> '' then
            WarehouseEntry."Package No." := WarehouseJournalLine."New Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterIfNotBlank', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterIfNotBlank(var WhseEntry: Record "Warehouse Entry")
    begin
        if WhseEntry."Package No." <> '' then
            WhseEntry.SetRange("Package No.", WhseEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromBinContent', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromBinContent(var WarehouseEntry: Record "Warehouse Entry"; var BinContent: Record "Bin Content")
    begin
        WarehouseEntry.SetFilter("Package No.", BinContent.GetFilter("Package No. Filter"));
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromBinContentBuffer', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromBinContentBuffer(var WarehouseEntry: Record "Warehouse Entry"; BinContentBuffer: Record "Bin Content Buffer")
    begin
        WarehouseEntry.SetRange("Package No.", BinContentBuffer."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromItemTrackingSetupIfRequired(var WarehouseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WarehouseEntry.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlankIfRequired', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromItemTrackingSetupIfNotBlankIfRequired(var WarehouseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            if WhseItemTrackingSetup."Package No. Required" then
                WarehouseEntry.SetRange("Package No.", WhseItemTrackingSetup."Package No.")
            else
                WarehouseEntry.SetFilter("Package No.", '%1|%2', WhseItemTrackingSetup."Package No.", '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromWhseEntry', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromWhseEntry(var WhseEntry: Record "Warehouse Entry"; FromWhseEntry: Record "Warehouse Entry")
    begin
        WhseEntry.SetRange("Package No.", FromWhseEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromReservEntryIfNotBlank', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromReservEntryIfNotBlank(var WarehouseEntry: Record "Warehouse Entry"; ReservEntry: Record "Reservation Entry")
    begin
        if ReservEntry."Package No." <> '' then
            WarehouseEntry.SetRange("Package No.", ReservEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromItemTrackingSetupIfNotBlank(var WarehouseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            WarehouseEntry.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterTrackingExists', '', false, false)]
    local procedure WarehouseEntryTrackingExists(WhseEntry: Record "Warehouse Entry"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (WhseEntry."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromItemFilters', '', false, false)]
    local procedure WarehouseEntrySetTrackingFilterFromItemFilters(var WarehouseEntry: Record "Warehouse Entry"; var Item: Record Item)
    begin
        Item.CopyFilter("Package No. Filter", WarehouseEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfRequiredIfNotBlank', '', false, false)]
    local procedure WarehouseEntryOnAfterSetTrackingFilterFromItemTrackingSetupIfRequiredIfNotBlank(var WarehouseEntry: Record "Warehouse Entry"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            if WhseItemTrackingSetup."Package No." <> '' then
                WarehouseEntry.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
    end;

    // Warehouse Journal Line subscribers

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCheckTrackingIfRequired', '', false, false)]
    local procedure WarehouseJournalLineEntryCheckTrackingIfRequired(var WhseJnlLine: Record "Warehouse Journal Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WhseJnlLine.TestField("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure WarehouseJournalLineCopyTrackingFromItemLedgEntry(var WhseJnlLine: Record "Warehouse Journal Line"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        WhseJnlLine."Package No." := ItemLedgEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure WarehouseJournalLineCopyTrackingFromWhseActivityLine(var WarehouseJournalLine: Record "Warehouse Journal Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        WarehouseJournalLine."Package No." := WarehouseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCopyTrackingFromWhseEntry', '', false, false)]
    local procedure WarehouseJournalLineCopyTrackingFromWhseEntry(var WarehouseJournalLine: Record "Warehouse Journal Line"; WarehouseEntry: Record "Warehouse Entry")
    begin
        WarehouseJournalLine."Package No." := WarehouseEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCopyTrackingFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure WarehouseJournalLineCopyTrackingFromItemTrackingSetupIfRequired(var WhseJnlLine: Record "Warehouse Journal Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WhseJnlLine."Package No." := WhseItemTrackingSetup."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Journal Line", 'OnAfterCopyNewTrackingFromItemTrackingSetupIfRequired', '', false, false)]
    local procedure WarehouseJournalLineCopyNewTrackingFromItemTrackingSetupIfRequired(var WhseJnlLine: Record "Warehouse Journal Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WhseJnlLine."New Package No." := WhseItemTrackingSetup."Package No.";
    end;

    // Whse. Item Entry Relation

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Entry Relation", 'OnAfterInitFromTrackingSpec', '', false, false)]
    local procedure WhseItemEntryRelationInitFromTrackingSpec(var WhseItemEntryRelation: Record "Whse. Item Entry Relation"; TrackingSpecification: Record "Tracking Specification")
    begin
        WhseItemEntryRelation."Package No." := TrackingSpecification."Package No.";
    end;

    // Whse. Item Tracking Line

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCheckTrackingIfRequired', '', false, false)]
    local procedure WhseItemTrackingLineInitFromTrackingSpec(WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No. Required" then
            WhseItemTrackingLine.TestField("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure WhseItemTrackingLineClearTrackingFilter(var WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        WhseItemTrackingLine.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromEntrySummary', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromEntrySummary(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; EntrySummary: Record "Entry Summary")
    begin
        WhseItemTrackingLine."Package No." := EntrySummary."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromItemLedgEntry(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        WhseItemTrackingLine."Package No." := ItemLedgerEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromPostedWhseReceiptine', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromPostedWhseReceiptLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; PostedWhseReceiptLine: Record "Posted Whse. Receipt Line")
    begin
        WhseItemTrackingLine."Package No." := PostedWhseReceiptLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromReservEntry(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; ReservationEntry: Record "Reservation Entry")
    begin
        WhseItemTrackingLine."Package No." := ReservationEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromPostedWhseRcptLine', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromPostedWhseRcptLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; PostedWhseRcptLine: Record "Posted Whse. Receipt Line")
    begin
        WhseItemTrackingLine."Package No." := PostedWhseRcptLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromWhseActivityLine', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromWhseActivityLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        WhseItemTrackingLine."Package No." := WhseActivityLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromWhseItemTrackingLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; FromWhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        WhseItemTrackingLine."Package No." := FromWhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromRelation', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromRelation(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        WhseItemTrackingLine."Package No." := WhseItemEntryRelation."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterCopyTrackingFromWhseEntry', '', false, false)]
    local procedure WhseItemTrackingLineCopyTrackingFromWhseEntry(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseEntry: Record "Warehouse Entry")
    begin
        WhseItemTrackingLine."Package No." := WhseEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromBinContent', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromBinContent(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; var BinContent: Record "Bin Content")
    begin
        WhseItemTrackingLine.SetFilter("Package No.", BinContent.GetFilter("Package No. Filter"));
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromRelation', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromRelation(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        WhseItemTrackingLine.SetRange("Package No.", WhseItemEntryRelation."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromReservEntry', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromReservEntry(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; ReservationEntry: Record "Reservation Entry")
    begin
        WhseItemTrackingLine.SetRange("Package No.", ReservationEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromSpec', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromSpec(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; FromWhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        WhseItemTrackingLine.SetRange("Package No.", FromWhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromWhseActivityLine', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromWhseActivityLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseActivityLine: Record "Warehouse Activity Line")
    begin
        WhseItemTrackingLine.SetRange("Package No.", WhseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromWhseItemTrackingLine', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromWhseItemTrackingLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; FromWhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        WhseItemTrackingLine.SetRange("Package No.", FromWhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromItemLedgerEntry', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromItemLedgerEntry(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; ItemLedgerEntry: Record "Item Ledger Entry")
    begin
        WhseItemTrackingLine.SetRange("Package No.", ItemLedgerEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromPostedWhseReceiptLine', '', false, false)]
    local procedure WhseItemTrackingLineSetTrackingFilterFromPostedWhseReceiptLine(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; PostedWhseReceiptLine: Record "Posted Whse. Receipt Line")
    begin
        WhseItemTrackingLine.SetRange("Package No.", PostedWhseReceiptLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank', '', false, false)]
    local procedure WhseItemTrackingLineOnAfterSetTrackingFilterFromItemTrackingSetupIfNotBlank(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No." <> '' then
            WhseItemTrackingLine.SetRange("Package No.", ItemTrackingSetup."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterHasSameNewTracking', '', false, false)]
    local procedure WhseItemTrackingLineHasSameNewTracking(WhseItemTrackingLine: Record "Whse. Item Tracking Line"; var IsSameTracking: Boolean)
    begin
        IsSameTracking := IsSameTracking and (WhseItemTrackingLine."New Package No." = WhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterHasSameTrackingWithItemEntryRelation', '', false, false)]
    local procedure WhseItemTrackingLineHasSameTrackingWithItemEntryRelation(WhseItemTrackingLine: Record "Whse. Item Tracking Line"; var IsSameTracking: Boolean; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        IsSameTracking := IsSameTracking and (WhseItemEntryRelation."Package No." = WhseItemTrackingLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterTrackingExists', '', false, false)]
    local procedure WhseItemTrackingLineTrackingExists(WhseItemTrackingLine: Record "Whse. Item Tracking Line"; var IsTrackingExist: Boolean)
    begin
        IsTrackingExist := IsTrackingExist or (WhseItemTrackingLine."Package No." <> '');
    end;

    [EventSubscriber(ObjectType::Table, Database::"Whse. Item Tracking Line", 'OnAfterLookupTrackingSummary', '', false, false)]
    local procedure WhseItemTrackingLineLookupTrackingSummary(var WhseItemTrackingLine: Record "Whse. Item Tracking Line"; var TempTrackingSpecification: Record "Tracking Specification"; TrackingType: Enum "Item Tracking Type")
    begin
        if TrackingType = TrackingType::"Package No." then
            if TempTrackingSpecification."Package No." <> '' then
                WhseItemTrackingLine.Validate("Package No.", TempTrackingSpecification."Package No.");
    end;

    // Item Tracing Buffer

    [EventSubscriber(ObjectType::Table, Database::"Item Tracing Buffer", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure ItemTracingBufferCopyTrackingFromItemLedgEntry(var ItemTracingBuffer: Record "Item Tracing Buffer"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        ItemTracingBuffer."Package No." := ItemLedgEntry."Package No.";
    end;

    // Inventory Profile

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterCopyTrackingFromItemLedgEntry', '', false, false)]
    local procedure InventoryProfileCopyTrackingFromItemLedgEntry(var InventoryProfile: Record "Inventory Profile"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        InventoryProfile."Package No." := ItemLedgEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterCopyTrackingFromInvtProfile', '', false, false)]
    local procedure InventoryProfileCopyTrackingFromInvtProfile(var InventoryProfile: Record "Inventory Profile"; FromInventoryProfile: Record "Inventory Profile")
    begin
        InventoryProfile."Package No." := FromInventoryProfile."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterCopyTrackingFromReservEntry', '', false, false)]
    local procedure InventoryProfileCopyTrackingFromReservEntry(var InventoryProfile: Record "Inventory Profile"; ReservEntry: Record "Reservation Entry")
    begin
        InventoryProfile."Package No." := ReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterSetTrackingFilter', '', false, false)]
    local procedure InventoryProfileSetTrackingFilter(var InventoryProfile: Record "Inventory Profile"; FromInventoryProfile: Record "Inventory Profile")
    begin
        if FromInventoryProfile."Package No." <> '' then
            InventoryProfile.SetRange("Package No.", FromInventoryProfile."Package No.")
        else
            InventoryProfile.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterSetTrackingFilterFromInvtProfile', '', false, false)]
    local procedure InventoryProfileSetTrackingFilterFromInvtProfile(var InventoryProfile: Record "Inventory Profile"; FromInventoryProfile: Record "Inventory Profile")
    begin
        InventoryProfile.SetRange("Package No.", FromInventoryProfile."Package No.")
    end;

    [EventSubscriber(ObjectType::Table, Database::"Inventory Profile", 'OnAfterTrackingExists', '', false, false)]
    local procedure InventoryProfileTrackingExists(InventoryProfile: Record "Inventory Profile"; var IsTrackingExists: Boolean)
    begin
        IsTrackingExists := IsTrackingExists or (InventoryProfile."Package No." <> '');
    end;

    // Posted Whse. Receipt Line
    [EventSubscriber(ObjectType::Table, Database::"Posted Whse. Receipt Line", 'OnAfterCopyTrackingFromWhseItemEntryRelation', '', false, false)]
    local procedure PostedWhseReceiptLineCopyTrackingFromWhseItemEntryRelation(var PostedWhseReceiptLine: Record "Posted Whse. Receipt Line"; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        PostedWhseReceiptLine."Package No." := WhseItemEntryRelation."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Posted Whse. Receipt Line", 'OnAfterCopyTrackingFromWhseItemTrackingLine', '', false, false)]
    local procedure PostedWhseReceiptLineCopyTrackingFromWhseItemTrackingLine(var PostedWhseReceiptLine: Record "Posted Whse. Receipt Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        PostedWhseReceiptLine."Package No." := WhseItemTrackingLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Table, Database::"Posted Whse. Receipt Line", 'OnAfterSetTrackingFilterFromItemLedgEntry', '', false, false)]
    local procedure PostedWhseReceiptLineSetTrackingFilterFromItemLedgEntry(var PostedWhseReceiptLine: Record "Posted Whse. Receipt Line"; ItemLedgEntry: Record "Item Ledger Entry")
    begin
        PostedWhseReceiptLine.SetRange("Package No.", ItemLedgEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Posted Whse. Receipt Line", 'OnAfterSetTrackingFilterFromRelation', '', false, false)]
    local procedure PostedWhseReceiptLineSetTrackingFilterFromRelation(var PostedWhseReceiptLine: Record "Posted Whse. Receipt Line"; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        PostedWhseReceiptLine.SetRange("Package No.", WhseItemEntryRelation."Package No.");
    end;

    // Registered Whse. Activity Line

    [EventSubscriber(ObjectType::Table, Database::"Registered Whse. Activity Line", 'OnAfterClearTrackingFilter', '', false, false)]
    local procedure RegisteredWhseActivityLineClearTrackingFilter(var RegisteredWhseActivityLine: Record "Registered Whse. Activity Line")
    begin
        RegisteredWhseActivityLine.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Registered Whse. Activity Line", 'OnAfterSetTrackingFilterFromRelation', '', false, false)]
    local procedure RegisteredWhseActivityLineSetTrackingFilterFromRelation(var RegisteredWhseActivityLine: Record "Registered Whse. Activity Line"; WhseItemEntryRelation: Record "Whse. Item Entry Relation")
    begin
        RegisteredWhseActivityLine.SetRange("Package No.", WhseItemEntryRelation."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Registered Whse. Activity Line", 'OnAfterSetTrackingFilterFromSpec', '', false, false)]
    local procedure RegisteredWhseActivityLineSetTrackingFilterFromSpec(var RegisteredWhseActivityLine: Record "Registered Whse. Activity Line"; TrackingSpecification: Record "Tracking Specification")
    begin
        RegisteredWhseActivityLine.SetRange("Package No.", TrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Registered Whse. Activity Line", 'OnAfterSetTrackingFilterFromWhseActivityLine', '', false, false)]
    local procedure RegisteredWhseActivityLineSetTrackingFilterFromWhseActivityLine(var RegisteredWhseActivityLine: Record "Registered Whse. Activity Line"; WarehouseActivityLine: Record "Warehouse Activity Line")
    begin
        RegisteredWhseActivityLine.SetRange("Package No.", WarehouseActivityLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Table, Database::"Registered Whse. Activity Line", 'OnAfterSetTrackingFilterFromWhseSpec', '', false, false)]
    local procedure RegisteredWhseActivityLineSetTrackingFilterFromWhseSpec(var RegisteredWhseActivityLine: Record "Registered Whse. Activity Line"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        RegisteredWhseActivityLine.SetRange("Package No.", WhseItemTrackingLine."Package No.");
    end;

    // ReservEngineMgt codeunit

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Reservation Engine Mgt.", 'OnAfterItemTrackingMismatch', '', false, false)]
    local procedure ReservEngineMgtItemTrackingMismatch(ReservationEntry: Record "Reservation Entry"; ItemTrackingSetup: Record "Item Tracking Setup"; var IsMismatch: Boolean)
    begin
        if (ReservationEntry."Package No." <> '') and (ItemTrackingSetup."Package No." <> '') then
            if (ReservationEntry."Package No." <> ItemTrackingSetup."Package No.") then
                IsMismatch := true;
    end;

    [EventSubscriber(ObjectType::Table, Database::"Warehouse Activity Line", 'OnCheckReservedItemTrkgOnCheckTypeElseCase', '', false, false)]
    local procedure CheckReservedItemTrkgOnCkeckTypeElseCase(var WarehouseActivityLine: Record "Warehouse Activity Line"; CheckType: Enum "Item Tracking Type"; ItemTrkgCode: Code[50])
    var
        Item: Record Item;
        ReservEntry: Record "Reservation Entry";
        ReservEntry2: Record "Reservation Entry";
        TempWhseActivLine: Record "Warehouse Activity Line" temporary;
        WhseItemTrackingSetup: Record "Item Tracking Setup";
        WhseAvailMgt: Codeunit "Warehouse Availability Mgt.";
        ItemTrackingMgt: Codeunit "Item Tracking Management";
        LineReservedQty: Decimal;
        AvailQtyFromOtherResvLines: Decimal;
    begin
        if CheckType <> CheckType::"Package No." then
            exit;

        ItemTrackingMgt.GetWhseItemTrkgSetup(WarehouseActivityLine."Item No.", WhseItemTrackingSetup);
        if not WhseItemTrackingSetup."Package No. Required" then
            exit;

        Item.Get(WarehouseActivityLine."Item No.");
        Item.SetRange("Location Filter", WarehouseActivityLine."Location Code");
        Item.SetRange("Variant Filter", WarehouseActivityLine."Variant Code");
        Item.SetRange("Package No. Filter", ItemTrkgCode);
        Item.CalcFields(Inventory, "Reserved Qty. on Inventory");
        WhseItemTrackingSetup."Package No." := CopyStr(ItemTrkgCode, 1, MaxStrLen(WhseItemTrackingSetup."Package No."));
        LineReservedQty :=
            WhseAvailMgt.CalcLineReservedQtyOnInvt(
            WarehouseActivityLine."Source Type", WarehouseActivityLine."Source Subtype", WarehouseActivityLine."Source No.",
            WarehouseActivityLine."Source Line No.", WarehouseActivityLine."Source Subline No.", true,
            WhseItemTrackingSetup, TempWhseActivLine);
        ReservEntry.SetCurrentKey("Item No.", "Variant Code", "Location Code", "Reservation Status");
        ReservEntry.SetRange("Item No.", WarehouseActivityLine."Item No.");
        ReservEntry.SetRange("Variant Code", WarehouseActivityLine."Variant Code");
        ReservEntry.SetRange("Location Code", WarehouseActivityLine."Location Code");
        ReservEntry.SetRange("Reservation Status", ReservEntry."Reservation Status"::Reservation);
        ReservEntry.SetRange("Package No.", ItemTrkgCode);
        ReservEntry.SetRange(Positive, true);
        if ReservEntry.Find('-') then
            repeat
                ReservEntry2.Get(ReservEntry."Entry No.", false);
                if ((ReservEntry2."Source Type" <> WarehouseActivityLine."Source Type") or
                    (ReservEntry2."Source Subtype" <> WarehouseActivityLine."Source Subtype") or
                    (ReservEntry2."Source ID" <> WarehouseActivityLine."Source No.") or
                    (((ReservEntry2."Source Ref. No." <> WarehouseActivityLine."Source Line No.") and
                        (ReservEntry2."Source Type" <> 5407)) or // Database::"Prod. Order Component"
                        (((ReservEntry2."Source Prod. Order Line" <> WarehouseActivityLine."Source Line No.") or
                        (ReservEntry2."Source Ref. No." <> WarehouseActivityLine."Source Subline No.")) and
                        (ReservEntry2."Source Type" = 5407)))) // Database::"Prod. Order Component"
                    and (ReservEntry2."Package No." = '') then
                    AvailQtyFromOtherResvLines := AvailQtyFromOtherResvLines + Abs(ReservEntry2."Quantity (Base)");
            until ReservEntry.Next() = 0;

        if (Item.Inventory - Abs(Item."Reserved Qty. on Inventory") +
            LineReservedQty + AvailQtyFromOtherResvLines +
            WhseAvailMgt.CalcReservQtyOnPicksShips(
                WarehouseActivityLine."Location Code", WarehouseActivityLine."Item No.",
                WarehouseActivityLine."Variant Code", TempWhseActivLine)) < WarehouseActivityLine."Qty. to Handle (Base)"
        then
            Error(InventoryNotAvailableErr, WarehouseActivityLine.FieldCaption("Package No."), ItemTrkgCode);
    end;

    // WMS Management

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"WMS Management", 'OnAfterCheckTrackingSpecificationChangeNeeded', '', false, false)]
    local procedure WMSManagementOnAfterCheckTrackingSpecificationChangeNeeded(TrackingSpecification: Record "Tracking Specification"; xTrackingSpecification: Record "Tracking Specification"; var CheckNeeded: Boolean)
    begin
        CheckNeeded := CheckNeeded or
            ((TrackingSpecification."New Package No." <> TrackingSpecification."Package No.") and
            ((TrackingSpecification."Package No." <> xTrackingSpecification."Package No.") or
            (TrackingSpecification."New Package No." <> xTrackingSpecification."New Package No.")));
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"WMS Management", 'OnCheckWhseJnlLineOnAfterCheckTracking', '', false, false)]
    local procedure WMSManagementOnCheckWhseJnlLineOnAfterCheckTracking(WarehouseJournalLine: Record "Warehouse Journal Line"; ItemTrackingCode: Record "Item Tracking Code"; Location: Record Location)
    begin
        if (WarehouseJournalLine."Package No." <> '') and
            (WarehouseJournalLine."From Bin Code" <> '') and
            ItemTrackingCode."Package Specific Tracking" and
            (WarehouseJournalLine."From Bin Code" <> Location."Adjustment Bin Code") and
            (((Location."Adjustment Bin Code" <> '') and
                (WarehouseJournalLine."Entry Type" = WarehouseJournalLine."Entry Type"::Movement)) or
            ((WarehouseJournalLine."Entry Type" <> WarehouseJournalLine."Entry Type"::Movement) or
                (WarehouseJournalLine."Source Document" = WarehouseJournalLine."Source Document"::"Reclass. Jnl.")))
        then
            CheckPackageNo(
                WarehouseJournalLine."Item No.", WarehouseJournalLine."Variant Code", WarehouseJournalLine."Location Code", WarehouseJournalLine."From Bin Code",
                WarehouseJournalLine."Unit of Measure Code", WarehouseJournalLine."Package No.", WarehouseJournalLine.CalcReservEntryQuantity());
    end;

    local procedure CheckPackageNo(ItemNo: Code[20]; VariantCode: Code[10]; LocationCode: Code[10]; BinCode: Code[20]; UOMCode: Code[10]; PackageNo: Code[50]; QuantityBase: Decimal)
    var
        BinContent: Record "Bin Content";
    begin
        BinContent.Get(LocationCode, BinCode, ItemNo, VariantCode, UOMCode);
        BinContent.SetRange("Package No. Filter", PackageNo);
        BinContent.CalcFields("Quantity (Base)");
        if BinContent."Quantity (Base)" < Abs(QuantityBase) then
            BinContent.FieldError(
              "Quantity (Base)", StrSubstNo(MustNotBeErr, BinContent."Quantity (Base)" - Abs(QuantityBase)));
    end;

    // CreatePick.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Pick", 'OnItemTrackedQuantityOnAfterCheckIfEmpty', '', false, false)]
    local procedure CreatePickOnItemTrackedQuantityOnAfterCheckIfEmpty(var TempWhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var IsHandled: Boolean)
    begin
        if WhseItemTrackingSetup."Package No." <> '' then begin
            TempWhseItemTrackingLine.SetTrackingKey();
            TempWhseItemTrackingLine.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
            IsHandled := TempWhseItemTrackingLine.IsEmpty();
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Pick", 'OnItemTrackedQuantityOnAfterSetFilters', '', false, false)]
    local procedure CreatePickOnItemTrackedQuantityOnAfterSetFilters(var TempWhseItemTrackingLine: Record "Whse. Item Tracking Line"; WhseItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if WhseItemTrackingSetup."Package No." <> '' then
            TempWhseItemTrackingLine.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
    end;

    // CreateInventoryPickMovement.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Inventory Pick/Movement", 'OnItemTrackedQuantityOnAfterCheckTracking', '', false, false)]
    local procedure OnItemTrackedQuantityOnAfterCheckTracking(var TempHandlingSpecification: Record "Tracking Specification"; WhseItemTrackingSetup: Record "Item Tracking Setup"; var IsTrackingEmpty: Boolean)
    begin
        if WhseItemTrackingSetup."Package No." <> '' then begin
            TempHandlingSpecification.SetTrackingKey();
            TempHandlingSpecification.SetRange("Package No.", WhseItemTrackingSetup."Package No.");
            IsTrackingEmpty := TempHandlingSpecification.IsEmpty();
        end;
    end;

    // CreateReservEntry.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Reserv. Entry", 'OnAfterSetNewTrackingFromItemJnlLine', '', false, false)]
    local procedure CreateReservEntrySetNewTrackingFromItemJnlLine(var InsertReservEntry: Record "Reservation Entry"; ItemJnlLine: Record "Item Journal Line")
    begin
        InsertReservEntry."New Package No." := ItemJnlLine."Package No.";
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Reserv. Entry", 'OnAfterSetNewTrackingFromNewTrackingSpecification', '', false, false)]
    local procedure CreateReservEntrySetNewTrackingFromNewTrackingSpecification(var InsertReservEntry: Record "Reservation Entry"; TrackingSpecification: Record "Tracking Specification")
    begin
        InsertReservEntry."New Package No." := TrackingSpecification."New Package No.";
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Reserv. Entry", 'OnAfterSetNewTrackingFromNewWhseItemTrackingLine', '', false, false)]
    local procedure CreateReservEntrySetNewTrackingFromWhseItemTrackingLine(var InsertReservEntry: Record "Reservation Entry"; WhseItemTrackingLine: Record "Whse. Item Tracking Line")
    begin
        InsertReservEntry."New Package No." := WhseItemTrackingLine."New Package No.";
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Reserv. Entry", 'OnBalanceListsOnAfterLoosenFilter1', '', false, false)]
    local procedure CreateReservEntryOnBalanceListsOnAfterLoosenFilter1(var TempTrackingSpecification1: Record "Tracking Specification"; TempTrackingSpecification2: Record "Tracking Specification")
    begin
        if TempTrackingSpecification2."Package No." = '' then
            TempTrackingSpecification1.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Create Reserv. Entry", 'OnBalanceListsOnAfterLoosenFilter2', '', false, false)]
    local procedure CreateReservEntryOnBalanceListsOnAfterLoosenFilter2(var TempTrackingSpecification2: Record "Tracking Specification"; TempTrackingSpecification1: Record "Tracking Specification")
    begin
        if TempTrackingSpecification1."Package No." = '' then
            TempTrackingSpecification2.SetRange("Package No.");
    end;

    // WhseActivityRegister.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Register", 'OnAfterAvailabilityError', '', false, false)]
    local procedure WhseActivityRegisterOnAfterAvailabilityError(WhseActivLine: Record "Warehouse Activity Line")
    begin
        if WhseActivLine."Package No." <> '' then
            Error(InventoryNotAvailableOrReservedErr, WhseActivLine.FieldCaption("Package No."), WhseActivLine."Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Whse.-Activity-Post", 'OnAfterAvailabilityError', '', false, false)]
    local procedure WhseActivityPostOnAfterAvailabilityError(WhseActivLine: Record "Warehouse Activity Line")
    begin
        if WhseActivLine."Package No." <> '' then
            Error(InventoryNotAvailableOrReservedErr, WhseActivLine.FieldCaption("Package No."), WhseActivLine."Package No.");
    end;

    // ItemTrackingDataCollection.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnAssistEditTrackingNoOnLookupModeElseCase', '', false, false)]
    local procedure ItemTrackingDataCollectionOnAssistEditTrackingNoOnLookupModeElseCase(TempTrackingSpecification: Record "Tracking Specification"; var ItemTrackingSummaryPage: Page "Item Tracking Summary"; var TempGlobalEntrySummary: Record "Entry Summary"; ItemTrackingType: Enum "Item Tracking Type")
    begin
        case ItemTrackingType of
            ItemTrackingType::"Package No.":
                AssistEditTrackingNoLookupPackageNo(TempTrackingSpecification, ItemTrackingSummaryPage, TempGlobalEntrySummary);
        end;
    end;

    local procedure AssistEditTrackingNoLookupPackageNo(TempTrackingSpecification: Record "Tracking Specification" temporary; var ItemTrackingSummaryPage: Page "Item Tracking Summary"; var TempGlobalEntrySummary: Record "Entry Summary")
    begin
        if TempTrackingSpecification."Serial No." <> '' then
            TempGlobalEntrySummary.SetRange("Serial No.", TempTrackingSpecification."Serial No.")
        else
            TempGlobalEntrySummary.SetRange("Serial No.", '');
        if TempTrackingSpecification."Lot No." <> '' then
            TempGlobalEntrySummary.SetRange("Lot No.", TempTrackingSpecification."Lot No.");
        TempGlobalEntrySummary.SetRange("Package No.", TempTrackingSpecification."Package No.");
        if TempGlobalEntrySummary.FindFirst() then
            ItemTrackingSummaryPage.SetRecord(TempGlobalEntrySummary);
        TempGlobalEntrySummary.SetRange("Package No.");
        TempGlobalEntrySummary.SetRange("Non Serial Tracking", true);
        ItemTrackingSummaryPage.Caption := StrSubstNo(ListTxt, TempGlobalEntrySummary.FieldCaption("Package No."));
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnTrackingAvailableOnLookupModeElseCase', '', false, false)]
    local procedure ItemTrackingDataCollectionOnTrackingAvailableOnLookupModeElseCase(TempTrackingSpecification: Record "Tracking Specification"; CurrItemTrackingCode: Record "Item Tracking Code"; LookupMode: Enum "Item Tracking Type"; var IsHandled: Boolean)
    begin
        if LookupMode = LookupMode::"Package No." then
            if (TempTrackingSpecification."Package No." = '') or (not CurrItemTrackingCode."Package Specific Tracking") then
                IsHandled := true;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnAfterShouldExitLookupTrackingAvailability', '', false, false)]
    local procedure ItemTrackingDataCollectionOnAfterShouldExitLookupTrackingAvailability(TempTrackingSpecification: Record "Tracking Specification"; LookupMode: Enum "Item Tracking Type"; var ShouldExit: Boolean)
    begin
        if (LookupMode = LookupMode::"Package No.") and (TempTrackingSpecification."Package No." = '') then
            ShouldExit := true;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnLookupTrackingAvailabilityOnSetFiltersElseCase', '', false, false)]
    local procedure ItemTrackingDataCollectionOnLookupTrackingAvailabilityOnSetFiltersElseCase(TempTrackingSpecification: Record "Tracking Specification"; var TempGlobalEntrySummary: Record "Entry Summary"; var TempGlobalReservEntry: Record "Reservation Entry"; var ItemTrackingSummaryPage: Page "Item Tracking Summary"; LookupMode: Enum "Item Tracking Type")
    begin
        if LookupMode = LookupMode::"Package No." then begin
            TempGlobalEntrySummary.SetRange("Serial No.", '');
            TempGlobalEntrySummary.SetRange("Package No.", TempTrackingSpecification."Package No.");
            TempGlobalReservEntry.SetRange("Package No.", TempTrackingSpecification."Package No.");
            ItemTrackingSummaryPage.Caption := StrSubstNo(
                AvailabilityTxt, TempTrackingSpecification.FieldCaption("Package No."), TempTrackingSpecification."Package No.");
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnAssistEditTrackingNoLookupSerialNoOnAfterSetFilters', '', false, false)]
    local procedure ItemTrackingDataCollectionOnAssistEditTrackingNoLookupSerialNoOnAfterSetFilters(var TempGlobalEntrySummary: Record "Entry Summary"; TempTrackingSpecification: Record "Tracking Specification")
    begin
        if TempTrackingSpecification."Package No." <> '' then
            TempGlobalEntrySummary.SetRange("Package No.", TempTrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnAssistEditTrackingNoLookupLotNoOnAfterSetFilters', '', false, false)]
    local procedure ItemTrackingDataCollectionOnAssistEditTrackingNoLookupLotNoOnAfterSetFilters(var TempGlobalEntrySummary: Record "Entry Summary"; TempTrackingSpecification: Record "Tracking Specification")
    begin
        if TempTrackingSpecification."Package No." <> '' then
            TempGlobalEntrySummary.SetRange("Package No.", TempTrackingSpecification."Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnAssistEditTrackingNoOnAfterAssignTrackingToSpec', '', false, false)]
    local procedure ItemTrackingDataCollectionOnAssistEditTrackingNoOnAfterAssignTrackingToSpec(var TempTrackingSpecification: Record "Tracking Specification"; TempGlobalEntrySummary: Record "Entry Summary")
    begin
        TempTrackingSpecification.Validate("Package No.", TempGlobalEntrySummary."Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnCreateEntrySummary2OnAfterAssignTrackingFromReservEntry', '', false, false)]
    local procedure ItemTrackingDataCollectionOnCreateEntrySummary2OnAfterAssignTrackingFromReservEntry(var TempGlobalEntrySummary: Record "Entry Summary"; TempReservEntry: Record "Reservation Entry")
    begin
        TempGlobalEntrySummary."Package No." := TempReservEntry."Package No.";
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnCreateEntrySummary2OnAfterSetFilters', '', false, false)]
    local procedure ItemTrackingDataCollectionOnCreateEntrySummary2OnAfterSetFilters(var TempGlobalEntrySummary: Record "Entry Summary"; var TempReservEntry: Record "Reservation Entry")
    begin
        // reserved for future use
    end;

    // ItemJnlPostLine.Codeunit.al

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Jnl.-Post Line", 'OnCheckItemTrackingOnAfterCheckRequiredTrackingNos', '', false, false)]
    local procedure ItemJnlPostLineOnCheckItemTrackingOnAfterCheckRequiredTrackingNos(ItemJournalLine: Record "Item Journal Line"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No. Required" and (ItemJournalLine."Package No." = '') then
            Error(
                GetTextStringWithLineNo(PackageNoRequiredErr, ItemJournalLine."Item No.", ItemJournalLine."Line No."));
    end;

    local procedure GetTextStringWithLineNo(BasicTextString: Text; ItemNo: Code[20]; LineNo: Integer): Text
    begin
        if LineNo = 0 then
            exit(StrSubstNo(BasicTextString, ItemNo));
        exit(StrSubstNo(BasicTextString, ItemNo) + StrSubstNo(LineNoTxt, LineNo));
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Jnl.-Post Line", 'OnAfterTestFirstApplyItemLedgerEntryTracking', '', false, false)]
    local procedure ItemJnlPostLineOnAfterTestFirstApplyItemLedgerEntryTracking(ItemLedgEntry: Record "Item Ledger Entry"; OldItemLedgEntry: Record "Item Ledger Entry"; ItemTrackingCode: Record "Item Tracking Code")
    begin
        if ItemTrackingCode."Package Specific Tracking" then
            OldItemLedgEntry.TestField("Package No.", ItemLedgEntry."Package No.");
        if ItemLedgEntry."Drop Shipment" and (OldItemLedgEntry."Package No." <> '') then
            OldItemLedgEntry.TestField("Package No.", ItemLedgEntry."Package No.");
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Jnl.-Post Line", 'OnInitTransValueEntryOnBeforeCalcCostAmounts', '', false, false)]
    local procedure ItemJnlPostLineOnInitTransValueEntryOnBeforeCalcCostAmounts(GlobalValueEntry: Record "Value Entry"; var ValueEntry: Record "Value Entry"; ItemTrackingSetup: Record "Item Tracking Setup"; var IsHandled: Boolean)
    begin
        if ItemTrackingSetup."Package No. Required" then begin
            ValueEntry."Cost Amount (Actual)" :=
                GlobalValueEntry."Cost Amount (Actual)" * ValueEntry."Valued Quantity" / GlobalValueEntry."Valued Quantity";
            ValueEntry."Cost Amount (Actual) (ACY)" :=
                GlobalValueEntry."Cost Amount (Actual) (ACY)" * ValueEntry."Valued Quantity" / GlobalValueEntry."Valued Quantity";
            IsHandled := true;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Jnl.-Post Line", 'OnInsertItemLedgEntryOnCheckItemTracking', '', false, false)]
    local procedure ItemJnlPostLineOnInsertItemLedgEntryOnCheckItemTracking(ItemJnlLine: Record "Item Journal Line"; ItemLedgEntry: Record "Item Ledger Entry"; ItemTrackingCode: Record "Item Tracking Code"; var IsHandled: Boolean)
    begin
        if not ItemTrackingCode."Package Specific Tracking" then
            exit;

        if not ((ItemJnlLine."Document Type" in [ItemJnlLine."Document Type"::"Purchase Return Shipment", ItemJnlLine."Document Type"::"Purchase Receipt"]) and
                (ItemJnlLine."Job No." <> ''))
        then begin
            IsHandled := true;
            if (ItemLedgEntry.Quantity < 0) and ItemTrackingCode.IsSpecific() then
                Error(
                    CannotBeFullyAppliedErr,
                    ItemJnlLine."Serial No.", ItemJnlLine."Lot No.", ItemJnlLine."Package No.",
                    ItemJnlLine."Item No.", ItemJnlLine."Variant Code");
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Copy Document Mgt.", 'OnAfterIsCopyItemTrkg', '', false, false)]
    local procedure CopyDocumentMgtOnAfterIsCopyItemTrkg(var ItemLedgEntry: Record "Item Ledger Entry"; FillExactCostRevLink: Boolean; var CopyItemTrkg: Boolean; var IsHandled: Boolean)
    begin
        ItemLedgEntry.SetFilter("Package No.", '<>%1', '');
        if not ItemLedgEntry.IsEmpty() then begin
            if FillExactCostRevLink then
                CopyItemTrkg := true;
            IsHandled := true;
        end;
        ItemLedgEntry.SetRange("Package No.");
    end;

    [EventSubscriber(ObjectType::Page, Page::"Available - Item Ledg. Entries", 'OnAfterSetFilters', '', false, false)]
    local procedure AvailableItemLedgEntriesOnAfterSetFilters(var ItemLedgerEntry: Record "Item Ledger Entry"; ReservationEntry: Record "Reservation Entry"; var ReservMgt: Codeunit "Reservation Management")
    var
        FieldFilter: Text;
    begin
        if ReservationEntry.FieldFilterNeeded(FieldFilter, ReservMgt.IsPositive(), "Item Tracking Type"::"Package No.") then
            ItemLedgerEntry.SetFilter("Package No.", FieldFilter);
    end;

    [EventSubscriber(ObjectType::Table, Database::"Document Entry", 'OnAfterSetTrackingFilterFromItemTrackingSetup', '', false, false)]
    local procedure DocumentEntryOnAfterSetTrackingFilterFromItemTrackingSetup(var DocumentEntry: Record "Document Entry"; ItemTrackingSetup: Record "Item Tracking Setup")
    begin
        if ItemTrackingSetup."Package No." <> '' then
            DocumentEntry.SetRange("Package No. Filter", ItemTrackingSetup."Package No.");
    end;
}