Table 246 Requisition Line

App
Base Application
Namespace
Microsoft.Inventory.Requisition
Versions
17-28

Fields, 119Keys, 14Procedures, 91Events, 173Obsolete, 8

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Requisition/RequisitionLine.Table.al4226 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.Requisition;

using Microsoft.CRM.Team;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.NoSeries;
using Microsoft.Foundation.UOM;
using Microsoft.Inventory;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Item.Catalog;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Planning;
using Microsoft.Inventory.Tracking;
using Microsoft.Inventory.Transfer;
using Microsoft.Pricing.Calculation;
using Microsoft.Pricing.PriceList;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Planning;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Warehouse.Journal;
using Microsoft.Warehouse.Structure;
using System.Automation;
using System.Security.AccessControl;

table 246 "Requisition Line"
{
    Caption = 'Requisition Line';
    DataCaptionFields = "Journal Batch Name", "Line No.";
    DrillDownPageID = "Requisition Lines";
    LookupPageID = "Requisition Lines";
#if not CLEAN28
    Permissions = TableData Microsoft.Manufacturing.Routing."Routing Header" = r,
                  TableData Microsoft.Manufacturing.ProductionBOM."Production BOM Header" = r;
#endif
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Worksheet Template Name"; Code[10])
        {
            Caption = 'Worksheet Template Name';
            ToolTip = 'Specifies the name of the requisition worksheet template.';
            TableRelation = "Req. Wksh. Template";
        }
        field(2; "Journal Batch Name"; Code[10])
        {
            Caption = 'Journal Batch Name';
            ToolTip = 'Specifies the name of the journal batch, a personalized journal layout, that the entries were posted from.';
            TableRelation = "Requisition Wksh. Name".Name where("Worksheet Template Name" = field("Worksheet Template Name"));
        }
        field(3; "Line No."; Integer)
        {
            Caption = 'Line No.';
            ToolTip = 'Specifies the number of the requisition worksheet line.';
        }
        field(4; Type; Enum "Requisition Line Type")
        {
            Caption = 'Type';
            ToolTip = 'Specifies the type of requisition worksheet line you are creating.';

            trigger OnValidate()
            var
                NewType: Enum "Requisition Line Type";
            begin
                if Type <> xRec.Type then begin
                    NewType := Type;

                    DeleteRelations();
                    "Dimension Set ID" := 0;
                    "No." := '';
                    "Variant Code" := '';
                    "Location Code" := '';
                    CleanProdOrderNo();
                    ReqLineReserve.VerifyChange(Rec, xRec);
                    OnResetReqLineFields(Rec);
                    Init();
                    Type := NewType;
                end;
            end;
        }
        field(5; "No."; Code[20])
        {
            Caption = 'No.';
            ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';
            TableRelation = if (Type = const("G/L Account")) "G/L Account"
            else
            if (Type = const(Item)) Item;

            trigger OnValidate()
            var
                ShouldValidateUnitofMeasureCode: Boolean;
                IsHandled: Boolean;
            begin
                CheckActionMessageNew();
                ReqLineReserve.VerifyChange(Rec, xRec);
                IsHandled := false;
                OnValidateNoOnBeforeDeleteRelations(Rec, xRec, IsHandled);
                if not IsHandled then
                    DeleteRelations();

                if "No." = '' then begin
                    CreateDimFromDefaultDim();
                    Init();
                    Type := xRec.Type;
                    exit;
                end;

                if "No." <> xRec."No." then begin
                    "Variant Code" := '';
                    CleanProdOrderNo();
                    OnResetReqLineFields(Rec);
                end;

                TestField(Type);
                case Type of
                    Type::"G/L Account":
                        CopyFromGLAcc();
                    Type::Item:
                        CopyFromItem();
                end;

                OnValidateNoOnAfterAssignFieldsForNo(Rec, xRec);

                ShouldValidateUnitofMeasureCode := "Planning Line Origin" <> "Planning Line Origin"::"Order Planning";
                OnValidateNoOfAfterCalcShouldValidateUnitofMeasureCode(Rec, xRec, Item, ShouldValidateUnitofMeasureCode);
                if ShouldValidateUnitofMeasureCode then
                    if ("Replenishment System" = "Replenishment System"::Purchase) and
                       (Item."Purch. Unit of Measure" <> '')
                    then
                        Validate("Unit of Measure Code", Item."Purch. Unit of Measure")
                    else
                        Validate("Unit of Measure Code", Item."Base Unit of Measure");

                CreateDimFromDefaultDim();
            end;
        }
        field(6; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies text that describes the entry.';
        }
        field(7; "Description 2"; Text[50])
        {
            Caption = 'Description 2';
            ToolTip = 'Specifies additional text describing the entry, or a remark about the requisition worksheet line.';
        }
        field(8; Quantity; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity';
            ToolTip = 'Specifies the number of units of the item.';
            DecimalPlaces = 0 : 5;

            trigger OnValidate()
            begin
                Quantity := UOMMgt.RoundAndValidateQty(Quantity, "Qty. Rounding Precision", FieldCaption(Quantity));

                "Quantity (Base)" :=
                    UOMMgt.CalcBaseQty(
                        "No.", "Variant Code", "Unit of Measure Code", Quantity, "Qty. per Unit of Measure",
                        "Qty. Rounding Precision (Base)", FieldCaption("Qty. Rounding Precision"), FieldCaption(Quantity),
                        FieldCaption("Quantity (Base)"));

                if Type = Type::Item then begin
                    OnValidateQuantityOnBeforeGetDirectCost(Rec, xRec, CurrFieldNo);
                    GetDirectCost(FieldNo(Quantity));
                    SetRemaningQuantity();

                    if (CurrFieldNo = FieldNo(Quantity)) or (CurrentFieldNo = FieldNo(Quantity)) then
                        SetActionMessage();

                    "Net Quantity (Base)" := (Quantity - "Original Quantity") * "Qty. per Unit of Measure";

                    OnValidateQuantityOnBeforeUnitCost(Rec, CurrFieldNo, CurrentFieldNo);
                    Validate("Unit Cost");
                    if ValidateFields() then
                        if "Ending Date" <> 0D then
                            Validate("Ending Time")
                        else begin
                            if "Starting Date" = 0D then
                                "Starting Date" := WorkDate();
                            Validate("Starting Time");
                        end;
                    ReqLineReserve.VerifyQuantity(Rec, xRec);
                end;
            end;
        }
        field(9; "Vendor No."; Code[20])
        {
            Caption = 'Vendor No.';
            ToolTip = 'Specifies the number of the vendor who will ship the items in the purchase order.';
            TableRelation = Vendor;
            ValidateTableRelation = false;

            trigger OnLookup()
            var
                Vend: Record Vendor;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeLookupVendorNo(Rec, IsHandled);
                if IsHandled then
                    exit;

                IsHandled := false;
                OnValidateVendorNoOnBeforeLookupVendor(Rec, IsHandled);
                if not IsHandled then
                    if LookupVendor(Vend, true) then
                        Validate("Vendor No.", Vend."No.");

                OnAfterLookupVendorNo(Rec, Vend);
            end;

            trigger OnValidate()
            var
                Vend: Record Vendor;
                ItemVend: Record "Item Vendor";
                TempSKU: Record "Stockkeeping Unit" temporary;
                IsHandled: Boolean;
                UpdateVendorItemInfo: Boolean;
            begin
                CheckActionMessageNew();
                if "Vendor No." <> '' then
                    if Vend.Get("Vendor No.") then begin
                        if Vend."Privacy Blocked" then begin
                            if PlanningResiliency then
                                TempPlanningErrorLog.SetError(
                                  StrSubstNo(Text031, Vend.TableCaption(), Vend."No."),
                                  Database::Vendor, CopyStr(Vend.GetPosition(), 1, 250));
                            Vend.VendPrivacyBlockedErrorMessage(Vend, false);
                        end;
                        CheckVendorBlocked(Vend);
                        OnValidateVendorNoOnAfterCheckVendor(Rec, Vend, CurrFieldNo);

                        if "Order Date" = 0D then
                            Validate("Order Date", WorkDate());

                        IsHandled := false;
                        OnValidateVendorNoOnBeforeValidateCurrencyCode(Rec, Vend, IsHandled);
                        if not IsHandled then
                            Validate("Currency Code", Vend."Currency Code");
                        if ("Planning Line Origin" <> "Planning Line Origin"::Planning) or ("Price Calculation Method" = "Price Calculation Method"::" ") then
                            "Price Calculation Method" := Vend.GetPriceCalculationMethod();
                        ValidateItemDescriptionAndQuantity(Vend);
                        SetPurchaserCode(Vend."Purchaser Code", "Purchaser Code");
                    end else begin
                        if ValidateFields() then
                            Error(Text005, FieldCaption("Vendor No."), "Vendor No.");
                        "Vendor No." := '';
                        if ("Planning Line Origin" <> "Planning Line Origin"::Planning) or ("Price Calculation Method" = "Price Calculation Method"::" ") then
                            "Price Calculation Method" := Vend.GetPriceCalculationMethod();
                    end
                else begin
                    UpdateDescription();
                    if ("Planning Line Origin" <> "Planning Line Origin"::Planning) or ("Price Calculation Method" = "Price Calculation Method"::" ") then
                        "Price Calculation Method" := Vend.GetPriceCalculationMethod();
                end;
                UpdateDescription();

                GetLocationCode();
                OnValidateVendorNoOnAfterGetLocationCode(Rec);
                GetDefaultBinCode();
                OnValidateVendorNoOnAfterGetDefaultBinCode(Rec);

                "Order Address Code" := '';

                UpdateVendorItemInfo := (Type = Type::Item) and ("No." <> '') and (not IsProdOrder());
                OnValidateVendorNoOnBeforeUpdateVendorItemInfo(Rec, UpdateVendorItemInfo);

                if UpdateVendorItemInfo then begin
                    if ItemVend.Get("Vendor No.", "No.", "Variant Code") then begin
                        IsHandled := false;
                        OnValidateVendorNoOnBeforeSetVendorItemNoFromItemVend(Rec, IsHandled);
                        if not IsHandled then
                            "Vendor Item No." := ItemVend."Vendor Item No.";
                        if not DoNotUpdateOrderReceiptDate then
                            UpdateOrderReceiptDate(ItemVend."Lead Time Calculation");
                    end else begin
                        GetPlanningParameters.AtSKU(TempSKU, "No.", "Variant Code", "Location Code");
                        if "Vendor No." = TempSKU."Vendor No." then
                            "Vendor Item No." := TempSKU."Vendor Item No."
                        else
                            "Vendor Item No." := '';
                    end;
                    OnValidateVendorNoOnBeforeGetDirectCost(Rec, xRec, CurrFieldNo);
                    GetDirectCost(FieldNo("Vendor No."))
                end;
                "Supply From" := "Vendor No.";
                OnValidateVendorNoOnAfterSetSupplyFrom(Rec);

                UpdateDim();
            end;
        }
        field(10; "Direct Unit Cost"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 2;
            Caption = 'Direct Unit Cost';
            ToolTip = 'Specifies the cost of one unit of the selected item or resource.';
        }
        field(12; "Due Date"; Date)
        {
            Caption = 'Due Date';
            ToolTip = 'Specifies the date when you can expect to receive the items.';

            trigger OnValidate()
            var
                ShouldExitDueDate: Boolean;
            begin
                if (CurrFieldNo = FieldNo("Due Date")) or (CurrentFieldNo = FieldNo("Due Date")) then
                    SetActionMessage();

                ShouldExitDueDate := "Due Date" = 0D;
                OnValidateDueDateOnAfterCalcShouldExitDueDate(Rec, xRec, CurrFieldNo, ShouldExitDueDate);
                if ShouldExitDueDate then
                    exit;

                if (CurrFieldNo = FieldNo("Due Date")) or (CurrentFieldNo = FieldNo("Due Date")) or (CurrFieldNo = FieldNo("Location Code")) then
                    if (Type = Type::Item) and
                       ("Planning Level" = 0)
                    then
                        Validate(
                          "Ending Date",
                          LeadTimeMgt.GetPlannedEndingDate("No.", "Location Code", "Variant Code", "Due Date", '', "Ref. Order Type"))
                    else
                        Validate("Ending Date", "Due Date");

                CheckDueDateToDemandDate();
            end;
        }
        field(13; "Requester ID"; Code[50])
        {
            Caption = 'Requester ID';
            ToolTip = 'Specifies the ID of the user who is ordering the items on the line.';
            TableRelation = User."User Name";
            ValidateTableRelation = false;

            trigger OnValidate()
            var
                UserSelection: Codeunit System.Security.User."User Selection";
            begin
                UserSelection.ValidateUserName("Requester ID");
            end;
        }
        field(14; Confirmed; Boolean)
        {
            Caption = 'Confirmed';
            ToolTip = 'Specifies whether the items on the line have been approved for purchase.';
        }
        field(15; "Shortcut Dimension 1 Code"; Code[20])
        {
            CaptionClass = '1,2,1';
            Caption = 'Shortcut Dimension 1 Code';
            ToolTip = 'Specifies the code for Shortcut Dimension 1, which is one of two global dimension codes that you set up in the General Ledger Setup window.';
            TableRelation = "Dimension Value".Code where("Global Dimension No." = const(1),
                                                          Blocked = const(false));

            trigger OnValidate()
            begin
                Rec.ValidateShortcutDimCode(1, "Shortcut Dimension 1 Code");
            end;
        }
        field(16; "Shortcut Dimension 2 Code"; Code[20])
        {
            CaptionClass = '1,2,2';
            Caption = 'Shortcut Dimension 2 Code';
            ToolTip = 'Specifies the code for Shortcut Dimension 2, which is one of two global dimension codes that you set up in the General Ledger Setup window.';
            TableRelation = "Dimension Value".Code where("Global Dimension No." = const(2),
                                                          Blocked = const(false));

            trigger OnValidate()
            begin
                Rec.ValidateShortcutDimCode(2, "Shortcut Dimension 2 Code");
            end;
        }
        field(17; "Location Code"; Code[10])
        {
            Caption = 'Location Code';
            ToolTip = 'Specifies a code for an inventory location where the items that are being ordered will be registered.';
            TableRelation = Location where("Use As In-Transit" = const(false));

            trigger OnValidate()
            var
                ItemVend: Record "Item Vendor";
                ShouldGetDefaultBin: Boolean;
            begin
                ValidateLocationChange();
                CheckActionMessageNew();
                "Bin Code" := '';
                ReqLineReserve.VerifyChange(Rec, xRec);

                if Type = Type::Item then begin
                    UpdateReplenishmentSystem();
                    if "Location Code" <> xRec."Location Code" then
                        if ("Location Code" <> '') and ("No." <> '') and not IsDropShipment() then begin
                            GetLocation("Location Code");
                            ShouldGetDefaultBin := Location."Bin Mandatory" and not Location."Directed Put-away and Pick";
                            OnValidateLocationCodeOnBeforeGetDefaultBin(Rec, ShouldGetDefaultBin, Location, CurrFieldNo);
                            if ShouldGetDefaultBin then
                                WMSManagement.GetDefaultBin("No.", "Variant Code", "Location Code", "Bin Code");
                        end;
                    if ItemVend.Get("Vendor No.", "No.", "Variant Code") then
                        "Vendor Item No." := ItemVend."Vendor Item No.";
                end;
                GetDirectCost(FieldNo("Location Code"));
                CreateDimFromDefaultDim();
                Validate("Due Date");
            end;
        }
        field(18; "Recurring Method"; Option)
        {
            BlankZero = true;
            Caption = 'Recurring Method';
            ToolTip = 'Specifies a recurring method, if you have indicated in the Recurring field that the worksheet is a recurring requisition worksheet.';
            OptionCaption = ',Fixed,Variable';
            OptionMembers = ,"Fixed",Variable;
        }
        field(19; "Expiration Date"; Date)
        {
            Caption = 'Expiration Date';
            ToolTip = 'Specifies the last date on which the recurring requisition worksheet will be converted to a purchase order.';
        }
        field(20; "Recurring Frequency"; DateFormula)
        {
            Caption = 'Recurring Frequency';
            ToolTip = 'Specifies a recurring frequency, if it is indicated in the Recurring field that the worksheet is a recurring requisition worksheet.';
        }
        field(21; "Order Date"; Date)
        {
            Caption = 'Order Date';
            ToolTip = 'Specifies the date when the related order was created.';

            trigger OnValidate()
            begin
                "Starting Date" := "Order Date";

                GetDirectCost(FieldNo("Order Date"));

                if CurrFieldNo = FieldNo("Order Date") then
                    Validate("Starting Date");
            end;
        }
        field(22; "Vendor Item No."; Text[50])
        {
            Caption = 'Vendor Item No.';
            ToolTip = 'Specifies the number that the vendor uses for this item.';
        }
        field(23; "Sales Order No."; Code[20])
        {
            Caption = 'Sales Order No.';
            Editable = false;
            TableRelation = "Sales Header"."No." where("Document Type" = const(Order));

            trigger OnValidate()
            begin
                ReqLineReserve.VerifyChange(Rec, xRec);
            end;
        }
        field(24; "Sales Order Line No."; Integer)
        {
            Caption = 'Sales Order Line No.';
            Editable = false;

            trigger OnValidate()
            begin
                ReqLineReserve.VerifyChange(Rec, xRec);
            end;
        }
        field(25; "Sell-to Customer No."; Code[20])
        {
            Caption = 'Sell-to Customer No.';
            ToolTip = 'Specifies the number of the customer.';
            Editable = false;
            TableRelation = Customer;

            trigger OnValidate()
            begin
                if "Sell-to Customer No." = '' then
                    "Ship-to Code" := ''
                else
                    Rec.Validate("Ship-to Code", '');

                ReqLineReserve.VerifyChange(Rec, xRec);
            end;
        }
        field(26; "Ship-to Code"; Code[10])
        {
            Caption = 'Ship-to Code';
            ToolTip = 'Specifies a code for an alternate shipment address if you want to ship to another address than the one that has been entered automatically. This field is also used in case of drop shipment.';
            Editable = false;
            TableRelation = "Ship-to Address".Code where("Customer No." = field("Sell-to Customer No."));

            trigger OnValidate()
            var
                Cust: Record Customer;
                ShipToAddr: Record "Ship-to Address";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeOnValidateShipToCode(Rec, IsHandled);
                if IsHandled then
                    exit;

                if "Ship-to Code" <> '' then begin
                    ShipToAddr.Get("Sell-to Customer No.", "Ship-to Code");
                    "Location Code" := ShipToAddr."Location Code";
                end else begin
                    Cust.Get("Sell-to Customer No.");
                    "Location Code" := Cust."Location Code";
                end;
            end;
        }
        field(28; "Order Address Code"; Code[10])
        {
            Caption = 'Order Address Code';
            ToolTip = 'Specifies the order address of the related vendor.';
            TableRelation = "Order Address".Code where("Vendor No." = field("Vendor No."));
        }
        field(29; "Currency Code"; Code[10])
        {
            Caption = 'Currency Code';
            ToolTip = 'Specifies the currency code for the requisition lines.';
            TableRelation = Currency;

            trigger OnValidate()
            var
                Currency: Record Currency;
                CurrExchRate: Record "Currency Exchange Rate";
            begin
                Currency.Initialize("Currency Code");
                if "Currency Code" <> '' then begin
                    TestField("Order Date");
                    if PlanningResiliency then
                        CheckExchRate(Currency);
                    OnValidateCurrencyCodeOnBeforeUpdateCurrencyFactor(Rec, CurrExchRate);
                    Rec.Validate("Currency Factor", CurrExchRate.ExchangeRate("Order Date", "Currency Code"));
                end else
                    Rec.Validate("Currency Factor", 0);

                GetDirectCost(FieldNo("Currency Code"));
            end;
        }
        field(30; "Currency Factor"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Currency Factor';
            DecimalPlaces = 0 : 15;
            MinValue = 0;

            trigger OnValidate()
            var
                CurrExchRate: Record "Currency Exchange Rate";
            begin
                if "Currency Code" <> '' then
                    TestField("Currency Factor");
                if "Currency Factor" <> xRec."Currency Factor" then begin
                    OnValidateCurrencyFactorOnBeforeUpdateDirectUnitCost(Rec, CurrExchRate);
                    if xRec."Currency Factor" <> 0 then
                        "Direct Unit Cost" :=
                          CurrExchRate.ExchangeAmtFCYToLCY(
                            "Order Date", xRec."Currency Code", "Direct Unit Cost", xRec."Currency Factor");
                    if "Currency Factor" <> 0 then
                        "Direct Unit Cost" :=
                          CurrExchRate.ExchangeAmtLCYToFCY(
                            "Order Date", "Currency Code", "Direct Unit Cost", "Currency Factor");
                end;
            end;
        }
        field(31; "Reserved Quantity"; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Reservation Entry".Quantity where("Source ID" = field("Worksheet Template Name"),
                                                                  "Source Ref. No." = field("Line No."),
                                                                  "Source Type" = const(246),
                                                                  "Source Subtype" = const("0"),
                                                                  "Source Batch Name" = field("Journal Batch Name"),
                                                                  "Source Prod. Order Line" = const(0),
                                                                  "Reservation Status" = const(Reservation)));
            Caption = 'Reserved Quantity';
            ToolTip = 'Specifies how many units of this item have been reserved.';
            DecimalPlaces = 0 : 5;
            Editable = false;
            FieldClass = FlowField;
        }
        field(43; "Purchaser Code"; Code[20])
        {
            Caption = 'Purchaser Code';
            ToolTip = 'Specifies which purchaser is assigned to the vendor.';
            TableRelation = "Salesperson/Purchaser" where(Blocked = const(false));

            trigger OnValidate()
            begin
                CreateDimFromDefaultDim();
            end;
        }
        field(73; "Drop Shipment"; Boolean)
        {
            AccessByPermission = TableData "Drop Shpt. Post. Buffer" = R;
            Caption = 'Drop Shipment';
            ToolTip = 'Specifies if demand is for drop shipment or not.';
            Editable = false;
        }
        field(480; "Dimension Set ID"; Integer)
        {
            Caption = 'Dimension Set ID';
            Editable = false;
            TableRelation = "Dimension Set Entry";

            trigger OnLookup()
            begin
                Rec.ShowDimensions();
            end;

            trigger OnValidate()
            begin
                DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
            end;
        }
        field(5402; "Variant Code"; Code[10])
        {
            Caption = 'Variant Code';
            ToolTip = 'Specifies the variant of the item on the line.';
            TableRelation = if (Type = const(Item)) "Item Variant".Code where("Item No." = field("No."));

            trigger OnValidate()
            var
                ItemVend: Record "Item Vendor";
                ShouldGetDefaultBin: Boolean;
            begin
                if "Variant Code" <> '' then begin
                    TestField(Type, Type::Item);
                    GetItemVariant();
                    ErrorIfItemVariantIsBlocked();
                end;
                CheckActionMessageNew();
                ReqLineReserve.VerifyChange(Rec, xRec);

                CalcFields("Reserved Qty. (Base)");
                TestField("Reserved Qty. (Base)", 0);

                GetDirectCost(FieldNo("Variant Code"));
                if "Variant Code" <> '' then begin
                    UpdateDescription();
                    UpdateReplenishmentSystem();
                    if "Variant Code" <> xRec."Variant Code" then begin
                        "Bin Code" := '';
                        if ("Location Code" <> '') and ("No." <> '') then begin
                            GetLocation("Location Code");
                            ShouldGetDefaultBin := Location."Bin Mandatory" and not Location."Directed Put-away and Pick";
                            OnBeforeGetDefaultBin(Rec, ShouldGetDefaultBin);
                            if ShouldGetDefaultBin then
                                WMSManagement.GetDefaultBin("No.", "Variant Code", "Location Code", "Bin Code");
                        end;
                    end;
                    if ItemVend.Get("Vendor No.", "No.", "Variant Code") then
                        "Vendor Item No." := ItemVend."Vendor Item No.";
                end else
                    Validate("No.");
            end;
        }
        field(5403; "Bin Code"; Code[20])
        {
            Caption = 'Bin Code';
            ToolTip = 'Specifies the bin of the item on the line.';
            TableRelation = Bin.Code where("Location Code" = field("Location Code"),
                                            "Item Filter" = field("No."),
                                            "Variant Filter" = field("Variant Code"));

            trigger OnValidate()
            begin
                CheckActionMessageNew();
                if (CurrFieldNo = FieldNo("Bin Code")) and
                   ("Action Message" <> "Action Message"::" ")
                then
                    TestField("Action Message", "Action Message"::New);
                TestField(Type, Type::Item);
                TestField("Location Code");
                GetItem();
                Item.TestField(Type, Item.Type::Inventory);
                if ("Bin Code" <> xRec."Bin Code") and ("Bin Code" <> '') then begin
                    GetLocation("Location Code");
                    Location.TestField("Bin Mandatory");
                    Location.TestField("Directed Put-away and Pick", false);
                    GetBin("Location Code", "Bin Code");
                    TestField("Location Code", Bin."Location Code");
                end;
                ReqLineReserve.VerifyChange(Rec, xRec);
            end;
        }
        field(5404; "Qty. per Unit of Measure"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. per Unit of Measure';
            DecimalPlaces = 0 : 5;
            Editable = false;
            InitValue = 1;
        }
        field(5405; "Qty. Rounding Precision"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Rounding Precision';
            InitValue = 0;
            DecimalPlaces = 0 : 5;
            MinValue = 0;
            MaxValue = 1;
            Editable = false;
        }
        field(5406; "Qty. Rounding Precision (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. Rounding Precision (Base)';
            InitValue = 0;
            DecimalPlaces = 0 : 5;
            MinValue = 0;
            MaxValue = 1;
            Editable = false;
        }
        field(5407; "Unit of Measure Code"; Code[10])
        {
            Caption = 'Unit of Measure Code';
            ToolTip = 'Specifies how each unit of the item or resource is measured, such as in pieces or hours. By default, the value in the Base Unit of Measure field on the item or resource card is inserted.';
            TableRelation = if (Type = const(Item)) "Item Unit of Measure".Code where("Item No." = field("No."))
            else
            "Unit of Measure";

            trigger OnValidate()
            begin
                CheckActionMessageNew();
                if (Type = Type::Item) and ("No." <> '') and (not IsProdOrder()) then
                    AssignItemUnitCostAndQuantitiesForUOM()
                else
                    if not IsProdOrder() then
                        "Qty. per Unit of Measure" := 1
                    else
                        "Qty. per Unit of Measure" := 0;

                OnValidateUnitofMeasureCodeOnBeforeGetDirectCost(Rec, Item);
                GetDirectCost(FieldNo("Unit of Measure Code"));

                if "Planning Line Origin" = "Planning Line Origin"::"Order Planning" then
                    SetSupplyQty("Demand Quantity (Base)", "Needed Quantity (Base)")
                else
                    Validate(Quantity);
            end;
        }
        field(5408; "Quantity (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity (Base)';
            DecimalPlaces = 0 : 5;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateQuantityBase(Rec, IsHandled, xRec, CurrFieldNo, CurrentFieldNo);
                if IsHandled then
                    exit;

                TestProdOrderNo();
                TestField("Qty. per Unit of Measure", 1);
                Validate(Quantity, "Quantity (Base)");
            end;
        }
        field(5431; "Reserved Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Reservation Entry"."Quantity (Base)" where("Source ID" = field("Worksheet Template Name"),
                                                                           "Source Ref. No." = field("Line No."),
                                                                           "Source Type" = const(246),
                                                                           "Source Subtype" = const("0"),
                                                                           "Source Batch Name" = field("Journal Batch Name"),
                                                                           "Source Prod. Order Line" = const(0),
                                                                           "Reservation Status" = const(Reservation)));
            Caption = 'Reserved Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
            FieldClass = FlowField;
        }
        field(5520; "Demand Type"; Integer)
        {
            Caption = 'Demand Type';
            Editable = false;
            TableRelation = System.Reflection.AllObjWithCaption."Object ID" where("Object Type" = const(Table));
        }
        field(5521; "Demand Subtype"; Option)
        {
            Caption = 'Demand Subtype';
            Editable = false;
            OptionCaption = '0,1,2,3,4,5,6,7,8,9';
            OptionMembers = "0","1","2","3","4","5","6","7","8","9";
        }
        field(5522; "Demand Order No."; Code[20])
        {
            Caption = 'Demand Order No.';
            ToolTip = 'Specifies the number of the demanded order that represents the planning line.';
            Editable = false;
        }
        field(5525; "Demand Line No."; Integer)
        {
            Caption = 'Demand Line No.';
            ToolTip = 'Specifies the line number of the demand, such as a sales order line.';
            Editable = false;
        }
        field(5526; "Demand Ref. No."; Integer)
        {
            Caption = 'Demand Ref. No.';
            Editable = false;
        }
        field(5527; Status; Option)
        {
            Caption = 'Status';
            Editable = false;
            OptionCaption = '0,1,2,3,4,5,6,7,8,9,10';
            OptionMembers = "0","1","2","3","4","5","6","7","8","9","10";
        }
        field(5530; "Demand Date"; Date)
        {
            Caption = 'Demand Date';
            ToolTip = 'Specifies the demanded date of the demand that the planning line represents.';
            Editable = false;
        }
        field(5532; "Demand Quantity"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Demand Quantity';
            ToolTip = 'Specifies the quantity on the demand that the planning line represents.';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5533; "Demand Quantity (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Demand Quantity (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5538; "Needed Quantity"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Needed Quantity';
            ToolTip = 'Specifies the demand quantity that is not available and must be ordered to meet the demand represented on the planning line.';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5539; "Needed Quantity (Base)"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Needed Quantity (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5540; Reserve; Boolean)
        {
            Caption = 'Reserve';
            ToolTip = 'Specifies whether the item on the planning line has a setting of Always in the Reserve field on its item card.';

            trigger OnValidate()
            begin
                GetItem();
                if Item.Reserve <> Item.Reserve::Optional then
                    TestField(Reserve, Item.Reserve = Item.Reserve::Always);
                if Reserve and IsProdDemand() then
                    Error(Text030);
                TestField("Planning Level", 0);
                TestField("Planning Line Origin", "Planning Line Origin"::"Order Planning");
            end;
        }
        field(5541; "Qty. per UOM (Demand)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Qty. per UOM (Demand)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5542; "Unit Of Measure Code (Demand)"; Code[10])
        {
            Caption = 'Unit Of Measure Code (Demand)';
            Editable = false;
            TableRelation = if (Type = const(Item)) "Item Unit of Measure".Code where("Item No." = field("No."));
        }
        field(5552; "Supply From"; Code[20])
        {
            Caption = 'Supply From';
            ToolTip = 'Specifies a value, according to the selected replenishment system, before a supply order can be created for the line.';
            TableRelation = if ("Replenishment System" = const(Purchase)) Vendor
            else
            if ("Replenishment System" = const(Transfer)) Location where("Use As In-Transit" = const(false));

            trigger OnLookup()
            var
                Vend: Record Vendor;
            begin
                case "Replenishment System" of
                    "Replenishment System"::Purchase:
                        if LookupVendor(Vend, true) then
                            Validate("Supply From", Vend."No.");
                    "Replenishment System"::Transfer:
                        if LookupFromLocation(Location) then
                            Validate("Supply From", Location.Code);
                    else
                        OnLookupSupplyFromOnCaseReplenishmentSystemElse(Rec);
                end;
            end;

            trigger OnValidate()
            begin
                case "Replenishment System" of
                    "Replenishment System"::Purchase:
                        Validate("Vendor No.", "Supply From");
                    "Replenishment System"::Transfer:
                        Validate("Transfer-from Code", "Supply From");
                    else
                        OnValidateSupplyFromOnCaseReplenishmentSystemElse(Rec);
                end;
            end;
        }
        field(5553; "Original Item No."; Code[20])
        {
            Caption = 'Original Item No.';
            Editable = false;
            TableRelation = Item;
        }
        field(5554; "Original Variant Code"; Code[10])
        {
            Caption = 'Original Variant Code';
            Editable = false;
            TableRelation = "Item Variant".Code where("Item No." = field("Original Item No."));
        }
        field(5560; Level; Integer)
        {
            Caption = 'Level';
            Editable = false;
        }
        field(5563; "Demand Qty. Available"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Demand Qty. Available';
            ToolTip = 'Specifies how many of the demand quantity are available.';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5590; "User ID"; Code[50])
        {
            Caption = 'User ID';
            DataClassification = EndUserIdentifiableInformation;
            Editable = false;
            TableRelation = User."User Name";
        }
        field(5701; "Item Category Code"; Code[20])
        {
            Caption = 'Item Category Code';
            TableRelation = if (Type = const(Item)) "Item Category";
        }
        field(5702; Nonstock; Boolean)
        {
            Caption = 'Catalog';
        }
        field(5703; "Purchasing Code"; Code[10])
        {
            Caption = 'Purchasing Code';
            ToolTip = 'Specifies the code for a special procurement method, such as drop shipment.';
            TableRelation = Purchasing;
        }
        field(5706; "Transfer-from Code"; Code[10])
        {
            Caption = 'Transfer-from Code';
            ToolTip = 'Specifies the code of the location that items are transferred from.';
            TableRelation = Location where("Use As In-Transit" = const(false));

            trigger OnValidate()
            begin
                CheckActionMessageNew();
                "Supply From" := "Transfer-from Code";
            end;
        }
        field(5707; "Transfer Shipment Date"; Date)
        {
            AccessByPermission = TableData "Transfer Header" = R;
            Caption = 'Transfer Shipment Date';
            ToolTip = 'Specifies the shipment date of the transfer order proposal.';
            Editable = false;
        }
        field(7000; "Price Calculation Method"; Enum "Price Calculation Method")
        {
            Caption = 'Price Calculation Method';
            ToolTip = 'Specifies the method that will be used for unit cost calculation in the line.';
        }
        field(7002; "Line Discount %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Line Discount %';
            ToolTip = 'Specifies the discount percentage that is granted for the item on the line.';
            MaxValue = 100;
            MinValue = 0;
        }
        field(7100; "Blanket Purch. Order Exists"; Boolean)
        {
            CalcFormula = exist("Purchase Line" where("Document Type" = const("Blanket Order"),
                                                       Type = const(Item),
                                                       "No." = field("No."),
                                                       "Outstanding Quantity" = filter(<> 0)));
            Caption = 'Blanket Purch. Order Exists';
            ToolTip = 'Specifies if a blanket purchase order exists for the item on the requisition line.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(7110; "Custom Sorting Order"; Code[50])
        {
        }
        field(99000755; "MPS Order"; Boolean)
        {
            Caption = 'MPS Order';
            ToolTip = 'Specifies whether the requisition worksheet line is an MPS order, that is, whether it is linked to a demand forecast or a sales order.';
        }
        field(99000756; "Planning Flexibility"; Enum "Reservation Planning Flexibility")
        {
            Caption = 'Planning Flexibility';
            ToolTip = 'Specifies whether the supply represented by this line is considered by the planning system when calculating action messages.';

            trigger OnValidate()
            begin
                if "Planning Flexibility" <> xRec."Planning Flexibility" then
                    ReqLineReserve.UpdatePlanningFlexibility(Rec);
            end;
        }
        field(99000757; "Routing Reference No."; Integer)
        {
            Caption = 'Routing Reference No.';
        }
        field(99000882; "Gen. Prod. Posting Group"; Code[20])
        {
            Caption = 'Gen. Prod. Posting Group';
            ToolTip = 'Specifies the item''s product type to link transactions made for this item with the appropriate general ledger account according to the general posting setup.';
            TableRelation = "Gen. Product Posting Group";
        }
        field(99000883; "Gen. Business Posting Group"; Code[20])
        {
            Caption = 'Gen. Business Posting Group';
            ToolTip = 'Specifies the code of the general business posting group to be used for the item when you post the planning worksheet.';
            TableRelation = "Gen. Business Posting Group";
        }
        field(99000884; "Low-Level Code"; Integer)
        {
            Caption = 'Low-Level Code';
            ToolTip = 'Specifies the planning level of this item entry in the planning worksheet.';
            Editable = false;
        }
        field(99000888; "Original Quantity"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Original Quantity';
            ToolTip = 'Specifies the quantity stated on the production or purchase order, when an action message proposes to change the quantity on an order.';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(99000889; "Finished Quantity"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Finished Quantity';
            DecimalPlaces = 0 : 5;
            Editable = false;
            MinValue = 0;
        }
        field(99000890; "Remaining Quantity"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Remaining Quantity';
            DecimalPlaces = 0 : 5;
            Editable = false;
            MinValue = 0;
        }
        field(99000891; "Original Due Date"; Date)
        {
            Caption = 'Original Due Date';
            ToolTip = 'Specifies the due date stated on the production or purchase order, when an action message proposes to reschedule an order.';
            Editable = false;
        }
        field(99000894; "Starting Date"; Date)
        {
            Caption = 'Starting Date';
            ToolTip = 'Specifies the starting date of the manufacturing process, if the planned supply is a production order.';

            trigger OnValidate()
            begin
                if Type = Type::Item then begin
                    OnValidateStartingDate(Rec);
                    Validate("Starting Time");
                end;
            end;
        }
        field(99000895; "Starting Time"; Time)
        {
            Caption = 'Starting Time';
            ToolTip = 'Specifies the starting time of the manufacturing process.';

            trigger OnValidate()
            var
                ShouldSetDueDate: Boolean;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateStartingTime(Rec, ShouldSetDueDate, IsHandled, CurrFieldNo, CurrentFieldNo, xRec);
                if IsHandled then
                    exit;

                TestField(Type, Type::Item);
                if ReqLine.Get("Worksheet Template Name", "Journal Batch Name", "Line No.") then
                    PlanningLineMgt.Recalculate(Rec, 0)
                else
                    CalcEndingDate('');

                CheckEndingDate(ValidateFields());

                ShouldSetDueDate := true;
                OnValidateStartingTimeOnBeforeSetDueDate(Rec, ShouldSetDueDate, xRec, CurrentFieldNo, CurrFieldNo);
                if ShouldSetDueDate then
                    SetDueDate();

                SetActionMessage();
                OnValidateStartingTimeOnBeforeUpdateDateTime(Rec);
                UpdateDatetime();
            end;
        }
        field(99000896; "Ending Date"; Date)
        {
            Caption = 'Ending Date';
            ToolTip = 'Specifies the ending date of the manufacturing process, if the planned supply is a production order.';

            trigger OnValidate()
            begin
                CheckEndingDate(ValidateFields());

                if Type = Type::Item then begin
                    Validate("Ending Time");
                    OnValidateEndingDate(Rec);
                end;
            end;
        }
        field(99000897; "Ending Time"; Time)
        {
            Caption = 'Ending Time';
            ToolTip = 'Specifies the ending time for the manufacturing process.';

            trigger OnValidate()
            var
                ShouldSetDueDate: Boolean;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateEndingTime(Rec, ShouldSetDueDate, IsHandled, CurrFieldNo, CurrentFieldNo);
                if IsHandled then
                    exit;

                TestField(Type, Type::Item);
                if ReqLine.Get("Worksheet Template Name", "Journal Batch Name", "Line No.") then
                    PlanningLineMgt.RecalculateWithOptionalModify(Rec, 1, false)
                else
                    CalcStartingDate('');

                ShouldSetDueDate := (CurrFieldNo in [FieldNo("Ending Date"), FieldNo("Ending Date-Time")]) and (CurrentFieldNo <> FieldNo("Due Date"));
                OnValidateEndingTimeOnBeforeSetDueDate(Rec, ShouldSetDueDate);
                if ShouldSetDueDate then
                    SetDueDate();

                SetActionMessage();
                OnValidateEndingTimeOnBeforeUpdateDateTime(Rec);
                UpdateDatetime();
            end;
        }
        field(99000899; "Indirect Cost %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Indirect Cost %';
            DecimalPlaces = 0 : 5;
        }
        field(99000900; "Overhead Rate"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Overhead Rate';
            DecimalPlaces = 0 : 5;
        }
        field(99000901; "Unit Cost"; Decimal)
        {
            AutoFormatType = 2;
            AutoFormatExpression = '';
            Caption = 'Unit Cost';
            ToolTip = 'Specifies the cost of one unit of the item or resource on the line.';
            MinValue = 0;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateUnitCost(Rec, IsHandled);
                if IsHandled then
                    exit;

                TestField(Type, Type::Item);
                TestField("No.");

                Item.Get("No.");
                if Item."Costing Method" = Item."Costing Method"::Standard then begin
                    if CurrFieldNo = FieldNo("Unit Cost") then
                        Error(
                          Text006,
                          FieldCaption("Unit Cost"), Item.FieldCaption("Costing Method"), Item."Costing Method");
                    "Unit Cost" := Item."Unit Cost" * "Qty. per Unit of Measure";
                end;
                "Cost Amount" := Round("Unit Cost" * Quantity);
            end;
        }
        field(99000902; "Cost Amount"; Decimal)
        {
            AutoFormatType = 0;
            AutoFormatExpression = '';
            Caption = 'Cost Amount';
            ToolTip = 'Specifies the total costs for the requisition worksheet line.';
            Editable = false;
            MinValue = 0;
        }
        field(99000903; "Replenishment System"; Enum "Replenishment System")
        {
            Caption = 'Replenishment System';
            ToolTip = 'Specifies which kind of order to use to create replenishment orders and order proposals.';

            trigger OnValidate()
            var
                StockkeepingUnit: Record "Stockkeeping Unit";
            begin
                TestField(Type, Type::Item);
                CheckActionMessageNew();
                if ValidateFields() and
                   ("Replenishment System" = xRec."Replenishment System") and
                   ("No." = xRec."No.") and
                   ("Location Code" = xRec."Location Code") and
                   ("Variant Code" = xRec."Variant Code")
                then
                    exit;

                TestField(Type, Type::Item);
                TestField("No.");
                GetItem();

                if Item.IsNonInventoriableType() then
                    if "Replenishment System" <> "Replenishment System"::Purchase then
                        Error(ErrorInfo.Create(StrSubstNo(ReplenishmentSystemPurchaseErr, Item."No.", "Location Code", Rec.FieldCaption("Replenishment System"), "Replenishment System"::Purchase, "Replenishment System")));

                StockkeepingUnit := Item.GetSKU("Location Code", "Variant Code");
                OnValidateReplenishmentSystemOnAfterSetStockkeepingUnit(Rec, StockkeepingUnit, Subcontracting);

                "Supply From" := '';

                case "Replenishment System" of
                    "Replenishment System"::Purchase:
                        SetReplenishmentSystemFromPurchase(StockkeepingUnit);
                    "Replenishment System"::Transfer:
                        SetReplenishmentSystemFromTransfer(StockkeepingUnit);
                    else
                        OnValidateReplenishmentSystemCaseElse(Rec, StockkeepingUnit);
                end;
            end;
        }
        field(99000904; "Ref. Order No."; Code[20])
        {
            Caption = 'Ref. Order No.';
            ToolTip = 'Specifies the number of the relevant production or purchase order.';
            Editable = false;
            TableRelation = if ("Ref. Order Type" = const(Purchase)) "Purchase Header"."No." where("Document Type" = const(Order))
            else
            if ("Ref. Order Type" = const(Transfer)) "Transfer Header"."No." where("No." = field("Ref. Order No."));
            ValidateTableRelation = false;

            trigger OnLookup()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnLookupRefOrderNoOnBeforeOpenPage(Rec, IsHandled);
                if not IsHandled then
                    LookupRefOrderNo();
            end;
        }
        field(99000905; "Ref. Order Type"; Enum "Requisition Ref. Order Type")
        {
            Caption = 'Ref. Order Type';
            ToolTip = 'Specifies whether the order is a purchase order, a production order, or a transfer order.';
            Editable = false;
        }
        field(99000906; "Ref. Order Status"; Enum Microsoft.Manufacturing.Document."Production Order Status")
        {
            BlankZero = true;
            Caption = 'Ref. Order Status';
            ToolTip = 'Specifies the status of the production order.';
            Editable = false;
        }
        field(99000907; "Ref. Line No."; Integer)
        {
            BlankZero = true;
            Caption = 'Ref. Line No.';
            ToolTip = 'Specifies the number of the purchase or production order line.';
            Editable = false;
        }
        field(99000908; "No. Series"; Code[20])
        {
            Caption = 'No. Series';
            Editable = false;
            TableRelation = "No. Series";
        }
        field(99000910; "Expected Component Cost Amt."; Decimal)
        {
            AutoFormatType = 0;
            AutoFormatExpression = '';
            CalcFormula = sum("Planning Component"."Cost Amount" where("Worksheet Template Name" = field("Worksheet Template Name"),
                                                                        "Worksheet Batch Name" = field("Journal Batch Name"),
                                                                        "Worksheet Line No." = field("Line No.")));
            Caption = 'Expected Component Cost Amt.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(99000911; "Finished Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Finished Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(99000912; "Remaining Qty. (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Remaining Qty. (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(99000913; "Related to Planning Line"; Integer)
        {
            Caption = 'Related to Planning Line';
            Editable = false;
        }
        field(99000914; "Planning Level"; Integer)
        {
            Caption = 'Planning Level';
            ToolTip = 'Indicates the planning level of the item in multi-level production orders. The planning level is calculated only for items that have Make-to-Order specified in the Manufacturing Policy field.';
            Editable = false;
        }
        field(99000915; "Planning Line Origin"; Enum "Planning Line Origin Type")
        {
            Caption = 'Planning Line Origin';
            Editable = false;
        }
        field(99000916; "Action Message"; Enum "Action Message Type")
        {
            Caption = 'Action Message';
            ToolTip = 'Specifies an action to take to rebalance the demand-supply situation.';

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateActionMessage(Rec, xRec, IsHandled);
                if IsHandled then
                    exit;

                if ("Action Message" = xRec."Action Message") or
                   (("Action Message" in ["Action Message"::" ", "Action Message"::New]) and
                    (xRec."Action Message" in ["Action Message"::" ", "Action Message"::New]))
                then
                    exit;
                TestField("Action Message", xRec."Action Message");
            end;
        }
        field(99000917; "Accept Action Message"; Boolean)
        {
            Caption = 'Accept Action Message';
            ToolTip = 'Specifies whether to accept the action message proposed for the line.';

            trigger OnValidate()
            begin
                if "Action Message" = "Action Message"::" " then
                    Validate("Action Message", "Action Message"::New);
            end;
        }
        field(99000918; "Net Quantity (Base)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Net Quantity (Base)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(99000919; "Starting Date-Time"; DateTime)
        {
            Caption = 'Starting Date-Time';
            ToolTip = 'Specifies the starting date and the starting time, which are combined in a format called "starting date-time".';

            trigger OnValidate()
            begin
                "Starting Date" := DT2Date("Starting Date-Time");
                "Starting Time" := DT2Time("Starting Date-Time");

                Validate("Starting Date");
            end;
        }
        field(99000920; "Ending Date-Time"; DateTime)
        {
            Caption = 'Ending Date-Time';
            ToolTip = 'Specifies the ending date and the ending time, which are combined in a format called "ending date-time".';

            trigger OnValidate()
            begin
                "Ending Date" := DT2Date("Ending Date-Time");
                "Ending Time" := DT2Time("Ending Date-Time");

                Validate("Ending Date");
            end;
        }
        field(99000921; "Order Promising ID"; Code[20])
        {
            Caption = 'Order Promising ID';
        }
        field(99000922; "Order Promising Line No."; Integer)
        {
            Caption = 'Order Promising Line No.';
        }
        field(99000923; "Order Promising Line ID"; Integer)
        {
            Caption = 'Order Promising Line ID';
        }
    }

    keys
    {
        key(Key1; "Worksheet Template Name", "Journal Batch Name", "Line No.")
        {
            Clustered = true;
        }
        key(Key2; "Worksheet Template Name", "Journal Batch Name", "Vendor No.", "Sell-to Customer No.", "Ship-to Code", "Order Address Code", "Currency Code", "Ref. Order Type", "Ref. Order Status", "Ref. Order No.", "Location Code", "Transfer-from Code", "Purchasing Code")
        {
            MaintainSQLIndex = false;
        }
        key(Key3; Type, "No.", "Variant Code", "Location Code", "Sales Order No.", "Planning Line Origin", "Due Date", "Drop Shipment")
        {
            IncludedFields = "Quantity (Base)";
        }
        key(Key4; Type, "No.", "Variant Code", "Location Code", "Sales Order No.", "Order Date")
        {
            IncludedFields = "Quantity (Base)";
        }
        key(Key5; Type, "No.", "Variant Code", "Location Code", "Starting Date")
        {
            IncludedFields = "Quantity (Base)";
        }
        key(Key6; "Worksheet Template Name", "Journal Batch Name", Type, "No.", "Due Date")
        {
            MaintainSQLIndex = false;
        }
        key(Key7; "Ref. Order Type", "Ref. Order Status", "Ref. Order No.", "Ref. Line No.")
        {
        }
        key(Key8; "Replenishment System", Type, "No.", "Variant Code", "Transfer-from Code", "Transfer Shipment Date")
        {
            IncludedFields = "Quantity (Base)";
        }
        key(Key9; "Order Promising ID", "Order Promising Line ID", "Order Promising Line No.")
        {
        }
        key(Key10; "User ID", "Demand Type", "Worksheet Template Name", "Journal Batch Name", "Line No.")
        {
        }
        key(Key11; "User ID", "Demand Type", "Demand Subtype", "Demand Order No.", "Demand Line No.", "Demand Ref. No.")
        {
        }
        key(Key12; "User ID", "Worksheet Template Name", "Journal Batch Name", "Line No.")
        {
            MaintainSQLIndex = false;
        }
        key(Key13; "Worksheet Template Name", "Journal Batch Name", "Custom Sorting Order")
        {
        }
        key(Key14; "Demand Order No.", "Demand Ref. No.", "Demand Subtype", "Demand Line No.", "Demand Type")
        {
            IncludedFields = "User ID";
        }
    }

    fieldgroups
    {
        fieldgroup(Brick; "No.", Description, Quantity, "Replenishment System", "Order Date")
        { }
    }

    trigger OnDelete()
    var
        RequisitionWkshName: Record "Requisition Wksh. Name";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeOnDelete(Rec, IsHandled);
        if IsHandled then
            exit;

        if RequisitionWkshName.Get(Rec."Worksheet Template Name", Rec."Journal Batch Name") then
            ApprovalsMgmt.PreventDeletingRecordWithOpenApprovalEntry(RequisitionWkshName);

        ReqLine.Reset();
        ReqLine.Get("Worksheet Template Name", "Journal Batch Name", "Line No.");
        while (ReqLine.Next() <> 0) and (ReqLine.Level > Level) do
            ReqLine.Delete(true);

        ReqLineReserve.DeleteLine(Rec);

        CalcFields("Reserved Qty. (Base)");
        TestField("Reserved Qty. (Base)", 0);

        DeleteRelations();
    end;

    trigger OnInsert()
    var
        Rec2: Record "Requisition Line";
    begin
        if CurrentKey <> Rec2.CurrentKey then begin
            Rec2 := Rec;
            Rec2.SetRecFilter();
            Rec2.SetRange("Line No.");
            if Rec2.FindLast() then
                "Line No." := Rec2."Line No." + 10000;
        end;

        ReqLineReserve.VerifyQuantity(Rec, xRec);

        ReqWkshTemplate.Get("Worksheet Template Name");
        ReqWkshName.Get("Worksheet Template Name", "Journal Batch Name");

        ApprovalsMgmt.PreventInsertRecIfOpenApprovalEntryExist(ReqWkshName);

        Rec.ValidateShortcutDimCode(1, "Shortcut Dimension 1 Code");
        Rec.ValidateShortcutDimCode(2, "Shortcut Dimension 2 Code");

        OnAfterOnInsert(Rec, ReqWkshTemplate, ReqWkshName);
    end;

    trigger OnModify()
    begin
        PreventModifyRecIfOpenApprovalEntryExist();
        ReqLineReserve.VerifyChange(Rec, xRec);
    end;

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

    var
        ReqWkshName: Record "Requisition Wksh. Name";
        ReqLine: Record "Requisition Line";
        ItemVariant: Record "Item Variant";
        Location: Record Location;
        Bin: Record Bin;
        ReqLineReserve: Codeunit "Req. Line-Reserve";
        UOMMgt: Codeunit "Unit of Measure Management";
        DimMgt: Codeunit DimensionManagement;
        LeadTimeMgt: Codeunit "Lead-Time Management";
        GetPlanningParameters: Codeunit "Planning-Get Parameters";
        WMSManagement: Codeunit "WMS Management";
        ConfirmManagement: Codeunit System.Utilities."Confirm Management";
        ApprovalsMgmt: Codeunit "Approvals Mgmt.";
        BlockReservation: Boolean;
        DoNotUpdateOrderReceiptDate: Boolean;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text004: Label 'You cannot rename a %1.';
        Text005: Label '%1 %2 does not exist.';
        Text006: Label 'You cannot change %1 when %2 is %3.';
        Text007: Label 'There is no %1 for this line.';
#pragma warning restore AA0470
        Text008: Label 'There is no replenishment order for this line.';
#pragma warning restore AA0074
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text028: Label 'The %1 on this %2 must match the %1 on the sales order line it is associated with.';
        Text029: Label 'Line %1 has a %2 that exceeds the %3.';
#pragma warning restore AA0470
        Text030: Label 'You cannot reserve components with status Planned.';
#pragma warning disable AA0470
        Text031: Label '%1 %2 is blocked.';
        Text037: Label 'The currency exchange rate for the %1 %2 that vendor %3 uses on the order date %4, does not have an %5 specified.';
        Text038: Label 'The currency exchange rate for the %1 %2 that vendor %3 uses on the order date %4, does not exist.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        ConfirmDeleteAllLinesQst: Label 'Go ahead and delete all lines?';
        BlockedErr: Label 'You cannot choose %1 %2 because the %3 check box is selected on its %1 card.', Comment = '%1 - Table Caption (item/variant), %2 - Item No./Variant Code, %3 - Field Caption';
        ItemVariantPrimaryKeyLbl: Label '%1, %2', Comment = '%1 - Item No., %2 - Variant Code', Locked = true;
        ReplenishmentSystemPurchaseErr: Label 'Item %1 in Location %2 should have %3 set to %4. Current %3 is %5.', Comment = '%1= Item No., %2= Location Code, %3= Replenishment System Caption, %4= Replenishment System::Purchase, %5= Field Value.';

    protected var
        Item: Record Item;
        ReqWkshTemplate: Record "Req. Wksh. Template";
        TempPlanningErrorLog: Record "Planning Error Log" temporary;
        PlanningLineMgt: Codeunit "Planning Line Management";
        CurrentFieldNo: Integer;
        PlanningResiliency: Boolean;
        Subcontracting: Boolean;
        MissingFieldValueErr: Label '%1 %2 has no %3 defined.', Comment = '%1 %2 - Item No., %3 - field caption';

    local procedure AssignItemUnitCostAndQuantitiesForUOM()
    var
        IsHandled: Boolean;
    begin
        GetItem();
        IsHandled := false;
        OnBeforeAssignItemUnitCostAndQuantitiesForUOM(Rec, xRec, Item, IsHandled);
        if IsHandled then
            exit;

        "Unit Cost" := Item."Unit Cost";
        "Overhead Rate" := Item."Overhead Rate";
        "Qty. per Unit of Measure" := UOMMgt.GetQtyPerUnitOfMeasure(Item, "Unit of Measure Code");
        "Qty. Rounding Precision" := UOMMgt.GetQtyRoundingPrecision(Item, "Unit of Measure Code");
        "Qty. Rounding Precision (Base)" := UOMMgt.GetQtyRoundingPrecision(Item, Item."Base Unit of Measure");
        if "Unit of Measure Code" <> '' then begin
            "Qty. per Unit of Measure" := UOMMgt.GetQtyPerUnitOfMeasure(Item, "Unit of Measure Code");
            "Unit Cost" := Round(Item."Unit Cost" * "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision());
        end else
            "Qty. per Unit of Measure" := 1;

    end;

    local procedure CopyFromGLAcc()
    var
        GLAcc: Record "G/L Account";
        ShouldTestFieldDirectPosting: Boolean;
    begin
        GLAcc.Get("No.");
        GLAcc.CheckGLAcc();
        ShouldTestFieldDirectPosting := true;
        OnCopyFromGLAccOnBeforeTestFieldDirectPosting(Rec, GLAcc, ShouldTestFieldDirectPosting);
        if ShouldTestFieldDirectPosting then
            GLAcc.TestField("Direct Posting", true);
        CopyDescriptionFromGLAcc(GLAcc);
    end;

    local procedure CopyDescriptionFromGLAcc(GLAcc: Record "G/L Account")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyDescriptionFromGLAcc(Rec, IsHandled);
        if IsHandled then
            exit;

        Description := GLAcc.Name;
    end;

    procedure CopyFromItem()
    begin
        GetItem();
        OnBeforeCopyFromItem(Rec, Item, xRec, CurrFieldNo, TempPlanningErrorLog, PlanningResiliency);

        if PlanningResiliency and Item.Blocked then
            TempPlanningErrorLog.SetError(
              StrSubstNo(Text031, Item.TableCaption(), Item."No."),
              Database::Item, CopyStr(Item.GetPosition(), 1, 250));
        CheckBlockedItem();
        "Low-Level Code" := Item."Low-Level Code";
        "Item Category Code" := Item."Item Category Code";
        "Gen. Prod. Posting Group" := Item."Gen. Prod. Posting Group";
        "Gen. Business Posting Group" := '';
        if PlanningResiliency and (Item."Base Unit of Measure" = '') then
            TempPlanningErrorLog.SetError(
              StrSubstNo(MissingFieldValueErr, Item.TableCaption(), Item."No.",
                Item.FieldCaption("Base Unit of Measure")),
              Database::Item, CopyStr(Item.GetPosition(), 1, 250));
        Item.TestField("Base Unit of Measure");
        "Indirect Cost %" := Item."Indirect Cost %";
        UpdateReplenishmentSystem();
        "Accept Action Message" := true;
        "Action Message" := "Action Message"::New;
        GetDirectCost(FieldNo("No."));
        SetFromBinCode();

        OnAfterCopyFromItem(Rec, Item, CurrFieldNo);
    end;

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

        Item.TestField(Blocked, false);
    end;

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

    procedure ShowReservation()
    var
        ReservationPage: Page Reservation;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeShowReservation(Rec, IsHandled);
        if IsHandled then
            exit;

        TestField(Type, Type::Item);
        TestField("No.");
        Clear(ReservationPage);
        ReservationPage.SetReservSource(Rec);
        ReservationPage.RunModal();
    end;

    procedure ShowReservationEntries(Modal: Boolean)
    var
        ReservEntry: Record "Reservation Entry";
    begin
        TestField(Type, Type::Item);
        TestField("No.");
        ReservEntry.InitSortingAndFilters(true);
        SetReservationFilters(ReservEntry);
        if Modal then
            PAGE.RunModal(PAGE::"Reservation Entries", ReservEntry)
        else
            PAGE.Run(PAGE::"Reservation Entries", ReservEntry);
    end;

    procedure UpdateOrderReceiptDate(LeadTimeCalc: DateFormula)
    var
        IsHandled: Boolean;
    begin
        OnBeforeUpdateOrderReceiptDate(Rec, LeadTimeCalc, IsHandled);
        if IsHandled then
            exit;

        CalcFields("Reserved Qty. (Base)");
        if "Reserved Qty. (Base)" = 0 then begin
            if "Order Date" <> 0D then
                "Starting Date" := "Order Date"
            else begin
                "Starting Date" := WorkDate();
                "Order Date" := "Starting Date";
            end;
            CalcEndingDate(Format(LeadTimeCalc));
            CheckEndingDate(ValidateFields());
            SetDueDate();
        end else
            if (Format(LeadTimeCalc) = '') or ("Due Date" = 0D) then
                "Order Date" := 0D
            else
                if "Due Date" <> 0D then begin
                    "Ending Date" :=
                      LeadTimeMgt.GetPlannedEndingDate(
                        "No.", "Location Code", "Variant Code", "Due Date", '', "Ref. Order Type");
                    CalcStartingDate(Format(LeadTimeCalc));
                end;

        SetActionMessage();
        UpdateDatetime();

        OnAfterUpdateOrderReceiptDate(Rec, LeadTimeCalc);
    end;

    procedure LookupVendor(var Vend: Record Vendor; PreferItemVendorCatalog: Boolean): Boolean
    var
        ItemVend: Record "Item Vendor";
        LookupThroughItemVendorCatalog: Boolean;
        IsHandled: Boolean;
        IsVendorSelected: Boolean;
    begin
        IsHandled := false;
        IsVendorSelected := false;
        OnBeforeLookupVendor(Rec, Vend, PreferItemVendorCatalog, IsHandled, IsVendorSelected);
        if IsHandled then
            exit(IsVendorSelected);

        if (Type = Type::Item) and ItemVend.ReadPermission then begin
            ItemVend.Init();
            ItemVend.SetRange("Item No.", "No.");
            ItemVend.SetRange("Vendor No.", "Vendor No.");
            if "Variant Code" <> '' then
                ItemVend.SetRange("Variant Code", "Variant Code");
            if not ItemVend.FindLast() then begin
                ItemVend."Item No." := "No.";
                ItemVend."Variant Code" := "Variant Code";
                ItemVend."Vendor No." := "Vendor No.";
            end;
            ItemVend.SetRange("Vendor No.");
            LookupThroughItemVendorCatalog := not ItemVend.IsEmpty() or PreferItemVendorCatalog;
        end;

        if LookupThroughItemVendorCatalog then begin
            if PAGE.RunModal(0, ItemVend) = ACTION::LookupOK then
                exit(Vend.Get(ItemVend."Vendor No."));
        end else begin
            Vend."No." := "Vendor No.";
            exit(PAGE.RunModal(0, Vend) = ACTION::LookupOK);
        end;
    end;

    procedure LookupFromLocation(var Location2: Record Location): Boolean
    begin
        Location2.Code := "Transfer-from Code";
        Location2.SetRange("Use As In-Transit", false);
        OnLookupFromLocationOnAfterSetFilters(Rec, Location2);
        exit(PAGE.RunModal(0, Location2) = ACTION::LookupOK);
    end;

    procedure UpdateDescription()
    var
        ItemVariantLocal: Record "Item Variant";
        SalesLine: Record "Sales Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateDescription(Rec, CurrFieldNo, IsHandled, xRec);
        if IsHandled then
            exit;

        if (Type <> Type::Item) or ("No." = '') then
            exit;


        IsHandled := false;
        OnUpdateWorkCenterDescription(Rec, IsHandled);
        if IsHandled then
            exit;

        if Rec."Variant Code" = '' then begin
            GetItem();
            Description := Item.Description;
            "Description 2" := Item."Description 2";
            if Item."Purch. Unit of Measure" = '' then
                "Unit of Measure Code" := Item."Base Unit of Measure";
            OnUpdateDescriptionFromItem(Rec, Item);
        end else begin
            ItemVariantLocal.Get("No.", "Variant Code");
            Description := ItemVariantLocal.Description;
            "Description 2" := ItemVariantLocal."Description 2";
            OnUpdateDescriptionFromItemVariant(Rec, ItemVariantLocal);
        end;

        if SalesLine.Get(SalesLine."Document Type"::Order, "Sales Order No.", "Sales Order Line No.") then begin
            Description := SalesLine.Description;
            "Description 2" := SalesLine."Description 2";
            OnUpdateDescriptionFromSalesLine(Rec, SalesLine);
        end;

        if "Vendor No." <> '' then
            UpdateItemReferenceDescription();
        OnAfterUpdateDescription(Rec, Item, ItemVariantLocal, CurrFieldNo);
    end;

    local procedure ValidateItemDescriptionAndQuantity(Vendor: Record Vendor)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateItemDescriptionAndQuantity(Rec, Vendor, IsHandled);
        if IsHandled then
            exit;

        if Type = Type::Item then
            UpdateDescription();
        Validate(Quantity);
    end;

    local procedure UpdateItemReferenceDescription()
    var
        ItemReference: Record "Item Reference";
        ItemTranslation: Record "Item Translation";
        Vendor: Record Vendor;
        IsHandled: Boolean;
    begin
        OnBeforeUpdateItemReferenceDescription(Rec, IsHandled);
        if IsHandled then
            exit;
        if not ItemReference.FindItemDescription(
                Description, "Description 2", "No.", "Variant Code", "Unit of Measure Code",
                Rec."Order Date", Enum::"Item Reference Type"::Vendor, "Vendor No.")
        then begin
            Vendor.Get("Vendor No.");
            if Vendor."Language Code" <> '' then
                if ItemTranslation.Get("No.", "Variant Code", Vendor."Language Code") then begin
                    Description := ItemTranslation.Description;
                    "Description 2" := ItemTranslation."Description 2";
                    OnUpdateDescriptionFromItemTranslation(Rec, ItemTranslation);
                end;
        end;
    end;

    procedure BlockDynamicTracking(SetBlock: Boolean)
    begin
        ReqLineReserve.Block(SetBlock);
    end;

    procedure BlockDynamicTrackingOnComp(SetBlock: Boolean)
    begin
        BlockReservation := SetBlock;
    end;

    procedure CreateDim(DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    var
        SourceCodeSetup: Record "Source Code Setup";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateDim(Rec, DefaultDimSource, CurrFieldNo, IsHandled);
        if IsHandled then
            exit;

        SourceCodeSetup.Get();

        "Shortcut Dimension 1 Code" := '';
        "Shortcut Dimension 2 Code" := '';
        "Dimension Set ID" :=
          DimMgt.GetRecDefaultDimID(
            Rec, CurrFieldNo, DefaultDimSource, SourceCodeSetup.Purchases, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code", 0, 0);

        DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");

        if "Ref. Order No." <> '' then
            GetDimFromRefOrderLine(true);

        if ("Demand Type" = Database::"Job Planning Line") then
            UpdateJobTaskDimensions();

        OnAfterCreateDim(Rec, xRec);
    end;

    local procedure UpdateDim()
    var
        DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
    begin
        InitDefaultDimensionSources(DefaultDimSource);
        UpdateDim(DefaultDimSource);
    end;

    procedure UpdateDim(DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    var
        SalesLine: Record "Sales Line";
        DimManagement: Codeunit DimensionManagement;
        DimSetIDArr: array[10] of Integer;
    begin
        CreateDim(DefaultDimSource);
        if "Demand Type" <> Database::"Sales Line" then
            exit;
        SalesLine.Get("Demand Subtype", "Demand Order No.", "Demand Line No.");
        DimSetIDArr[2] := SalesLine."Dimension Set ID";
        DimSetIDArr[1] := "Dimension Set ID";
        DimSetIDArr[1] := DimManagement.GetCombinedDimensionSetID(DimSetIDArr, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
        Validate("Dimension Set ID", DimSetIDArr[1]);

        OnAfterUpdateDim(Rec, DefaultDimSource);
    end;

    procedure ValidateShortcutDimCode(FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
        OnBeforeValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);

        DimMgt.ValidateShortcutDimValues(FieldNumber, ShortcutDimCode, "Dimension Set ID");

        OnAfterValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);
    end;

    procedure LookupShortcutDimCode(FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
        DimMgt.LookupDimValueCode(FieldNumber, ShortcutDimCode);
        DimMgt.ValidateShortcutDimValues(FieldNumber, ShortcutDimCode, "Dimension Set ID");
    end;

    procedure ShowShortcutDimCode(var ShortcutDimCode: array[8] of Code[20])
    begin
        DimMgt.GetShortcutDimensions(Rec."Dimension Set ID", ShortcutDimCode);
    end;

    procedure OpenItemTrackingLines()
    begin
        TestField(Type, Type::Item);
        TestField("No.");
        TestField("Quantity (Base)");
        ReqLineReserve.CallItemTracking(Rec);
    end;

    procedure DeleteRelations()
    begin
        DeleteRelations(false);
    end;

    procedure DeleteRelations(DeleteAllLines: Boolean)
    var
        PlanningComponent: Record "Planning Component";
        UntrackedPlanningElement: Record "Untracked Planning Element";
        ReservationEntry: Record "Reservation Entry";
        PlngComponentReserve: Codeunit "Plng. Component-Reserve";
        IsHandled: Boolean;
    begin
        if not DeleteAllLines then begin
            if Type <> Type::Item then
                exit;
            PlanningComponent.SetRange("Worksheet Line No.", "Line No.");
            UntrackedPlanningElement.SetRange("Worksheet Line No.", "Line No.");
        end;

        PlanningComponent.SetRange("Worksheet Template Name", "Worksheet Template Name");
        PlanningComponent.SetRange("Worksheet Batch Name", "Journal Batch Name");
        if PlanningComponent.FindSet() then
            repeat
                PlanningComponent.BlockDynamicTracking(BlockReservation);
                IsHandled := false;
                OnDeleteRelationsOnBeforePlanningComponentDelete(Rec, IsHandled);
                if not IsHandled then
                    if not DeleteAllLines then
                        PlanningComponent.Delete(true)
                    else
                        PlanningComponent.Delete(PlngComponentReserve.FindReservEntry(PlanningComponent, ReservationEntry));
            until PlanningComponent.Next() = 0;

        UntrackedPlanningElement.SetRange("Worksheet Template Name", "Worksheet Template Name");
        UntrackedPlanningElement.SetRange("Worksheet Batch Name", "Journal Batch Name");
        if not UntrackedPlanningElement.IsEmpty() then
            UntrackedPlanningElement.DeleteAll();

        OnAfterDeleteRelations(Rec, DeleteAllLines);
    end;

    procedure DeleteMultiLevel()
    var
        ReqLine2: Record "Requisition Line";
    begin
        OnBeforeDeleteMultiLevel(Rec);
        ReqLine2.SetCurrentKey("Ref. Order Type", "Ref. Order Status", "Ref. Order No.", "Ref. Line No.");
        ReqLine2.SetRange("Ref. Order Type", "Ref. Order Type");
        ReqLine2.SetRange("Ref. Order Status", "Ref. Order Status");
        ReqLine2.SetRange("Ref. Order No.", "Ref. Order No.");
        ReqLine2.SetRange("Worksheet Template Name", "Worksheet Template Name");
        ReqLine2.SetRange("Journal Batch Name", "Journal Batch Name");
        ReqLine2.SetFilter("Line No.", '<>%1', "Line No.");
        ReqLine2.SetFilter("Planning Level", '>0');
        OnDeleteMultiLevelOnAfterSetFilterReqLine2(Rec, ReqLine2);
        if ReqLine2.Find('-') then
            repeat
                ReqLineReserve.DeleteLine(ReqLine2);
                ReqLine2.CalcFields("Reserved Qty. (Base)");
                ReqLine2.TestField("Reserved Qty. (Base)", 0);
                ReqLine2.DeleteRelations();
                ReqLine2.Delete();
            until ReqLine2.Next() = 0;
        OnAfterDeleteMultiLevel(Rec);
    end;

    procedure ClearPlanningWorksheet(SkipConfirm: Boolean)
    var
        RequisitionLine: Record "Requisition Line";
        ReservationEntry: Record "Reservation Entry";
    begin
        RequisitionLine.SetRange("Worksheet Template Name", "Worksheet Template Name");
        RequisitionLine.SetRange("Journal Batch Name", "Journal Batch Name");
        if not RequisitionLine.FindSet() then
            exit;

        if GuiAllowed and not SkipConfirm then
            if not Confirm(ConfirmDeleteAllLinesQst) then
                exit;

        repeat
            if ReqLineReserve.FindReservEntry(RequisitionLine, ReservationEntry) then begin
                ReqLineReserve.DeleteLine(RequisitionLine);
                RequisitionLine.TestField("Reserved Qty. (Base)", 0);
            end;
            OnClearPlanningWorksheetOnBeforeRequisitionLineDelete(RequisitionLine);
            RequisitionLine.Delete();
        until RequisitionLine.Next() = 0;

        DeleteRelations(true);

        OnAfterClearPlanningWorksheet(Rec);
    end;

    internal procedure ClearOrderPlanningWorksheet()
    var
        RequisitionLine: Record "Requisition Line";
        OrderPlanningMgt: Codeunit "Order Planning Mgt.";
    begin
        if IsEmpty() then
            exit;

        if not ConfirmManagement.GetResponse(ConfirmDeleteAllLinesQst, false) then
            exit;

        DeleteAll();
        OrderPlanningMgt.PrepareRequisitionRecord(RequisitionLine);
    end;

    /// <summary>
    /// Populates values of 'Order Date', 'Recurring Method' and 'Price Calculation Method' fields for a new requisition line.
    /// </summary>
    /// <param name="LastReqLine">Source requisition line record. </param>
    procedure SetUpNewLine(LastReqLine: Record "Requisition Line")
    var
        Vendor: Record Vendor;
    begin
        ReqWkshTemplate.Get("Worksheet Template Name");
        ReqWkshName.Get("Worksheet Template Name", "Journal Batch Name");
        ReqLine.SetRange("Worksheet Template Name", "Worksheet Template Name");
        ReqLine.SetRange("Journal Batch Name", "Journal Batch Name");
        if ReqLine.Find('-') then
            "Order Date" := LastReqLine."Order Date"
        else
            "Order Date" := WorkDate();

        "Recurring Method" := LastReqLine."Recurring Method";
        "Price Calculation Method" := Vendor.GetPriceCalculationMethod();

        OnAfterSetUpNewLine(Rec, LastReqLine);
    end;

    local procedure CheckEndingDate(ShowWarning: Boolean)
    var
        CheckDateConflict: Codeunit "Reservation-Check Date Confl.";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckEndingDate(Rec, ShowWarning, IsHandled);
        if IsHandled then
            exit;

        CheckDateConflict.ReqLineCheck(Rec, ShowWarning);
        ReqLineReserve.VerifyChange(Rec, xRec);
    end;

    /// <summary>
    /// Sets the value of field 'Due Date' for the current requisition line.
    /// </summary>
    procedure SetDueDate()
    begin
        if "Ending Date" = 0D then
            exit;
        if (Type = Type::Item) and
           ("Planning Level" = 0)
        then
            "Due Date" :=
              LeadTimeMgt.GetPlannedDueDate("No.", "Location Code", "Variant Code", "Ending Date", '', "Ref. Order Type")
        else
            "Due Date" := "Ending Date";

        CheckDueDateToDemandDate();

        OnAfterSetDueDate(Rec);
    end;

    /// <summary>
    /// Sets the global variable 'CurrentFieldNo'.
    /// </summary>
    /// <param name="NewCurrFieldNo">Specified field number. </param>
    procedure SetCurrFieldNo(NewCurrFieldNo: Integer)
    begin
        CurrentFieldNo := NewCurrFieldNo;
    end;

    procedure CheckDueDateToDemandDate()
    begin
        if ("Planning Line Origin" = "Planning Line Origin"::"Order Planning") and
           ("Due Date" > "Demand Date") and
           ("Demand Date" <> 0D) and
           ValidateFields()
        then
            Message(Text029, "Line No.", FieldCaption("Due Date"), FieldCaption("Demand Date"));
    end;

    procedure CheckActionMessageNew()
    begin
        if "Action Message" <> "Action Message"::" " then
            if ShouldCheckNewActionMessage() then
                TestField("Action Message", "Action Message"::New);
    end;

    local procedure ShouldCheckNewActionMessage() ShouldCheck: Boolean
    begin
        ShouldCheck :=
            CurrFieldNo in [FieldNo(Type),
                            FieldNo("No."),
                            FieldNo("Variant Code"),
                            FieldNo("Location Code"),
                            FieldNo("Bin Code"),
                            FieldNo("Replenishment System"),
                            FieldNo("Unit of Measure Code"),
                            FieldNo("Vendor No."),
                            FieldNo("Transfer-from Code")];

        OnAfterShouldCheckNewActionMessage(Rec, CurrFieldNo, ShouldCheck);
    end;

    procedure SetActionMessage()
    begin
        if ValidateFields() and
           ("Action Message" <> "Action Message"::" ") and
           ("Action Message" <> "Action Message"::New)
        then begin
            if (Quantity <> xRec.Quantity) and ("Original Quantity" = 0) then
                "Original Quantity" := xRec.Quantity;
            if ("Due Date" <> xRec."Due Date") and ("Original Due Date" = 0D) then
                "Original Due Date" := xRec."Due Date";
            if Quantity = 0 then
                "Action Message" := "Action Message"::Cancel
            else
                if "Original Quantity" <> 0 then
                    if "Original Due Date" <> 0D then
                        "Action Message" := "Action Message"::"Resched. & Chg. Qty."
                    else
                        "Action Message" := "Action Message"::"Change Qty."
                else
                    if "Original Due Date" <> 0D then
                        "Action Message" := "Action Message"::Reschedule;

            if "Action Message" <> xRec."Action Message" then
                Clear("Planning Line Origin");
        end;
    end;

    procedure ValidateFields() Result: Boolean
    begin
        Result := (CurrFieldNo <> 0) or (CurrentFieldNo <> 0);
        OnAfterValidateFields(Rec, CurrFieldNo, CurrentFieldNo, Result);
    end;

    /// <summary>
    /// Prepares and transfers relevant field values from provided purchase line to the current requisition line.
    /// </summary>
    /// <param name="PurchOrderLine">Source purchase line record. </param>
    /// <remarks>In case no purchase header is found for the provided 'PurchOrderLine', error will be invoked. </remarks>
    procedure GetPurchOrderLine(PurchOrderLine: Record "Purchase Line")
    var
        PurchHeader2: Record "Purchase Header";
    begin
        if PurchOrderLine.Type <> PurchOrderLine.Type::Item then
            exit;
        PurchOrderLine.CalcFields("Reserved Quantity", "Reserved Qty. (Base)");
        PurchHeader2.Get(PurchOrderLine."Document Type", PurchOrderLine."Document No.");
        Item.Get(PurchOrderLine."No.");

        TransferFromPurchaseLine(PurchOrderLine);
    end;

    /// <summary>
    /// Prepares and transfers relevant field values from provided transfer line to the current requisition line.
    /// </summary>
    /// <param name="TransLine">Source transfer line record. </param>
    /// <remarks>In case no transfer header is found for the provided 'TransLine', error will be invoked. </remarks>
    procedure GetTransLine(TransLine: Record "Transfer Line")
    var
        TransHeader: Record "Transfer Header";
    begin
        TransLine.CalcFields(
          "Reserved Quantity Inbnd.",
          "Reserved Quantity Outbnd.",
          "Reserved Qty. Inbnd. (Base)",
          "Reserved Qty. Outbnd. (Base)");
        TransHeader.Get(TransLine."Document No.");
        Item.Get(TransLine."Item No.");

        TransferFromTransLine(TransLine);
    end;

    /// <summary>
    /// Runs the report 'Get Action Messages' in reference to the current requisition line. 
    /// </summary>
    procedure GetActionMessages()
    var
        GetActionMsgReport: Report "Get Action Messages";
    begin
        GetActionMsgReport.SetTemplAndWorksheet("Worksheet Template Name", "Journal Batch Name");
        GetActionMsgReport.RunModal();
    end;

    /// <summary>
    /// Calculates values of fields 'Remaining Quantity' and 'Remaining Quantity (Base)' for the current requisition line.
    /// </summary>
    /// <param name="RemainingQty">Parameter to hold the value of field 'Remaining Quantity'. </param>
    /// <param name="RemainingQtyBase">Parameter to hold the value of field 'Remaining Quantity (Base)'. </param>
    procedure GetRemainingQty(var RemainingQty: Decimal; var RemainingQtyBase: Decimal)
    begin
        CalcFields("Reserved Quantity", "Reserved Qty. (Base)");
        RemainingQty := 0;
        RemainingQtyBase := "Net Quantity (Base)" - Abs("Reserved Qty. (Base)");
    end;

    /// <summary>
    /// Calculates reserve quantity information for the current requisition line.
    /// </summary>
    /// <param name="QtyReserved">Parameter to hold the value of field 'Reserved Quantity'. </param>
    /// <param name="QtyReservedBase">Parameter to hold the value of field 'Reserved Qty. (Base)'. </param>
    /// <param name="QtyToReserve">Parameter to hold the quantity to reserve. </param>
    /// <param name="QtyToReserveBase">Parameter to hold the quantity to reserve base value. </param>
    /// <returns>Returns quantity per unit of measure information for the current record. </returns>
    procedure GetReservationQty(var QtyReserved: Decimal; var QtyReservedBase: Decimal; var QtyToReserve: Decimal; var QtyToReserveBase: Decimal) Result: Decimal
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetReservationQty(Rec, QtyReserved, QtyReservedBase, QtyToReserve, QtyToReserveBase, Result, IsHandled);
        if IsHandled then
            exit(Result);

        CalcFields("Reserved Quantity", "Reserved Qty. (Base)");
        QtyReserved := "Reserved Quantity";
        QtyReservedBase := "Reserved Qty. (Base)";
        QtyToReserve := Quantity;
        QtyToReserveBase := "Quantity (Base)";
        exit("Qty. per Unit of Measure");
    end;

    /// <summary>
    /// Combines values of 'Worksheet Template Name', 'Journal Batch Name' and 'No.' fields of the current requisition line. 
    /// </summary>
    /// <returns>Returns source requisiton line information. </returns>
    procedure GetSourceCaption(): Text
    begin
        exit(StrSubstNo('%1 %2 %3', "Worksheet Template Name", "Journal Batch Name", "No."));
    end;

    /// <summary>
    /// Copies values from the current record to specified reservation entry record.
    /// </summary>
    /// <param name="ReservEntry">Specified reservation entry. </param>
    procedure SetReservationEntry(var ReservEntry: Record "Reservation Entry")
    begin
        ReservEntry.SetSource(
            Database::"Requisition Line", 0, "Worksheet Template Name", "Line No.", "Journal Batch Name", 0);
        ReservEntry.SetItemData("No.", Description, "Location Code", "Variant Code", "Qty. per Unit of Measure");
        if Type <> Type::Item then
            ReservEntry."Item No." := '';
        ReservEntry."Expected Receipt Date" := "Due Date";
        ReservEntry."Shipment Date" := "Due Date";
        ReservEntry."Planning Flexibility" := "Planning Flexibility";

        OnAfterSetReservationEntry(ReservEntry, Rec);
    end;

    /// <summary>
    /// Sets filters from the current requisition line to specified reservation entry record.
    /// </summary>
    /// <param name="ReservEntry">Specified reservation entry. </param>
    procedure SetReservationFilters(var ReservEntry: Record "Reservation Entry")
    begin
        ReservEntry.SetSourceFilter(Database::"Requisition Line", 0, "Worksheet Template Name", "Line No.", false);
        ReservEntry.SetSourceFilter("Journal Batch Name", 0);

        OnAfterSetReservationFilters(ReservEntry, Rec);
    end;

    /// <summary>
    /// Checks whether reservation entries related to the current requisition line exist. 
    /// </summary>
    /// <returns>Returns 'true' if reservation entry is found, otherwise 'false'. </returns>
    procedure ReservEntryExist(): Boolean
    var
        ReservEntry: Record "Reservation Entry";
    begin
        ReservEntry.InitSortingAndFilters(false);
        SetReservationFilters(ReservEntry);
        exit(not ReservEntry.IsEmpty);
    end;


    /// <summary>
    /// Sets filters from provided reference document line to the current requisition line.
    /// </summary>
    /// <param name="RefOrderType">Provided reference order type. </param>
    /// <param name="RefOrderStatus">Provided reference order status. </param>
    /// <param name="RefOrderNo">Provided reference order number. </param>
    /// <param name="RefLineNo">Provided reference order line number. </param>
    procedure SetRefOrderFilters(RefOrderType: Enum "Requisition Ref. Order Type"; RefOrderStatus: Option; RefOrderNo: Code[20]; RefLineNo: Integer)
    begin
        SetCurrentKey("Ref. Order Type", "Ref. Order Status", "Ref. Order No.", "Ref. Line No.");
        SetRange("Ref. Order Type", RefOrderType);
        SetRange("Ref. Order Status", RefOrderStatus);
        SetRange("Ref. Order No.", RefOrderNo);
        SetRange("Ref. Line No.", RefLineNo);
    end;

    procedure TransferFromPurchaseLine(var PurchLine: Record "Purchase Line")
    var
        PurchHeader: Record "Purchase Header";
    begin
        PurchHeader.Get(PurchLine."Document Type", PurchLine."Document No.");
        Item.Get(PurchLine."No.");

        Type := Type::Item;
        "No." := PurchLine."No.";
        "Variant Code" := PurchLine."Variant Code";
        Description := PurchLine.Description;
        "Description 2" := PurchLine."Description 2";
        "Location Code" := PurchLine."Location Code";
        "Dimension Set ID" := PurchLine."Dimension Set ID";
        "Shortcut Dimension 1 Code" := PurchLine."Shortcut Dimension 1 Code";
        "Shortcut Dimension 2 Code" := PurchLine."Shortcut Dimension 2 Code";
        "Bin Code" := PurchLine."Bin Code";
        "Gen. Prod. Posting Group" := PurchLine."Gen. Prod. Posting Group";
        "Gen. Business Posting Group" := PurchLine."Gen. Bus. Posting Group";
        "Low-Level Code" := Item."Low-Level Code";
        "Order Date" := PurchHeader."Order Date";
        "Starting Date" := "Order Date";
        "Ending Date" := PurchLine."Planned Receipt Date";
        "Due Date" := PurchLine."Expected Receipt Date";
        Quantity := PurchLine.Quantity;
        "Finished Quantity" := PurchLine."Quantity Received";
        "Remaining Quantity" := PurchLine."Outstanding Quantity";
        BlockDynamicTracking(true);
        Validate("Unit Cost", PurchLine."Unit Cost (LCY)");
        BlockDynamicTracking(false);
        "Indirect Cost %" := PurchLine."Indirect Cost %";
        "Overhead Rate" := PurchLine."Overhead Rate";
        "Unit of Measure Code" := PurchLine."Unit of Measure Code";
        "Qty. per Unit of Measure" := PurchLine."Qty. per Unit of Measure";
        "Quantity (Base)" := PurchLine."Quantity (Base)";
        "Finished Qty. (Base)" := PurchLine."Qty. Received (Base)";
        "Remaining Qty. (Base)" := PurchLine."Outstanding Qty. (Base)";
        "Replenishment System" := "Replenishment System"::Purchase;
        "MPS Order" := PurchLine."MPS Order";
        "Planning Flexibility" := PurchLine."Planning Flexibility";
        "Ref. Order No." := PurchLine."Document No.";
        "Ref. Order Type" := "Ref. Order Type"::Purchase;
        "Ref. Line No." := PurchLine."Line No.";
        "Vendor No." := PurchLine."Buy-from Vendor No.";
        Validate("Currency Code", PurchLine."Currency Code");

        OnAfterTransferFromPurchaseLine(Rec, PurchLine);

        GetDimFromRefOrderLine(false);
    end;

    procedure TransferFromTransLine(var TransLine: Record "Transfer Line")
    var
        TransHeader: Record "Transfer Header";
    begin
        TransHeader.Get(TransLine."Document No.");
        Item.Get(TransLine."Item No.");
        Type := Type::Item;
        "No." := TransLine."Item No.";
        "Variant Code" := TransLine."Variant Code";
        Description := TransLine.Description;
        "Description 2" := TransLine."Description 2";
        "Location Code" := TransLine."Transfer-to Code";
        "Dimension Set ID" := TransLine."Dimension Set ID";
        "Shortcut Dimension 1 Code" := TransLine."Shortcut Dimension 1 Code";
        "Shortcut Dimension 2 Code" := TransLine."Shortcut Dimension 2 Code";
        "Gen. Prod. Posting Group" := TransLine."Gen. Prod. Posting Group";
        "Low-Level Code" := Item."Low-Level Code";
        "Starting Date" := CalcDate(TransLine."Outbound Whse. Handling Time", TransLine."Shipment Date");
        "Ending Date" := CalcDate(TransLine."Shipping Time", "Starting Date");
        "Due Date" := TransLine."Receipt Date";
        Quantity := TransLine.Quantity;
        "Finished Quantity" := TransLine."Quantity Received";
        "Remaining Quantity" := TransLine."Outstanding Quantity";
        BlockDynamicTracking(false);
        "Unit of Measure Code" := TransLine."Unit of Measure Code";
        "Qty. per Unit of Measure" := TransLine."Qty. per Unit of Measure";
        "Quantity (Base)" := TransLine."Quantity (Base)";
        "Finished Qty. (Base)" := TransLine."Qty. Received (Base)";
        "Remaining Qty. (Base)" := TransLine."Outstanding Qty. (Base)";
        "Replenishment System" := "Replenishment System"::Transfer;
        "Ref. Order No." := TransLine."Document No.";
        "Ref. Order Type" := "Ref. Order Type"::Transfer;
        "Ref. Line No." := TransLine."Line No.";
        "Transfer-from Code" := TransLine."Transfer-from Code";
        "Transfer Shipment Date" := TransLine."Shipment Date";

        OnAfterTransferFromTransLine(Rec, TransLine);

        GetDimFromRefOrderLine(false);
    end;

    procedure GetDimFromRefOrderLine(AddToExisting: Boolean)
    var
        PurchLine: Record "Purchase Line";
        TransferLine: Record "Transfer Line";
        DimSetIDArr: array[10] of Integer;
        i: Integer;
        IsHandled: Boolean;
    begin
        if AddToExisting then begin
            i := 1;
            DimSetIDArr[i] := "Dimension Set ID";
        end;
        i := i + 1;

        case "Ref. Order Type" of
            "Ref. Order Type"::Purchase:
                if PurchLine.Get(PurchLine."Document Type"::Order, "Ref. Order No.", "Ref. Line No.") then
                    DimSetIDArr[i] := PurchLine."Dimension Set ID";
            "Ref. Order Type"::Transfer:
                begin
                    IsHandled := false;
                    OnGetDimFromRefOrderLineOnBeforeSetDimSetIDTypeTransfer(Rec, DimSetIDArr, i, IsHandled);
                    if not IsHandled then
                        if TransferLine.Get("Ref. Order No.", "Ref. Line No.") then
                            DimSetIDArr[i] := TransferLine."Dimension Set ID";
                end;
            else
                OnGetDimFromRefOrderLineElseCase(Rec, DimSetIDArr, i);
        end;
        "Dimension Set ID" := DimMgt.GetCombinedDimensionSetID(DimSetIDArr, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
    end;

    procedure TransferFromActionMessage(var ActionMessageEntry: Record "Action Message Entry")
    var
        ReservEntry: Record "Reservation Entry";
        EndDate: Date;
    begin
        if not ReservEntry.Get(ActionMessageEntry."Reservation Entry", true) then
            ReservEntry.Get(ActionMessageEntry."Reservation Entry", false);
        BlockDynamicTracking(true);
        Type := Type::Item;
        Validate("No.", ReservEntry."Item No.");
        BlockDynamicTracking(false);
        Validate("Variant Code", ReservEntry."Variant Code");
        Validate("Location Code", ReservEntry."Location Code");
        Description := ReservEntry.Description;

        if ReservEntry.Positive then
            EndDate := ReservEntry."Expected Receipt Date"
        else
            EndDate := ReservEntry."Shipment Date";

        if EndDate <> 0D then
            "Due Date" := EndDate
        else
            "Due Date" := WorkDate();

        if ShouldUpdateEndingDateForSourceType(ReservEntry."Source Type") then
            "Ending Date" :=
                LeadTimeMgt.GetPlannedEndingDate(
                ReservEntry."Item No.", ReservEntry."Location Code", ReservEntry."Variant Code",
                "Due Date", "Vendor No.", "Ref. Order Type");

        OnAfterTransferFromActionMessage(Rec, ActionMessageEntry, ReservEntry);
    end;

    local procedure ShouldUpdateEndingDateForSourceType(SourceType: Integer) ShouldUpdate: Boolean
    begin
        if SourceType in [Database::"Transfer Line", Database::"Purchase Line", Database::"Requisition Line"] then
            ShouldUpdate := true;

        OnAfterShouldUpdateEndingDateForSourceType(SourceType, ShouldUpdate);
    end;

    procedure TransferToTrackingEntry(var TrkgReservEntry: Record "Reservation Entry"; PointerOnly: Boolean)
    begin
        TrkgReservEntry.SetSource(
          Database::"Requisition Line", 0, "Worksheet Template Name", "Line No.", "Journal Batch Name", 0);
        if PointerOnly then
            exit;

        TrkgReservEntry."Item No." := "No.";
        TrkgReservEntry."Location Code" := "Location Code";
        TrkgReservEntry.Description := '';
        TrkgReservEntry."Creation Date" := Today;
        TrkgReservEntry."Created By" := CopyStr(UserId(), 1, 50);
        TrkgReservEntry."Qty. per Unit of Measure" := "Qty. per Unit of Measure";
        TrkgReservEntry."Variant Code" := "Variant Code";
        CalcFields("Reserved Quantity");
        TrkgReservEntry.Quantity := "Remaining Quantity" - "Reserved Quantity";
        TrkgReservEntry."Quantity (Base)" := TrkgReservEntry.Quantity * TrkgReservEntry."Qty. per Unit of Measure";
        TrkgReservEntry.Positive := TrkgReservEntry."Quantity (Base)" > 0;
        if "Planning Level" > 0 then
            TrkgReservEntry."Reservation Status" := TrkgReservEntry."Reservation Status"::Reservation
        else
            TrkgReservEntry."Reservation Status" := TrkgReservEntry."Reservation Status"::Tracking;
        if TrkgReservEntry.Positive then
            TrkgReservEntry."Expected Receipt Date" := "Due Date"
        else
            TrkgReservEntry."Shipment Date" := "Due Date";

        OnAfterTransferToTrackingEntry(TrkgReservEntry, Rec);
    end;

    procedure UpdateDatetime()
    begin
        "Starting Date-Time" := CreateDateTime("Starting Date", "Starting Time");
        "Ending Date-Time" := CreateDateTime("Ending Date", "Ending Time");
    end;

    /// <summary>
    /// Gets item unit cost of the current requisition line. 
    /// </summary>
    /// <param name="CalledByFieldNo">Indicates the number of the field which invoked the method. </param>
    procedure GetDirectCost(CalledByFieldNo: Integer)
    var
        PriceCalculationMgt: Codeunit "Price Calculation Mgt.";
        LineWithPrice: Interface "Line With Price";
        PriceCalculation: Interface "Price Calculation";
        PriceType: enum "Price Type";
        Line: Variant;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetDirectCost(Rec, xRec, CalledByFieldNo, CurrFieldNo, Subcontracting, IsHandled);
        if IsHandled then
            exit;

        if ("Replenishment System" = "Replenishment System"::Purchase) and not Subcontracting then begin
            IsHandled := false;
            OnGetDirectCostOnBeforePriceCalculation(Rec, IsHandled);
            if not IsHandled then begin
                GetLineWithPrice(LineWithPrice);
                LineWithPrice.SetLine(PriceType::Purchase, Rec);
                PriceCalculationMgt.GetHandler(LineWithPrice, PriceCalculation);
                PriceCalculation.ApplyDiscount();
                PriceCalculation.ApplyPrice(CalledByFieldNo);
                PriceCalculation.GetLine(Line);
                Rec := Line;
            end;
        end;

        OnAfterGetDirectCost(Rec, CalledByFieldNo);
    end;

    procedure GetLineWithPrice(var LineWithPrice: Interface "Line With Price")
    var
        RequisitionLinePrice: Codeunit "Requisition Line - Price";
    begin
        LineWithPrice := RequisitionLinePrice;
        OnAfterGetLineWithPrice(LineWithPrice);
    end;

    local procedure ValidateLocationChange()
    var
        Purchasing: Record Purchasing;
        SalesOrderLine: Record "Sales Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateLocationChange(Rec, IsHandled);

        case true of
            "Location Code" = xRec."Location Code":
                exit;
            "Purchasing Code" = '':
                exit;
            not Purchasing.Get("Purchasing Code"):
                exit;
            not Purchasing."Special Order":
                exit;
            not SalesOrderLine.Get(SalesOrderLine."Document Type"::Order, "Sales Order No.", "Sales Order Line No."):
                exit;
            "Location Code" = SalesOrderLine."Location Code":
                exit;
            IsHandled:
                exit;
        end;

        Error(Text028, FieldCaption("Location Code"), TableCaption);
    end;

    procedure RowID1(): Text[250]
    var
        ItemTrackingMgt: Codeunit "Item Tracking Management";
    begin
        exit(
          ItemTrackingMgt.ComposeRowID(
            Database::"Requisition Line", 0, "Worksheet Template Name", "Journal Batch Name", 0, "Line No."));
    end;

    /// <summary>
    /// Calculates value for the field 'Ending Date' based on provided 'LeadTime' formula or current requisition line. 
    /// </summary>
    /// <param name="LeadTime">Provided lead time formula. </param>
    /// <remarks>In case 'LeadTime' is empty, lead time code will be defined according to the reference order type. </remarks>
    procedure CalcEndingDate(LeadTime: Code[20])
    var
        RoutingExists: Boolean;
    begin
        OnBeforeCalcEndingDate(Rec, LeadTime);

        case "Ref. Order Type" of
            "Ref. Order Type"::Purchase:
                if LeadTime = '' then
                    LeadTime := LeadTimeMgt.PurchaseLeadTime("No.", "Location Code", "Variant Code", "Vendor No.");
            "Ref. Order Type"::"Prod. Order":
                begin
                    OnRoutingLineExists(Rec, RoutingExists);
                    if RoutingExists then
                        exit;

                    if LeadTime = '' then
                        LeadTime := LeadTimeMgt.ManufacturingLeadTime("No.", "Location Code", "Variant Code");
                end;
            "Ref. Order Type"::Assembly:
                begin
                    OnRoutingLineExists(Rec, RoutingExists);
                    if RoutingExists then
                        exit;

                    if LeadTime = '' then
                        LeadTime := LeadTimeMgt.ManufacturingLeadTime("No.", "Location Code", "Variant Code");
                end;
            "Ref. Order Type"::Transfer:
                CalcTransferShipmentDate();
            else
                exit;
        end;

        "Ending Date" :=
          LeadTimeMgt.GetPlannedEndingDate(
            "No.", "Location Code", "Variant Code", "Vendor No.", LeadTime, "Ref. Order Type", "Starting Date");

        OnAfterCalcEndingDate(Rec, LeadTime);
    end;

    /// <summary>
    /// Calculates value for the field 'Starting Date' based on provided 'LeadTime' formula for the current requisition line. 
    /// </summary>
    /// <param name="LeadTime">Provided lead time formula.</param>
    /// <remarks>In case 'LeadTime' is empty, lead time code will be defined according to the reference order type. 
    /// 'Order Date' of the current requisition line will be set to newly calculated 'Starting Date'. </remarks>
    procedure CalcStartingDate(LeadTime: Code[20])
    var
        IsHandled: Boolean;
        RoutingExists: Boolean;
    begin
        OnBeforeCalcStartingDate(Rec, LeadTime);

        case "Ref. Order Type" of
            "Ref. Order Type"::Purchase:
                if LeadTime = '' then
                    LeadTime :=
                      LeadTimeMgt.PurchaseLeadTime(
                        "No.", "Location Code", "Variant Code", "Vendor No.");
            "Ref. Order Type"::"Prod. Order":
                begin
                    OnRoutingLineExists(Rec, RoutingExists);
                    if RoutingExists then
                        exit;

                    if LeadTime = '' then
                        LeadTime := LeadTimeMgt.ManufacturingLeadTime("No.", "Location Code", "Variant Code");
                end;
            "Ref. Order Type"::Assembly:
                begin
                    OnRoutingLineExists(Rec, RoutingExists);
                    if RoutingExists then
                        exit;

                    if LeadTime = '' then
                        LeadTime := LeadTimeMgt.ManufacturingLeadTime("No.", "Location Code", "Variant Code");
                end;
            "Ref. Order Type"::" ":
                exit;
        end;

        "Starting Date" :=
          LeadTimeMgt.GetPlannedStartingDate(
            "No.", "Location Code", "Variant Code", "Vendor No.", LeadTime, "Ref. Order Type", "Ending Date");

        IsHandled := false;
        OnCalcStartingDateOnBeforeValidateOrderDate(Rec, LeadTime, IsHandled);
        if not IsHandled then
            Validate("Order Date", "Starting Date");

        if "Ref. Order Type" = "Ref. Order Type"::Transfer then
            CalcTransferShipmentDate();
    end;

    local procedure CalcTransferShipmentDate()
    var
        TransferRoute: Record "Transfer Route";
        DateFormula: DateFormula;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcTransferShipmentDate(Rec, IsHandled);
        if IsHandled then
            exit;

        Evaluate(DateFormula, LeadTimeMgt.WhseOutBoundHandlingTime("Transfer-from Code"));
        TransferRoute.CalcShipmentDateBackward("Transfer Shipment Date", "Starting Date", DateFormula, "Transfer-from Code");
    end;

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

        if LocationCode = '' then
            Clear(Location)
        else
            if Location.Code <> LocationCode then
                Location.Get(LocationCode);
    end;

    local procedure GetBin(LocationCode: Code[10]; BinCode: Code[20])
    begin
        if BinCode = '' then
            Clear(Bin)
        else
            if Bin.Code <> BinCode then
                Bin.Get(LocationCode, BinCode);
    end;

    procedure SetSubcontracting(NewSubcontracting: Boolean)
    begin
        Subcontracting := NewSubcontracting;
    end;

    procedure IsSubcontracting(): Boolean
    begin
        exit(Subcontracting);
    end;

    /// <summary>
    /// Populates corresponding values of the current requisition line in reference to the provided unplanned demand.
    /// </summary>
    /// <param name="UnplannedDemand">Source unplanned demand record.</param>
    procedure TransferFromUnplannedDemand(var UnplannedDemand: Record "Unplanned Demand")
    begin
        InitRecordForOrderPlanning();

        OnTransferFromUnplannedDemandOnBeforeSetType(Rec);
        Type := Type::Item;
        "No." := UnplannedDemand."Item No.";
        "Location Code" := UnplannedDemand."Location Code";
        "Bin Code" := UnplannedDemand."Bin Code";
        Validate("No.");
        Validate("Variant Code", UnplannedDemand."Variant Code");
        UpdateDescription();
        "Unit Of Measure Code (Demand)" := UnplannedDemand."Unit of Measure Code";
        "Qty. per UOM (Demand)" := UnplannedDemand."Qty. per Unit of Measure";
        Reserve := UnplannedDemand.Reserve;
        SetDemandTypeFromUnplannedDemand(UnplannedDemand);
        "Demand Subtype" := UnplannedDemand."Demand SubType";
        "Demand Order No." := UnplannedDemand."Demand Order No.";
        "Demand Line No." := UnplannedDemand."Demand Line No.";
        "Demand Ref. No." := UnplannedDemand."Demand Ref. No.";

        OnTransferFromUnplannedDemandOnBeforeSetStatus(Rec, UnplannedDemand);
        Status := UnplannedDemand.Status;

        Level := 1;
        "Action Message" := ReqLine."Action Message"::New;
        "User ID" := CopyStr(UserId(), 1, MaxStrLen("User ID"));
        "Drop Shipment" := UnplannedDemand."Drop Shipment";

        UpdateSalesOrderDetailForDropShipment();

        UpdateDim();

        OnAfterTransferFromUnplannedDemand(Rec, UnplannedDemand);
    end;

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

        Init();
        "Journal Batch Name" := GetJnlBatchNameForOrderPlanning();
        "Line No." := "Line No." + 10000;
        "Planning Line Origin" := "Planning Line Origin"::"Order Planning";
    end;

    /// <summary>
    /// Sets values of 'Demand Date', 'Order Date', 'Starting Date' and 'Ending Date' fields of the current record based on provided 'DemandDate'.
    /// </summary>
    /// <param name="DemandDate">Provided demand date.</param>
    procedure SetSupplyDates(DemandDate: Date)
    begin
        "Demand Date" := DemandDate;
        "Starting Date" := "Demand Date";
        "Order Date" := "Demand Date";
        Validate("Due Date", "Demand Date");

        if "Planning Level" = 0 then begin
            Validate(
              "Ending Date",
              LeadTimeMgt.GetPlannedEndingDate(
                "No.", "Location Code", "Variant Code", "Due Date", '', "Ref. Order Type"));
            OnSetSupplyDatesOnAfterValidateEndingDate(Rec);
        end else begin
            Validate("Ending Date", "Due Date");
            Validate("Ending Time", 0T);
        end;

        OnAfterSetSupplyDates(Rec);
    end;

    /// <summary>
    /// Calculates demanded and needed quantities based on provided parameters 'DemandQtyBase' and 'NeededQtyBase'.
    /// </summary>
    /// <param name="DemandQtyBase">Provided demanded quantity. </param>
    /// <param name="NeededQtyBase">Provided needed quantitiy. </param>
    /// <remarks>Validation of the field 'Quantity' will be triggered. </remarks>
    procedure SetSupplyQty(DemandQtyBase: Decimal; NeededQtyBase: Decimal)
    begin
        if "Qty. per Unit of Measure" = 0 then
            "Qty. per Unit of Measure" := 1;

        "Demand Quantity" := Round(DemandQtyBase / "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision());
        "Demand Quantity (Base)" := DemandQtyBase;
        "Needed Quantity" := Round(NeededQtyBase / "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision());
        if "Needed Quantity" < NeededQtyBase / "Qty. per Unit of Measure" then
            "Needed Quantity" := Round(NeededQtyBase / "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision(), '>');
        "Needed Quantity (Base)" := NeededQtyBase;
        "Demand Qty. Available" :=
          Round((DemandQtyBase - NeededQtyBase) / "Qty. per Unit of Measure", UOMMgt.QtyRndPrecision());
        Validate(Quantity, "Needed Quantity");
    end;

    procedure SetResiliencyOn(WkshTemplName: Code[10]; JnlBatchName: Code[10]; ItemNo: Code[20])
    begin
        PlanningResiliency := true;
        TempPlanningErrorLog.SetJnlBatch(WkshTemplName, JnlBatchName, ItemNo);
    end;

    procedure GetResiliencyError(var PlanningErrorLog: Record "Planning Error Log"): Boolean
    begin
        exit(TempPlanningErrorLog.GetError(PlanningErrorLog));
    end;

    /// <summary>
    /// Gets all resiliency errors from the planning error log.
    /// </summary>
    /// <param name="PlanningErrorLog">The planning error log record to populate with errors.</param>
    /// <returns>True if there are errors, otherwise false.</returns>
    procedure GetResiliencyErrors(var PlanningErrorLog: Record "Planning Error Log"): Boolean
    begin
        exit(TempPlanningErrorLog.GetErrors(PlanningErrorLog));
    end;

    procedure SetResiliencyError(TheError: Text[250]; TheTableID: Integer; TheTablePosition: Text[250])
    begin
        TempPlanningErrorLog.SetError(TheError, TheTableID, TheTablePosition);
    end;

    procedure SetDemandTypeFromUnplannedDemand(UnplannedDemand: Record "Unplanned Demand")
    begin
        OnSetDemandTypeFromUnplannedDemand(Rec, UnplannedDemand);
    end;

    local procedure CheckExchRate(Currency: Record Currency)
    var
        CurrExchRate: Record "Currency Exchange Rate";
    begin
        CurrExchRate.SetRange("Currency Code", "Currency Code");
        CurrExchRate.SetRange("Starting Date", 0D, "Order Date");
        case true of
            not CurrExchRate.FindLast():
                TempPlanningErrorLog.SetError(
                  StrSubstNo(
                    Text038,
                    Currency.TableCaption(), Currency.Code, "Vendor No.", "Order Date"),
                  Database::Currency, CopyStr(Currency.GetPosition(), 1, 250));
            CurrExchRate."Exchange Rate Amount" = 0:
                TempPlanningErrorLog.SetError(
                  StrSubstNo(
                    Text037,
                    Currency.TableCaption(), Currency.Code, "Vendor No.",
                    "Order Date", CurrExchRate.FieldCaption("Exchange Rate Amount")),
                  Database::Currency, CopyStr(Currency.GetPosition(), 1, 250));
            CurrExchRate."Relational Exch. Rate Amount" = 0:
                TempPlanningErrorLog.SetError(
                  StrSubstNo(
                    Text037,
                    Currency.TableCaption(), Currency.Code, "Vendor No.",
                    "Order Date", CurrExchRate.FieldCaption("Relational Exch. Rate Amount")),
                  Database::Currency, CopyStr(Currency.GetPosition(), 1, 250));
        end;
    end;

    local procedure CheckVendorBlocked(Vend: Record Vendor)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckVendorBlocked(Rec, Vend, IsHandled, CurrentFieldNo);
        if IsHandled then
            exit;

        if Vend.Blocked = Vend.Blocked::All then begin
            if PlanningResiliency then
                TempPlanningErrorLog.SetError(
                  StrSubstNo(Text031, Vend.TableCaption(), Vend."No."),
                  Database::Vendor, CopyStr(Vend.GetPosition(), 1, 250));
            Vend.VendBlockedErrorMessage(Vend, false);
        end;
    end;

    /// <summary>
    /// Filters corresponding fields of the current record based on provided item record.
    /// </summary>
    /// <param name="Item">Provided item record. </param>
    procedure FilterLinesWithItemToPlan(var Item2: Record Item)
    begin
        Reset();
        SetCurrentKey(Type, "No.");
        SetRange(Type, Type::Item);
        SetRange("No.", Item2."No.");
        SetRange("Sales Order No.", '');
        SetFilter("Variant Code", Item2.GetFilter("Variant Filter"));
        SetFilter("Location Code", Item2.GetFilter("Location Filter"));
        SetFilter("Due Date", Item2.GetFilter("Date Filter"));
        Item2.CopyFilter("Global Dimension 1 Filter", "Shortcut Dimension 1 Code");
        Item2.CopyFilter("Global Dimension 2 Filter", "Shortcut Dimension 2 Code");
        SetRange("Planning Line Origin", "Planning Line Origin"::" ");
        SetFilter("Quantity (Base)", '<>0');
        SetFilter("Unit of Measure Code", Item2.GetFilter("Unit of Measure Filter"));

        OnAfterFilterLinesWithItemToPlan(Rec, Item);
    end;

    /// <summary>
    /// Gets filtered requisition line based on values from provided item record. 
    /// </summary>
    /// <param name="Item">Provided item record.</param>
    /// <returns>Returns 'true' if filtered requisition line is found, otherwise 'false'.</returns>
    procedure FindLinesWithItemToPlan(var Item2: Record Item): Boolean
    begin
        FilterLinesWithItemToPlan(Item2);
        exit(Find('-'));
    end;

    /// <summary>
    /// Sets filters on corresponding fields of requisition lines based on specified reservation entry, availability date filter and parameter 'Positive'.
    /// </summary>
    /// <param name="ReservationEntry">Specified reservation entry record.</param>
    /// <param name="AvailabilityFilter">Specified availability date filter.</param>
    /// <param name="Positive">In case 'true', 'Quantity (Base)' is to have value greater than zero, otherwise negative value.</param>
    procedure FilterLinesForReservation(ReservationEntry: Record "Reservation Entry"; AvailabilityFilter: Text; Positive: Boolean)
    begin
        Reset();
        SetCurrentKey(
          Type, "No.", "Variant Code", "Location Code", "Sales Order No.", "Planning Line Origin", "Due Date");
        SetRange(Type, Type::Item);
        SetRange("No.", ReservationEntry."Item No.");
        SetRange("Variant Code", ReservationEntry."Variant Code");
        SetRange("Location Code", ReservationEntry."Location Code");
        SetRange("Sales Order No.", '');
        SetFilter("Due Date", AvailabilityFilter);
        if Positive then
            SetFilter("Quantity (Base)", '>0')
        else
            SetFilter("Quantity (Base)", '<0');

        OnAfterFilterLinesForReservation(Rec, ReservationEntry);
    end;

    procedure FindCurrForecastName(var ForecastName: Code[10]): Boolean
    var
        UntrackedPlanningElement: Record "Untracked Planning Element";
    begin
        if (Type <> Type::Item) or
           ("Planning Line Origin" <> "Planning Line Origin"::Planning)
        then
            exit(false);

        UntrackedPlanningElement.SetRange("Worksheet Template Name", "Worksheet Template Name");
        UntrackedPlanningElement.SetRange("Worksheet Batch Name", "Journal Batch Name");
        UntrackedPlanningElement.SetRange("Item No.", "No.");
        UntrackedPlanningElement.SetRange("Source Type", 99000852); // Database::"Production Forecast Entry"
        UntrackedPlanningElement.SetLoadFields("Source ID");
        if UntrackedPlanningElement.FindFirst() then begin
            ForecastName := CopyStr(UntrackedPlanningElement."Source ID", 1, 10);
            exit(true);
        end;
    end;

    /// <summary>
    /// Depicts dimensions of the current requisition line. 
    /// </summary>
    procedure ShowDimensions()
    begin
        "Dimension Set ID" :=
          DimMgt.EditDimensionSet(
            Rec, "Dimension Set ID", StrSubstNo('%1 %2 %3', "Worksheet Template Name", "Journal Batch Name", "Line No."),
            "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");

        OnAfterShowDimensions(Rec, xRec);
    end;

    /// <summary>
    /// Calcuates original base quantity from fields 'Original Quantity' and 'Qty. per Unit of Measure' of the current requisition line.
    /// </summary>
    /// <returns>Returns calculated quantity base value.</returns>
    procedure GetOriginalQtyBase(): Decimal
    begin
        exit(UOMMgt.CalcBaseQty("Original Quantity", "Qty. per Unit of Measure"));
    end;

    local procedure SetFromBinCode()
    var
        IsHandled: Boolean;
        ShouldGetDefaultBin: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetFromBinCode(Rec, IsHandled);
        if IsHandled then
            exit;

        if ("Location Code" <> '') and ("No." <> '') then begin
            GetLocation("Location Code");
            OnSetFromBinCodeOnSetBinCode(Rec, Location);
            ShouldGetDefaultBin := ("Bin Code" = '') and Location."Bin Mandatory" and not Location."Directed Put-away and Pick";
            OnBeforeGetDefaultBin(Rec, ShouldGetDefaultBin);
            if ShouldGetDefaultBin then
                WMSManagement.GetDefaultBin("No.", "Variant Code", "Location Code", "Bin Code");
        end;
    end;

    local procedure GetDefaultBinCode()
    begin
        if Rec."Replenishment System" <> Rec."Replenishment System"::Purchase then
            exit;
        if (Rec."Sales Order No." <> '') and Rec."Drop Shipment" then
            exit;
        if ("Location Code" <> '') and ("No." <> '') then
            if not IsDropShipment() then begin
                GetLocation("Location Code");
                if ("Bin Code" = '') and Location."Bin Mandatory" and not Location."Directed Put-away and Pick" then
                    WMSManagement.GetDefaultBin("No.", "Variant Code", "Location Code", "Bin Code");
            end;
    end;

    /// <summary>
    /// Checks whether the current requisition line is a drop shipment.
    /// </summary>
    /// <returns>Returns 'true' if requisition line is a drop shipment, otherwise 'false'. </returns>
    procedure IsDropShipment(): Boolean
    var
        SalesLine: Record "Sales Line";
    begin
        if "Drop Shipment" then
            exit(true);

        if "Replenishment System" = "Replenishment System"::Purchase then
            if SalesLine.Get(SalesLine."Document Type"::Order, "Sales Order No.", "Sales Order Line No.") then
                exit(SalesLine."Drop Shipment");
        exit(false);
    end;

    /// <summary>
    /// Sets location code for the current requisition line record.
    /// </summary>
    procedure GetLocationCode()
    var
        Vend: Record Vendor;
        IsHandled: Boolean;
    begin
        if not IsLocationCodeAlterable() or IsDropShipmentOrSpecialOrder() then
            exit;

        IsHandled := false;
        OnGetLocationCodeOnBeforeUpdate(Rec, CurrFieldNo, IsHandled);
        if IsHandled then
            exit;

        if "Vendor No." <> '' then begin
            Vend.Get("Vendor No.");
            if Vend."Location Code" <> '' then
                "Location Code" := Vend."Location Code";
        end else
            "Location Code" := '';
    end;

    procedure IsDropShipmentOrSpecialOrder(): Boolean
    var
        SalesLine: Record "Sales Line";
    begin
        if "Replenishment System" = "Replenishment System"::Purchase then begin
            SalesLine.SetLoadFields("Drop Shipment", "Special Order");
            if SalesLine.Get(SalesLine."Document Type"::Order, "Sales Order No.", "Sales Order Line No.") then
                exit(SalesLine."Drop Shipment" or SalesLine."Special Order");
        end;
    end;

    local procedure IsLocationCodeAlterable(): Boolean
    begin
        if (CurrFieldNo = 0) and (CurrentFieldNo = 0) then
            exit(false);

        if (CurrFieldNo = FieldNo("Location Code")) or (CurrentFieldNo = FieldNo("Location Code")) then
            exit(false);

        if (CurrFieldNo = FieldNo("Replenishment System")) or (CurrentFieldNo = FieldNo("Replenishment System")) then
            exit(false);

        if "Planning Line Origin" <> "Planning Line Origin"::" " then
            exit(false);

        exit(true);
    end;

    procedure LookupRefOrderNo()
    var
        PurchHeader: Record "Purchase Header";
        TransHeader: Record "Transfer Header";
        IsHandled: Boolean;
    begin
        case "Ref. Order Type" of
            "Ref. Order Type"::Purchase:
                if PurchHeader.Get(PurchHeader."Document Type"::Order, "Ref. Order No.") then
                    PAGE.Run(PAGE::"Purchase Order", PurchHeader)
                else
                    Message(Text007, PurchHeader.TableCaption());
            "Ref. Order Type"::Transfer:
                if TransHeader.Get("Ref. Order No.") then
                    PAGE.Run(PAGE::"Transfer Order", TransHeader)
                else
                    Message(Text007, TransHeader.TableCaption());
            else begin
                IsHandled := false;
                OnLookupRefOrderNoElseCase(Rec, IsHandled);
                if not IsHandled then
                    Message(Text008);
            end;
        end;
    end;

    local procedure SetRemaningQuantity()
    begin
        "Remaining Quantity" := Quantity - "Finished Quantity";
        "Remaining Qty. (Base)" := "Remaining Quantity" * "Qty. per Unit of Measure";

        OnAfterSetRemaningQuantity(Rec, xRec, CurrFieldNo, CurrentFieldNo);
    end;

    local procedure SetReplenishmentSystemFromPurchase(StockkeepingUnit: Record "Stockkeeping Unit")
    begin
        "Ref. Order Type" := "Ref. Order Type"::Purchase;
        Clear("Ref. Order Status");
        "Ref. Order No." := '';
        DeleteRelations();
        CleanProdBOMNo();
        UpdateUnitOfMeasureCodeFromItemPurchUnitOfMeasure();
        Validate("Transfer-from Code", '');

        ValidateVendorNoWithStockkeepingUnit(StockkeepingUnit);

        OnAfterSetReplenishmentSystemFromPurchase(Rec, Item, StockkeepingUnit);
    end;

    local procedure ValidateVendorNoWithStockkeepingUnit(StockkeepingUnit: Record "Stockkeeping Unit")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateVendorNoWithStockkeepingUnit(Rec, StockkeepingUnit, IsHandled);
        if IsHandled then
            exit;

        if StockkeepingUnit."Vendor No." = '' then
            Validate("Vendor No.")
        else
            Validate("Vendor No.", StockkeepingUnit."Vendor No.");
    end;

    local procedure UpdateUnitOfMeasureCodeFromItemPurchUnitOfMeasure()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateUnitOfMeasureCodeFromItemPurchUnitOfMeasure(Rec, Item, IsHandled);
        if IsHandled then
            exit;

        if Item."Purch. Unit of Measure" <> '' then
            Validate("Unit of Measure Code", Item."Purch. Unit of Measure");
    end;

    procedure UpdateUnitOfMeasureCodeFromItemBaseUnitOfMeasure()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateUnitOfMeasureCodeFromItemBaseUnitOfMeasure(Rec, Item, IsHandled);
        if IsHandled then
            exit;

        Validate("Unit of Measure Code", Item."Base Unit of Measure");
    end;

    local procedure SetReplenishmentSystemFromTransfer(StockkeepingUnit: Record "Stockkeeping Unit")
    begin
        OnBeforeSetReplenishmentSystemFromTransfer(Rec, Item, StockkeepingUnit, CurrFieldNo);

        "Ref. Order Type" := "Ref. Order Type"::Transfer;
        Clear("Ref. Order Status");
        "Ref. Order No." := '';
        DeleteRelations();
        Validate("Vendor No.", '');
        CleanProdBOMNo();
        Validate("Transfer-from Code", StockkeepingUnit."Transfer-from Code");
        UpdateUnitOfMeasureCodeFromItemBaseUnitOfMeasure();

        OnAfterSetReplenishmentSystemFromTransfer(Rec, Item, StockkeepingUnit, CurrFieldNo);
    end;

    local procedure UpdateReplenishmentSystem()
    var
        StockkeepingUnit: Record "Stockkeeping Unit";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateReplenishmentSystem(Rec, IsHandled);
        if IsHandled then
            exit;

        GetItem();
        StockkeepingUnit := Item.GetSKU("Location Code", "Variant Code");
        if Subcontracting then
            StockkeepingUnit."Replenishment System" := StockkeepingUnit."Replenishment System"::"Prod. Order";
        ValidateReplenishmentSystem(StockkeepingUnit);
    end;

    local procedure ValidateReplenishmentSystem(StockkeepingUnit: Record "Stockkeeping Unit")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidateReplenishmentSystem(Rec, StockkeepingUnit, IsHandled);
        if IsHandled then
            exit;
        Validate("Replenishment System", StockkeepingUnit."Replenishment System");
    end;

    procedure GetJnlBatchNameForOrderPlanning(): Code[10]
    var
        RequisitionLine: Record "Requisition Line";
    begin
        RequisitionLine.ReadIsolation := RequisitionLine.ReadIsolation::ReadUncommitted;
        RequisitionLine.SetLoadFields("Journal Batch Name");
        RequisitionLine.SetRange("Worksheet Template Name", '');
        RequisitionLine.SetFilter("Journal Batch Name", '<>%1', '');
        RequisitionLine.SetRange("User ID", UserId());
        if RequisitionLine.FindFirst() then
            exit(RequisitionLine."Journal Batch Name");

        RequisitionLine.SetRange("User ID");
        if RequisitionLine.FindLast() then
            exit(IncStr(RequisitionLine."Journal Batch Name"));

        exit('0');
    end;

    procedure CreateDimFromDefaultDim()
    var
        DefaultDimSource: List of [Dictionary of [Integer, Code[20]]];
    begin
        InitDefaultDimensionSources(DefaultDimSource);
        CreateDim(DefaultDimSource);
    end;

    local procedure InitDefaultDimensionSources(var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    begin
        DimMgt.AddDimSource(DefaultDimSource, DimMgt.ReqLineTypeToTableID(Rec.Type), Rec."No.");
        DimMgt.AddDimSource(DefaultDimSource, Database::Vendor, Rec."Vendor No.");
        DimMgt.AddDimSource(DefaultDimSource, Database::Location, Rec."Location Code");
        DimMgt.AddDimSource(DefaultDimSource, Database::"Salesperson/Purchaser", Rec."Purchaser Code");
        DimMgt.AddDimSource(DefaultDimSource, Database::Job, Rec."Demand Order No.");

        OnAfterInitDefaultDimensionSources(Rec, DefaultDimSource, CurrFieldNo);
    end;

    local procedure SetPurchaserCode(PurchaserCodeToCheck: Code[20]; var PurchaserCodeToAssign: Code[20])
    var
        SalespersonPurchaser: Record "Salesperson/Purchaser";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetPurchaserCode(Rec, PurchaserCodeToCheck, PurchaserCodeToAssign, IsHandled);
        if IsHandled then
            exit;

        if PurchaserCodeToCheck = '' then
            PurchaserCodeToCheck := GetUserSetupPurchaserCode();
        if SalespersonPurchaser.Get(PurchaserCodeToCheck) then begin
            if SalespersonPurchaser.VerifySalesPersonPurchaserPrivacyBlocked(SalespersonPurchaser) then
                PurchaserCodeToAssign := ''
            else
                PurchaserCodeToAssign := PurchaserCodeToCheck;
        end else
            PurchaserCodeToAssign := '';
    end;

    local procedure GetUserSetupPurchaserCode(): Code[20]
    var
        UserSetup: Record System.Security.User."User Setup";
    begin
        UserSetup.SetLoadFields("Salespers./Purch. Code");
        if not UserSetup.Get(UserId) then
            exit('');

        exit(UserSetup."Salespers./Purch. Code");
    end;

    local procedure UpdateJobTaskDimensions()
    var
        JobPlanningLine: Record "Job Planning Line";
        DimSetIDArr: array[10] of Integer;
    begin
        DimSetIDArr[1] := "Dimension Set ID";

        JobPlanningLine.SetRange("Job No.", "Demand Order No.");
        JobPlanningLine.SetRange("Job Contract Entry No.", "Demand Line No.");
        if JobPlanningLine.FindFirst() then
            DimSetIDArr[2] := DimMgt.CreateDimSetFromJobTaskDim(JobPlanningLine."Job No.", JobPlanningLine."Job Task No.", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");

        "Dimension Set ID" := DimMgt.GetCombinedDimensionSetID(DimSetIDArr, "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
    end;

    local procedure GetItemVariant()
    begin
        if Rec."Variant Code" = '' then begin
            Clear(ItemVariant);
            exit;
        end;

        if (ItemVariant."Item No." <> Rec."No.") or (ItemVariant.Code <> Rec."Variant Code") then begin
            ItemVariant.SetLoadFields("Blocked");
            ItemVariant.Get(Rec."No.", Rec."Variant Code");
        end;
    end;

    local procedure UpdateSalesOrderDetailForDropShipment()
    var
        SalesHeader: Record "Sales Header";
        SalesLine: Record "Sales Line";
    begin
        if Rec."Demand Type" <> Database::"Sales Line" then
            exit;

        if not Rec."Drop Shipment" then
            exit;

        SalesLine.SetLoadFields("Sell-to Customer No.");
        if not SalesLine.Get(Rec."Demand Subtype", Rec."Demand Order No.", Rec."Demand Line No.") then
            exit;

        Rec."Sales Order No." := SalesLine."Document No.";
        Rec."Sales Order Line No." := SalesLine."Line No.";
        Rec."Sell-to Customer No." := SalesLine."Sell-to Customer No.";

        SalesHeader.SetLoadFields("Ship-to Code");
        if SalesHeader.Get(SalesLine."Document Type", SalesLine."Document No.") then
            Rec."Ship-to Code" := SalesHeader."Ship-to Code";
    end;

    procedure ReserveBindingOrder(TrackingSpecification: Record "Tracking Specification"; SourceDescription: Text[100]; ExpectedDate: Date; ReservQty: Decimal; ReservQtyBase: Decimal; UpdateReserve: Boolean)
    begin
        OnReserveBindingOrder(Rec, TrackingSpecification, SourceDescription, ExpectedDate, ReservQty, ReservQtyBase, UpdateReserve);
    end;

    local procedure ErrorIfItemVariantIsBlocked()
    begin
        if ItemVariant.Blocked then
            Error(BlockedErr, ItemVariant.TableCaption(), StrSubstNo(ItemVariantPrimaryKeyLbl, ItemVariant."Item No.", ItemVariant.Code), ItemVariant.FieldCaption(Blocked));
    end;

    procedure CleanProdOrderNo()
    begin
        OnCleanProdOrderNo(Rec);
    end;

    procedure CleanProdBOMNo()
    begin
        OnCleanProdBOMNo(Rec);
    end;

    procedure SetOperationNoFilterToBlank()
    begin
        OnSetOperationNoFilterToBlank(Rec);
    end;

    procedure IsProdOrder() Result: Boolean
    begin
        OnIsProdOrder(Rec, Result);
    end;

    procedure IsProductionBOM() Result: Boolean
    begin
        OnIsProductionBOM(Rec, Result);
    end;

    procedure IsProdDemand() Result: Boolean
    begin
        OnIsProdDemand(Rec, Result);
    end;

    procedure ResetReqLineFields()
    begin
        OnResetReqLineFields(Rec);
    end;

    procedure TestProdOrderNo()
    begin
        OnTestProdOrderNo(Rec);
    end;

    procedure SetDoNotUpdateOrderReceiptDate(NewUpdateOrderReceiptDate: Boolean)
    begin
        DoNotUpdateOrderReceiptDate := NewUpdateOrderReceiptDate;
    end;

    local procedure PreventModifyRecIfOpenApprovalEntryExist()
    var
        RequisitionWkshName: Record "Requisition Wksh. Name";
    begin
        if RequisitionWkshName.Get("Worksheet Template Name", "Journal Batch Name") then
            ApprovalsMgmt.PreventModifyRecIfOpenApprovalEntryExist(RequisitionWkshName);
    end;

    procedure CheckRequisitionWkshLineRestriction()
    begin
        OnCheckRequisitionWkshLinePostRestrictions();
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDefaultDimensionSources(var RequisitionLine: Record "Requisition Line"; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; CurrFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateDescription(var RequisitionLine: Record "Requisition Line"; Item: Record Item; ItemVariant: Record "Item Variant"; FieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromItem(var RequisitionLine: Record "Requisition Line"; Item: Record Item; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterClearPlanningWorksheet(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateDim(var ReqLine: Record "Requisition Line"; xReqLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterDeleteMultiLevel(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterDeleteRelations(var RequisitionLine: Record "Requisition Line"; DeleteAllLines: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFilterLinesWithItemToPlan(var RequisitionLine: Record "Requisition Line"; var Item: Record Item)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFilterLinesForReservation(var RequisitionLine: Record "Requisition Line"; var ReservationEntry: Record "Reservation Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetDirectCost(var RequisitionLine: Record "Requisition Line"; CalledByFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterGetLineWithPrice(var LineWithPrice: Interface "Line With Price")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterOnInsert(var RequisitionLine: Record "Requisition Line"; ReqWkshTemplate: Record "Req. Wksh. Template"; RequisitionWkshName: Record "Requisition Wksh. Name")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDueDate(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetRemaningQuantity(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; CallingFieldNo: Integer; GlobalCurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetReplenishmentSystemFromPurchase(var RequisitionLine: Record "Requisition Line"; Item: Record Item; StockkeepingUnit: Record "Stockkeeping Unit")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromActionMessage(var RequisitionLine: Record "Requisition Line"; var ActionMessageEntry: Record "Action Message Entry"; var ReservEntry: Record "Reservation Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetReplenishmentSystemFromTransfer(var RequisitionLine: Record "Requisition Line"; Item: Record Item; StockkeepingUnit: Record "Stockkeeping Unit"; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetReservationEntry(var ReservEntry: Record "Reservation Entry"; RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetReservationFilters(var ReservEntry: Record "Reservation Entry"; RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromPurchaseLine(var ReqLine: Record "Requisition Line"; PurchLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromTransLine(var ReqLine: Record "Requisition Line"; TransLine: Record "Transfer Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferFromUnplannedDemand(var RequisitionLine: Record "Requisition Line"; UnplannedDemand: Record "Unplanned Demand")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferToTrackingEntry(var ReservationEntry: Record "Reservation Entry"; RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateOrderReceiptDate(var RequisitionLine: Record "Requisition Line"; LeadTimeCalc: DateFormula)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateFields(RequisitionLine: Record "Requisition Line"; CurrFieldNo: Integer; CurrentFieldNo: Integer; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateShortcutDimCode(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyFromItem(var RequisitionLine: Record "Requisition Line"; Item: Record Item; xRequisitionLine: Record "Requisition Line"; FieldNo: Integer; var TempPlanningErrorLog: Record "Planning Error Log" temporary; PlanningResiliency: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckBlockedItem(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckEndingDate(var RequisitionLine: Record "Requisition Line"; var ShowWarning: Boolean; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckVendorBlocked(var RequisitionLine: Record "Requisition Line"; var Vendor: Record Vendor; var IsHandled: Boolean; GlobalCurrentFieldNo: Integer);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteMultiLevel(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetDefaultBin(var RequisitionLine: Record "Requisition Line"; var ShouldGetDefaultBin: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetDirectCost(var ReqLine: Record "Requisition Line"; xReqLine: Record "Requisition Line"; CalledByFieldNo: Integer; FieldNo: Integer; Subcontracting: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetReservationQty(var RequisitionLine: Record "Requisition Line"; var QtyReserved: Decimal; var QtyReservedBase: Decimal; var QtyToReserve: Decimal; var QtyToReserveBase: Decimal; var Result: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInitRecordForOrderPlanning(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLookupVendor(var RequisitionLine: Record "Requisition Line"; var Vendor: Record Vendor; var PreferItemVendorCatalog: Boolean; var IsHandled: Boolean; var IsVendorSelected: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLookupVendorNo(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnDelete(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetFromBinCode(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateVendorNoWithStockkeepingUnit(var RequisitionLine: Record "Requisition Line"; StockkeepingUnit: Record "Stockkeeping Unit"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateItemDescriptionAndQuantity(var RequisitionLine: Record "Requisition Line"; Vendor: Record Vendor; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateShortcutDimCode(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateDescription(var RequisitionLine: Record "Requisition Line"; CalledByFieldNo: Integer; var IsHandled: Boolean; xRequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateOrderReceiptDate(var RequisitionLine: Record "Requisition Line"; LeadTimeCalc: DateFormula; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateQuantityBase(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean; xRequisitionLine: Record "Requisition Line"; FieldNo: Integer; FieldNo2: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateUnitCost(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateReplenishmentSystem(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateReplenishmentSystem(var RequisitionLine: Record "Requisition Line"; StockkeepingUnit: Record "Stockkeeping Unit"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetLocationCodeOnBeforeUpdate(var RequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupSupplyFromOnCaseReplenishmentSystemElse(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateSupplyFromOnCaseReplenishmentSystemElse(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateNoOfAfterCalcShouldValidateUnitofMeasureCode(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; Item: Record Item; var ShouldVaidateUnitofMeasureCode: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateDescriptionFromItem(var RequisitionLine: Record "Requisition Line"; Item: Record Item)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateDescriptionFromItemVariant(var RequisitionLine: Record "Requisition Line"; ItemVariant: Record "Item Variant")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateDescriptionFromItemTranslation(var RequisitionLine: Record "Requisition Line"; ItemTranslation: Record "Item Translation")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateDescriptionFromSalesLine(var RequisitionLine: Record "Requisition Line"; SalesLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateEndingTimeOnBeforeSetDueDate(var RequisitionLine: Record "Requisition Line"; var ShouldSetDueDate: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateStartingTimeOnBeforeSetDueDate(var RequisitionLine: Record "Requisition Line"; var ShouldSetDueDate: Boolean; xRequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer; CurrFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateLocationCodeOnBeforeGetDefaultBin(var RequisitionLine: Record "Requisition Line"; var ShouldGetDefaultBin: Boolean; Location: Record Location; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateQuantityOnBeforeUnitCost(var RequisitionLine: Record "Requisition Line"; CallingFieldNo: Integer; GlobalCurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateReplenishmentSystemCaseElse(var RequisitionLine: Record "Requisition Line"; var StockkeepingUnit: Record "Stockkeeping Unit")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateReplenishmentSystemOnAfterSetStockkeepingUnit(var RequisitionLine: Record "Requisition Line"; var StockkeepingUnit: Record "Stockkeeping Unit"; Subcontracting: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnAfterGetLocationCode(var RequisitionLine: Record "Requisition Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcStartingDate(var RequisitionLine: Record "Requisition Line"; var LeadTime: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcEndingDate(var RequisitionLine: Record "Requisition Line"; var LeadTime: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyDescriptionFromGLAcc(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCopyFromGLAccOnBeforeTestFieldDirectPosting(var RequisitionLine: Record "Requisition Line"; GLAccount: Record "G/L Account"; var ShouldTestFieldDirectPosting: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterLookupVendorNo(var RequisitionLine: Record "Requisition Line"; var Vend: Record Vendor)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeShowReservation(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateStartingTime(var RequisitionLine: Record "Requisition Line"; var ShouldSetDueDate: Boolean; var IsHandled: Boolean; CallingFieldNo: Integer; CurrentFieldNo: Integer; xRequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateLocationChange(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateEndingTime(var RequisitionLine: Record "Requisition Line"; var ShouldSetDueDate: Boolean; var IsHandled: Boolean; CallingFieldNo: Integer; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetLocation(var RequisitionLine: Record "Requisition Line"; var Location: Record Location; LocationCode: Code[10]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferFromUnplannedDemandOnBeforeSetType(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetUpNewLine(var RequisitionLine: Record "Requisition Line"; LastReqLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateDim(var RequisitionLine: Record "Requisition Line"; DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferFromUnplannedDemandOnBeforeSetStatus(var RequisitionLine: Record "Requisition Line"; var UnplannedDemand: Record "Unplanned Demand")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteRelationsOnBeforePlanningComponentDelete(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetSupplyDates(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateActionMessage(var RequisitionLine: Record "Requisition Line"; var xRequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateUnitofMeasureCodeOnBeforeGetDirectCost(var RequisitionLine: Record "Requisition Line"; var Item: Record Item)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateUnitOfMeasureCodeFromItemBaseUnitOfMeasure(var RequisitionLine: Record "Requisition Line"; var Item: Record Item; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateUnitOfMeasureCodeFromItemPurchUnitOfMeasure(var RequisitionLine: Record "Requisition Line"; var Item: Record Item; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupFromLocationOnAfterSetFilters(RequisitionLine: Record "Requisition Line"; var Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcEndingDate(var Rec: Record "Requisition Line"; LeadTime: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetDirectCostOnBeforePriceCalculation(var Rec: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCalcStartingDateOnBeforeValidateOrderDate(var Rec: Record "Requisition Line"; var LeadTime: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetReplenishmentSystemFromTransfer(var RequisitionLine: Record "Requisition Line"; Item: Record Item; StockkeepingUnit: Record "Stockkeeping Unit"; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcTransferShipmentDate(var Rec: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteMultiLevelOnAfterSetFilterReqLine2(ReqLine: Record "Requisition Line"; var ReqLine2: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupRefOrderNoOnBeforeOpenPage(var ReqLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetDimFromRefOrderLineOnBeforeSetDimSetIDTypeTransfer(ReqLine: Record "Requisition Line"; var DimSetIDArr: array[10] of Integer; i: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCurrencyCodeOnBeforeUpdateCurrencyFactor(var ReqLine: Record "Requisition Line"; var CurrExchRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnValidateShipToCode(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAssignItemUnitCostAndQuantitiesForUOM(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; Item: Record Item; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateQuantityOnBeforeGetDirectCost(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateDueDateOnAfterCalcShouldExitDueDate(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer; var ShouldExitDueDate: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnBeforeSetVendorItemNoFromItemVend(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnBeforeGetDirectCost(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetPurchaserCode(var RequisitionLine: Record "Requisition Line"; PurchaserCodeToCheck: Code[20]; var PurchaserCodeToAssign: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCurrencyFactorOnBeforeUpdateDirectUnitCost(var RequisitionLine: Record "Requisition Line"; var CurrencyExchangeRate: Record "Currency Exchange Rate")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateNoOnAfterAssignFieldsForNo(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetDemandTypeFromUnplannedDemand(var RequisitionLine: Record "Requisition Line"; UnplannedDemand: Record "Unplanned Demand")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnReserveBindingOrder(var RequisitionLine: Record "Requisition Line"; TrackingSpecification: Record "Tracking Specification"; SourceDescription: Text[100]; ExpectedDate: Date; ReservQty: Decimal; ReservQtyBase: Decimal; UpdateReserve: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShowDimensions(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnIsProdOrder(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnIsProductionBOM(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnIsProdDemand(var RequisitionLine: Record "Requisition Line"; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCleanProdOrderNo(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCleanProdBOMNo(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTestProdOrderNo(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetDimFromRefOrderLineElseCase(var RequisitionLine: Record "Requisition Line"; var DimSetIDArr: array[10] of Integer; i: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupRefOrderNoElseCase(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnClearPlanningWorksheetOnBeforeRequisitionLineDelete(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRoutingLineExists(var RequisitionLine: Record "Requisition Line"; var RoutingExists: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateStartingDate(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateEndingDate(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateStartingTimeOnBeforeUpdateDateTime(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateEndingTimeOnBeforeUpdateDateTime(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetFromBinCodeOnSetBinCode(var RequisitionLine: Record "Requisition Line"; Location: Record Location)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldCheckNewActionMessage(var RequisitionLine: Record "Requisition Line"; CurrentFieldNo: Integer; var ShouldCheck: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateWorkCenterDescription(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterShouldUpdateEndingDateForSourceType(SourceType: Integer; var ShouldUpdate: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetSupplyDatesOnAfterValidateEndingDate(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnBeforeLookupVendor(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnAfterCheckVendor(var RequisitionLine: Record "Requisition Line"; Vend: Record Vendor; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnAfterSetSupplyFrom(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnResetReqLineFields(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetOperationNoFilterToBlank(var RequisitionLine: Record "Requisition Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateDim(var RequisitionLine: Record "Requisition Line"; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateItemReferenceDescription(var RequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnCheckRequisitionWkshLinePostRestrictions()
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateNoOnBeforeDeleteRelations(var RequisitionLine: Record "Requisition Line"; xRequisitionLine: Record "Requisition Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnBeforeValidateCurrencyCode(var RequisitionLine: Record "Requisition Line"; Vendor: Record Vendor; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnAfterGetDefaultBinCode(var RequisitionLine: Record "Requisition Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVendorNoOnBeforeUpdateVendorItemInfo(var RequisitionLine: Record "Requisition Line"; var UpdateVendorItemInfo: Boolean)
    begin
    end;
}