Codeunit 5720 Item Reference Management, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Item/Catalog/ItemReferenceManagement.Codeunit.al1357 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.Item.Catalog;

using Microsoft.Intercompany.GLAccount;
using Microsoft.Inventory.Counting.Document;
using Microsoft.Inventory.Counting.Recording;
using Microsoft.Inventory.Document;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Purchases.Document;
using Microsoft.Sales.Document;

codeunit 5720 "Item Reference Management"
{
    Permissions = TableData "Item Reference" = rid;

    trigger OnRun()
    begin
    end;

    var
        GlobalItem: Record Item;
        GlobalItemReference: Record "Item Reference";
        GlobalItemVariant: Record "Item Variant";
        GlobalSalesLine: Record "Sales Line";
        GlobalPurchLine: Record "Purchase Line";
        Found: Boolean;
        ItemRefNotExistErr: Label 'There are no items with reference %1.', Comment = '%1=Reference No.';
        ItemRefWrongTypeErr: Label 'The reference type must be Customer or Vendor.';

    procedure EnterSalesItemReference(var SalesLine2: Record "Sales Line")
    var
        SalesLineBeforeChanges: Record "Sales Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeEnterSalesItemReference(SalesLine2, GlobalItemReference, Found, IsHandled);
        if IsHandled then
            exit;

        if SalesLine2.Type = SalesLine2.Type::Item then begin
            FindItemReferenceForSalesLine(SalesLine2);
            SalesLineBeforeChanges.Copy(SalesLine2);

            if Found then begin
                SalesLine2."Item Reference No." := GlobalItemReference."Reference No.";
                SalesLine2."Item Reference Unit of Measure" := GlobalItemReference."Unit of Measure";
                SalesLine2."Item Reference Type" := GlobalItemReference."Reference Type";
                if GlobalItemReference.Description <> '' then begin
                    SalesLine2.Description := GlobalItemReference.Description;
                    SalesLine2."Description 2" := GlobalItemReference."Description 2";
                end else begin
                    FillSalesDescription(SalesLine2);
                    SalesLine2.GetItemTranslation();
                end;

                SalesLine2."Item Reference Type No." := GlobalItemReference."Reference Type No.";
                OnAfterSalesItemReferenceFound(SalesLine2, GlobalItemReference, SalesLineBeforeChanges);
            end else begin
                SalesLine2."Item Reference No." := '';
                SalesLine2."Item Reference Type" := SalesLine2."Item Reference Type"::" ";
                SalesLine2."Item Reference Type No." := '';
                if SalesLine2."Variant Code" <> '' then begin
                    GlobalItemVariant.Get(SalesLine2."No.", SalesLine2."Variant Code");
                    SalesLine2.Description := GlobalItemVariant.Description;
                    SalesLine2."Description 2" := GlobalItemVariant."Description 2";
                    OnEnterSalesItemReferenceOnAfterFillDescriptionFromItemVariant(SalesLine2, GlobalItemVariant, SalesLineBeforeChanges);
                end else begin
                    GlobalItem.Get(SalesLine2."No.");
                    SalesLine2.Description := GlobalItem.Description;
                    SalesLine2."Description 2" := GlobalItem."Description 2";
                    OnEnterSalesItemReferenceOnAfterFillDescriptionFromItem(SalesLine2, GlobalItem, SalesLineBeforeChanges);
                end;
                SalesLine2.GetItemTranslation();
                OnAfterSalesItemItemRefNotFound(SalesLine2, GlobalItemVariant, SalesLineBeforeChanges);
            end;
        end;
    end;

    local procedure FindItemReferenceForSalesLine(var SalesLine: Record "Sales Line")
    var
        ToDate: Date;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFindItemReferenceForSalesLine(SalesLine, GlobalItemReference, Found, IsHandled);
        if IsHandled then
            exit;

        GlobalItemReference.Reset();
        GlobalItemReference.SetRange("Item No.", SalesLine."No.");
        GlobalItemReference.SetRange("Variant Code", SalesLine."Variant Code");
        GlobalItemReference.SetRange("Unit of Measure", SalesLine."Unit of Measure Code");
        ToDate := SalesLine.GetDateForCalculations();
        if ToDate <> 0D then begin
            GlobalItemReference.SetFilter("Starting Date", '<=%1', ToDate);
            GlobalItemReference.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
        end;
        GlobalItemReference.SetRange("Reference Type", SalesLine."Item Reference Type"::Customer);
        GlobalItemReference.SetRange("Reference Type No.", SalesLine."Sell-to Customer No.");
        GlobalItemReference.SetRange("Reference No.", SalesLine."Item Reference No.");
        OnFindItemReferenceForSalesLineOnBeforeFindFirst(SalesLine, GlobalItemReference);
        if GlobalItemReference.FindFirst() then
            Found := true
        else begin
            GlobalItemReference.SetRange("Reference No.");
            Found := GlobalItemReference.FindFirst();
        end;

        OnAfterFindItemReferenceForSalesLine(SalesLine, GlobalItemReference, Found);
    end;

    procedure ReferenceLookupSalesItem(var SalesLine2: Record "Sales Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupSalesItem(SalesLine2, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;

        GlobalSalesLine.Copy(SalesLine2);
        if GlobalSalesLine.Type = GlobalSalesLine.Type::Item then
            FindOrSelectFromItemReferenceList(
                ReturnedItemReference, ShowDialog, GlobalSalesLine."No.", GlobalSalesLine."Item Reference No.", GlobalSalesLine."Sell-to Customer No.",
                ReturnedItemReference."Reference Type"::Customer, GlobalSalesLine.GetDateForCalculations());
    end;

    procedure EnterPurchaseItemReference(var PurchLine2: Record "Purchase Line")
    var
        ShouldAssignDescription: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeEnterPurchaseItemReference(PurchLine2, GlobalItemReference, Found, IsHandled);
        if IsHandled then
            exit;

        if PurchLine2.Type = PurchLine2.Type::Item then begin
            FindItemReferenceForPurchaseLine(PurchLine2);

            if Found then begin
                PurchLine2."Item Reference No." := GlobalItemReference."Reference No.";
                PurchLine2."Item Reference Unit of Measure" := GlobalItemReference."Unit of Measure";
                PurchLine2."Item Reference Type" := GlobalItemReference."Reference Type";
                PurchLine2."Item Reference Type No." := GlobalItemReference."Reference Type No.";
                ShouldAssignDescription := GlobalItemReference.Description <> '';
                OnEnterPurchaseItemReferenceOnAfterCalcShouldAssignDescription(PurchLine2, GlobalItemReference, ShouldAssignDescription);
                if ShouldAssignDescription then begin
                    PurchLine2.Description := GlobalItemReference.Description;
                    PurchLine2."Description 2" := GlobalItemReference."Description 2";
                end else begin
                    FillDescription(PurchLine2);
                    PurchLine2.GetItemTranslation();
                end;

                OnAfterPurchItemReferenceFound(PurchLine2, GlobalItemReference);
            end else begin
                PurchLine2."Item Reference No." := '';
                PurchLine2."Item Reference Type" := PurchLine2."Item Reference Type"::" ";
                PurchLine2."Item Reference Type No." := '';
                FillDescription(PurchLine2);
                PurchLine2.GetItemTranslation();
                OnAfterPurchItemItemRefNotFound(PurchLine2, GlobalItemVariant);
            end;
        end;
    end;

    local procedure FindItemReferenceForPurchaseLine(var PurchaseLine: Record "Purchase Line")
    var
        ToDate: Date;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFindItemReferenceForPurchaseLine(PurchaseLine, GlobalItemReference, Found, IsHandled);
        if not IsHandled then begin
            GlobalItemReference.Reset();
            GlobalItemReference.SetRange("Item No.", PurchaseLine."No.");
            GlobalItemReference.SetRange("Variant Code", PurchaseLine."Variant Code");
            GlobalItemReference.SetRange("Unit of Measure", PurchaseLine."Unit of Measure Code");
            ToDate := PurchaseLine.GetDateForCalculations();
            if ToDate <> 0D then begin
                GlobalItemReference.SetFilter("Starting Date", '<=%1', ToDate);
                GlobalItemReference.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
            end;
            GlobalItemReference.SetRange("Reference Type", PurchaseLine."Item Reference Type"::Vendor);
            GlobalItemReference.SetRange("Reference Type No.", PurchaseLine."Buy-from Vendor No.");
            GlobalItemReference.SetRange("Reference No.", PurchaseLine."Item Reference No.");
            OnFindItemReferenceForPurchaseLineBeforeFindFirst(PurchaseLine, GlobalItemReference);
            if GlobalItemReference.FindFirst() then
                Found := true
            else begin
                GlobalItemReference.SetRange("Reference No.");
                Found := GlobalItemReference.FindFirst();
            end;
        end;
        OnAfterFindItemReferenceForPurchaseLine(PurchaseLine, GlobalItemReference, Found);
    end;

    local procedure FillDescription(var PurchaseLine: Record "Purchase Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFillDescription(PurchaseLine, IsHandled);
        if IsHandled then
            exit;

        if PurchaseLine."Variant Code" <> '' then begin
            GlobalItemVariant.Get(PurchaseLine."No.", PurchaseLine."Variant Code");
            PurchaseLine.Description := GlobalItemVariant.Description;
            PurchaseLine."Description 2" := GlobalItemVariant."Description 2";
        end else begin
            GlobalItem.Get(PurchaseLine."No.");
            PurchaseLine.Description := GlobalItem.Description;
            PurchaseLine."Description 2" := GlobalItem."Description 2";
        end;
    end;

    local procedure FillSalesDescription(var SalesLine: Record "Sales Line")
    begin
        if SalesLine."Variant Code" <> '' then begin
            GlobalItemVariant.Get(SalesLine."No.", SalesLine."Variant Code");
            SalesLine.Description := GlobalItemVariant.Description;
            SalesLine."Description 2" := GlobalItemVariant."Description 2";
        end else begin
            GlobalItem.Get(SalesLine."No.");
            SalesLine.Description := GlobalItem.Description;
            SalesLine."Description 2" := GlobalItem."Description 2";
        end;
    end;

    procedure ReferenceLookupPurchaseItem(var PurchLine2: Record "Purchase Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupPurchaseItem(PurchLine2, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;

        GlobalPurchLine.Copy(PurchLine2);
        if GlobalPurchLine.Type = GlobalPurchLine.Type::Item then
            FindOrSelectFromItemReferenceList(
                ReturnedItemReference, ShowDialog, GlobalPurchLine."No.", GlobalPurchLine."Item Reference No.", GlobalPurchLine."Buy-from Vendor No.",
                ReturnedItemReference."Reference Type"::Vendor, GlobalPurchLine.GetDateForCalculations());
    end;

    local procedure FilterItemReferenceByItemVendor(var ItemReference: Record "Item Reference"; ItemVendor: Record "Item Vendor")
    begin
        ItemReference.Reset();
        ItemReference.SetRange("Item No.", ItemVendor."Item No.");
        ItemReference.SetRange("Variant Code", ItemVendor."Variant Code");
        ItemReference.SetRange("Reference Type", ItemReference."Reference Type"::Vendor);
        ItemReference.SetRange("Reference Type No.", ItemVendor."Vendor No.");
        ItemReference.SetRange("Reference No.", ItemVendor."Vendor Item No.");
    end;

    local procedure FillItemReferenceFromItemVendor(var ItemReference: Record "Item Reference"; ItemVend: Record "Item Vendor")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFillItemReferenceFromItemVendor(ItemReference, ItemVend, IsHandled);
        if IsHandled then
            exit;

        ItemReference.Init();
        ItemReference.Validate("Item No.", ItemVend."Item No.");
        ItemReference.Validate("Variant Code", ItemVend."Variant Code");
        ItemReference.Validate("Reference Type", ItemReference."Reference Type"::Vendor);
        ItemReference.Validate("Reference Type No.", ItemVend."Vendor No.");
        ItemReference."Reference No." := ItemVend."Vendor Item No.";
        if ItemReference."Unit of Measure" = '' then begin
            GlobalItem.Get(ItemVend."Item No.");
            ItemReference.Validate("Unit of Measure", GlobalItem."Base Unit of Measure");
        end;
    end;

    local procedure CreateItemReference(ItemVend: Record "Item Vendor")
    var
        ItemReference2: Record "Item Reference";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateItemReference(ItemVend, IsHandled);
        if IsHandled then
            exit;

        FillItemReferenceFromItemVendor(ItemReference2, ItemVend);

        OnCreateItemReferenceOnBeforeInsert(ItemReference2, ItemVend);
        ItemReference2.Insert();
    end;

    procedure InsertItemReference(ItemVend: Record "Item Vendor")
    var
        ItemReference2: Record "Item Reference";
    begin
        FilterItemReferenceByItemVendor(ItemReference2, ItemVend);
        if ItemReference2.IsEmpty() then
            CreateItemReference(ItemVend);
    end;

    procedure DeleteItemReference(ItemVend: Record "Item Vendor")
    var
        ItemReference2: Record "Item Reference";
    begin
        FilterItemReferenceByItemVendor(ItemReference2, ItemVend);
        ItemReference2.DeleteAll();
    end;

    procedure UpdateItemReference(ItemVend: Record "Item Vendor"; xItemVend: Record "Item Vendor")
    begin
        // delete the item cross references
        DeleteItemReference(xItemVend);

        // insert the updated item cross references - faster then RENAME
        CreateItemReference(ItemVend);
    end;

    procedure FindOrSelectFromItemReferenceList(var ItemReferenceToReturn: Record "Item Reference"; ShowDialog: Boolean; ItemNo: Code[20]; ItemRefNo: Code[50]; ItemRefTypeNo: Code[30]; ItemRefType: Enum "Item Reference Type")
    begin
        FindOrSelectFromItemReferenceList(ItemReferenceToReturn, ShowDialog, ItemNo, ItemRefNo, ItemRefTypeNo, ItemRefType, 0D);
    end;

    procedure FindOrSelectFromItemReferenceList(var ItemReferenceToReturn: Record "Item Reference"; ShowDialog: Boolean; ItemNo: Code[20]; ItemRefNo: Code[50]; ItemRefTypeNo: Code[30]; ItemRefType: Enum "Item Reference Type"; ToDate: Date)
    var
        TempRecRequired: Boolean;
        MultipleItemsToChoose: Boolean;
        QtyCustOrVendCR: Integer;
        QtyBarCodeAndBlankCR: Integer;
    begin
        InitItemReferenceFilters(GlobalItemReference, ItemNo, ItemRefNo, ItemRefType, ToDate);
        CountItemReference(GlobalItemReference, QtyCustOrVendCR, QtyBarCodeAndBlankCR, ItemRefType, ItemRefTypeNo);
        MultipleItemsToChoose := true;

        ProcessDecisionTree(QtyCustOrVendCR, QtyBarCodeAndBlankCR, ItemRefNo, ItemRefType, ItemRefTypeNo, TempRecRequired, MultipleItemsToChoose);

        SelectOrFindReference(ItemRefNo, ItemRefType, ItemRefTypeNo, TempRecRequired, MultipleItemsToChoose, ShowDialog);

        ItemReferenceToReturn.Copy(GlobalItemReference);
    end;

    local procedure ProcessDecisionTree(QtyCustOrVendCR: Integer; QtyBarCodeAndBlankCR: Integer; ItemRefNo: Code[50]; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]; var TempRecRequired: Boolean; var MultipleItemsToChoose: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeProcessDecisionTree(GlobalItemReference, QtyCustOrVendCR, QtyBarCodeAndBlankCR, ItemRefNo, ItemRefType, ItemRefTypeNo, TempRecRequired, MultipleItemsToChoose, IsHandled);
        if IsHandled then
            exit;

        case true of
            (QtyCustOrVendCR = 0) and (QtyBarCodeAndBlankCR = 0):
                Error(ItemRefNotExistErr, ItemRefNo);
            (QtyCustOrVendCR = 0) and (QtyBarCodeAndBlankCR = 1):
                MultipleItemsToChoose := false;
            (QtyCustOrVendCR = 0) and (QtyBarCodeAndBlankCR > 1):
                MultipleItemsToChoose := BarCodeCRAreMappedToDifferentItems(GlobalItemReference);
            (QtyCustOrVendCR = 1) and (QtyBarCodeAndBlankCR = 0):
                MultipleItemsToChoose := false;
            (QtyCustOrVendCR = 1) and (QtyBarCodeAndBlankCR > 0):
                MultipleItemsToChoose := CustVendAndBarCodeCRAreMappedToDifferentItems(GlobalItemReference, ItemRefType, ItemRefTypeNo);
            (QtyCustOrVendCR > 1) and (QtyBarCodeAndBlankCR = 0):
                SetFiltersTypeAndTypeNoItemRef(GlobalItemReference, ItemRefType, ItemRefTypeNo);
            (QtyCustOrVendCR > 1) and (QtyBarCodeAndBlankCR > 0):
                TempRecRequired := true;
        end;
    end;

    local procedure SelectOrFindReference(ItemRefNo: Code[50]; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30];
                                                                                TempRecRequired: Boolean;
                                                                                MultipleItemsToChoose: Boolean;
                                                                                ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSelectOrFindReference(GlobalItemReference, ItemRefNo, ItemRefType, ItemRefTypeNo, TempRecRequired, MultipleItemsToChoose, ShowDialog, IsHandled);
        if IsHandled then
            exit;

        if ShowDialog and MultipleItemsToChoose then begin
            if not RunPageReferenceListOnRealOrTempRec(GlobalItemReference, TempRecRequired, ItemRefType, ItemRefTypeNo) then
                Error(ItemRefNotExistErr, ItemRefNo);
        end else
            if not FindFirstCustVendItemReference(GlobalItemReference, ItemRefType, ItemRefTypeNo) then
                FindFirstBarCodeOrBlankTypeItemReference(GlobalItemReference);
    end;

    local procedure InitItemReferenceFilters(var ItemReference: Record "Item Reference"; ItemNo: Code[20]; ItemRefNo: Code[50]; ItemRefType: Enum "Item Reference Type"; ToDate: Date)
    begin
        ItemReference.Reset();
        ItemReference.SetCurrentKey("Reference No.", "Reference Type", "Reference Type No.");
        ItemReference.SetRange("Reference No.", ItemRefNo);
        ItemReference.SetRange("Item No.", ItemNo);
        if ToDate <> 0D then begin
            ItemReference.SetFilter("Starting Date", '<=%1', ToDate);
            ItemReference.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
        end;
        ExcludeOtherReferenceTypes(ItemReference, ItemRefType);
        OnInitItemReferenceFiltersOnBeforeCheckIsEmpty(ItemReference, ItemRefType);
        if ItemReference.IsEmpty() then
            ItemReference.SetRange("Item No.");
    end;

    local procedure ExcludeOtherReferenceTypes(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type")
    begin
        case ItemRefType of
            ItemReference."Reference Type"::" ":
                ItemReference.SetFilter("Reference Type", '<>%1&<>%2', ItemReference."Reference Type"::Customer, ItemReference."Reference Type"::Vendor);
            ItemReference."Reference Type"::Vendor:
                ItemReference.SetFilter("Reference Type", '<>%1', ItemReference."Reference Type"::Customer);
            ItemReference."Reference Type"::Customer:
                ItemReference.SetFilter("Reference Type", '<>%1', ItemReference."Reference Type"::Vendor);
            else
                Error(ItemRefWrongTypeErr);
        end;
    end;

    local procedure CountItemReference(var ItemReference: Record "Item Reference"; var QtyCustOrVendCR: Integer; var QtyBarCodeAndBlankCR: Integer; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30])
    var
        ItemReferenceToCheck: Record "Item Reference";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCountItemReference(ItemReference, QtyCustOrVendCR, QtyBarCodeAndBlankCR, ItemRefType, ItemRefTypeNo, IsHandled);
        if IsHandled then
            exit;

        ItemReferenceToCheck.CopyFilters(ItemReference);
        SetFiltersTypeAndTypeNoItemRef(ItemReferenceToCheck, ItemRefType, ItemRefTypeNo);
        QtyCustOrVendCR := ItemReferenceToCheck.Count();
        SetFiltersBlankTypeItemRef(ItemReferenceToCheck);
        QtyBarCodeAndBlankCR := ItemReferenceToCheck.Count();
    end;

    local procedure BarCodeCRAreMappedToDifferentItems(var ItemReference: Record "Item Reference"): Boolean
    var
        ItemReferenceToCheck: Record "Item Reference";
    begin
        ItemReferenceToCheck.CopyFilters(ItemReference);
        SetFiltersBlankTypeItemRef(ItemReferenceToCheck);
        ItemReferenceToCheck.FindFirst();
        ItemReferenceToCheck.SetFilter("Item No.", '<>%1', ItemReferenceToCheck."Item No.");
        exit(not ItemReferenceToCheck.IsEmpty);
    end;

    local procedure CustVendAndBarCodeCRAreMappedToDifferentItems(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]): Boolean
    var
        ItemReferenceToCheck: Record "Item Reference";
    begin
        ItemReferenceToCheck.CopyFilters(ItemReference);
        SetFiltersTypeAndTypeNoItemRef(ItemReferenceToCheck, ItemRefType, ItemRefTypeNo);
        ItemReferenceToCheck.FindFirst();
        ItemReferenceToCheck.SetFilter("Item No.", '<>%1', ItemReferenceToCheck."Item No.");
        SetFiltersBlankTypeItemRef(ItemReferenceToCheck);
        exit(not ItemReferenceToCheck.IsEmpty);
    end;

    local procedure RunPageReferenceListOnRealOrTempRec(var ItemReference: Record "Item Reference"; RunOnTempRec: Boolean; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]): Boolean
    begin
        if RunOnTempRec then
            exit(RunPageReferenceListOnTempRecord(
                ItemReference, ItemRefType, ItemRefTypeNo));
        exit(RunPageReferenceList(ItemReference));
    end;

    local procedure RunPageReferenceListOnTempRecord(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]): Boolean
    var
        TempItemReference: Record "Item Reference" temporary;
        ItemReferenceToCopy: Record "Item Reference";
    begin
        ItemReferenceToCopy.CopyFilters(ItemReference);
        SetFiltersTypeAndTypeNoItemRef(ItemReferenceToCopy, ItemRefType, ItemRefTypeNo);
        InsertTempRecords(TempItemReference, ItemReferenceToCopy);
        SetFiltersBlankTypeItemRef(ItemReferenceToCopy);
        InsertTempRecords(TempItemReference, ItemReferenceToCopy);
        if RunPageReferenceList(TempItemReference) then begin
            ItemReference := TempItemReference;
            exit(true);
        end;
        exit(false);
    end;

    local procedure RunPageReferenceList(var ItemReference: Record "Item Reference"): Boolean
    begin
        ItemReference.FindFirst();
        exit(PAGE.RunModal(PAGE::"Item Reference List", ItemReference) = ACTION::LookupOK);
    end;

    local procedure InsertTempRecords(var TempItemReference: Record "Item Reference" temporary; var ItemReferenceToCopy: Record "Item Reference")
    begin
        if ItemReferenceToCopy.FindSet() then
            repeat
                TempItemReference := ItemReferenceToCopy;
                TempItemReference.Insert();
            until ItemReferenceToCopy.Next() = 0;
    end;

    local procedure FindFirstCustVendItemReference(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]): Boolean
    var
        ItemReferenceToCheck: Record "Item Reference";
    begin
        SetFiltersTypeAndTypeNoItemRef(ItemReference, ItemRefType, ItemRefTypeNo);
        ItemReferenceToCheck.CopyFilters(ItemReference);
        if ItemReferenceToCheck.FindFirst() then begin
            ItemReference.Copy(ItemReferenceToCheck);
            exit(true);
        end;
        exit(false);
    end;

    local procedure FindFirstBarCodeOrBlankTypeItemReference(var ItemReference: Record "Item Reference")
    var
        ItemReferenceToCheck: Record "Item Reference";
    begin
        SetFiltersBlankTypeItemRef(ItemReference);
        ItemReferenceToCheck.CopyFilters(ItemReference);
        ItemReferenceToCheck.FindFirst();
        ItemReference.Copy(ItemReferenceToCheck);
    end;

    local procedure SetFiltersTypeAndTypeNoItemRef(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30])
    begin
        ItemReference.SetRange("Reference Type", ItemRefType);
        ItemReference.SetRange("Reference Type No.", ItemRefTypeNo);

        OnAfterSetFiltersTypeAndTypeNoItemRef(ItemReference, ItemRefType, ItemRefTypeNo);
    end;

    local procedure SetFiltersBlankTypeItemRef(var ItemReference: Record "Item Reference")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetFiltersBlankTypeItemRef(ItemReference, IsHandled);
        if IsHandled then
            exit;

        ItemReference.SetFilter("Reference Type", '%1|%2', ItemReference."Reference Type"::" ", ItemReference."Reference Type"::"Bar Code");
        ItemReference.SetRange("Reference Type No.");
    end;

    procedure SalesReferenceNoLookup(var SalesLine: Record "Sales Line")
    begin
        SalesReferenceNoLookup(SalesLine, SalesLine.GetSalesHeader());
    end;

    procedure SalesReferenceNoLookup(var SalesLine: Record "Sales Line"; SalesHeader: record "Sales Header")
    var
        ItemReference2: Record "Item Reference";
        ICGLAcc: Record "IC G/L Account";
        ToDate: Date;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSalesReferenceNoLookup(SalesLine, SalesHeader, IsHandled);
        if IsHandled then
            exit;
        case SalesLine.Type of
            SalesLine.Type::Item:
                begin
                    SalesLine.SetSalesHeader(SalesHeader);
                    ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
                    ItemReference2.SetFilter("Reference Type", '%1|%2', ItemReference2."Reference Type"::Customer, ItemReference2."Reference Type"::" ");
                    ItemReference2.SetFilter("Reference Type No.", '%1|%2', SalesHeader."Sell-to Customer No.", '');
                    ToDate := SalesLine.GetDateForCalculations();
                    if ToDate <> 0D then begin
                        ItemReference2.SetFilter("Starting Date", '<=%1', ToDate);
                        ItemReference2.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
                    end;
                    OnSalesReferenceNoLookupOnAfterSetFilters(ItemReference2, SalesLine, SalesHeader);
                    if PAGE.RunModal(PAGE::"Item Reference List", ItemReference2) = ACTION::LookupOK then begin
                        SalesLine."Item Reference No." := ItemReference2."Reference No.";
                        ValidateSalesReferenceNo(SalesLine, SalesHeader, ItemReference2, false, 0);
                        SalesLine.UpdateReferencePriceAndDiscount();
                        SalesReferenceNoLookupValidateUnitPrice(SalesLine, SalesHeader);
                    end;
                end;
            SalesLine.Type::"G/L Account", SalesLine.Type::Resource:
                begin
                    SalesLine.SetSalesHeader(SalesHeader);
                    SalesHeader.TestField("Sell-to IC Partner Code");
                    if PAGE.RunModal(PAGE::"IC G/L Account List", ICGLAcc) = ACTION::LookupOK then
                        SalesLine."Item Reference No." := ICGLAcc."No.";
                end;
        end;
    end;

    local procedure SalesReferenceNoLookupValidateUnitPrice(var SalesLine: Record "Sales Line"; SalesHeader: record "Sales Header")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnSalesReferenceNoLookupOnBeforeValidateUnitPrice(SalesLine, SalesHeader, IsHandled);
        if IsHandled then
            exit;

        SalesLine.Validate("Unit Price");
    end;

    procedure ValidateSalesReferenceNo(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        DummyItemReference: Record "Item Reference";
    begin
        ValidateSalesReferenceNo(SalesLine, SalesHeader, DummyItemReference, SearchItem, CurrentFieldNo);
    end;

    procedure ValidateSalesReferenceNo(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateSalesReferenceNo(SalesLine, ItemReference, SearchItem, CurrentFieldNo, IsHandled);
        if IsHandled then
            exit;

        ReturnedItemReference.Init();
        if SalesLine."Item Reference No." <> '' then begin
            if SearchItem then
                ReferenceLookupSalesItem(SalesLine, ReturnedItemReference, CurrentFieldNo <> 0)
            else
                ReturnedItemReference := ItemReference;

            OnValidateSalesReferenceNoOnBeforeAssignNo(SalesLine, ReturnedItemReference);
            if SalesLine."No." <> ReturnedItemReference."Item No." then
                SalesLine.Validate("No.", ReturnedItemReference."Item No.");
            if ReturnedItemReference."Variant Code" <> '' then
                SalesLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
            if ReturnedItemReference."Unit of Measure" <> '' then
                SalesLine.Validate("Unit of Measure Code", ReturnedItemReference."Unit of Measure");
            OnValidateSalesReferenceNoOnAfterAssignNo(SalesLine, ReturnedItemReference);
        end;

        SalesLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
        SalesLine."Item Reference Type" := ReturnedItemReference."Reference Type";
        SalesLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
        SalesLine."Item Reference No." := ReturnedItemReference."Reference No.";

        if (SalesLine."Item Reference No." = '') and (SalesLine."Variant Code" <> '') then begin
            FillSalesDescription(SalesLine);
            SalesLine.GetItemTranslation();
        end;

        if (ReturnedItemReference.Description <> '') or (ReturnedItemReference."Description 2" <> '') then begin
            SalesLine.Description := ReturnedItemReference.Description;
            SalesLine."Description 2" := ReturnedItemReference."Description 2";
        end;

        SalesLine.UpdateUnitPrice(SalesLine.FieldNo("Item Reference No."));
        SalesLine.UpdateICPartner();

        OnAfterValidateSalesReferenceNo(SalesLine, ItemReference, ReturnedItemReference);
    end;

    procedure PurchaseReferenceNoLookup(var PurchaseLine: Record "Purchase Line")
    var
        PurchHeader: Record "Purchase Header";
    begin
        PurchHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No.");
        PurchaseReferenceNoLookup(PurchaseLine, PurchHeader);
    end;

    procedure PurchaseReferenceNoLookup(var PurchaseLine: Record "Purchase Line"; PurchHeader: Record "Purchase Header")
    var
        ItemReference2: Record "Item Reference";
        ToDate: Date;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePurchaseReferenceNoLookup(PurchaseLine, PurchHeader, IsHandled);
        if IsHandled then
            exit;

        if PurchaseLine.Type = PurchaseLine.Type::Item then begin
            ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
            ItemReference2.SetFilter("Reference Type", '%1|%2', ItemReference2."Reference Type"::Vendor, ItemReference2."Reference Type"::" ");
            ItemReference2.SetFilter("Reference Type No.", '%1|%2', PurchHeader."Buy-from Vendor No.", '');
            ToDate := PurchaseLine.GetDateForCalculations();
            if ToDate <> 0D then begin
                ItemReference2.SetFilter("Starting Date", '<=%1', ToDate);
                ItemReference2.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
            end;
            OnPurchaseReferenceNoLookUpOnAfterSetFilters(ItemReference2, PurchaseLine);
            if PAGE.RunModal(PAGE::"Item Reference List", ItemReference2) = ACTION::LookupOK then begin
                PurchaseLine."Item Reference No." := ItemReference2."Reference No.";
                ValidatePurchaseReferenceNo(PurchaseLine, PurchHeader, ItemReference2, false, 0);
                PurchaseLine.UpdateReferencePriceAndDiscount();
                OnPurchaseReferenceNoLookupOnBeforeValidateDirectUnitCost(PurchaseLine, PurchHeader);
                PurchaseLine.Validate("Direct Unit Cost");
            end;
        end;
    end;

    procedure ValidatePurchaseReferenceNo(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidatePurchaseReferenceNo(PurchaseLine, PurchaseHeader, ItemReference, SearchItem, CurrentFieldNo, IsHandled);
        if not IsHandled then begin
            ReturnedItemReference.Init();
            if PurchaseLine."Item Reference No." <> '' then begin
                if SearchItem then
                    ReferenceLookupPurchaseItem(PurchaseLine, ReturnedItemReference, CurrentFieldNo <> 0)
                else
                    ReturnedItemReference := ItemReference;

                OnValidatePurchaseReferenceNoOnBeforeAssignNo(PurchaseLine, ReturnedItemReference);

                PurchaseLine.SetPurchHeader(PurchaseHeader);
                PurchaseLine.Validate("No.", ReturnedItemReference."Item No.");
                PurchaseLine.SetVendorItemNo();
                if ReturnedItemReference."Variant Code" <> '' then
                    PurchaseLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
                if ReturnedItemReference."Unit of Measure" <> '' then
                    PurchaseLine.Validate("Unit of Measure Code", ReturnedItemReference."Unit of Measure");
                OnValidatePurchaseReferenceNoOnBeforePurchaseLineUpdateDirectUnitCost(PurchaseLine, ReturnedItemReference);
                PurchaseLine.UpdateDirectUnitCost(PurchaseLine.FieldNo("Item Reference No."));
            end;

            PurchaseLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
            PurchaseLine."Item Reference Type" := ReturnedItemReference."Reference Type";
            PurchaseLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
            PurchaseLine."Item Reference No." := ReturnedItemReference."Reference No.";

            if (PurchaseLine."Item Reference No." = '') and (PurchaseLine."Variant Code" <> '') then begin
                FillDescription(PurchaseLine);
                PurchaseLine.GetItemTranslation();
            end;

            if (ReturnedItemReference.Description <> '') or (ReturnedItemReference."Description 2" <> '') then begin
                PurchaseLine.Description := ReturnedItemReference.Description;
                PurchaseLine."Description 2" := ReturnedItemReference."Description 2";
            end;

            PurchaseLine.UpdateDirectUnitCost(PurchaseLine.FieldNo("Item Reference No."));
            PurchaseLine.UpdateICPartner();
        end;
        OnAfterValidatePurchaseReferenceNo(PurchaseLine, ItemReference, ReturnedItemReference);
    end;

    procedure PhysicalInventoryOrderReferenceNoLookup(var PhysInvtOrderLine: Record "Phys. Invt. Order Line")
    var
        ItemReference2: Record "Item Reference";
        ToDate: Date;
    begin
        ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
        ItemReference2.SetRange("Reference Type", ItemReference2."Reference Type"::" ");
        ItemReference2.SetRange("Reference Type No.", '');
        ToDate := PhysInvtOrderLine.GetDateForCalculations();
        if ToDate <> 0D then begin
            ItemReference2.SetFilter("Starting Date", '<=%1', ToDate);
            ItemReference2.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
        end;
        OnPhysicalInventoryOrderReferenceNoLookupOnAfterSetFilters(ItemReference2, PhysInvtOrderLine);
        if Page.RunModal(Page::"Item Reference List", ItemReference2) = Action::LookupOK then begin
            PhysInvtOrderLine."Item Reference No." := ItemReference2."Reference No.";
            ValidatePhysicalInventoryOrderReferenceNo(PhysInvtOrderLine, ItemReference2, false, 0);
        end;
    end;

    procedure ValidatePhysicalInventoryOrderReferenceNo(var PhysInvtOrderLine: Record "Phys. Invt. Order Line"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
    begin
        ReturnedItemReference.Init();
        if PhysInvtOrderLine."Item Reference No." <> '' then begin
            if SearchItem then
                ReferenceLookupPhysicalInventoryOrderItem(PhysInvtOrderLine, ReturnedItemReference, CurrentFieldNo <> 0)
            else
                ReturnedItemReference := ItemReference;

            OnValidatePhysicalInventoryOrderReferenceNoOnBeforeAssignNo(PhysInvtOrderLine, ReturnedItemReference);

            TestEmptyOrBaseItemUnitOfMeasure(ReturnedItemReference);
            PhysInvtOrderLine.Validate("Item No.", ReturnedItemReference."Item No.");
            if ReturnedItemReference."Variant Code" <> '' then
                PhysInvtOrderLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
            if ReturnedItemReference."Unit of Measure" <> '' then
                PhysInvtOrderLine.Validate("Base Unit of Measure Code", ReturnedItemReference."Unit of Measure");
        end;

        PhysInvtOrderLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
        PhysInvtOrderLine."Item Reference Type" := ReturnedItemReference."Reference Type";
        PhysInvtOrderLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
        PhysInvtOrderLine."Item Reference No." := ReturnedItemReference."Reference No.";

        if (PhysInvtOrderLine."Item Reference No." = '') then
            FillPhysInvOrderLineDescription(PhysInvtOrderLine);

        if (ReturnedItemReference.Description <> '') or (ReturnedItemReference."Description 2" <> '') then begin
            PhysInvtOrderLine.Description := ReturnedItemReference.Description;
            PhysInvtOrderLine."Description 2" := ReturnedItemReference."Description 2";
        end;
        OnAfterValidatePhysicalInventoryOrderReferenceNo(PhysInvtOrderLine, ItemReference, ReturnedItemReference);
    end;

    local procedure FillPhysInvOrderLineDescription(var PhysInvtOrderLine: Record "Phys. Invt. Order Line")
    var
        Item: Record Item;
    begin
        if PhysInvtOrderLine."Variant Code" <> '' then
            PhysInvtOrderLine.Validate("Variant Code")
        else begin
            Item.Get(PhysInvtOrderLine."Item No.");
            PhysInvtOrderLine.Description := Item.Description;
            PhysInvtOrderLine."Description 2" := Item."Description 2";
        end;
    end;

    procedure ReferenceLookupPhysicalInventoryOrderItem(var PhysInvtOrderLine: Record "Phys. Invt. Order Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupPhysicalInventoryOrderItem(PhysInvtOrderLine, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;
        FindOrSelectFromItemReferenceList(ReturnedItemReference, ShowDialog, PhysInvtOrderLine."Item No.", PhysInvtOrderLine."Item Reference No.", '', ReturnedItemReference."Reference Type"::" ", PhysInvtOrderLine.GetDateForCalculations());
    end;

    procedure PhysicalInventoryRecordReferenceNoLookup(var PhysInvtRecordLine: Record "Phys. Invt. Record Line")
    var
        ItemReference2: Record "Item Reference";
        ToDate: Date;
    begin
        ItemReference2.Reset();
        ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
        ItemReference2.SetRange("Reference Type", ItemReference2."Reference Type"::" ");
        ItemReference2.SetRange("Reference Type No.", '');
        ToDate := PhysInvtRecordLine.GetDateForCalculations();
        if ToDate <> 0D then begin
            ItemReference2.SetFilter("Starting Date", '<=%1', ToDate);
            ItemReference2.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
        end;
        OnPhysicalInventoryRecordReferenceNoLookupOnAfterSetFilters(ItemReference2, PhysInvtRecordLine);
        if Page.RunModal(Page::"Item Reference List", ItemReference2) = Action::LookupOK then begin
            PhysInvtRecordLine."Item Reference No." := ItemReference2."Reference No.";
            ValidatePhysicalInventoryRecordReferenceNo(PhysInvtRecordLine, ItemReference2, false, 0);
        end;
    end;

    procedure ValidatePhysicalInventoryRecordReferenceNo(var PhysInvtRecordLine: Record "Phys. Invt. Record Line"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
    begin
        ReturnedItemReference.Init();
        if PhysInvtRecordLine."Item Reference No." <> '' then begin
            if SearchItem then
                ReferenceLookupPhysicalInventoryRecordItem(PhysInvtRecordLine, ReturnedItemReference, CurrentFieldNo <> 0)
            else
                ReturnedItemReference := ItemReference;

            OnValidatePhysicalInventoryRecordReferenceNoOnBeforeAssignNo(PhysInvtRecordLine, ReturnedItemReference);

            ReturnedItemReference.TestField("Item No.");
            PhysInvtRecordLine.Validate("Item No.", ReturnedItemReference."Item No.");
            if ReturnedItemReference."Variant Code" <> '' then
                PhysInvtRecordLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
            if ReturnedItemReference."Unit of Measure" <> '' then
                PhysInvtRecordLine.Validate("Unit of Measure Code", ReturnedItemReference."Unit of Measure");
        end;

        PhysInvtRecordLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
        PhysInvtRecordLine."Item Reference Type" := ReturnedItemReference."Reference Type";
        PhysInvtRecordLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
        PhysInvtRecordLine."Item Reference No." := ReturnedItemReference."Reference No.";

        if (PhysInvtRecordLine."Item Reference No." = '') then
            FillPhysInvtRecordLineDescription(PhysInvtRecordLine);

        if (ReturnedItemReference.Description <> '') or (ReturnedItemReference."Description 2" <> '') then begin
            PhysInvtRecordLine.Description := ReturnedItemReference.Description;
            PhysInvtRecordLine."Description 2" := ReturnedItemReference."Description 2";
        end;
        OnAfterValidatePhysicalInventoryRecordReferenceNo(PhysInvtRecordLine, ItemReference, ReturnedItemReference);
    end;

    local procedure FillPhysInvtRecordLineDescription(var PhysInvtRecordLine: Record "Phys. Invt. Record Line")
    var
        Item: Record Item;
    begin
        if PhysInvtRecordLine."Variant Code" <> '' then
            PhysInvtRecordLine.Validate("Variant Code")
        else begin
            Item.Get(PhysInvtRecordLine."Item No.");
            PhysInvtRecordLine.Description := Item.Description;
            PhysInvtRecordLine."Description 2" := Item."Description 2";
        end;
    end;

    procedure ReferenceLookupPhysicalInventoryRecordItem(var PhysInvtRecordLine: Record "Phys. Invt. Record Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupPhysicalInventoryRecordItem(PhysInvtRecordLine, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;
        FindOrSelectFromItemReferenceList(ReturnedItemReference, ShowDialog, PhysInvtRecordLine."Item No.", PhysInvtRecordLine."Item Reference No.", '', ReturnedItemReference."Reference Type"::" ", PhysInvtRecordLine.GetDateForCalculations());
    end;

    procedure ItemJournalReferenceNoLookup(var ItemJournalLine: Record "Item Journal Line")
    var
        ItemReference2: Record "Item Reference";
        ToDate: Date;
    begin
        ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
        ItemReference2.SetRange("Reference Type", ItemReference2."Reference Type"::" ");
        ItemReference2.SetRange("Reference Type No.", '');
        ToDate := ItemJournalLine.GetDateForCalculations();
        if ToDate <> 0D then begin
            ItemReference2.SetFilter("Starting Date", '<=%1', ToDate);
            ItemReference2.SetFilter("Ending Date", '>=%1|%2', ToDate, 0D);
        end;
        OnItemJournalReferenceNoLookupOnAfterSetFilters(ItemReference2, ItemJournalLine);
        if Page.RunModal(Page::"Item Reference List", ItemReference2) = Action::LookupOK then begin
            ItemJournalLine."Item Reference No." := ItemReference2."Reference No.";
            ValidateItemJournalReferenceNo(ItemJournalLine, ItemReference2, false, 0);
        end;
    end;

    procedure ValidateItemJournalReferenceNo(var ItemJournalLine: Record "Item Journal Line"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
    begin
        ReturnedItemReference.Init();
        if ItemJournalLine."Item Reference No." <> '' then begin
            if SearchItem then
                ReferenceLookupItemJournalItem(ItemJournalLine, ReturnedItemReference, CurrentFieldNo <> 0)
            else
                ReturnedItemReference := ItemReference;

            OnValidateItemJournalReferenceNoOnBeforeAssignNo(ItemJournalLine, ReturnedItemReference);

            ReturnedItemReference.TestField("Item No.");
            ItemJournalLine.Validate("Item No.", ReturnedItemReference."Item No.");
            if ReturnedItemReference."Variant Code" <> '' then
                ItemJournalLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
            if ReturnedItemReference."Unit of Measure" <> '' then
                ItemJournalLine.Validate("Unit of Measure Code", ReturnedItemReference."Unit of Measure");
        end;

        ItemJournalLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
        ItemJournalLine."Item Reference Type" := ReturnedItemReference."Reference Type";
        ItemJournalLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
        ItemJournalLine."Item Reference No." := ReturnedItemReference."Reference No.";

        if (ItemJournalLine."Item Reference No." = '') then
            FillItemJournalDescription(ItemJournalLine);

        if ReturnedItemReference.Description <> '' then
            ItemJournalLine.Description := ReturnedItemReference.Description;
        OnAfterValidateItemJournalReferenceNo(ItemJournalLine, ItemReference, ReturnedItemReference);
    end;

    local procedure FillItemJournalDescription(var ItemJournalLine: Record "Item Journal Line")
    var
        Item: Record Item;
    begin
        if ItemJournalLine."Variant Code" <> '' then
            ItemJournalLine.Validate("Variant Code")
        else begin
            Item.Get(ItemJournalLine."Item No.");
            ItemJournalLine.Description := Item.Description;
        end;
    end;

    procedure ReferenceLookupItemJournalItem(var ItemJournalLine: Record "Item Journal Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupItemJournalItem(ItemJournalLine, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;
        FindOrSelectFromItemReferenceList(ReturnedItemReference, ShowDialog, ItemJournalLine."Item No.", ItemJournalLine."Item Reference No.", '', ReturnedItemReference."Reference Type"::" ", ItemJournalLine.GetDateForCalculations());
    end;

    procedure ValidateInvtDocumentReferenceNo(var InvtDocumentLine: Record "Invt. Document Line"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer)
    var
        ReturnedItemReference: Record "Item Reference";
    begin
        ReturnedItemReference.Init();
        if InvtDocumentLine."Item Reference No." <> '' then begin
            if SearchItem then
                ReferenceLookupInvtDocumentItem(InvtDocumentLine, ReturnedItemReference, CurrentFieldNo <> 0)
            else
                ReturnedItemReference := ItemReference;

            OnValidateInvtDocumentReferenceNoOnBeforeAssignNo(InvtDocumentLine, ReturnedItemReference);

            ReturnedItemReference.TestField("Item No.");
            InvtDocumentLine.Validate("Item No.", ReturnedItemReference."Item No.");
            if ReturnedItemReference."Variant Code" <> '' then
                InvtDocumentLine.Validate("Variant Code", ReturnedItemReference."Variant Code");
            if ReturnedItemReference."Unit of Measure" <> '' then
                InvtDocumentLine.Validate("Unit of Measure Code", ReturnedItemReference."Unit of Measure");
        end;

        InvtDocumentLine."Item Reference Unit of Measure" := ReturnedItemReference."Unit of Measure";
        InvtDocumentLine."Item Reference Type" := ReturnedItemReference."Reference Type";
        InvtDocumentLine."Item Reference Type No." := ReturnedItemReference."Reference Type No.";
        InvtDocumentLine."Item Reference No." := ReturnedItemReference."Reference No.";

        if (InvtDocumentLine."Item Reference No." = '') then
            FillInvtDocumentLine(InvtDocumentLine);

        if ReturnedItemReference.Description <> '' then
            InvtDocumentLine.Description := ReturnedItemReference.Description;

        OnAfterValidateInvtDocumentReferenceNo(InvtDocumentLine, ItemReference, ReturnedItemReference);
    end;

    local procedure FillInvtDocumentLine(var InvtDocumentLine: Record "Invt. Document Line")
    var
        Item: Record Item;
    begin
        if InvtDocumentLine."Variant Code" <> '' then
            InvtDocumentLine.Validate("Variant Code")
        else begin
            Item.Get(InvtDocumentLine."Item No.");
            InvtDocumentLine.Description := Item.Description;
        end;
    end;

    procedure ReferenceLookupInvtDocumentItem(var InvtDocumentLine: Record "Invt. Document Line"; var ReturnedItemReference: Record "Item Reference"; ShowDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeReferenceLookupInvtDocumentItem(InvtDocumentLine, ReturnedItemReference, ShowDialog, IsHandled);
        if IsHandled then
            exit;
        FindOrSelectFromItemReferenceList(ReturnedItemReference, ShowDialog, InvtDocumentLine."Item No.", InvtDocumentLine."Item Reference No.", '', ReturnedItemReference."Reference Type"::" ");
    end;

    procedure InvtDocumentReferenceNoLookup(var InvtDocumentLine: Record "Invt. Document Line")
    var
        ItemReference2: Record "Item Reference";
    begin
        ItemReference2.SetCurrentKey("Reference Type", "Reference Type No.");
        ItemReference2.SetRange("Reference Type", ItemReference2."Reference Type"::" ");
        ItemReference2.SetRange("Reference Type No.", '');
        OnInvtDocumentReferenceNoLookupOnAfterSetFilters(ItemReference2, InvtDocumentLine);
        if Page.RunModal(Page::"Item Reference List", ItemReference2) = Action::LookupOK then begin
            InvtDocumentLine."Item Reference No." := ItemReference2."Reference No.";
            ValidateInvtDocumentReferenceNo(InvtDocumentLine, ItemReference2, false, 0);
        end;
    end;

    local procedure TestEmptyOrBaseItemUnitOfMeasure(ItemReferenceToTest: Record "Item Reference")
    begin
        ItemReferenceToTest.TestField("Item No.");
        GlobalItem.Get(ItemReferenceToTest."Item No.");
        if not (ItemReferenceToTest."Unit of Measure" in ['', GlobalItem."Base Unit of Measure"]) then
            ItemReferenceToTest.FieldError("Unit of Measure");
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSalesItemReferenceFound(var SalesLine: Record "Sales Line"; ItemReference: Record "Item Reference"; SalesLineBeforeChanges: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSalesItemItemRefNotFound(var SalesLine: Record "Sales Line"; var ItemVariant: Record "Item Variant"; SalesLineBeforeChanges: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetFiltersTypeAndTypeNoItemRef(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPurchItemReferenceFound(var PurchLine: Record "Purchase Line"; ItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPurchItemItemRefNotFound(var PurchaseLine: Record "Purchase Line"; var ItemVariant: Record "Item Variant")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateSalesReferenceNo(var SalesLine: Record "Sales Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidatePurchaseReferenceNo(var PurchaseLine: Record "Purchase Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCountItemReference(var ItemReference: Record "Item Reference"; var QtyCustOrVendCR: Integer; var QtyBarCodeAndBlankCR: Integer; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeEnterSalesItemReference(var SalesLine: Record "Sales Line"; var ItemReference: Record "Item Reference"; var Found: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindItemReferenceForSalesLine(var SalesLine: Record "Sales Line"; var ItemReference: Record "Item Reference"; var Found: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFillDescription(var PurchaseLine: Record "Purchase Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFillItemReferenceFromItemVendor(var ItemReference: Record "Item Reference"; ItemVend: Record "Item Vendor"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeEnterPurchaseItemReference(var PurchaseLine2: Record "Purchase Line"; var ItemReference: Record "Item Reference"; var Found: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePurchaseReferenceNoLookup(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeProcessDecisionTree(var ItemReference: Record "Item Reference"; QtyCustOrVendCR: Integer; QtyBarCodeAndBlankCR: Integer; ItemRefNo: Code[50]; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30]; var TempRecRequired: Boolean; var MultipleItemsToChoose: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupSalesItem(var SalesLine: Record "Sales Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupPurchaseItem(var PurchaseLine: Record "Purchase Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSalesReferenceNoLookup(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSelectOrFindReference(var ItemReference: Record "Item Reference"; ItemRefNo: Code[50]; ItemRefType: Enum "Item Reference Type"; ItemRefTypeNo: Code[30];
                                                                                                                                    TempRecRequired: Boolean;
                                                                                                                                    MultipleItemsToChoose: Boolean;
                                                                                                                                    ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidatePurchaseReferenceNo(var PurchaseLine: Record "Purchase Line"; PurchaseHeader: Record "Purchase Header"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateItemReferenceOnBeforeInsert(var ItemReference: Record "Item Reference"; ItemVendor: Record "Item Vendor")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnEnterPurchaseItemReferenceOnAfterCalcShouldAssignDescription(var PurchaseLine: Record "Purchase Line"; ItemReference: Record "Item Reference"; var ShouldAssignDescription: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInitItemReferenceFiltersOnBeforeCheckIsEmpty(var ItemReference: Record "Item Reference"; ItemRefType: Enum "Item Reference Type")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSalesReferenceNoLookupOnAfterSetFilters(var ItemReference: Record "Item Reference"; SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSalesReferenceNoLookupOnBeforeValidateUnitPrice(var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPurchaseReferenceNoLookUpOnAfterSetFilters(var ItemReference: Record "Item Reference"; PurchaseLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPurchaseReferenceNoLookupOnBeforeValidateDirectUnitCost(var PurchaseLine: Record "Purchase Line"; PurchHeader: Record "Purchase Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateSalesReferenceNoOnAfterAssignNo(var SalesLine: Record "Sales Line"; ReturnedItemReference: Record "Item Reference");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateSalesReferenceNoOnBeforeAssignNo(var SalesLine: Record "Sales Line"; var ReturnedItemReference: Record "Item Reference");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePurchaseReferenceNoOnBeforePurchaseLineUpdateDirectUnitCost(var PurchaseLine: Record "Purchase Line"; ItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePurchaseReferenceNoOnBeforeAssignNo(var PurchaseLine: Record "Purchase Line"; var ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPhysicalInventoryOrderReferenceNoLookupOnAfterSetFilters(var ItemReference: Record "Item Reference"; PhysInvtOrderLine: Record "Phys. Invt. Order Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupPhysicalInventoryOrderItem(var PhysInvtOrderLine: Record "Phys. Invt. Order Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePhysicalInventoryOrderReferenceNoOnBeforeAssignNo(var PhysInvtOrderLine: Record "Phys. Invt. Order Line"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidatePhysicalInventoryOrderReferenceNo(var PhysInvtOrderLine: Record "Phys. Invt. Order Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPhysicalInventoryRecordReferenceNoLookupOnAfterSetFilters(var ItemReference: Record "Item Reference"; PhysInvtRecordLine: Record "Phys. Invt. Record Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupPhysicalInventoryRecordItem(var PhysInvtRecordLine: Record "Phys. Invt. Record Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePhysicalInventoryRecordReferenceNoOnBeforeAssignNo(var PhysInvtRecordLine: Record "Phys. Invt. Record Line"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidatePhysicalInventoryRecordReferenceNo(var PhysInvtRecordLine: Record "Phys. Invt. Record Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnItemJournalReferenceNoLookupOnAfterSetFilters(var ItemReference: Record "Item Reference"; ItemJournalLine: Record "Item Journal Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupItemJournalItem(var ItemJournalLine: Record "Item Journal Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateItemJournalReferenceNoOnBeforeAssignNo(var ItemJournalLine: Record "Item Journal Line"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateItemJournalReferenceNo(var ItemJournalLine: Record "Item Journal Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateInvtDocumentReferenceNoOnBeforeAssignNo(var InvtDocumentLine: Record "Invt. Document Line"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateInvtDocumentReferenceNo(var InvtDocumentLine: Record "Invt. Document Line"; ItemReference: Record "Item Reference"; ReturnedItemReference: Record "Item Reference")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeReferenceLookupInvtDocumentItem(var InvtDocumentLine: Record "Invt. Document Line"; var ItemReference: Record "Item Reference"; ShowDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInvtDocumentReferenceNoLookupOnAfterSetFilters(var ItemReference: Record "Item Reference"; InvtDocumentLine: Record "Invt. Document Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnEnterSalesItemReferenceOnAfterFillDescriptionFromItem(var SalesLine: Record "Sales Line"; var Item: Record Item; SalesLineBeforeChanges: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnEnterSalesItemReferenceOnAfterFillDescriptionFromItemVariant(var SalesLine: Record "Sales Line"; var ItemVariant: Record "Item Variant"; SalesLineBeforeChanges: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateItemReference(ItemVendor: Record "Item Vendor"; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateSalesReferenceNo(var SalesLine: Record "Sales Line"; ItemReference: Record "Item Reference"; SearchItem: Boolean; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetFiltersBlankTypeItemRef(var ItemReference: Record "Item Reference"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindItemReferenceForSalesLineOnBeforeFindFirst(var SalesLine: Record "Sales Line"; var ItemReference: Record "Item Reference");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFindItemReferenceForSalesLine(var SalesLine: Record "Sales Line"; var ItemReference: Record "Item Reference"; var Found: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeFindItemReferenceForPurchaseLine(var PurchaseLine: Record "Purchase Line"; var ItemReference: Record "Item Reference"; var Found: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnFindItemReferenceForPurchaseLineBeforeFindFirst(var PurchaseLine: Record "Purchase Line"; var ItemReference: Record "Item Reference");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFindItemReferenceForPurchaseLine(var PurchaseLine: Record "Purchase Line"; var ItemReference: Record "Item Reference"; var Found: Boolean)
    begin
    end;
}