Table 5900 Service Header, source in 29

Source29

src/Layers/W1/BaseApp/Service/Document/ServiceHeader.Table.al6588 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.Service.Document;

using Microsoft.Bank.BankAccount;
using Microsoft.Bank.DirectDebit;
using Microsoft.Bank.Payment;
using Microsoft.CRM.BusinessRelation;
using Microsoft.CRM.Contact;
using Microsoft.CRM.Team;
using Microsoft.EServices.EDocument;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.ReceivablesPayables;
using Microsoft.Finance.SalesTax;
using Microsoft.Finance.VAT.Setup;
using Microsoft.Foundation.Address;
using Microsoft.Foundation.AuditCodes;
using Microsoft.Foundation.Company;
using Microsoft.Foundation.Enums;
using Microsoft.Foundation.ExtendedText;
using Microsoft.Foundation.NoSeries;
using Microsoft.Foundation.PaymentTerms;
using Microsoft.Foundation.Shipping;
using Microsoft.Inventory.Intrastat;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Location;
using Microsoft.Inventory.Tracking;
using Microsoft.Pricing.Calculation;
using Microsoft.Projects.Resources.Journal;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Pricing;
using Microsoft.Sales.Receivables;
#if not CLEAN27
using Microsoft.Sales.Setup;
#endif
using Microsoft.Service.Archive;
using Microsoft.Service.Comment;
using Microsoft.Service.Contract;
using Microsoft.Service.History;
using Microsoft.Service.Ledger;
using Microsoft.Service.Loaner;
using Microsoft.Service.Maintenance;
using Microsoft.Service.Posting;
using Microsoft.Service.Setup;
using Microsoft.Utilities;
using Microsoft.Warehouse.Activity;
using Microsoft.Warehouse.Document;
using Microsoft.Warehouse.Request;
using System.Email;
using System.Globalization;
using System.Reflection;
using System.Security.User;
using System.Threading;
using System.Utilities;

table 5900 "Service Header"
{
    Caption = 'Service Header';
    DataCaptionFields = "No.", Name, Description;
    DrillDownPageID = "Service List";
    LookupPageID = "Service List";
    Permissions = TableData "Loaner Entry" = d,
                  TableData "Service Order Allocation" = rimd;
    DataClassification = CustomerContent;

    fields
    {
        field(1; "Document Type"; Enum "Service Document Type")
        {
            Caption = 'Document Type';
            ToolTip = 'Specifies the type of the service document on the line.';
        }
        field(2; "Customer No."; Code[20])
        {
            Caption = 'Customer No.';
            ToolTip = 'Specifies the number of the customer who owns the items in the service document.';
            TableRelation = Customer;

            trigger OnValidate()
            var
                ConfirmManagement: Codeunit "Confirm Management";
                Confirmed: Boolean;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateCustomerNo(Rec, xRec, CurrFieldNo, IsHandled);
                if not IsHandled then
                    if ("Customer No." <> xRec."Customer No.") and (xRec."Customer No." <> '') then begin
                        if "Contract No." <> '' then
                            Error(
                              Text003,
                              FieldCaption("Customer No."),
                              "Document Type", FieldCaption("No."), "No.",
                              FieldCaption("Contract No."), "Contract No.");
                        if HideValidationDialog or not GuiAllowed then
                            Confirmed := true
                        else
                            if ServItemLineExists() then
                                Confirmed :=
                                  ConfirmManagement.GetResponseOrDefault(
                                    StrSubstNo(Text004, FieldCaption("Customer No.")), true)
                            else
                                if ServLineExists() then
                                    Confirmed :=
                                      ConfirmManagement.GetResponseOrDefault(
                                        StrSubstNo(Text057, FieldCaption("Customer No.")), true)
                                else
                                    Confirmed :=
                                      ConfirmManagement.GetResponseOrDefault(
                                        StrSubstNo(Text005, FieldCaption("Customer No.")), true);
                        if Confirmed then begin
                            ServLine.SetRange("Document Type", "Document Type");
                            ServLine.SetRange("Document No.", "No.");
                            if "Document Type" = "Document Type"::Order then
                                ServLine.SetFilter("Quantity Shipped", '<>0')
                            else
                                if "Document Type" = "Document Type"::Invoice then begin
                                    ServLine.SetRange("Customer No.", xRec."Customer No.");
                                    ServLine.SetFilter("Shipment No.", '<>%1', '');
                                end;

                            if ServLine.FindFirst() then
                                if "Document Type" = "Document Type"::Order then
                                    ServLine.TestField("Quantity Shipped", 0)
                                else
                                    ServLine.TestField("Shipment No.", '');
                            OnValidateCustomerNoOnBeforeModify(Rec, CurrFieldNo);
                            Modify(true);

                            IsHandled := false;
                            OnValidateCustomerNoOnBeforeDeleteLines(Rec, IsHandled);
                            if not IsHandled then begin
                                ServLine.LockTable();
                                ServLine.Reset();
                                ServLine.SetRange("Document Type", "Document Type");
                                ServLine.SetRange("Document No.", "No.");
                                ServLine.DeleteAll(true);

                                ServItemLine.LockTable();
                                ServItemLine.Reset();
                                ServItemLine.SetRange("Document Type", "Document Type");
                                ServItemLine.SetRange("Document No.", "No.");
                                ServItemLine.DeleteAll(true);
                            end;

                            Get("Document Type", "No.");
                            if "Customer No." = '' then begin
                                Init();
                                OnValidateCustomerNoAfterInit(Rec, xRec);
                                GetServiceMgtSetup();
                                "No. Series" := xRec."No. Series";
                                InitRecord();
                                if xRec."Shipping No." <> '' then begin
                                    "Shipping No. Series" := xRec."Shipping No. Series";
                                    "Shipping No." := xRec."Shipping No.";
                                end;
                                if xRec."Posting No." <> '' then begin
                                    "Posting No. Series" := xRec."Posting No. Series";
                                    "Posting No." := xRec."Posting No.";
                                end;
                                exit;
                            end;
                        end else begin
                            Rec := xRec;
                            exit;
                        end;
                    end;

                if "No." = '' then
                    InitRecord();

                GetCust("Customer No.");
                if "Customer No." <> '' then begin
                    IsHandled := false;
                    OnBeforeCheckBlockedCustomer(Cust, IsHandled);
                    if not IsHandled then
                        Cust.CheckBlockedCustOnDocs(Cust, "Document Type", false, false);
                    if CheckBusPostingGroups() then
                        Cust.TestField("Gen. Bus. Posting Group");
                    CopyCustomerFields(Cust);
                end;

                IsHandled := false;
                OnValidateCustomerNoOnBeforeShippedServLinesExist(Rec, xRec, IsHandled);
                if not IsHandled then
                    if "Customer No." = xRec."Customer No." then
                        if ShippedServLinesExist() then
                            if CheckBusPostingGroups() then begin
                                TestField("VAT Bus. Posting Group", xRec."VAT Bus. Posting Group");
                                TestField("Gen. Bus. Posting Group", xRec."Gen. Bus. Posting Group");
                            end;

                IsHandled := false;
                OnValidateCustomerNoOnBeforeVerifyShipToCode(Rec, SkipBillToContact, IsHandled);
                if not IsHandled then begin
                    Validate("Ship-to Code", Cust."Ship-to Code");
                    IsHandled := false;
                    OnValidateCustomerNoOnBeforeValidateBillToCustomerNo(Rec, Cust, IsHandled);
                    if not IsHandled then
                        if Cust."Bill-to Customer No." <> '' then
                            Validate("Bill-to Customer No.", Cust."Bill-to Customer No.")
                        else begin
                            if "Bill-to Customer No." = "Customer No." then
                                SkipBillToContact := true;
                            Validate("Bill-to Customer No.", "Customer No.");
                            SkipBillToContact := false;
                        end;
                end;

                IsHandled := false;
                OnValidateCustomerNoOnBeforeValidateServiceZoneCode(Rec, IsHandled);
                if not IsHandled then
                    Validate("Service Zone Code");

                if not SkipContact then
                    UpdateCont("Customer No.");
            end;
        }
        field(3; "No."; Code[20])
        {
            Caption = 'No.';
            ToolTip = 'Specifies the number of the involved entry or record, according to the specified number series.';

            trigger OnValidate()
            begin
                if "No." <> xRec."No." then begin
                    GetServiceMgtSetup();
                    TestNoSeriesManual();
                    "No. Series" := '';
                end;
            end;
        }
        field(4; "Bill-to Customer No."; Code[20])
        {
            Caption = 'Bill-to Customer No.';
            ToolTip = 'Specifies the number of the customer that you send or sent the invoice or credit memo to.';
            NotBlank = true;
            TableRelation = Customer;

            trigger OnValidate()
            var
                ServCheckCreditLimit: Codeunit "Serv. Check Credit Limit";
                ConfirmManagement: Codeunit "Confirm Management";
                Confirmed: Boolean;
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnValidateBillToCustomerNoOnBeforeConfirmChange(Rec, xRec, IsHandled);
                if not IsHandled then
                    if (xRec."Bill-to Customer No." <> "Bill-to Customer No.") and
                       (xRec."Bill-to Customer No." <> '')
                    then begin
                        if HideValidationDialog then
                            Confirmed := true
                        else
                            Confirmed :=
                              ConfirmManagement.GetResponseOrDefault(
                                StrSubstNo(Text005, FieldCaption("Bill-to Customer No.")), true);
                        if Confirmed then begin
                            ServLine.SetRange("Document Type", "Document Type");
                            ServLine.SetRange("Document No.", "No.");
                            if "Document Type" = "Document Type"::Order then
                                ServLine.SetFilter("Quantity Shipped", '<>0')
                            else
                                if "Document Type" = "Document Type"::Invoice then
                                    ServLine.SetFilter("Shipment No.", '<>%1', '');

                            OnValidateBillToCustomerNoOnAfterSetFilters(ServLine, Rec, xRec);

                            if ServLine.FindFirst() then
                                if "Document Type" = "Document Type"::Order then
                                    ServLine.TestField("Quantity Shipped", 0)
                                else
                                    ServLine.TestField("Shipment No.", '');
                            ServLine.Reset();
                        end else
                            "Bill-to Customer No." := xRec."Bill-to Customer No.";
                    end;

                GetCust("Bill-to Customer No.");

                IsHandled := false;
                OnBeforeCheckBlockedCustomer(Cust, IsHandled);
                if not IsHandled then
                    Cust.CheckBlockedCustOnDocs(Cust, "Document Type", false, false);

                Cust.TestField("Customer Posting Group");

                IsHandled := false;
                OnValidateBillToCustomerNoOnBeforeCopyBillToCustomerFields(Rec, IsHandled);
                if not IsHandled then
                    if GuiAllowed and not HideValidationDialog and
                       ("Document Type" in ["Document Type"::Quote, "Document Type"::Order, "Document Type"::Invoice])
                    then
                        ServCheckCreditLimit.ServiceHeaderCheck(Rec);

                CopyBillToCustomerFields(Cust);

                ValidateServPriceGrOnServItem();

                if "Bill-to Customer No." = xRec."Bill-to Customer No." then
                    if ShippedServLinesExist() then begin
                        TestField("Customer Disc. Group", xRec."Customer Disc. Group");
                        TestField("Currency Code", xRec."Currency Code");
                    end;

                CreateDimFromDefaultDim(Rec.FieldNo("Bill-to Customer No."));

                Validate("Payment Terms Code");
                Validate("Payment Method Code");
                Validate("Currency Code");

                IsHandled := false;
                OnValidateBillToCustomerNoOnBeforeRecreateServLines(Rec, xRec, IsHandled);
                if not IsHandled then
                    if (xRec."Customer No." = "Customer No.") and
                       (xRec."Bill-to Customer No." <> "Bill-to Customer No.")
                    then
                        RecreateServLines(FieldCaption("Bill-to Customer No."));

                if not SkipBillToContact then
                    UpdateBillToCont("Bill-to Customer No.");

                if Rec."Customer No." <> Rec."Bill-to Customer No." then
                    UpdateShipToSalespersonCode();

                OnAfterValidateBillToCustomerNo(Rec, xRec, Cust);
            end;
        }
        field(5; "Bill-to Name"; Text[100])
        {
            Caption = 'Bill-to Name';
            ToolTip = 'Specifies the name of the customer that you send or sent the invoice or credit memo to.';
        }
        field(6; "Bill-to Name 2"; Text[50])
        {
            Caption = 'Bill-to Name 2';
            ToolTip = 'Specifies an additional part of the name of the customer that you send or sent the invoice or credit memo to.';
        }
        field(7; "Bill-to Address"; Text[100])
        {
            Caption = 'Bill-to Address';
            ToolTip = 'Specifies the address of the customer to whom you will send the invoice.';
        }
        field(8; "Bill-to Address 2"; Text[50])
        {
            Caption = 'Bill-to Address 2';
            ToolTip = 'Specifies an additional line of the address.';
        }
        field(9; "Bill-to City"; Text[30])
        {
            Caption = 'Bill-to City';
            ToolTip = 'Specifies the city of the address.';
            TableRelation = if ("Bill-to Country/Region Code" = const('')) "Post Code".City
            else
            if ("Bill-to Country/Region Code" = filter(<> '')) "Post Code".City where("Country/Region Code" = field("Bill-to Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode("Bill-to City", "Bill-to Post Code", "Bill-to County", "Bill-to Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateBillToCity(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidateCity(
                        "Bill-to City", "Bill-to Post Code", "Bill-to County", "Bill-to Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
            end;
        }
        field(10; "Bill-to Contact"; Text[100])
        {
            Caption = 'Bill-to Contact';
            ToolTip = 'Specifies the name of the contact person at the customer''s billing address.';
        }
        field(11; "Your Reference"; Text[35])
        {
            Caption = 'Your Reference';
            ToolTip = 'Specifies a customer reference, which will be used when printing service documents.';
        }
        field(12; "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.';
            TableRelation = "Ship-to Address".Code where("Customer No." = field("Customer No."));

            trigger OnValidate()
            var
                ShipToAddr: Record "Ship-to Address";
                ConfirmManagement: Codeunit "Confirm Management";
                IsHandled: Boolean;
                ShouldUpdateShipToAddressFields: Boolean;
            begin
                IsHandled := false;
                OnValidateShiptoCodeBeforeConfirmDialog(Rec, xRec, IsHandled);
                if not IsHandled then
                    if ("Ship-to Code" <> xRec."Ship-to Code") and ("Customer No." = xRec."Customer No.") then begin
                        if ("Contract No." <> '') and not HideValidationDialog then
                            Error(
                                Text003,
                                FieldCaption("Ship-to Code"), "Document Type", FieldCaption("No."), "No.", FieldCaption("Contract No."), "Contract No.");
                        if ServItemLineExists() then begin
                            if not ConfirmManagement.GetResponseOrDefault(StrSubstNo(Text004, FieldCaption("Ship-to Code")), true) then begin
                                "Ship-to Code" := xRec."Ship-to Code";
                                exit;
                            end;
                        end else
                            if ServLineExists() then begin
                                IsHandled := false;
                                OnValidateShipToCodeOnBeforeConfirmDeleteLines(Rec, IsHandled);
                                if not IsHandled then
                                    if not ConfirmManagement.GetResponseOrDefault(StrSubstNo(Text057, FieldCaption("Ship-to Code")), true) then begin
                                        "Ship-to Code" := xRec."Ship-to Code";
                                        exit;
                                    end;
                            end;
                    end;

                ShouldUpdateShipToAddressFields := "Document Type" <> "Document Type"::"Credit Memo";
                OnValidateShipToCodeOnAfterCalcShouldUpdateShipToAddressFields(Rec, ShouldUpdateShipToAddressFields);
                if ShouldUpdateShipToAddressFields then
                    if "Ship-to Code" <> '' then begin
                        if xRec."Ship-to Code" <> '' then begin
                            GetCust("Customer No.");
                            if Cust."Location Code" <> '' then
                                "Location Code" := Cust."Location Code";
                            "Tax Area Code" := Cust."Tax Area Code";
                        end;
                        ShipToAddr.Get("Customer No.", "Ship-to Code");
                        SetShipToCustomerAddressFieldsFromShipToAddr(ShipToAddr);
                    end else
                        if "Customer No." <> '' then begin
                            GetCust("Customer No.");
                            CopyShipToCustomerAddressFieldsFromCust(Cust);
                        end;

                UpdateShipToSalespersonCode();
                GetShipmentMethodCode();
                GetShippingTime(FieldNo("Ship-to Code"));

                if (xRec."Customer No." = "Customer No.") and
                   (xRec."Ship-to Code" <> "Ship-to Code")
                then
                    if (xRec."VAT Country/Region Code" <> "VAT Country/Region Code") or
                       (xRec."Tax Area Code" <> "Tax Area Code")
                    then
                        RecreateServLines(FieldCaption("Ship-to Code"))
                    else
                        if xRec."Tax Liable" <> "Tax Liable" then
                            Validate("Tax Liable");

                IsHandled := false;
                OnValidateShipToCodeOnBeforeValidateServiceZoneCode(Rec, IsHandled);
                if not IsHandled then
                    Validate("Service Zone Code");

                IsHandled := false;
                OnValidateShipToCodeOnBeforeDeleteLines(Rec, IsHandled, xRec);
                if not IsHandled then
                    if ("Ship-to Code" <> xRec."Ship-to Code") and
                       ("Customer No." = xRec."Customer No.") and
                       ServItemLineExists()
                    then begin
                        Modify(true);
                        ServLine.LockTable();
                        ServItemLine.LockTable();
                        ServLine.Reset();
                        ServLine.SetRange("Document Type", "Document Type");
                        ServLine.SetRange("Document No.", "No.");
                        ServLine.DeleteAll(true);
                        ServItemLine.Reset();
                        ServItemLine.SetRange("Document Type", "Document Type");
                        ServItemLine.SetRange("Document No.", "No.");
                        ServItemLine.DeleteAll(true);
                    end;
            end;
        }
        field(13; "Ship-to Name"; Text[100])
        {
            Caption = 'Ship-to Name';
            ToolTip = 'Specifies the name of the customer at the address that the items are shipped to.';
        }
        field(14; "Ship-to Name 2"; Text[50])
        {
            Caption = 'Ship-to Name 2';
            ToolTip = 'Specifies an additional part of thethe name of the customer at the address that the items are shipped to.';
        }
        field(15; "Ship-to Address"; Text[100])
        {
            Caption = 'Ship-to Address';
            ToolTip = 'Specifies the address that the items are shipped to.';
        }
        field(16; "Ship-to Address 2"; Text[50])
        {
            Caption = 'Ship-to Address 2';
            ToolTip = 'Specifies an additional part of the ship-to address, in case it is a long address.';
        }
        field(17; "Ship-to City"; Text[30])
        {
            Caption = 'Ship-to City';
            ToolTip = 'Specifies the city of the address that the items are shipped to.';
            TableRelation = if ("Ship-to Country/Region Code" = const('')) "Post Code".City
            else
            if ("Ship-to Country/Region Code" = filter(<> '')) "Post Code".City where("Country/Region Code" = field("Ship-to Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode("Ship-to City", "Ship-to Post Code", "Ship-to County", "Ship-to Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateShipToCity(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidateCity(
                        "Ship-to City", "Ship-to Post Code", "Ship-to County", "Ship-to Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
            end;
        }
        field(18; "Ship-to Contact"; Text[100])
        {
            Caption = 'Ship-to Contact';
            ToolTip = 'Specifies the name of the contact person at the address that the items are shipped to.';
        }
        field(19; "Order Date"; Date)
        {
            Caption = 'Order Date';
            ToolTip = 'Specifies the date when the order was created.';
            NotBlank = true;

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

                if "Order Date" <> xRec."Order Date" then begin
                    if ("Order Date" > "Starting Date") and
                       ("Starting Date" <> 0D)
                    then
                        Error(Text007, FieldCaption("Order Date"), FieldCaption("Starting Date"));

                    if ("Order Date" > "Finishing Date") and
                       ("Finishing Date" <> 0D)
                    then
                        Error(Text007, FieldCaption("Order Date"), FieldCaption("Finishing Date"));

                    if "Starting Time" <> 0T then
                        Validate("Starting Time");
                    ServItemLine.Reset();
                    ServItemLine.SetCurrentKey("Document Type", "Document No.", "Starting Date");
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    ServItemLine.SetFilter("Starting Date", '<>%1', 0D);
                    if ServItemLine.Find('-') then
                        repeat
                            if ServItemLine."Starting Date" < "Order Date" then
                                Error(
                                  Text027, FieldCaption("Order Date"),
                                  ServItemLine.FieldCaption("Starting Date"));
                        until ServItemLine.Next() = 0;

                    ServItemLine.Reset();
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    if ServItemLine.Find('-') then
                        repeat
                            ServItemLine.CheckWarranty("Order Date");
                            ServItemLine.CalculateResponseDateTime("Order Date", "Order Time");
                            ServItemLine.Modify();
                        until ServItemLine.Next() = 0;
                    UpdateServLinesByFieldNo(FieldNo("Order Date"), false);
                end;
            end;
        }
        field(20; "Posting Date"; Date)
        {
            Caption = 'Posting Date';
            ToolTip = 'Specifies the date when the service document should be posted.';

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                if ("Posting No." <> '') and ("Posting No. Series" <> '') then begin
                    GlobalNoSeries.Get("Posting No. Series");
                    if GlobalNoSeries."Date Order" then
                        Error(
                          Text045,
                          FieldCaption("Posting Date"), FieldCaption("Posting No. Series"), "Posting No. Series",
                          GlobalNoSeries.FieldCaption("Date Order"), GlobalNoSeries."Date Order", "Document Type",
                          FieldCaption("Posting No."), "Posting No.");
                end;

                TestField("Posting Date");
                OnValidatePostingDateOnAfterCheckPostingDate(Rec);

                GeneralLedgerSetup.GetRecordOnce();
                GeneralLedgerSetup.UpdateVATDate("Posting Date", Enum::"VAT Reporting Date"::"Posting Date", "VAT Reporting Date");
                Validate("VAT Reporting Date");
                IsHandled := false;
                OnValidatePostingDateOnAfterValidateVATReportingDate(Rec, xRec, IsHandled);
                if not IsHandled then
                    Validate("Document Date", "Posting Date");

                ServLine.SetRange("Document Type", "Document Type");
                ServLine.SetRange("Document No.", "No.");
                if ServLine.FindSet() then
                    repeat
                        if "Posting Date" <> ServLine."Posting Date" then begin
                            ServLine."Posting Date" := "Posting Date";
                            ServLine.Modify();
                        end;
                    until ServLine.Next() = 0;

                OnValidatePostingDateOnAfterUpdatePostingDateOnLines(Rec, HideValidationDialog);

                if ("Document Type" in ["Document Type"::Invoice, "Document Type"::"Credit Memo"]) and
                   not ("Posting Date" = xRec."Posting Date")
                then
                    if ServLineExists() then
                        ServLine.ModifyAll("Posting Date", "Posting Date");

                if "Currency Code" <> '' then begin
                    UpdateCurrencyFactor();
                    if "Currency Factor" <> xRec."Currency Factor" then
                        ConfirmCurrencyFactorUpdate();
                end;
            end;
        }
        field(22; "Posting Description"; Text[100])
        {
            Caption = 'Posting Description';
        }
        field(23; "Payment Terms Code"; Code[10])
        {
            Caption = 'Payment Terms Code';
            ToolTip = 'Specifies a formula that calculates the payment due date, payment discount date, and payment discount amount.';
            TableRelation = "Payment Terms";

            trigger OnValidate()
            begin
                ValidatePaymentTerms(Rec);
            end;
        }
        field(24; "Due Date"; Date)
        {
            Caption = 'Due Date';
            ToolTip = 'Specifies when the invoice is due.';
        }
        field(25; "Payment Discount %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Payment Discount %';
            ToolTip = 'Specifies the percentage of payment discount given, if the customer pays by the date entered in the Pmt. Discount Date field.';
            DecimalPlaces = 0 : 5;
            MaxValue = 100;
            MinValue = 0;

            trigger OnValidate()
            begin
                GeneralLedgerSetup.GetRecordOnce();
                if "Payment Discount %" < GeneralLedgerSetup."VAT Tolerance %" then
                    "VAT Base Discount %" := "Payment Discount %"
                else
                    "VAT Base Discount %" := GeneralLedgerSetup."VAT Tolerance %";
                Validate("VAT Base Discount %");
            end;
        }
        field(26; "Pmt. Discount Date"; Date)
        {
            Caption = 'Pmt. Discount Date';
            ToolTip = 'Specifies the date on which the amount in the entry must be paid for a payment discount to be granted.';
        }
        field(27; "Shipment Method Code"; Code[10])
        {
            Caption = 'Shipment Method Code';
            ToolTip = 'Specifies the delivery conditions of the related shipment, such as free on board (FOB).';
            TableRelation = "Shipment Method";

            trigger OnValidate()
            begin
                TestField("Release Status", "Release Status"::Open);
            end;
        }
        field(28; "Location Code"; Code[10])
        {
            Caption = 'Location Code';
            ToolTip = 'Specifies the code of the location (for example, warehouse or distribution center) of the items specified on the service item lines. When you select the customer and the customer has a location assigned, the value is taken from the Customer card. If the customer has no location, but a Responsibility Center is populated, the location code is taken from the Responsibility Center. If neither is specified, the value is taken from Company Information.';
            TableRelation = Location;

            trigger OnValidate()
            begin
                if ("Location Code" <> xRec."Location Code") and
                   ("Customer No." = xRec."Customer No.")
                then
                    MessageIfServLinesExist(FieldCaption("Location Code"));

                UpdateShipToAddress();
                CreateDimFromDefaultDim(Rec.FieldNo("Location Code"));
            end;
        }
        field(29; "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
                CheckHeaderDimension();
                Rec.ValidateShortcutDimCode(1, "Shortcut Dimension 1 Code");
            end;
        }
        field(30; "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
                CheckHeaderDimension();
                Rec.ValidateShortcutDimCode(2, "Shortcut Dimension 2 Code");
            end;
        }
        field(31; "Customer Posting Group"; Code[20])
        {
            Caption = 'Customer Posting Group';
            ToolTip = 'Specifies the customer''s market type to link business transactions to.';
            TableRelation = "Customer Posting Group";

            trigger OnValidate()
            begin
                CheckCustomerPostingGroupChange();
            end;
        }
        field(32; "Currency Code"; Code[10])
        {
            Caption = 'Currency Code';
            ToolTip = 'Specifies the currency code for various amounts on the service lines.';
            TableRelation = Currency;

            trigger OnValidate()
            begin
                if CurrFieldNo <> FieldNo("Currency Code") then
                    UpdateCurrencyFactor()
                else
                    if "Currency Code" <> xRec."Currency Code" then begin
                        if ServLineExists() and ("Contract No." <> '') and
                           ("Document Type" in ["Document Type"::Invoice, "Document Type"::"Credit Memo"])
                        then
                            Error(Text058, FieldCaption("Currency Code"), "Document Type", "No.", "Contract No.");

                        UpdateCurrencyFactor();
                        ValidateServPriceGrOnServItem();
                    end else
                        if "Currency Code" <> '' then begin
                            UpdateCurrencyFactor();
                            if "Currency Factor" <> xRec."Currency Factor" then
                                ConfirmCurrencyFactorUpdate();
                        end;
                SetCompanyBankAccount();
            end;
        }
        field(33; "Currency Factor"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Currency Factor';
            DecimalPlaces = 0 : 15;
            Editable = false;
            MinValue = 0;

            trigger OnValidate()
            begin
                if "Currency Factor" <> xRec."Currency Factor" then
                    UpdateServLinesByFieldNo(FieldNo("Currency Factor"), false);
            end;
        }
        field(34; "Customer Price Group"; Code[10])
        {
            Caption = 'Customer Price Group';
            TableRelation = "Customer Price Group";

            trigger OnValidate()
            begin
                PriceMsgIfServLinesExist(FieldCaption("Customer Price Group"));
            end;
        }
        field(35; "Prices Including VAT"; Boolean)
        {
            Caption = 'Prices Including VAT';
            ToolTip = 'Specifies if the Unit Price and Line Amount fields on document lines should be shown with or without VAT.';

            trigger OnValidate()
            var
                ServLine: Record "Service Line";
                Currency: Record Currency;
                RecalculatePrice: Boolean;
            begin
                if "Prices Including VAT" <> xRec."Prices Including VAT" then begin
                    TestField("Max. Labor Unit Price", 0);
                    ServLine.SetRange("Document Type", "Document Type");
                    ServLine.SetRange("Document No.", "No.");
                    ServLine.SetFilter(Type, '>0');
                    ServLine.SetFilter(Quantity, '<>0');
                    if ServLine.Find('-') then
                        repeat
                            ServLine.Amount := 0;
                            ServLine."Amount Including VAT" := 0;
                            ServLine."VAT Base Amount" := 0;
                            ServLine.InitOutstandingAmount();
                            ServLine.Modify();
                        until ServLine.Next() = 0;
                    ServLine.SetRange(Type);
                    ServLine.SetRange(Quantity);

                    ServLine.SetFilter("Unit Price", '<>%1', 0);
                    ServLine.SetFilter("VAT %", '<>%1', 0);
                    if ServLine.Find('-') then begin
                        RecalculatePrice := ConfirmRecalculatePrice();
                        OnValidatePricesIncludingVATOnAfterCalcRecalculatePrice(Rec, ServLine, RecalculatePrice);
                        ServLine.SetServHeader(Rec);

                        if "Currency Code" = '' then
                            Currency.InitRoundingPrecision()
                        else
                            Currency.Get("Currency Code");

                        repeat
                            ServLine.TestField("Quantity Invoiced", 0);
                            if not RecalculatePrice then begin
                                ServLine."VAT Difference" := 0;
                                ServLine.InitOutstandingAmount();
                            end else
                                if "Prices Including VAT" then begin
                                    ServLine."Unit Price" :=
                                      Round(
                                        ServLine."Unit Price" * (1 + (ServLine."VAT %" / 100)),
                                        Currency."Unit-Amount Rounding Precision");
                                    if ServLine.Quantity <> 0 then begin
                                        ServLine."Line Discount Amount" :=
                                          Round(
                                            ServLine.CalcChargeableQty() * ServLine."Unit Price" * ServLine."Line Discount %" / 100,
                                            Currency."Amount Rounding Precision");
                                        ServLine.Validate("Inv. Discount Amount",
                                          Round(
                                            ServLine."Inv. Discount Amount" * (1 + (ServLine."VAT %" / 100)),
                                            Currency."Amount Rounding Precision"));
                                    end;
                                end else begin
                                    ServLine."Unit Price" :=
                                      Round(
                                        ServLine."Unit Price" / (1 + (ServLine."VAT %" / 100)),
                                        Currency."Unit-Amount Rounding Precision");
                                    if ServLine.Quantity <> 0 then begin
                                        ServLine."Line Discount Amount" :=
                                          Round(
                                            ServLine.CalcChargeableQty() * ServLine."Unit Price" * ServLine."Line Discount %" / 100,
                                            Currency."Amount Rounding Precision");
                                        ServLine.Validate("Inv. Discount Amount",
                                          Round(
                                            ServLine."Inv. Discount Amount" / (1 + (ServLine."VAT %" / 100)),
                                            Currency."Amount Rounding Precision"));
                                    end;
                                end;
                            ServLine.Modify();
                        until ServLine.Next() = 0;
                    end;
                end;
            end;
        }
        field(37; "Invoice Disc. Code"; Code[20])
        {
            Caption = 'Invoice Disc. Code';

            trigger OnValidate()
            begin
                Rec.TestField("Release Status", "Release Status"::Open);
                MessageIfServLinesExist(FieldCaption("Invoice Disc. Code"));
            end;
        }
        field(40; "Customer Disc. Group"; Code[20])
        {
            Caption = 'Customer Disc. Group';
            TableRelation = "Customer Discount Group";

            trigger OnValidate()
            begin
                MessageIfServLinesExist(FieldCaption("Customer Disc. Group"));
            end;
        }
        field(41; "Language Code"; Code[10])
        {
            Caption = 'Language Code';
            TableRelation = Language;

            trigger OnValidate()
            begin
                MessageIfServLinesExist(FieldCaption("Language Code"));
            end;
        }
        field(42; "Format Region"; Text[80])
        {
            Caption = 'Format Region';
            TableRelation = "Language Selection"."Language Tag";
        }
        field(43; "Salesperson Code"; Code[20])
        {
            Caption = 'Salesperson Code';
            ToolTip = 'Specifies the code of the salesperson assigned to this service document.';
            TableRelation = "Salesperson/Purchaser" where(Blocked = const(false));

            trigger OnValidate()
            begin
                ValidateSalesPersonOnServiceHeader(Rec, false, false);

                CreateDimFromDefaultDim(Rec.FieldNo("Salesperson Code"));
            end;
        }
        field(46; Comment; Boolean)
        {
            CalcFormula = exist("Service Comment Line" where("Table Name" = const("Service Header"),
                                                              "Table Subtype" = field("Document Type"),
                                                              "No." = field("No."),
                                                              Type = const(General)));
            Caption = 'Comment';
            Editable = false;
            FieldClass = FlowField;
        }
        field(47; "No. Printed"; Integer)
        {
            Caption = 'No. Printed';
            Editable = false;
        }
        field(52; "Applies-to Doc. Type"; Enum "Gen. Journal Document Type")
        {
            Caption = 'Applies-to Doc. Type';
            ToolTip = 'Specifies the type of the posted document that this document or journal line will be applied to when you post, for example to register payment.';
        }
        field(53; "Applies-to Doc. No."; Code[20])
        {
            Caption = 'Applies-to Doc. No.';
            ToolTip = 'Specifies the number of the posted document that this document or journal line will be applied to when you post, for example to register payment.';

            trigger OnLookup()
            var
                CustLedgEntry: Record "Cust. Ledger Entry";
                GenJnlLine: Record "Gen. Journal Line";
                GenJnlApply: Codeunit "Gen. Jnl.-Apply";
                ServApplyCustEntries: Page "Serv. Apply Customer Entries";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeLookupAppliesToDocNo(Rec, CustLedgEntry, IsHandled);
                if IsHandled then
                    exit;

                TestField("Bal. Account No.", '');
                CustLedgEntry.SetApplyToFilters("Bill-to Customer No.", "Applies-to Doc. Type".AsInteger(), "Applies-to Doc. No.", 0);
                OnValidateAppliestoDocNoOnAfterSetFilters(CustLedgEntry, Rec);

                ServApplyCustEntries.SetService(Rec, CustLedgEntry, ServHeader.FieldNo("Applies-to Doc. No."));
                ServApplyCustEntries.SetTableView(CustLedgEntry);
                ServApplyCustEntries.SetRecord(CustLedgEntry);
                ServApplyCustEntries.LookupMode(true);
                if ServApplyCustEntries.RunModal() = ACTION::LookupOK then begin
                    ServApplyCustEntries.GetCustLedgEntry(CustLedgEntry);
                    GenJnlApply.CheckAgainstApplnCurrency(
                      "Currency Code", CustLedgEntry."Currency Code", GenJnlLine."Account Type"::Customer, true);
                    CopyAppliestoFieldsFromCustLedgerEntry(CustLedgEntry);
                end;
                Clear(ServApplyCustEntries);

                OnAfterLookupAppliesToDocNo(Rec, CustLedgEntry);
            end;

            trigger OnValidate()
            var
                CustLedgEntry: Record "Cust. Ledger Entry";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateAppliesToDocNo(Rec, CustLedgEntry, xRec, IsHandled);
                if IsHandled then
                    exit;

                if "Applies-to Doc. No." <> '' then
                    TestField("Bal. Account No.", '');

                if ("Applies-to Doc. No." <> xRec."Applies-to Doc. No.") and (xRec."Applies-to Doc. No." <> '') and
                   ("Applies-to Doc. No." <> '')
                then begin
                    CustLedgEntry.SetAmountToApply("Applies-to Doc. No.", "Customer No.");
                    CustLedgEntry.SetAmountToApply(xRec."Applies-to Doc. No.", "Customer No.");
                end else
                    if ("Applies-to Doc. No." <> xRec."Applies-to Doc. No.") and (xRec."Applies-to Doc. No." = '') then
                        CustLedgEntry.SetAmountToApply("Applies-to Doc. No.", "Customer No.")
                    else
                        if ("Applies-to Doc. No." <> xRec."Applies-to Doc. No.") and ("Applies-to Doc. No." = '') then
                            CustLedgEntry.SetAmountToApply(xRec."Applies-to Doc. No.", "Customer No.");

                OnAfterValidateAppliesToDocNo(Rec, xRec, CustLedgEntry);
            end;
        }
        field(55; "Bal. Account No."; Code[20])
        {
            Caption = 'Bal. Account No.';
            TableRelation = if ("Bal. Account Type" = const("G/L Account")) "G/L Account"
            else
            if ("Bal. Account Type" = const("Bank Account")) "Bank Account";

            trigger OnValidate()
            var
                GLAcc: Record "G/L Account";
                BankAcc: Record "Bank Account";
            begin
                if "Bal. Account No." <> '' then
                    case "Bal. Account Type" of
                        "Bal. Account Type"::"G/L Account":
                            begin
                                GLAcc.Get("Bal. Account No.");
                                GLAcc.CheckGLAcc();
                                GLAcc.TestField("Direct Posting", true);
                            end;
                        "Bal. Account Type"::"Bank Account":
                            begin
                                BankAcc.Get("Bal. Account No.");
                                BankAcc.TestField(Blocked, false);
                                BankAcc.TestField("Currency Code", "Currency Code");
                            end;
                    end;
            end;
        }
        field(60; Amount; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            CalcFormula = sum("Service Line".Amount where("Document Type" = field("Document Type"), "Document No." = field("No.")));
            Caption = 'Amount';
            ToolTip = 'Specifies the sum of amounts on all the lines in the document.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(61; "Amount Including VAT"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            CalcFormula = sum("Service Line"."Amount Including VAT" where("Document Type" = field("Document Type"), "Document No." = field("No.")));
            Caption = 'Amount Including VAT';
            ToolTip = 'Specifies the sum of amounts, including VAT, on all the lines in the document.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(62; "Shipping No."; Code[20])
        {
            Caption = 'Shipping No.';
        }
        field(63; "Posting No."; Code[20])
        {
            Caption = 'Posting No.';
        }
        field(64; "Last Shipping No."; Code[20])
        {
            Caption = 'Last Shipping No.';
            Editable = false;
            TableRelation = "Service Shipment Header";
        }
        field(65; "Last Posting No."; Code[20])
        {
            Caption = 'Last Posting No.';
            Editable = false;
            TableRelation = "Service Invoice Header";
        }
        field(70; "VAT Registration No."; Text[20])
        {
            Caption = 'VAT Registration No.';
        }
        field(71; "Combine Shipments"; Boolean)
        {
            Caption = 'Combine Shipments';
            ToolTip = 'Specifies whether the order will be included when you use the Combine Shipments function.';
        }
        field(73; "Reason Code"; Code[10])
        {
            Caption = 'Reason Code';
            TableRelation = "Reason Code";
        }
        field(74; "Gen. Bus. Posting Group"; Code[20])
        {
            Caption = 'Gen. Bus. Posting Group';
            TableRelation = "Gen. Business Posting Group";

            trigger OnValidate()
            var
                GenBusPostingGroup: Record "Gen. Business Posting Group";
            begin
                if "Gen. Bus. Posting Group" <> xRec."Gen. Bus. Posting Group" then begin
                    if GenBusPostingGroup.ValidateVatBusPostingGroup(GenBusPostingGroup, "Gen. Bus. Posting Group") then
                        "VAT Bus. Posting Group" := GenBusPostingGroup."Def. VAT Bus. Posting Group";
                    RecreateServLines(FieldCaption("Gen. Bus. Posting Group"));
                end;
            end;
        }
        field(75; "EU 3-Party Trade"; Boolean)
        {
            Caption = 'EU 3-Party Trade';
            ToolTip = 'Specifies if the transaction is related to trade with a third party within the EU.';
        }
        field(76; "Transaction Type"; Code[10])
        {
            Caption = 'Transaction Type';
            ToolTip = 'Specifies the type of transaction that the document represents, for the purpose of reporting to INTRASTAT.';
            TableRelation = "Transaction Type";

            trigger OnValidate()
            begin
                UpdateServLinesByFieldNo(FieldNo("Transaction Type"), false);
            end;
        }
        field(77; "Transport Method"; Code[10])
        {
            Caption = 'Transport Method';
            ToolTip = 'Specifies the transport method, for the purpose of reporting to INTRASTAT.';
            TableRelation = "Transport Method";

            trigger OnValidate()
            begin
                UpdateServLinesByFieldNo(FieldNo("Transport Method"), false);
            end;
        }
        field(78; "VAT Country/Region Code"; Code[10])
        {
            Caption = 'VAT Country/Region Code';
            TableRelation = "Country/Region";
        }
        field(79; Name; Text[100])
        {
            Caption = 'Name';
            ToolTip = 'Specifies the name of the customer to whom the items on the document will be shipped.';
        }
        field(80; "Name 2"; Text[50])
        {
            Caption = 'Name 2';
            ToolTip = 'Specifies an additional part of the name of the customer to whom the items on the document will be shipped.';
        }
        field(81; Address; Text[100])
        {
            Caption = 'Address';
            ToolTip = 'Specifies the address of the customer to whom the service will be shipped.';

            trigger OnValidate()
            begin
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to Address"));
            end;
        }
        field(82; "Address 2"; Text[50])
        {
            Caption = 'Address 2';
            ToolTip = 'Specifies additional address information.';

            trigger OnValidate()
            begin
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to Address 2"));
            end;
        }
        field(83; City; Text[30])
        {
            Caption = 'City';
            ToolTip = 'Specifies the city of the address.';
            TableRelation = if ("Country/Region Code" = const('')) "Post Code".City
            else
            if ("Country/Region Code" = filter(<> '')) "Post Code".City where("Country/Region Code" = field("Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode(City, "Post Code", County, "Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateCity(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidateCity(City, "Post Code", County, "Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to City"));
            end;
        }
        field(84; "Contact Name"; Text[100])
        {
            Caption = 'Contact Name';
            ToolTip = 'Specifies the name of the contact who will receive the service.';
        }
        field(85; "Bill-to Post Code"; Code[20])
        {
            Caption = 'Bill-to Post Code';
            ToolTip = 'Specifies the postal code of the customer''s billing address.';
            TableRelation = if ("Bill-to Country/Region Code" = const('')) "Post Code"
            else
            if ("Bill-to Country/Region Code" = filter(<> '')) "Post Code" where("Country/Region Code" = field("Bill-to Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode("Bill-to City", "Bill-to Post Code", "Bill-to County", "Bill-to Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateBillToPostCode(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidatePostCode(
                        "Bill-to City", "Bill-to Post Code", "Bill-to County", "Bill-to Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
            end;
        }
        field(86; "Bill-to County"; Text[30])
        {
            CaptionClass = '5,3,' + "Bill-to Country/Region Code";
            Caption = 'Bill-to County';
            ToolTip = 'Specifies the county in the customer''s address.';
        }
        field(87; "Bill-to Country/Region Code"; Code[10])
        {
            Caption = 'Bill-to Country/Region Code';
            ToolTip = 'Specifies the country/region in the customer''s address.';
            TableRelation = "Country/Region";

            trigger OnValidate()
            var
                FormatAddress: Codeunit "Format Address";
            begin
                if not FormatAddress.UseCounty(Rec."Bill-to Country/Region Code") then
                    "Bill-to County" := '';
            end;
        }
        field(88; "Post Code"; Code[20])
        {
            Caption = 'Post Code';
            ToolTip = 'Specifies the postal code.';
            TableRelation = if ("Country/Region Code" = const('')) "Post Code"
            else
            if ("Country/Region Code" = filter(<> '')) "Post Code" where("Country/Region Code" = field("Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode(City, "Post Code", County, "Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidatePostCode(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidatePostCode(City, "Post Code", County, "Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to Post Code"));
            end;
        }
        field(89; County; Text[30])
        {
            CaptionClass = '5,1,' + "Country/Region Code";
            Caption = 'County';
            ToolTip = 'Specifies the county in the customer''s address.';

            trigger OnValidate()
            begin
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to County"));
            end;
        }
        field(90; "Country/Region Code"; Code[10])
        {
            Caption = 'Country/Region Code';
            ToolTip = 'Specifies the country/region of the address.';
            TableRelation = "Country/Region";

            trigger OnValidate()
            var
                FormatAddress: Codeunit "Format Address";
            begin
                if not FormatAddress.UseCounty("Country/Region Code") then
                    County := '';
                UpdateShipToAddressFromGeneralAddress(FieldNo("Ship-to Country/Region Code"));

                Validate("Ship-to Country/Region Code");
            end;
        }
        field(91; "Ship-to Post Code"; Code[20])
        {
            Caption = 'Ship-to Post Code';
            ToolTip = 'Specifies the postal code of the address that the items are shipped to.';
            TableRelation = if ("Ship-to Country/Region Code" = const('')) "Post Code"
            else
            if ("Ship-to Country/Region Code" = filter(<> '')) "Post Code" where("Country/Region Code" = field("Ship-to Country/Region Code"));
            ValidateTableRelation = false;

            trigger OnLookup()
            begin
                PostCode.LookupPostCode("Ship-to City", "Ship-to Post Code", "Ship-to County", "Ship-to Country/Region Code");
            end;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateShipToPostCode(Rec, PostCode, CurrFieldNo, IsHandled);
                if not IsHandled then
                    PostCode.ValidatePostCode(
                        "Ship-to City", "Ship-to Post Code", "Ship-to County", "Ship-to Country/Region Code", (CurrFieldNo <> 0) and GuiAllowed);
            end;
        }
        field(92; "Ship-to County"; Text[30])
        {
            CaptionClass = '5,4,' + "Ship-to Country/Region Code";
            Caption = 'Ship-to County';
            ToolTip = 'Specifies the county in the customer''s address.';
        }
        field(93; "Ship-to Country/Region Code"; Code[10])
        {
            Caption = 'Ship-to Country/Region Code';
            ToolTip = 'Specifies the country/region in the customer''s address.';
            TableRelation = "Country/Region";
        }
        field(94; "Bal. Account Type"; Enum "Payment Balance Account Type")
        {
            Caption = 'Bal. Account Type';
        }
        field(97; "Exit Point"; Code[10])
        {
            Caption = 'Exit Point';
            ToolTip = 'Specifies the point of exit through which you ship the items out of your country/region, for reporting to Intrastat.';
            TableRelation = "Entry/Exit Point";

            trigger OnValidate()
            begin
                UpdateServLinesByFieldNo(FieldNo("Exit Point"), false);
            end;
        }
        field(98; Correction; Boolean)
        {
            Caption = 'Correction';
        }
        field(99; "Document Date"; Date)
        {
            Caption = 'Document Date';
            ToolTip = 'Specifies the date when the related document was created.';

            trigger OnValidate()
            begin
                GeneralLedgerSetup.GetRecordOnce();
                GeneralLedgerSetup.UpdateVATDate("Document Date", Enum::"VAT Reporting Date"::"Document Date", "VAT Reporting Date");
                Validate("VAT Reporting Date");
                OnValidateDocumentDateOnAfterValidateVATReportingDate(Rec, xRec);
                Validate("Payment Terms Code");
            end;
        }
#if not CLEAN28
#pragma warning disable AS0136
#endif
        field(100; "External Document No."; Code[35])
#if not CLEAN28
#pragma warning restore AS0136
#endif
        {
            Caption = 'External Document No.';
            ToolTip = 'Specifies a document number that refers to the customer''s or vendor''s numbering system.';

            trigger OnValidate()
            var
                WhseServiceRelease: Codeunit "Whse.-Service Release";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateExternalDocumentNo(Rec, xRec, CurrFieldNo, IsHandled);
                if IsHandled then
                    exit;

                if (xRec."External Document No." <> Rec."External Document No.")
                    and (Rec."Release Status" = Rec."Release Status"::"Released to Ship")
                    and ("Document Type" = "Document Type"::Order)
                then
                    WhseServiceRelease.UpdateExternalDocNoForReleasedOrder(Rec);
            end;
        }
        field(101; "Area"; Code[10])
        {
            Caption = 'Area';
            ToolTip = 'Specifies the area of the customer or vendor, for the purpose of reporting to INTRASTAT.';
            TableRelation = Area;

            trigger OnValidate()
            begin
                UpdateServLinesByFieldNo(FieldNo(Area), false);
            end;
        }
        field(102; "Transaction Specification"; Code[10])
        {
            Caption = 'Transaction Specification';
            ToolTip = 'Specifies a specification of the document''s transaction, for the purpose of reporting to INTRASTAT.';
            TableRelation = "Transaction Specification";

            trigger OnValidate()
            begin
                UpdateServLinesByFieldNo(FieldNo("Transaction Specification"), false);
            end;
        }
        field(104; "Payment Method Code"; Code[10])
        {
            Caption = 'Payment Method Code';
            ToolTip = 'Specifies how to make payment, such as with bank transfer, cash, or check.';
            TableRelation = "Payment Method";

            trigger OnValidate()
            var
                PaymentMethod: Record "Payment Method";
                SEPADirectDebitMandate: Record "SEPA Direct Debit Mandate";
            begin
                PaymentMethod.Init();
                if "Payment Method Code" <> '' then
                    PaymentMethod.Get("Payment Method Code");
                if PaymentMethod."Direct Debit" then begin
                    "Direct Debit Mandate ID" := SEPADirectDebitMandate.GetDefaultMandate("Bill-to Customer No.", "Due Date");
                    if "Payment Terms Code" = '' then
                        "Payment Terms Code" := PaymentMethod."Direct Debit Pmt. Terms Code";
                end else
                    "Direct Debit Mandate ID" := '';
                "Bal. Account Type" := PaymentMethod."Bal. Account Type";
                "Bal. Account No." := PaymentMethod."Bal. Account No.";
                if "Bal. Account No." <> '' then begin
                    TestField("Applies-to Doc. No.", '');
                    TestField("Applies-to ID", '');
                end;
            end;
        }
        field(105; "Shipping Agent Code"; Code[10])
        {
            AccessByPermission = TableData "Shipping Agent Services" = R;
            Caption = 'Shipping Agent Code';
            ToolTip = 'Specifies the code for the shipping agent who is transporting the items.';
            TableRelation = "Shipping Agent";

            trigger OnValidate()
            begin
                TestField("Release Status", "Release Status"::Open);
                if xRec."Shipping Agent Code" = "Shipping Agent Code" then
                    exit;

                "Shipping Agent Service Code" := '';
                GetShippingTime(FieldNo("Shipping Agent Code"));
                UpdateServLinesByFieldNo(FieldNo("Shipping Agent Code"), CurrFieldNo <> 0);
            end;
        }
        field(107; "No. Series"; Code[20])
        {
            Caption = 'No. Series';
            Editable = false;
            TableRelation = "No. Series";
        }
        field(108; "Posting No. Series"; Code[20])
        {
            Caption = 'Posting No. Series';
            TableRelation = "No. Series";

            trigger OnLookup()
            begin
                ServHeader := Rec;
                ServHeader.GetServiceMgtSetup();
                ServHeader.TestNoSeries();
                if NoSeries.LookupRelatedNoSeries(GetPostingNoSeriesCode(), ServHeader."Posting No. Series") then
                    ServHeader.Validate(ServHeader."Posting No. Series");
                Rec := ServHeader;
            end;

            trigger OnValidate()
            begin
                if "Posting No. Series" <> '' then begin
                    GetServiceMgtSetup();
                    TestNoSeries();
                    NoSeries.TestAreRelated(GetPostingNoSeriesCode(), "Posting No. Series");
                end;
                TestField("Posting No.", '');
            end;
        }
        field(109; "Shipping No. Series"; Code[20])
        {
            Caption = 'Shipping No. Series';
            TableRelation = "No. Series";

            trigger OnValidate()
            begin
                if "Shipping No. Series" <> '' then begin
                    GetServiceMgtSetup();
                    ServiceMgtSetup.TestField("Posted Service Shipment Nos.");
                    NoSeries.TestAreRelated(ServiceMgtSetup."Posted Service Shipment Nos.", "Shipping No. Series");
                end;
                TestField("Shipping No.", '');
            end;
        }
        field(114; "Tax Area Code"; Code[20])
        {
            Caption = 'Tax Area Code';
            ToolTip = 'Specifies the tax area that is used to calculate and post sales tax.';
            TableRelation = "Tax Area";

            trigger OnValidate()
            begin
                MessageIfServLinesExist(FieldCaption("Tax Area Code"));
            end;
        }
        field(115; "Tax Liable"; Boolean)
        {
            Caption = 'Tax Liable';
            ToolTip = 'Specifies if the customer or vendor is liable for sales tax.';

            trigger OnValidate()
            begin
                MessageIfServLinesExist(FieldCaption("Tax Liable"));
                UpdateServLinesByFieldNo(FieldNo("Tax Liable"), false);
            end;
        }
        field(116; "VAT Bus. Posting Group"; Code[20])
        {
            Caption = 'VAT Bus. Posting Group';
            ToolTip = 'Specifies the VAT specification of the involved customer or vendor to link transactions made for this record with the appropriate general ledger account according to the VAT posting setup.';
            TableRelation = "VAT Business Posting Group";

            trigger OnValidate()
            begin
                if "VAT Bus. Posting Group" <> xRec."VAT Bus. Posting Group" then
                    RecreateServLines(FieldCaption("VAT Bus. Posting Group"));
            end;
        }
        field(117; Reserve; Enum "Reserve Method")
        {
            Caption = 'Reserve';
        }
        field(118; "Applies-to ID"; Code[50])
        {
            Caption = 'Applies-to ID';
            ToolTip = 'Specifies the ID of entries that will be applied to when you choose the Apply Entries action.';

            trigger OnValidate()
            var
                CustLedgEntry: Record "Cust. Ledger Entry";
                TempCustLedgEntry: Record "Cust. Ledger Entry" temporary;
                CustEntrySetApplID: Codeunit "Cust. Entry-SetAppl.ID";
            begin
                if "Applies-to ID" <> '' then
                    TestField("Bal. Account No.", '');
                if ("Applies-to ID" <> xRec."Applies-to ID") and (xRec."Applies-to ID" <> '') then begin
                    CustLedgEntry.SetCurrentKey("Customer No.", Open);
                    CustLedgEntry.SetRange("Customer No.", "Bill-to Customer No.");
                    CustLedgEntry.SetRange(Open, true);
                    CustLedgEntry.SetRange("Applies-to ID", xRec."Applies-to ID");
                    if CustLedgEntry.FindFirst() then
                        CustEntrySetApplID.SetApplId(CustLedgEntry, TempCustLedgEntry, '');
                    CustLedgEntry.Reset();
                end;
            end;
        }
        field(119; "VAT Base Discount %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'VAT Base Discount %';
            DecimalPlaces = 0 : 5;
            MaxValue = 100;
            MinValue = 0;

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                GeneralLedgerSetup.GetRecordOnce();
                if "VAT Base Discount %" > GeneralLedgerSetup."VAT Tolerance %" then
                    Error(
                      Text011,
                      FieldCaption("VAT Base Discount %"),
                      GeneralLedgerSetup.FieldCaption("VAT Tolerance %"),
                      GeneralLedgerSetup.TableCaption());

                if ("VAT Base Discount %" = xRec."VAT Base Discount %") and
                   (CurrFieldNo <> 0)
                then
                    exit;

                IsHandled := false;
                OnValidateVATBaseDiscountPctOnBeforeUpdateLineAmounts(Rec, IsHandled);
                if not IsHandled then begin
                    ServLine.Reset();
                    ServLine.SetRange("Document Type", "Document Type");
                    ServLine.SetRange("Document No.", "No.");
                    ServLine.SetFilter(Type, '<>%1', ServLine.Type::" ");
                    ServLine.SetFilter(Quantity, '<>0');
                    ServLine.LockTable();
                    LockTable();
                    if ServLine.FindSet() then begin
                        Modify();
                        repeat
                            if (ServLine."Quantity Invoiced" <> ServLine.Quantity) or
                            ("Shipping Advice" = "Shipping Advice"::Complete) or
                            (CurrFieldNo <> 0)
                            then begin
                                ServLine.UpdateAmounts();
                                ServLine.Modify();
                            end;
                        until ServLine.Next() = 0;
                    end;
                end;
            end;
        }
        field(120; Status; Enum "Service Document Status")
        {
            Caption = 'Status';
            ToolTip = 'Specifies the service order status, which reflects the repair or maintenance status of all service items on the service order.';

            trigger OnValidate()
            var
                JobQueueEntry: Record "Job Queue Entry";
                RepairStatus: Record "Repair Status";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateStatus(Rec, xRec, CurrFieldNo, IsHandled);
                if IsHandled then
                    exit;

                ServItemLine.Reset();
                ServItemLine.SetRange("Document Type", "Document Type");
                ServItemLine.SetRange("Document No.", "No.");
                LinesExist := true;
                OnValidateServiceDocumentStatusOnAfterServItemLineSetFilters(Rec, ServItemLine);
                if ServItemLine.Find('-') then
                    repeat
                        if ServItemLine."Repair Status Code" <> '' then begin
                            RepairStatus.Get(ServItemLine."Repair Status Code");
                            if ((Status = Status::Pending) and not RepairStatus."Pending Status Allowed") or
                               ((Status = Status::"In Process") and not RepairStatus."In Process Status Allowed") or
                               ((Status = Status::Finished) and not RepairStatus."Finished Status Allowed") or
                               ((Status = Status::"On Hold") and not RepairStatus."On Hold Status Allowed")
                            then
                                Error(
                                  Text031,
                                  FieldCaption(Status), Format(Status), TableCaption(), "No.", ServItemLine.FieldCaption("Repair Status Code"),
                                  ServItemLine."Repair Status Code", ServItemLine.TableCaption(), ServItemLine."Line No.")
                        end;
                    until ServItemLine.Next() = 0
                else
                    LinesExist := false;

                case Status of
                    Status::"In Process":
                        if not LinesExist then begin
                            "Starting Date" := WorkDate();
                            Validate("Starting Time", Time);
                        end else
                            UpdateStartingDateTime();
                    Status::Finished:
                        begin
                            TestMandatoryFields(ServLine);
                            if Status <> xRec.Status then
                                if "Notify Customer" = "Notify Customer"::"By Email" then begin
                                    TestField("Customer No.");
                                    Clear(NotifyCust);
                                    NotifyCust.Run(Rec);
                                end;
                            if not LinesExist then begin
                                if ("Finishing Date" = 0D) and ("Finishing Time" = 0T) then begin
                                    "Finishing Date" := WorkDate();
                                    "Finishing Time" := Time;
                                end;
                            end else
                                UpdateFinishingDateTime();

                            OnValidateStatusFinishedOnAferUpdateFinishingDateTime(Rec, xRec);
                        end;
                end;

                if Status <> Status::Finished then begin
                    "Finishing Date" := 0D;
                    "Finishing Time" := 0T;
                    "Service Time (Hours)" := 0;
                end;

                if ("Starting Date" <> 0D) and
                   ("Finishing Date" <> 0D) and
                   not LinesExist
                then begin
                    CalcFields("Contract Serv. Hours Exist");
                    "Service Time (Hours)" :=
                      ServOrderMgt.CalcServTime(
                        "Starting Date", "Starting Time", "Finishing Date", "Finishing Time",
                        "Contract No.", "Contract Serv. Hours Exist");
                end;

                if Status = Status::Pending then begin
                    GetServiceMgtSetup();
                    if ServiceMgtSetup."First Warning Within (Hours)" <> 0 then
                        if JobQueueEntry.WritePermission then begin
                            JobQueueEntry.SetRange("Object Type to Run", JobQueueEntry."Object Type to Run"::Codeunit);
                            JobQueueEntry.SetRange("Object ID to Run", CODEUNIT::"ServOrder-Check Response Time");
                            JobQueueEntry.SetRange(Status, JobQueueEntry.Status::"On Hold");
                            if JobQueueEntry.FindFirst() then
                                JobQueueEntry.SetStatus(JobQueueEntry.Status::Ready);
                        end;
                end;
            end;
        }
        field(121; "Invoice Discount Calculation"; Option)
        {
            Caption = 'Invoice Discount Calculation';
            Editable = false;
            OptionCaption = 'None,%,Amount';
            OptionMembers = "None","%",Amount;
        }
        field(122; "Invoice Discount Value"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 1;
            Caption = 'Invoice Discount Value';
            Editable = false;
        }
        field(129; "Company Bank Account Code"; Code[20])
        {
            Caption = 'Bank Account Code';
            ToolTip = 'Specifies the bank account to use for bank information when the document is printed.';
            TableRelation = "Bank Account" where("Currency Code" = field("Currency Code"));
        }
        field(130; "Release Status"; Enum "Service Doc. Release Status")
        {
            Caption = 'Release Status';
            ToolTip = 'Specifies if items in the Service Lines window are ready to be handled in warehouse activities.';
            Editable = false;
        }
        field(131; "VAT Reporting Date"; Date)
        {
            Caption = 'VAT Date';
            ToolTip = 'Specifies the date used to include entries on VAT reports in a VAT period. This is either the date that the document was created or posted, depending on your setting on the General Ledger Setup page.';
            Editable = false;

            trigger OnValidate()
            begin
                if "VAT Reporting Date" = 0D then
                    InitVATDate();
            end;
        }
        field(165; "Incoming Document Entry No."; Integer)
        {
            Caption = 'Incoming Document Entry No.';
            TableRelation = "Incoming Document";

            trigger OnValidate()
            var
                IncomingDocument: Record "Incoming Document";
                ServDocExchangeMgt: Codeunit "Serv. Doc. Exchange Mgt.";
            begin
                if "Incoming Document Entry No." = xRec."Incoming Document Entry No." then
                    exit;
                if "Incoming Document Entry No." = 0 then
                    IncomingDocument.RemoveReferenceToWorkingDocument(xRec."Incoming Document Entry No.")
                else
                    ServDocExchangeMgt.SetServiceDoc(Rec, IncomingDocument);
            end;
        }
        field(176; "Tax System Type"; Enum "Tax System Type")
        {
            Caption = 'Tax System Type';
            Editable = false;
        }
        field(178; "Journal Templ. Name"; Code[10])
        {
            Caption = 'Journal Template Name';
            TableRelation = "Gen. Journal Template" where(Type = filter(Sales));

            trigger OnValidate()
            begin
                GetServiceMgtSetup();
                TestNoSeries();
                Validate("Posting No. Series", GenJournalTemplate."Posting No. Series");
            end;
        }
        field(200; "Work Description"; BLOB)
        {
            Caption = 'Work Description';
            DataClassification = CustomerContent;
        }
        field(480; "Dimension Set ID"; Integer)
        {
            Caption = 'Dimension Set ID';
            Editable = false;
            TableRelation = "Dimension Set Entry";

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

            trigger OnValidate()
            begin
                DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
            end;
        }
        field(1200; "Direct Debit Mandate ID"; Code[35])
        {
            Caption = 'Direct Debit Mandate ID';
            ToolTip = 'Specifies the direct-debit mandate that the customer has signed to allow direct debit collection of payments.';
            TableRelation = "SEPA Direct Debit Mandate" where("Customer No." = field("Bill-to Customer No."),
                                                               Closed = const(false),
                                                               Blocked = const(false));
            DataClassification = SystemMetadata;
        }
        field(5043; "No. of Archived Versions"; Integer)
        {
            CalcFormula = max("Service Header Archive"."Version No." where("Document Type" = field("Document Type"),
                                                                          "No." = field("No."),
                                                                          "Doc. No. Occurrence" = field("Doc. No. Occurrence")));
            Caption = 'No. of Archived Versions';
            ToolTip = 'Specifies the number of archived versions for this document.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5048; "Doc. No. Occurrence"; Integer)
        {
            Caption = 'Doc. No. Occurrence';
            Editable = false;
        }
        field(5052; "Contact No."; Code[20])
        {
            Caption = 'Contact No.';
            ToolTip = 'Specifies the number of the contact to whom you will deliver the service.';
            TableRelation = Contact;

            trigger OnLookup()
            var
                Cont: Record Contact;
                ContBusinessRelation: Record "Contact Business Relation";
            begin
                OnBeforeLookupContactNo(Rec);

                Cont.FilterGroup(2);
                if "Customer No." <> '' then
                    if Cont.Get("Contact No.") then
                        Cont.SetRange("Company No.", Cont."Company No.")
                    else
                        if ContBusinessRelation.FindByRelation(ContBusinessRelation."Link to Table"::Customer, "Customer No.") then
                            Cont.SetRange("Company No.", ContBusinessRelation."Contact No.")
                        else
                            Cont.SetRange("No.", '');

                if "Contact No." <> '' then
                    if Cont.Get("Contact No.") then;
                if PAGE.RunModal(0, Cont) = ACTION::LookupOK then begin
                    xRec := Rec;
                    Validate("Contact No.", Cont."No.");
                end;
                Cont.FilterGroup(0);
            end;

            trigger OnValidate()
            var
                Cont: Record Contact;
                ContBusinessRelation: Record "Contact Business Relation";
                ConfirmManagement: Codeunit "Confirm Management";
                Confirmed: Boolean;
            begin
                if ("Contact No." <> xRec."Contact No.") and
                   (xRec."Contact No." <> '')
                then begin
                    if HideValidationDialog then
                        Confirmed := true
                    else
                        Confirmed :=
                          ConfirmManagement.GetResponseOrDefault(
                            StrSubstNo(Text005, FieldCaption("Contact No.")), true);
                    if Confirmed then begin
                        ServLine.Reset();
                        ServLine.SetRange("Document Type", "Document Type");
                        ServLine.SetRange("Document No.", "No.");
                        if ("Contact No." = '') and ("Customer No." = '') then begin
                            if not ServLine.IsEmpty() then
                                Error(Text050, FieldCaption("Contact No."));
                            InitRecordFromContact();
                            exit;
                        end;
                    end else begin
                        Rec := xRec;
                        exit;
                    end;
                end;

                if ("Customer No." <> '') and ("Contact No." <> '') then begin
                    Cont.Get("Contact No.");
                    if ContBusinessRelation.FindByRelation(ContBusinessRelation."Link to Table"::Customer, "Customer No.") and
                       (ContBusinessRelation."Contact No." <> Cont."Company No.")
                    then
                        Error(Text038, Cont."No.", Cont.Name, "Customer No.");
                end;

                UpdateCust("Contact No.");
            end;
        }
        field(5053; "Bill-to Contact No."; Code[20])
        {
            Caption = 'Bill-to Contact No.';
            ToolTip = 'Specifies the number of the contact person at the customer''s billing address.';
            TableRelation = Contact;

            trigger OnLookup()
            var
                Cont: Record Contact;
                ContBusinessRelation: Record "Contact Business Relation";
            begin
                Cont.FilterGroup(2);
                if "Bill-to Customer No." <> '' then
                    if Cont.Get("Bill-to Contact No.") then
                        Cont.SetRange("Company No.", Cont."Company No.")
                    else
                        if ContBusinessRelation.FindByRelation(ContBusinessRelation."Link to Table"::Customer, "Bill-to Customer No.") then
                            Cont.SetRange("Company No.", ContBusinessRelation."Contact No.")
                        else
                            Cont.SetRange("No.", '');

                if "Bill-to Contact No." <> '' then
                    if Cont.Get("Bill-to Contact No.") then;
                if PAGE.RunModal(0, Cont) = ACTION::LookupOK then begin
                    xRec := Rec;
                    Validate("Bill-to Contact No.", Cont."No.");
                end;
                Cont.FilterGroup(0);
            end;

            trigger OnValidate()
            var
                Cont: Record Contact;
                ContBusinessRelation: Record "Contact Business Relation";
                ConfirmManagement: Codeunit "Confirm Management";
                Confirmed: Boolean;
            begin
                if ("Bill-to Contact No." <> xRec."Bill-to Contact No.") and
                   (xRec."Bill-to Contact No." <> '')
                then begin
                    if HideValidationDialog then
                        Confirmed := true
                    else
                        Confirmed :=
                          ConfirmManagement.GetResponseOrDefault(
                            StrSubstNo(Text005, FieldCaption("Bill-to Contact No.")), true);
                    if Confirmed then begin
                        ServLine.Reset();
                        ServLine.SetRange("Document Type", "Document Type");
                        ServLine.SetRange("Document No.", "No.");
                        if ("Bill-to Contact No." = '') and ("Bill-to Customer No." = '') then begin
                            if not ServLine.IsEmpty() then
                                Error(Text050, FieldCaption("Bill-to Contact No."));
                            InitRecordFromContact();
                            exit;
                        end;
                    end else begin
                        "Bill-to Contact No." := xRec."Bill-to Contact No.";
                        exit;
                    end;
                end;

                if ("Bill-to Customer No." <> '') and ("Bill-to Contact No." <> '') then begin
                    Cont.Get("Bill-to Contact No.");
                    if ContBusinessRelation.FindByRelation(ContBusinessRelation."Link to Table"::Customer, "Bill-to Customer No.") and
                       (ContBusinessRelation."Contact No." <> Cont."Company No.")
                    then
                        Error(Text038, Cont."No.", Cont.Name, "Bill-to Customer No.");
                end;

                UpdateBillToCust("Bill-to Contact No.");
            end;
        }
        field(5700; "Responsibility Center"; Code[10])
        {
            Caption = 'Responsibility Center';
            ToolTip = 'Specifies the code of the responsibility center, such as a distribution hub, that is associated with the involved user, company, customer, or vendor.';
            TableRelation = "Responsibility Center";

            trigger OnValidate()
            var
                RespCenter: Record "Responsibility Center";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateResponsibilityCenter(Rec, xRec, IsHandled);
                if IsHandled then
                    exit;

                if not UserSetupMgt.CheckRespCenter(2, "Responsibility Center") then
                    Error(
                      Text010,
                      RespCenter.TableCaption(), UserSetupMgt.GetServiceFilter());

                UpdateShipToAddress();

                CreateDimFromDefaultDim(Rec.FieldNo("Responsibility Center"));

                ServItemLine.Reset();
                ServItemLine.SetRange("Document Type", "Document Type");
                ServItemLine.SetRange("Document No.", "No.");
                if ServItemLine.Find('-') then
                    repeat
                        ServItemLine.Validate("Responsibility Center", "Responsibility Center");
                        ServItemLine.Modify(true);
                    until ServItemLine.Next() = 0;

                if xRec."Responsibility Center" <> "Responsibility Center" then begin
                    RecreateServLines(FieldCaption("Responsibility Center"));
                    Validate("Location Code", UserSetupMgt.GetLocation(2, '', "Responsibility Center"));
                    "Assigned User ID" := '';
                end;
            end;
        }
        field(5750; "Shipping Advice"; Enum "Sales Header Shipping Advice")
        {
            Caption = 'Shipping Advice';
            ToolTip = 'Specifies information about whether the customer will accept a partial shipment of the order.';

            trigger OnValidate()
            var
                ServiceWarehouseMgt: Codeunit "Service Warehouse Mgt.";
            begin
                TestField("Release Status", "Release Status"::Open);
                if WhsePickConflict("Document Type", "No.", "Shipping Advice") then
                    Error(Text064, FieldCaption("Shipping Advice"), Format("Shipping Advice"), TableCaption);
                if WhseShipmentConflict("Document Type", "No.", "Shipping Advice") then
                    Error(Text065, FieldCaption("Shipping Advice"), Format("Shipping Advice"), TableCaption);
                ServiceWarehouseMgt.ServiceHeaderVerifyChange(Rec, xRec);
            end;
        }
        field(5752; "Completely Shipped"; Boolean)
        {
            CalcFormula = min("Service Line"."Completely Shipped" where("Document Type" = field("Document Type"),
                                                                         "Document No." = field("No."),
                                                                         Type = filter(<> " "),
                                                                         "Location Code" = field("Location Filter")));
            Caption = 'Completely Shipped';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5754; "Location Filter"; Code[10])
        {
            Caption = 'Location Filter';
            FieldClass = FlowFilter;
            TableRelation = Location.Code;
        }
        field(5792; "Shipping Time"; DateFormula)
        {
            AccessByPermission = TableData "Shipping Agent Services" = R;
            Caption = 'Shipping Time';
            ToolTip = 'Specifies how long it takes from when the items are shipped from the warehouse to when they are delivered.';

            trigger OnValidate()
            begin
                TestField("Release Status", "Release Status"::Open);
                if "Shipping Time" <> xRec."Shipping Time" then
                    UpdateServLinesByFieldNo(FieldNo("Shipping Time"), CurrFieldNo <> 0);
            end;
        }
        field(5794; "Shipping Agent Service Code"; Code[10])
        {
            Caption = 'Shipping Agent Service Code';
            ToolTip = 'Specifies the code for the service, such as a one-day delivery, that is offered by the shipping agent.';
            TableRelation = "Shipping Agent Services".Code where("Shipping Agent Code" = field("Shipping Agent Code"));

            trigger OnValidate()
            begin
                TestField("Release Status", "Release Status"::Open);
                GetShippingTime(FieldNo("Shipping Agent Service Code"));
                UpdateServLinesByFieldNo(FieldNo("Shipping Agent Service Code"), CurrFieldNo <> 0);
            end;
        }
        field(5796; "Date Filter"; Date)
        {
            Caption = 'Date Filter';
            FieldClass = FlowFilter;
        }
        field(5902; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies a short description of the service document, such as Order 2001.';
        }
        field(5904; "Service Order Type"; Code[10])
        {
            Caption = 'Service Order Type';
            ToolTip = 'Specifies the type of this service order.';
            TableRelation = "Service Order Type";

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnValidateServiceOrderTypeOnBeforeCreateDim(Rec, xRec, IsHandled);
                if not IsHandled then
                    CreateDimFromDefaultDim(Rec.FieldNo("Service Order Type"));
            end;
        }
        field(5905; "Link Service to Service Item"; Boolean)
        {
            Caption = 'Link Service to Service Item';
            ToolTip = 'Specifies that service lines for items and resources must be linked to a service item line.';

            trigger OnValidate()
            begin
                if "Link Service to Service Item" <> xRec."Link Service to Service Item" then begin
                    ServLine.Reset();
                    ServLine.SetRange("Document Type", "Document Type");
                    ServLine.SetRange("Document No.", "No.");
                    ServLine.SetFilter(Type, '<>%1', ServLine.Type::Cost);
                    if ServLine.Find('-') then
                        Message(
                          Text001,
                          FieldCaption("Link Service to Service Item"),
                          "No.");
                end;
            end;
        }
        field(5907; Priority; Enum "Service Priority")
        {
            Caption = 'Priority';
            ToolTip = 'Specifies the priority of the service order.';
            Editable = false;
        }
        field(5911; "Allocated Hours"; Decimal)
        {
            AutoFormatType = 0;
            CalcFormula = sum("Service Order Allocation"."Allocated Hours" where("Document Type" = field("Document Type"),
                                                                                  "Document No." = field("No."),
                                                                                  "Allocation Date" = field("Date Filter"),
                                                                                  "Resource No." = field("Resource Filter"),
                                                                                  Status = filter(Active | Finished),
                                                                                  "Resource Group No." = field("Resource Group Filter")));
            Caption = 'Allocated Hours';
            ToolTip = 'Specifies the number of hours allocated to the items in this service order.';
            DecimalPlaces = 0 : 5;
            Editable = false;
            FieldClass = FlowField;
        }
        field(5915; "Phone No."; Text[30])
        {
            Caption = 'Phone No.';
            ToolTip = 'Specifies the phone number of the customer in this service order.';
            ExtendedDatatype = PhoneNo;

            trigger OnValidate()
            begin
                UpdateShipToAddressFromGeneralAddress(Rec.FieldNo("Ship-to Phone"));
            end;
        }
        field(5916; "E-Mail"; Text[80])
        {
            Caption = 'Email';
            ToolTip = 'Specifies the email address of the customer in this service order.';
            ExtendedDatatype = EMail;

            trigger OnValidate()
            var
                MailManagement: Codeunit "Mail Management";
            begin
                MailManagement.ValidateEmailAddressField("E-Mail");
                UpdateShipToAddressFromGeneralAddress(Rec.FieldNo("Ship-to E-Mail"));
            end;
        }
        field(5917; "Phone No. 2"; Text[30])
        {
            Caption = 'Phone No. 2';
            ToolTip = 'Specifies your customer''s alternate phone number.';
            ExtendedDatatype = PhoneNo;

            trigger OnValidate()
            begin
                UpdateShipToAddressFromGeneralAddress(Rec.FieldNo("Ship-to Phone 2"));
            end;
        }
        field(5918; "Fax No."; Text[30])
        {
            Caption = 'Fax No.';
        }
        field(5921; "No. of Unallocated Items"; Integer)
        {
            CalcFormula = count("Service Item Line" where("Document Type" = field("Document Type"),
                                                           "Document No." = field("No."),
                                                           "No. of Active/Finished Allocs" = const(0)));
            Caption = 'No. of Unallocated Items';
            ToolTip = 'Specifies the number of service items in this order that are not allocated to resources.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5923; "Order Time"; Time)
        {
            Caption = 'Order Time';
            ToolTip = 'Specifies the time when the service order was created.';
            NotBlank = true;

            trigger OnValidate()
            begin
                if "Order Time" <> xRec."Order Time" then begin
                    if ("Order Time" > "Starting Time") and
                       ("Starting Time" <> 0T) and
                       ("Order Date" = "Starting Date")
                    then
                        Error(Text007, FieldCaption("Order Time"), FieldCaption("Starting Time"));
                    if "Starting Time" <> 0T then
                        Validate("Starting Time");
                    ServItemLine.Reset();
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    if ServItemLine.Find('-') then
                        repeat
                            ServItemLine.CalculateResponseDateTime("Order Date", "Order Time");
                            ServItemLine.Modify();
                        until ServItemLine.Next() = 0;
                end;
            end;
        }
        field(5924; "Default Response Time (Hours)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Default Response Time (Hours)';
            DecimalPlaces = 0 : 5;
            MinValue = 0;
        }
        field(5925; "Actual Response Time (Hours)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Actual Response Time (Hours)';
            DecimalPlaces = 0 : 5;
            Editable = false;
            MinValue = 0;
        }
        field(5926; "Service Time (Hours)"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Service Time (Hours)';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        field(5927; "Response Date"; Date)
        {
            Caption = 'Response Date';
            ToolTip = 'Specifies the estimated date when work on the order should start, that is, when the service order status changes from Pending, to In Process.';
            Editable = false;
        }
        field(5928; "Response Time"; Time)
        {
            Caption = 'Response Time';
            ToolTip = 'Specifies the estimated time when work on the order starts, that is, when the service order status changes from Pending, to In Process.';
            Editable = false;
        }
        field(5929; "Starting Date"; Date)
        {
            Caption = 'Starting Date';
            ToolTip = 'Specifies the starting date of the service, that is, the date when the order status changes from Pending, to In Process for the first time.';

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

                if "Starting Date" <> 0D then begin
                    if "Starting Date" < "Order Date" then
                        Error(Text026, FieldCaption("Starting Date"), FieldCaption("Order Date"));

                    if ("Starting Date" > "Finishing Date") and
                       ("Finishing Date" <> 0D)
                    then
                        Error(Text007, FieldCaption("Starting Date"), FieldCaption("Finishing Time"));

                    ServItemLine.Reset();
                    ServItemLine.SetCurrentKey("Document Type", "Document No.", "Starting Date");
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    ServItemLine.SetFilter("Starting Date", '<>%1', 0D);
                    if ServItemLine.Find('-') then
                        repeat
                            if ServItemLine."Starting Date" < "Starting Date" then
                                Error(Text024, FieldCaption("Starting Date"));
                        until ServItemLine.Next() = 0;

                    if Time < "Order Time" then
                        Validate("Starting Time", "Order Time")
                    else
                        Validate("Starting Time", Time);
                end else begin
                    "Starting Time" := 0T;
                    "Actual Response Time (Hours)" := 0;
                    "Finishing Date" := 0D;
                    "Finishing Time" := 0T;
                    "Service Time (Hours)" := 0;
                end;
            end;
        }
        field(5930; "Starting Time"; Time)
        {
            Caption = 'Starting Time';
            ToolTip = 'Specifies the starting time of the service, that is, the time when the order status changes from Pending, to In Process for the first time.';

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

                TestField("Starting Date");

                if ("Starting Date" = "Finishing Date") and
                   ("Starting Time" > "Finishing Time")
                then
                    Error(Text007, FieldCaption("Starting Time"), FieldCaption("Finishing Time"));

                if ("Starting Date" = "Order Date") and
                   ("Starting Time" < "Order Time")
                then
                    Error(Text026, FieldCaption("Starting Time"), FieldCaption("Order Time"));

                if ("Starting Time" = 0T) and (xRec."Starting Time" <> 0T) then begin
                    "Finishing Time" := 0T;
                    "Finishing Date" := 0D;
                    "Service Time (Hours)" := 0;
                end;

                if ("Starting Time" <> 0T) and
                   ("Starting Date" <> 0D)
                then begin
                    CalcFields("Contract Serv. Hours Exist");
                    "Actual Response Time (Hours)" :=
                      ServOrderMgt.CalcServTime(
                        "Order Date", "Order Time", "Starting Date", "Starting Time",
                        "Contract No.", "Contract Serv. Hours Exist");
                end else
                    "Actual Response Time (Hours)" := 0;
                if "Finishing Time" <> 0T then
                    Validate("Finishing Time");
            end;
        }
        field(5931; "Finishing Date"; Date)
        {
            Caption = 'Finishing Date';
            ToolTip = 'Specifies the finishing date of the service, that is, the date when the Status field changes to Finished.';

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

                if "Finishing Date" <> 0D then begin
                    if "Finishing Date" < "Starting Date" then
                        Error(Text026, FieldCaption("Finishing Date"), FieldCaption("Starting Date"));

                    if "Finishing Date" < "Order Date" then
                        Error(
                          Text026,
                          FieldCaption("Finishing Date"),
                          FieldCaption("Order Date"));

                    if "Starting Date" = 0D then begin
                        "Starting Date" := "Finishing Date";
                        "Starting Time" := Time;
                        CalcFields("Contract Serv. Hours Exist");
                        "Actual Response Time (Hours)" :=
                          ServOrderMgt.CalcServTime(
                            "Order Date", "Order Time", "Starting Date", "Starting Time",
                            "Contract No.", "Contract Serv. Hours Exist");
                    end;

                    if "Finishing Date" <> xRec."Finishing Date" then begin
                        if Time < "Starting Time" then
                            "Finishing Time" := "Starting Time"
                        else
                            "Finishing Time" := Time;
                        Validate("Finishing Time");
                    end;

                    ServItemLine.Reset();
                    ServItemLine.SetCurrentKey("Document Type", "Document No.", "Finishing Date");
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    ServItemLine.SetFilter("Finishing Date", '<>%1', 0D);
                    if ServItemLine.Find('-') then
                        repeat
                            if ServItemLine."Finishing Date" > "Finishing Date" then
                                Error(Text025, FieldCaption("Finishing Date"));
                        until ServItemLine.Next() = 0;
                end else begin
                    "Finishing Time" := 0T;
                    "Service Time (Hours)" := 0;
                end;
            end;
        }
        field(5932; "Finishing Time"; Time)
        {
            Caption = 'Finishing Time';
            ToolTip = 'Specifies the finishing time of the service, that is, the time when the Status field changes to Finished.';

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

                TestField("Finishing Date");
                if "Finishing Time" <> 0T then begin
                    if ("Starting Date" = "Finishing Date") and
                       ("Finishing Time" < "Starting Time")
                    then
                        Error(
                          Text026, FieldCaption("Finishing Time"),
                          FieldCaption("Starting Time"));

                    if ("Finishing Date" = "Order Date") and
                       ("Finishing Time" < "Order Time")
                    then
                        Error(
                          Text026, FieldCaption("Finishing Time"),
                          FieldCaption("Order Time"));

                    ServItemLine.Reset();
                    ServItemLine.SetCurrentKey("Document Type", "Document No.", "Finishing Date");
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    ServItemLine.SetFilter("Finishing Date", '<>%1', 0D);
                    IsHandled := false;
                    OnValidateFinishingTimeOnBeforeCheckServItemLines(Rec, xRec, ServItemLine, IsHandled);
                    if not IsHandled then
                        if ServItemLine.Find('-') then
                            repeat
                                if (ServItemLine."Finishing Date" = "Finishing Date") and
                                   (ServItemLine."Finishing Time" > "Finishing Time")
                                then
                                    Error(Text025, FieldCaption("Finishing Time"));
                            until ServItemLine.Next() = 0;

                    CalcFields("Contract Serv. Hours Exist");
                    "Service Time (Hours)" :=
                      ServOrderMgt.CalcServTime(
                        "Starting Date", "Starting Time", "Finishing Date", "Finishing Time",
                        "Contract No.", "Contract Serv. Hours Exist");
                end else
                    "Service Time (Hours)" := 0;
            end;
        }
        field(5933; "Contract Serv. Hours Exist"; Boolean)
        {
            CalcFormula = exist("Service Hour" where("Service Contract No." = field("Contract No.")));
            Caption = 'Contract Serv. Hours Exist';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5934; "Reallocation Needed"; Boolean)
        {
            CalcFormula = exist("Service Order Allocation" where(Status = const("Reallocation Needed"),
                                                                  "Resource No." = field("Resource Filter"),
                                                                  "Document Type" = field("Document Type"),
                                                                  "Document No." = field("No."),
                                                                  "Resource Group No." = field("Resource Group Filter")));
            Caption = 'Reallocation Needed';
            ToolTip = 'Specifies that you must reallocate resources to at least one service item in this service order.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5936; "Notify Customer"; Option)
        {
            Caption = 'Notify Customer';
            ToolTip = 'Specifies how the customer wants to receive notifications about service completion.';
            OptionCaption = 'No,By Phone 1,By Phone 2,By Fax,By Email';
            OptionMembers = No,"By Phone 1","By Phone 2","By Fax","By Email";
        }
        field(5937; "Max. Labor Unit Price"; Decimal)
        {
            AutoFormatExpression = Rec."Currency Code";
            AutoFormatType = 2;
            BlankZero = true;
            Caption = 'Max. Labor Unit Price';
            ToolTip = 'Specifies the maximum unit price that can be set for a resource (for example, a technician) on all service lines linked to this order.';

            trigger OnValidate()
            begin
                if ServLineExists() then
                    Message(
                      Text001,
                      FieldCaption("Max. Labor Unit Price"),
                      "No.");
            end;
        }
        field(5938; "Warning Status"; Option)
        {
            Caption = 'Warning Status';
            ToolTip = 'Specifies the response time warning status for the order.';
            OptionCaption = ' ,First Warning,Second Warning,Third Warning';
            OptionMembers = " ","First Warning","Second Warning","Third Warning";
        }
        field(5939; "No. of Allocations"; Integer)
        {
            CalcFormula = count("Service Order Allocation" where("Document Type" = field("Document Type"),
                                                                  "Document No." = field("No."),
                                                                  "Resource No." = field("Resource Filter"),
                                                                  "Resource Group No." = field("Resource Group Filter"),
                                                                  "Allocation Date" = field("Date Filter"),
                                                                  Status = filter(Active | Finished)));
            Caption = 'No. of Allocations';
            ToolTip = 'Specifies the number of resource allocations to service items in this order.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(5940; "Contract No."; Code[20])
        {
            Caption = 'Contract No.';
            ToolTip = 'Specifies the number of the contract associated with the order.';
            TableRelation = "Service Contract Header"."Contract No." where("Contract Type" = const(Contract),
                                                                            "Customer No." = field("Customer No."),
                                                                            "Ship-to Code" = field("Ship-to Code"),
                                                                            "Bill-to Customer No." = field("Bill-to Customer No."));

            trigger OnLookup()
            var
                ServContractHeader: Record "Service Contract Header";
                ServContractList: Page "Service Contract List";
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnBeforeValidateContractNo(Rec, xRec, IsHandled);
                if IsHandled then
                    exit;

                if "Contract No." <> '' then
                    if ServContractHeader.Get(ServContractHeader."Contract Type"::Contract, "Contract No.") then
                        ServContractList.SetRecord(ServContractHeader);

                ServContractHeader.Reset();
                ServContractHeader.FilterGroup(2);
                ServContractHeader.SetCurrentKey("Customer No.", "Ship-to Code");
                ServContractHeader.SetRange("Customer No.", "Customer No.");
                ServContractHeader.SetRange("Ship-to Code", "Ship-to Code");
                ServContractHeader.SetRange("Contract Type", ServContractHeader."Contract Type"::Contract);
                ServContractHeader.SetRange("Bill-to Customer No.", "Bill-to Customer No.");
                ServContractHeader.SetRange(Status, ServContractHeader.Status::Signed);
                ServContractHeader.SetFilter("Starting Date", '<=%1', "Order Date");
                ServContractHeader.SetFilter("Expiration Date", '>=%1 | =%2', "Order Date", 0D);
                ServContractHeader.FilterGroup(0);
                OnLookupContractNoOnAfterServContractHeaderSetFilters(Rec, ServContractHeader);
                Clear(ServContractList);
                ServContractList.SetTableView(ServContractHeader);
                ServContractList.LookupMode(true);
                if ServContractList.RunModal() = ACTION::LookupOK then begin
                    ServContractList.GetRecord(ServContractHeader);
                    Validate("Contract No.", ServContractHeader."Contract No.");
                end;
            end;

            trigger OnValidate()
            var
                ServContractHeader: Record "Service Contract Header";
            begin
                if "Contract No." <> xRec."Contract No." then begin
                    if "Contract No." <> '' then begin
                        TestField("Order Date");
                        ServContractHeader.Get(ServContractHeader."Contract Type"::Contract, "Contract No.");
                        if ServContractHeader.Status <> ServContractHeader.Status::Signed then
                            Error(Text041, "Contract No.");
                        if ServContractHeader."Starting Date" > "Order Date" then
                            Error(Text042, "Contract No.");
                        if (ServContractHeader."Expiration Date" <> 0D) and
                           (ServContractHeader."Expiration Date" < "Order Date")
                        then
                            Error(Text043, "Contract No.");
                    end;
                    ServItemLine.Reset();
                    ServItemLine.SetRange("Document Type", "Document Type");
                    ServItemLine.SetRange("Document No.", "No.");
                    if ServItemLine.Find('-') then
                        Error(Text028,
                          FieldCaption("Contract No."), ServItemLine.TableCaption());

                    if not ConfirmChangeContractNo() then begin
                        "Contract No." := xRec."Contract No.";
                        exit;
                    end;

                    if "Contract No." <> '' then begin
                        TestField("Customer No.");
                        TestField("Bill-to Customer No.");
                        "Default Response Time (Hours)" := ServContractHeader."Response Time (Hours)";
                        TestField("Ship-to Code", ServContractHeader."Ship-to Code");
                        "Service Order Type" := ServContractHeader."Service Order Type";
                        Validate("Currency Code", ServContractHeader."Currency Code");
                        "Max. Labor Unit Price" := ServContractHeader."Max. Labor Unit Price";
                        "Your Reference" := ServContractHeader."Your Reference";
                        "Service Zone Code" := ServContractHeader."Service Zone Code";
                    end;
                end;

                if "Contract No." <> '' then
                    CreateDimFromDefaultDim(Rec.FieldNo("Contract No."));
            end;
        }
        field(5951; "Type Filter"; Option)
        {
            Caption = 'Type Filter';
            FieldClass = FlowFilter;
            OptionCaption = ' ,Resource,Item,Service Cost,Service Contract';
            OptionMembers = " ",Resource,Item,"Service Cost","Service Contract";
        }
        field(5952; "Customer Filter"; Code[20])
        {
            Caption = 'Customer Filter';
            FieldClass = FlowFilter;
            TableRelation = Customer."No.";
        }
        field(5953; "Resource Filter"; Code[20])
        {
            Caption = 'Resource Filter';
            FieldClass = FlowFilter;
            TableRelation = Resource;
        }
        field(5954; "Contract Filter"; Code[20])
        {
            Caption = 'Contract Filter';
            FieldClass = FlowFilter;
            TableRelation = "Service Contract Header"."Contract No." where("Contract Type" = const(Contract));
        }
        field(5955; "Ship-to Fax No."; Text[30])
        {
            Caption = 'Ship-to Fax No.';
        }
        field(5956; "Ship-to E-Mail"; Text[80])
        {
            Caption = 'Ship-to Email';
            ToolTip = 'Specifies the email address at the address that the items are shipped to.';
            ExtendedDatatype = EMail;

            trigger OnValidate()
            var
                MailManagement: Codeunit "Mail Management";
            begin
                MailManagement.ValidateEmailAddressField("Ship-to E-Mail");
            end;
        }
        field(5957; "Resource Group Filter"; Code[20])
        {
            Caption = 'Resource Group Filter';
            FieldClass = FlowFilter;
            TableRelation = "Resource Group";
        }
        field(5958; "Ship-to Phone"; Text[30])
        {
            Caption = 'Ship-to Phone';
            ToolTip = 'Specifies the telephone number of the company''s shipping address.';
            ExtendedDatatype = PhoneNo;
        }
        field(5959; "Ship-to Phone 2"; Text[30])
        {
            Caption = 'Ship-to Phone 2';
            ToolTip = 'Specifies an additional phone number at address that the items are shipped to.';
            ExtendedDatatype = PhoneNo;
        }
        field(5966; "Service Zone Filter"; Code[10])
        {
            Caption = 'Service Zone Filter';
            FieldClass = FlowFilter;
            TableRelation = "Service Zone".Code;
        }
        field(5968; "Service Zone Code"; Code[10])
        {
            Caption = 'Service Zone Code';
            ToolTip = 'Specifies the service zone code of the customer''s ship-to address in the service order.';
            Editable = false;
            TableRelation = "Service Zone".Code;

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

                if ShipToAddr.Get("Customer No.", "Ship-to Code") then
                    "Service Zone Code" := ShipToAddr."Service Zone Code"
                else
                    if Cust.Get("Customer No.") then
                        "Service Zone Code" := Cust."Service Zone Code"
                    else
                        "Service Zone Code" := '';
            end;
        }
        field(5981; "Expected Finishing Date"; Date)
        {
            Caption = 'Expected Finishing Date';
            ToolTip = 'Specifies the date when service on the order is expected to be finished.';
        }
        field(7000; "Price Calculation Method"; Enum "Price Calculation Method")
        {
            Caption = 'Price Calculation Method';
        }
        field(7001; "Allow Line Disc."; Boolean)
        {
            Caption = 'Allow Line Disc.';

            trigger OnValidate()
            begin
                MessageIfServLinesExist(FieldCaption("Allow Line Disc."));
            end;
        }
        field(9000; "Assigned User ID"; Code[50])
        {
            Caption = 'Assigned User ID';
            ToolTip = 'Specifies the ID of the user who is responsible for the document.';
            DataClassification = EndUserIdentifiableInformation;
            TableRelation = "User Setup";

            trigger OnValidate()
            var
                IsHandled: Boolean;
            begin
                IsHandled := false;
                OnValidateAssignedUserIdOnBeforeCheckRespCenter(Rec, xRec, IsHandled);
                if not IsHandled then
                    if not UserSetupMgt.CheckRespCenter(2, "Responsibility Center", "Assigned User ID") then
                        Error(Text060, "Assigned User ID", UserSetupMgt.GetServiceFilter("Assigned User ID"));
            end;
        }
        field(9001; "Quote No."; Code[20])
        {
            Caption = 'Quote No.';
            ToolTip = 'Specifies the number of the service quote that the service order was created from. You can track the number to service quote documents that you have printed, saved, or emailed.';
            Editable = false;
        }
    }

    keys
    {
        key(Key1; "Document Type", "No.")
        {
            Clustered = true;
        }
        key(Key2; "No.", "Document Type")
        {
        }
        key(Key3; "Customer No.", "Order Date")
        {
        }
        key(Key4; "Contract No.", Status, "Posting Date")
        {
        }
        key(Key5; Status, "Response Date", "Response Time", Priority, "Responsibility Center")
        {
        }
        key(Key6; Status, Priority, "Response Date", "Response Time")
        {
        }
        key(Key7; "Document Type", "Customer No.", "Order Date")
        {
            MaintainSQLIndex = false;
        }
        key(Key9; "Incoming Document Entry No.")
        {
        }
        key(Key10; "Document Type", "Combine Shipments", "Customer No.", "Bill-to Customer No.", "Currency Code", "EU 3-Party Trade", "Dimension Set ID", "Journal Templ. Name")
        {
        }
    }

    fieldgroups
    {
        fieldgroup(DropDown; "Document Type", "No.", "Customer No.", "Posting Date", Status)
        {
        }
        fieldgroup(Brick; "Document Type", "No.", "Customer No.", "Posting Date", Status)
        {
        }
    }

    trigger OnDelete()
    var
        ServDocRegister: Record "Service Document Register";
        ServDocLog: Record "Service Document Log";
        ServOrderAlloc: Record "Service Order Allocation";
        ServCommentLine: Record "Service Comment Line";
        WhseRequest: Record "Warehouse Request";
        Loaner: Record Loaner;
        LoanerEntry: Record "Loaner Entry";
        ServAllocMgt: Codeunit ServAllocationManagement;
        ReservMgt: Codeunit "Reservation Management";
        ServiceDocumentArchiveMgmt: Codeunit "Service Document Archive Mgmt.";
        ShowPostedDocsToPrint, IsHandled : Boolean;
    begin
        OnBeforeOnDelete(Rec);

        if not UserSetupMgt.CheckRespCenter(2, "Responsibility Center") then
            Error(Text000, UserSetupMgt.GetServiceFilter());

        if "Document Type" = "Document Type"::Invoice then
            PrepareDeleteServiceInvoice();

        OnDeleteOnBeforeArchiveServiceDocument(Rec, xRec);
        ServiceDocumentArchiveMgmt.AutoArchiveServiceDocument(Rec);

        IsHandled := false;
        OnDeleteHeaderOnBeforeDeleteRelatedRecords(Rec, ServShptHeader, ServInvHeader, ServCrMemoHeader, IsHandled);
        if not IsHandled then
            ServPost.DeleteHeader(Rec, ServShptHeader, ServInvHeader, ServCrMemoHeader);
        Validate("Applies-to ID", '');
        Rec.Validate("Incoming Document Entry No.", 0);

        ServLine.Reset();
        ServLine.LockTable();

        ReservMgt.DeleteDocumentReservation(DATABASE::"Service Line", "Document Type".AsInteger(), "No.", HideValidationDialog);

        WhseRequest.DeleteRequest(DATABASE::"Service Line", Rec."Document Type".AsInteger(), Rec."No.");

        ServLine.SetRange("Document Type", "Document Type");
        ServLine.SetRange("Document No.", "No.");
        ServLine.SuspendStatusCheck(true);
        ServLine.DeleteAll(true);

        ServCommentLine.Reset();
        ServCommentLine.SetRange("Table Name", ServCommentLine."Table Name"::"Service Header");
        ServCommentLine.SetRange("Table Subtype", "Document Type");
        ServCommentLine.SetRange("No.", "No.");
        ServCommentLine.DeleteAll();

        ServDocRegister.SetCurrentKey("Destination Document Type", "Destination Document No.");
        case "Document Type" of
            "Document Type"::Invoice:
                begin
                    ServDocRegister.SetRange("Destination Document Type", ServDocRegister."Destination Document Type"::Invoice);
                    ServDocRegister.SetRange("Destination Document No.", "No.");
                    ServDocRegister.DeleteAll();
                end;
            "Document Type"::"Credit Memo":
                begin
                    ServDocRegister.SetRange("Destination Document Type", ServDocRegister."Destination Document Type"::"Credit Memo");
                    ServDocRegister.SetRange("Destination Document No.", "No.");
                    ServDocRegister.DeleteAll();
                end;
        end;

        ServOrderAlloc.Reset();
        ServOrderAlloc.SetCurrentKey("Document Type");
        ServOrderAlloc.SetRange("Document Type", "Document Type");
        ServOrderAlloc.SetRange("Document No.", "No.");
        ServOrderAlloc.SetRange(Posted, false);
        ServOrderAlloc.DeleteAll();
        ServAllocMgt.SetServOrderAllocStatus(Rec);

        ServItemLine.Reset();
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        if ServItemLine.Find('-') then
            repeat
                if ServItemLine."Loaner No." <> '' then begin
                    Loaner.Get(ServItemLine."Loaner No.");
                    LoanerEntry.SetRange("Document Type", LoanerEntry.GetDocTypeFromServDocType("Document Type"));
                    LoanerEntry.SetRange("Document No.", "No.");
                    LoanerEntry.SetRange("Loaner No.", ServItemLine."Loaner No.");
                    LoanerEntry.SetRange(Lent, true);
                    if not LoanerEntry.IsEmpty() then
                        Error(
                          Text040,
                          TableCaption,
                          ServItemLine."Document No.",
                          ServItemLine."Line No.",
                          ServItemLine.FieldCaption("Loaner No."),
                          ServItemLine."Loaner No.");

                    LoanerEntry.SetRange(Lent, true);
                    LoanerEntry.DeleteAll();
                end;

                Clear(ServLogMgt);
                ServLogMgt.ServItemOffServOrder(ServItemLine);
                OnDeleteOnBeforeServItemLineDelete(ServItemLine, Rec);
                ServItemLine.Delete();
            until ServItemLine.Next() = 0;

        ServDocLog.Reset();
        ServDocLog.SetRange("Document Type", "Document Type");
        ServDocLog.SetRange("Document No.", "No.");
        ServDocLog.DeleteAll();

        ServDocLog.Reset();
        ServDocLog.SetRange(Before, "No.");
        ServDocLog.SetFilter("Document Type", '%1|%2|%3',
          ServDocLog."Document Type"::Shipment, ServDocLog."Document Type"::"Posted Invoice",
          ServDocLog."Document Type"::"Posted Credit Memo");
        ServDocLog.DeleteAll();

        OnDeleteOnBeforeShowPostedDocsToPrint(Rec);

        ShowPostedDocsToPrint := (ServShptHeader."No." <> '') or
           (ServInvHeader."No." <> '') or
           (ServCrMemoHeader."No." <> '');
        OnBeforeShowPostedDocsToPrintCreatedMsg(ShowPostedDocsToPrint);
        if ShowPostedDocsToPrint then
            Message(PostedDocsToPrintCreatedMsg);
    end;

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

        InitInsert();

        Clear(ServLogMgt);
        ServLogMgt.ServHeaderCreate(Rec);

        if "Salesperson Code" = '' then
            SetDefaultSalesperson();

        if GetFilter("Customer No.") <> '' then begin
            Clear(xRec."Ship-to Code");
            if GetRangeMin("Customer No.") = GetRangeMax("Customer No.") then
                Validate("Customer No.", GetRangeMin("Customer No."));
        end;

        if GetFilter("Contact No.") <> '' then
            if GetRangeMin("Contact No.") = GetRangeMax("Contact No.") then
                Validate("Contact No.", GetRangeMin("Contact No."));

        OnAfterOnInsert(Rec);
    end;

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

        UpdateServiceOrderChangeLog(xRec);
    end;

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

    var
#pragma warning disable AA0074
        Text000: Label 'You cannot delete this document. Your identification is set up to process from Responsibility Center %1 only.', Comment = '%1=User management service filter;';
#pragma warning disable AA0470
        Text001: Label 'Changing %1 in service header %2 will not update the existing service lines.\You must update the existing service lines manually.';
#pragma warning restore AA0470
        Text003: Label 'You cannot change the %1 because the %2 %3 %4 is associated with a %5 %6.', Comment = '%1=Customer number field caption;%2=Document type;%3=Number field caption;%4=Number;%5=Contract number field caption;%6=Contract number; ';
#pragma warning disable AA0470
        Text004: Label 'When you change the %1 the existing Service item line and service line will be deleted.\Do you want to change the %1?';
        Text005: Label 'Do you want to change the %1?';
        Text007: Label '%1 cannot be greater than %2.';
#pragma warning restore AA0470
        Text008: Label 'You cannot create Service %1 with %2=%3 because this number has already been used in the system.', Comment = '%1=Document type format;%2=Number field caption;%3=Number;';
        Text010: Label 'Your identification is set up to process from %1 %2 only.', Comment = '%1=Resposibility center table caption;%2=User management service filter;';
#pragma warning disable AA0470
        Text011: Label '%1 cannot be greater than %2 in the %3 table.';
        Text012: Label 'If you change %1, the existing service lines will be deleted and the program will create new service lines based on the new information on the header.\Do you want to change the %1?';
        Text013: Label 'Deleting this document will cause a gap in the number series for posted credit memos. An empty posted credit memo %1 will be created to fill this gap in the number series.\\Do you want to continue?';
#pragma warning restore AA0470
        Text015: Label 'Do you want to update the exchange rate?';
#pragma warning disable AA0470
        Text016: Label 'You have modified %1.\Do you want to update the service lines?';
#pragma warning restore AA0470
        Text018: Label 'You have not specified the %1 for %2 %3=%4, %5=%6.', Comment = '%1=Service order type field caption;%2=table caption;%3=Document type field caption;%4=Document type format;%5=Number field caption;%6=Number format;';
#pragma warning disable AA0470
        Text019: Label 'You have changed %1 on the service header, but it has not been changed on the existing service lines.\The change may affect the exchange rate used in the price calculation of the service lines.';
        Text021: Label 'You have changed %1 on the %2, but it has not been changed on the existing service lines.\You must update the existing service lines manually.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        ServiceMgtSetup: Record "Service Mgt. Setup";
        Cust: Record Customer;
        ServHeader: Record "Service Header";
        ServLine: Record "Service Line";
        ServItemLine: Record "Service Item Line";
        PostCode: Record "Post Code";
        CurrExchRate: Record "Currency Exchange Rate";
        GeneralLedgerSetup: Record "General Ledger Setup";
#if not CLEAN27
        SalesReceivablesSetup: Record "Sales & Receivables Setup";
#endif
        ServShptHeader: Record "Service Shipment Header";
        ServInvHeader: Record "Service Invoice Header";
        ServCrMemoHeader: Record "Service Cr.Memo Header";
        ReservEntry: Record "Reservation Entry";
        TempReservEntry: Record "Reservation Entry" temporary;
        GenJournalTemplate: Record "Gen. Journal Template";
        Salesperson: Record "Salesperson/Purchaser";
        ServOrderMgt: Codeunit ServOrderManagement;
        DimMgt: Codeunit DimensionManagement;
        NoSeries: Codeunit "No. Series";
        ServLogMgt: Codeunit ServLogManagement;
        UserSetupMgt: Codeunit "User Setup Management";
        NotifyCust: Codeunit "Customer-Notify by Email";
        ServPost: Codeunit "Service-Post";
        CurrencyDate: Date;
        TempLinkToServItem: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text024: Label 'The %1 cannot be greater than the minimum %1 of the\ Service Item Lines.';
        Text025: Label 'The %1 cannot be less than the maximum %1 of the related\ Service Item Lines.';
        Text026: Label '%1 cannot be earlier than the %2.';
        Text027: Label 'The %1 cannot be greater than the minimum %2 of the related\ Service Item Lines.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        ValidatingFromLines: Boolean;
        LinesExist: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text028: Label 'You cannot change the %1 because %2 exists.';
        Text029: Label 'The %1 field on the %2 will be updated if you change %3 manually.\Do you want to continue?';
#pragma warning restore AA0470
        Text031: Label 'You cannot change %1 to %2 in %3 %4.\\%5 %6 in %7 %8 line is preventing it.', Comment = '%1=Status field caption;%2=Status format;%3=table caption;%4=Number;%5=ServItemLine repair status code field caption;%6=ServItemLine repair status code;%7=ServItemLine table caption;%8=ServItemLine line number;';
        Text037: Label 'Contact %1 %2 is not related to customer %3.', Comment = '%1=Contact number;%2=Contact name;%3=Customer number;';
        Text038: Label 'Contact %1 %2 is related to a different company than customer %3.', Comment = '%1=Contact number;%2=Contact name;%3=Customer number;';
        Text039: Label 'Contact %1 %2 is not related to a customer.', Comment = '%1=Contact number;%2=Contact name;';
#pragma warning restore AA0074
        ContactNo: Code[20];
#pragma warning disable AA0074
        Text040: Label 'You cannot delete %1 %2 because the %4 %5 for Service Item Line %3 has not been received.', Comment = '%1=table caption;%2=ServItemLine document number;%3=ServItemLine line number;%4=ServItemLine loaner number field caption;%5=ServItemLine loaner number;';
#pragma warning restore AA0074
        SkipContact: Boolean;
        SkipBillToContact: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text041: Label 'Contract %1 is not signed.';
        Text042: Label 'The service period for contract %1 has not yet started.';
        Text043: Label 'The service period for contract %1 has expired.';
        Text044: Label 'You cannot rename a %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
#pragma warning disable AA0074
        Text045: Label 'You can not change the %1 field because %2 %3 has %4 = %5 and the %6 has already been assigned %7 %8.', Comment = '%1=Posting date field caption;%2=Posting number series field caption;%3=Posting number series;%4=NoSeries date order field caption;%5=NoSeries date order;%6=Document type;%7=posting number field caption;%8=Posting number;';
#pragma warning disable AA0470
        Text047: Label 'You cannot change %1 because reservation, item tracking, or order tracking exists on the sales order.';
        Text050: Label 'You cannot reset %1 because the document still has one or more lines.';
#pragma warning restore AA0470
        Text051: Label 'The service %1 %2 already exists.', Comment = '%1=Document type format;%2=Number;';
#pragma warning disable AA0470
        Text053: Label 'Deleting this document will cause a gap in the number series for shipments. An empty shipment %1 will be created to fill this gap in the number series.\\Do you want to continue?';
        Text054: Label 'Deleting this document will cause a gap in the number series for posted invoices. An empty posted invoice %1 will be created to fill this gap in the number series.\\Do you want to continue?';
        Text055: Label 'You have modified the %1 field. Note that the recalculation of VAT may cause penny differences, so you must check the amounts afterwards. Do you want to update the %2 field on the lines to reflect the new value of %1?';
        Text057: Label 'When you change the %1 the existing service line will be deleted.\Do you want to change the %1?';
#pragma warning restore AA0470
        Text058: Label 'You cannot change %1 because %2 %3 is linked to Contract %4.', Comment = '%1=Currency code field caption;%2=Document type;%3=Number;%4=Contract number;';
        Text060: Label 'Responsibility Center is set up to process from %1 %2 only.', Comment = '%1=Assigned user ID;%2=User management service filter assigned user id;';
        Text061: Label 'You may have changed a dimension.\\Do you want to update the lines?';
#pragma warning disable AA0470
        Text062: Label 'An open inventory pick exists for the %1 and because %2 is %3.\\You must first post or delete the inventory pick or change %2 to Partial.';
        Text063: Label 'An open warehouse shipment exists for the %1 and %2 is %3.\\You must add the item(s) as new line(s) to the existing warehouse shipment or change %2 to Partial.';
        Text064: Label 'You cannot change %1 to %2 because an open inventory pick on the %3.';
        Text065: Label 'You cannot change %1  to %2 because an open warehouse shipment exists for the %3.';
#pragma warning restore AA0470
        Text066: Label 'You cannot change the dimension because there are service entries connected to this line.';
#pragma warning restore AA0074
        PostedDocsToPrintCreatedMsg: Label 'One or more related posted documents have been generated during deletion to fill gaps in the posting number series. You can view or print the documents from the respective document archive.';
        DocumentNotPostedClosePageQst: Label 'The document has been saved but is not yet posted.\\Are you sure you want to exit?';
        MissingExchangeRatesQst: Label 'There are no exchange rates for currency %1 and date %2. Do you want to add them now? Otherwise, the last change you made will be reverted.', Comment = '%1 - currency code, %2 - posting date';
        FullServiceTypesTxt: Label 'Service Quote,Service Order,Service Invoice,Service Credit Memo';
        RestoreInvoiceDatesOnDeleteInvQst: Label 'Deleting the service invoice will restore the previous invoice dates in the service contract. Do you want to continue?';
        CannotDeletePostedInvoiceErr: Label 'The service invoice cannot be deleted because it has been posted.';
        CannotDeleteWhenNextInvPostedErr: Label 'The service invoice cannot be deleted because there are posted service ledger entries with a later posting date.';
        CannotDeleteWhenNextInvExistsErr: Label 'The service invoice cannot be deleted because there are service invoices with a later posting date.';
        CannotRestoreInvoiceDatesErr: Label 'The service invoice cannot be deleted because the previous invoice dates cannot be restored in the service contract.';
        InvoicePeriodChangedErr: Label 'The invoice period in the service contract has been changed and cannot be updated.';
#if not CLEAN27
        SkipStatsPrep: Boolean;
#endif

    protected var
        GlobalNoSeries: Record "No. Series";
        HideValidationDialog: Boolean;

    /// <summary>
    /// Lists all related number series for service header when creating new record.
    /// </summary>
    /// <param name="OldServHeader">Service header record that is created. </param>
    /// <returns>Returns true if number series is assigned successfully, otherwise 'false'. </returns>
    procedure AssistEdit(OldServHeader: Record "Service Header"): Boolean
    var
        ServHeader2: Record "Service Header";
    begin
        ServHeader.Copy(Rec);
        ServHeader.GetServiceMgtSetup();
        ServHeader.TestNoSeries();
        if NoSeries.LookupRelatedNoSeries(ServHeader.GetNoSeriesCode(), OldServHeader."No. Series", ServHeader."No. Series") then begin
            if (ServHeader."Customer No." = '') and (ServHeader."Contact No." = '') then
                ServHeader.CheckCreditMaxBeforeInsert(false);

            ServHeader."No." := NoSeries.GetNextNo(ServHeader."No. Series");
            if ServHeader2.Get(ServHeader."Document Type", ServHeader."No.") then
                Error(Text051, LowerCase(Format(ServHeader."Document Type")), ServHeader."No.");
            Rec := ServHeader;
            exit(true);
        end;
    end;

    /// <summary>
    /// Generates new dimension set id from provided default dimensions for the current service header.
    /// </summary>
    /// <param name="DefaultDimSource">Provided list of default dimensions. </param>
    /// <remarks>If selected service header is assigned to a contract, it's dimension will be added.
    /// Additional dimensions will be propagated to service item lines or service lines if they exist. </remarks>
    procedure CreateDim(DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    var
        SourceCodeSetup: Record "Source Code Setup";
        ServiceContractHeader: Record "Service Contract Header";
        ContractDimensionSetID: Integer;
        OldDimSetID: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateDim(Rec, CurrFieldNo, IsHandled);
        if IsHandled then
            exit;

        SourceCodeSetup.Get();

        "Shortcut Dimension 1 Code" := '';
        "Shortcut Dimension 2 Code" := '';
        OldDimSetID := "Dimension Set ID";

        if "Contract No." <> '' then begin
            ServiceContractHeader.Get(ServiceContractHeader."Contract Type"::Contract, "Contract No.");
            ContractDimensionSetID := ServiceContractHeader."Dimension Set ID";
        end;

        "Dimension Set ID" :=
          DimMgt.GetRecDefaultDimID(
            Rec, CurrFieldNo, DefaultDimSource, SourceCodeSetup."Service Management",
            "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code", ContractDimensionSetID, DATABASE::"Service Contract Header");

        OnCreateDimOnBeforeUpdateLines(Rec, xRec, CurrFieldNo, OldDimSetID, DefaultDimSource);

        if "Dimension Set ID" <> OldDimSetID then begin
            DimMgt.UpdateGlobalDimFromDimSetID("Dimension Set ID", "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
            if ServItemLineExists() or ServLineExists() then begin
                Modify();
                UpdateAllLineDim("Dimension Set ID", OldDimSetID);
            end;
        end;

        OnAfterCreateDim(Rec, DefaultDimSource);
    end;

    procedure UpdateAllLineDim(NewParentDimSetID: Integer; OldParentDimSetID: Integer)
    var
        xServiceLine: Record "Service Line";
        ConfirmManagement: Codeunit "Confirm Management";
        NewDimSetID: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateAllLineDim(Rec, NewParentDimSetID, OldParentDimSetID, IsHandled);
        if IsHandled then
            exit;

        if NewParentDimSetID = OldParentDimSetID then
            exit;

        IsHandled := false;
        OnUpdateAllLineDimOnBeforeGetResponse(Rec, NewParentDimSetID, OldParentDimSetID, IsHandled);
        if not IsHandled then
            if not HideValidationDialog and GuiAllowed then
                if not ConfirmManagement.GetResponseOrDefault(Text061, true) then
                    exit;

        ServLine.Reset();
        ServLine.SetRange("Document Type", "Document Type");
        ServLine.SetRange("Document No.", "No.");
        ServLine.LockTable();
        if ServLine.Find('-') then
            repeat
                OnUpdateAllLineDimOnBeforeGetServLineNewDimSetID(ServLine, NewParentDimSetID, OldParentDimSetID);
                NewDimSetID := DimMgt.GetDeltaDimSetID(ServLine."Dimension Set ID", NewParentDimSetID, OldParentDimSetID);
                if ServLine."Dimension Set ID" <> NewDimSetID then begin
                    xServiceLine := ServLine;
                    ServLine."Dimension Set ID" := NewDimSetID;
                    DimMgt.UpdateGlobalDimFromDimSetID(
                      ServLine."Dimension Set ID", ServLine."Shortcut Dimension 1 Code", ServLine."Shortcut Dimension 2 Code");

                    OnUpdateAllLineDimOnBeforeServiceLineModify(ServLine, xServiceLine);
                    ServLine.Modify();
                    OnUpdateAllLineDimOnAfterServiceLineModify(ServLine);
                end;
            until ServLine.Next() = 0;

        ServItemLine.Reset();
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        ServItemLine.LockTable();
        if ServItemLine.Find('-') then
            repeat
                OnUpdateAllLineDimOnBeforeGetServItemLineNewDimSetID(ServItemLine, NewParentDimSetID, OldParentDimSetID);
                NewDimSetID := DimMgt.GetDeltaDimSetID(ServItemLine."Dimension Set ID", NewParentDimSetID, OldParentDimSetID);
                if ServItemLine."Dimension Set ID" <> NewDimSetID then begin
                    ServItemLine."Dimension Set ID" := NewDimSetID;
                    DimMgt.UpdateGlobalDimFromDimSetID(
                      ServItemLine."Dimension Set ID", ServItemLine."Shortcut Dimension 1 Code", ServItemLine."Shortcut Dimension 2 Code");
                    ServItemLine.Modify();
                end;
            until ServItemLine.Next() = 0;
    end;

    local procedure ValidatePaymentTerms(var ServiceHeader: Record "Service Header")
    var
        PaymentTerms: Record "Payment Terms";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeValidatePaymentTerms(ServiceHeader, IsHandled);
        if IsHandled then
            exit;

        if (ServiceHeader."Payment Terms Code" <> '') and (ServiceHeader."Document Date" <> 0D) then begin
            PaymentTerms.Get("Payment Terms Code");
            if (ServiceHeader."Document Type" in [ServiceHeader."Document Type"::"Credit Memo"]) and
               not PaymentTerms."Calc. Pmt. Disc. on Cr. Memos"
            then begin
                ServiceHeader.Validate("Due Date", ServiceHeader."Document Date");
                ServiceHeader.Validate("Pmt. Discount Date", 0D);
                ServiceHeader.Validate("Payment Discount %", 0);
            end else begin
                ServiceHeader."Due Date" := CalcDate(PaymentTerms."Due Date Calculation", ServiceHeader."Document Date");
                IsHandled := false;
                OnValidatePaymentTermsCodeOnBeforeCalcPmtDiscDate(ServiceHeader, IsHandled);
                if not IsHandled then
                    ServiceHeader."Pmt. Discount Date" := CalcDate(PaymentTerms."Discount Date Calculation", ServiceHeader."Document Date");
                ServiceHeader.Validate("Payment Discount %", PaymentTerms."Discount %")
            end;
        end else begin
            IsHandled := false;
            OnValidatePaymentTermsCodeOnBeforeValidateDueDate(ServiceHeader, IsHandled);
            if not IsHandled then
                ServiceHeader.Validate("Due Date", ServiceHeader."Document Date");
            ServiceHeader.Validate("Pmt. Discount Date", 0D);
            ServiceHeader.Validate("Payment Discount %", 0);
        end;
    end;

    /// <summary>
    /// Triggers validation of shortcut dimension values.
    /// </summary>
    /// <param name="FieldNumber">Indicates the number of a field which invoked the method. </param>
    /// <param name="ShortcutDimCode">Specified value of the shortcut dimension. </param>
    /// <remarks>Additional changes will be propagated to service item lines or service lines if they exist. </remarks>
    procedure ValidateShortcutDimCode(FieldNumber: Integer; var ShortcutDimCode: Code[20])
    var
        OldDimSetID: Integer;
    begin
        OnBeforeValidateShortcutDimCode(Rec, xRec, FieldNumber, ShortcutDimCode);

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

        OnValidateShortcutDimCodeOnBeforeUpdateUpdateAllLineDim(Rec, xRec, FieldNumber);
        if ServItemLineExists() or ServLineExists() then
            UpdateAllLineDim("Dimension Set ID", OldDimSetID);

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

    /// <summary>
    /// Updates value of the field 'Currency Factor' for the current service header.
    /// </summary>
    /// <remarks>If no exchange rate for selected currency code exists, the system will offer to a user option to manually add missing exchange rate.
    /// Changes will be propagated to all existing service lines related to current service header. </remarks>
    procedure UpdateCurrencyFactor()
    var
        UpdateCurrencyExchangeRates: Codeunit "Update Currency Exchange Rates";
        ConfirmManagement: Codeunit "Confirm Management";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateCurrencyFactor(Rec, CurrExchRate, IsHandled);
        if IsHandled then
            exit;

        if "Currency Code" <> '' then begin
            GeneralLedgerSetup.GetRecordOnce();
            CurrencyDate := "Posting Date";
            OnUpdateCurrencyFactorOnAfterSetCurrencyDate(Rec, GeneralLedgerSetup, CurrencyDate);
            if UpdateCurrencyExchangeRates.ExchangeRatesForCurrencyExist(CurrencyDate, "Currency Code") then begin
                "Currency Factor" := CurrExchRate.ExchangeRate(CurrencyDate, "Currency Code");
                if "Currency Code" <> xRec."Currency Code" then
                    RecreateServLines(FieldCaption("Currency Code"));
            end else
                if ConfirmManagement.GetResponseOrDefault(
                     StrSubstNo(MissingExchangeRatesQst, "Currency Code", CurrencyDate), true)
                then begin
                    UpdateCurrencyExchangeRates.OpenExchangeRatesPage("Currency Code");
                    UpdateCurrencyFactor();
                end else
                    RevertCurrencyCodeAndPostingDate();
        end else begin
            "Currency Factor" := 0;
            if "Currency Code" <> xRec."Currency Code" then
                RecreateServLines(FieldCaption("Currency Code"));
        end;
    end;

    /// <summary>
    /// Recalculates existing service lines related to current service header based on new values from hader.
    /// </summary>
    /// <param name="ChangedFieldName">Indicates the name of a field which invoked the method. </param>
    /// <remarks>Changing 'Location Code' value won't be possible if reservation entry, item tracking code or order tracking exist.
    /// Additional service lines must not be shipped or invoiced. </remarks>
    procedure RecreateServLines(ChangedFieldName: Text[100])
    var
        TempServLine: Record "Service Line" temporary;
        ServDocReg: Record "Service Document Register";
        TempServDocReg: Record "Service Document Register" temporary;
        ServiceCommentLine: Record "Service Comment Line";
        TempServiceCommentLine: Record "Service Comment Line" temporary;
        Confirmed: Boolean;
        ExtendedTextAdded: Boolean;
        IsHandled: Boolean;
    begin
        if not ServLineExists() then
            exit;

        IsHandled := false;
        OnBeforeRecreateServLines(Rec, xRec, ChangedFieldName, IsHandled, CurrFieldNo);
        if IsHandled then
            exit;

        Confirmed := ConfirmRecreateServLines(ChangedFieldName);

        if Confirmed then begin
            ServLine.LockTable();
            ReservEntry.LockTable();
            Modify();

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

            ServLine.Reset();
            ServLine.SetRange("Document Type", "Document Type");
            ServLine.SetRange("Document No.", "No.");
            OnRecreateServLinesOnAfterServLineSetFilters(ServLine);
            if ServLine.Find('-') then begin
                repeat
                    ServLine.TestField("Quantity Shipped", 0);
                    ServLine.TestField("Quantity Invoiced", 0);
                    ServLine.TestField("Shipment No.", '');
                    TempServLine := ServLine;
                    if ServLine.Nonstock then begin
                        ServLine.Nonstock := false;
                        ServLine.Modify();
                    end;
                    TempServLine.Insert();
                    CopyReservEntryToTemp(ServLine);
                until ServLine.Next() = 0;

                if "Location Code" <> xRec."Location Code" then
                    if not TempReservEntry.IsEmpty() then
                        Error(Text047, FieldCaption("Location Code"));

                if "Document Type" = "Document Type"::Invoice then begin
                    ServDocReg.SetCurrentKey("Destination Document Type", "Destination Document No.");
                    ServDocReg.SetRange("Destination Document Type", ServDocReg."Destination Document Type"::Invoice);
                    ServDocReg.SetRange("Destination Document No.", TempServLine."Document No.");
                    if ServDocReg.Find('-') then
                        repeat
                            TempServDocReg := ServDocReg;
                            TempServDocReg.Insert();
                        until ServDocReg.Next() = 0;
                end;
                StoreServiceCommentLineToTemp(TempServiceCommentLine);
                ServiceCommentLine.DeleteServiceInvoiceLinesRelatedComments(Rec);
                IsHandled := false;
                OnRecreateServLinesOnBeforeServLineDeleteAll(Rec, ServLine, CurrFieldNo, IsHandled);
                if not IsHandled then
                    ServLine.DeleteAll(true);

                if "Document Type" = "Document Type"::Invoice then
                    if TempServDocReg.Find('-') then
                        repeat
                            ServDocReg := TempServDocReg;
                            ServDocReg.Insert();
                        until TempServDocReg.Next() = 0;

                CreateServiceLines(TempServLine, ExtendedTextAdded, TempServiceCommentLine);
                TempServLine.SetRange(Type);
                TempServLine.DeleteAll();
                OnRecreateServLinesOnAfterTempServLineDeleteAll(Rec);
            end;
        end else
            Error('');
    end;

    local procedure StoreServiceCommentLineToTemp(var TempServiceCommentLine: Record "Service Comment Line" temporary)
    var
        ServiceCommentLine: Record "Service Comment Line";
    begin
        ServiceCommentLine.SetRange("Table Name", ServiceCommentLine."Table Name"::"Service Header");
        ServiceCommentLine.SetRange("Table Subtype", "Document Type");
        ServiceCommentLine.SetRange("No.", "No.");
        ServiceCommentLine.SetRange(Type, ServiceCommentLine.Type::General);
        if ServiceCommentLine.FindSet() then
            repeat
                TempServiceCommentLine := ServiceCommentLine;
                TempServiceCommentLine.Insert();
            until ServiceCommentLine.Next() = 0;
    end;

    local procedure RestoreServiceCommentLine(var TempServiceCommentLine: Record "Service Comment Line" temporary; OldDocumentLineNo: Integer; NewDocumentLineNo: Integer)
    var
        ServiceCommentLine: Record "Service Comment Line";
    begin
        TempServiceCommentLine.SetRange("Table Name", TempServiceCommentLine."Table Name"::"Service Header");
        TempServiceCommentLine.SetRange("Table Subtype", "Document Type");
        TempServiceCommentLine.SetRange("No.", "No.");
        TempServiceCommentLine.SetRange("Table Line No.", OldDocumentLineNo);
        if TempServiceCommentLine.FindSet() then
            repeat
                ServiceCommentLine := TempServiceCommentLine;
                ServiceCommentLine."Table Line No." := NewDocumentLineNo;
                ServiceCommentLine.Insert();
            until TempServiceCommentLine.Next() = 0;
    end;

    procedure ConfirmCurrencyFactorUpdate()
    var
        ConfirmManagement: Codeunit "Confirm Management";
        Confirmed: Boolean;
    begin
        if HideValidationDialog then
            Confirmed := true
        else
            Confirmed := ConfirmManagement.GetResponseOrDefault(Text015, true);

        if Confirmed then
            Validate("Currency Factor")
        else
            "Currency Factor" := xRec."Currency Factor";
    end;

    /// <summary>
    /// Propagates changes for specific fields provided by 'ChangedFieldNo' to service lines related to current service header.
    /// </summary>
    /// <param name="ChangedFieldNo">Indicates the number of fields which invoked the validation. </param>
    /// <param name="AskQuestion">Indicates if confirmation dialog should appear. </param>
    procedure UpdateServLinesByFieldNo(ChangedFieldNo: Integer; AskQuestion: Boolean)
    var
        "Field": Record "Field";
        ConfirmManagement: Codeunit "Confirm Management";
        Question: Text[250];
        IsHandled: Boolean;
    begin
        Field.Get(DATABASE::"Service Header", ChangedFieldNo);

        IsHandled := false;
        OnBeforeUpdateServLinesByFieldNoOnBeforeAskQst(Rec, AskQuestion, ChangedFieldNo, IsHandled);
        if not IsHandled then
            if ServLineExists() and AskQuestion then begin
                Question := StrSubstNo(
                    Text016,
                    Field."Field Caption");
                if not ConfirmManagement.GetResponseOrDefault(Question, true) then
                    exit
            end;

        if ServLineExists() then begin
            ServLine.LockTable();
            ServLine.Reset();
            ServLine.SetRange("Document Type", "Document Type");
            ServLine.SetRange("Document No.", "No.");

            ServLine.SetRange("Quantity Shipped", 0);
            ServLine.SetRange("Quantity Invoiced", 0);
            ServLine.SetRange("Quantity Consumed", 0);
            ServLine.SetRange("Shipment No.", '');
            OnUpdateServLinesByFieldNoOnAfterServLineSetFilters(ServLine, Rec, xRec, ChangedFieldNo);

            if ServLine.Find('-') then
                repeat
                    case ChangedFieldNo of
                        FieldNo("Currency Factor"):
                            if (ServLine."Posting Date" = "Posting Date") and (ServLine.Type <> ServLine.Type::" ") then begin
                                ServLine.Validate("Unit Price");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Posting Date"):
                            begin
                                ServLine.Validate("Posting Date", "Posting Date");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Responsibility Center"):
                            begin
                                ServLine.Validate("Responsibility Center", "Responsibility Center");
                                ServLine.Modify(true);
                                ServItemLine.Reset();
                                ServItemLine.SetRange("Document Type", "Document Type");
                                ServItemLine.SetRange("Document No.", "No.");
                                if ServItemLine.Find('-') then
                                    repeat
                                        ServItemLine.Validate("Responsibility Center", "Responsibility Center");
                                        ServItemLine.Modify(true);
                                    until ServItemLine.Next() = 0;
                            end;
                        FieldNo("Order Date"):
                            begin
                                ServLine."Order Date" := "Order Date";
                                ServLine.Modify(true);
                            end;
                        FieldNo("Transaction Type"):
                            begin
                                ServLine.Validate("Transaction Type", "Transaction Type");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Transport Method"):
                            begin
                                ServLine.Validate("Transport Method", "Transport Method");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Exit Point"):
                            begin
                                ServLine.Validate("Exit Point", "Exit Point");
                                ServLine.Modify(true);
                            end;
                        FieldNo(Area):
                            begin
                                ServLine.Validate(Area, Area);
                                ServLine.Modify(true);
                            end;
                        FieldNo("Transaction Specification"):
                            begin
                                ServLine.Validate("Transaction Specification", "Transaction Specification");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Shipping Agent Code"):
                            begin
                                ServLine.Validate("Shipping Agent Code", "Shipping Agent Code");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Shipping Time"):
                            begin
                                ServLine.Validate("Shipping Time", "Shipping Time");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Shipping Agent Service Code"):
                            begin
                                if ServLine."Shipping Agent Code" <> "Shipping Agent Code" then
                                    ServLine.Validate("Shipping Agent Code", "Shipping Agent Code");
                                ServLine.Validate("Shipping Agent Service Code", "Shipping Agent Service Code");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Customer No."):
                            begin
                                ServLine.Validate("Customer No.");
                                ServLine.Modify(true);
                            end;
                        FieldNo("Tax Liable"):
                            if ServLine."No." <> '' then
                                ServLine.Validate("Tax Liable", "Tax Liable");
                        else
                            OnUpdateServLineByChangedFieldName(Rec, ServLine, Field."Field Caption", ChangedFieldNo);
                    end;
                until ServLine.Next() = 0;
        end;

        OnAfterUpdateServLinesByFieldNo(Rec, ServLine, ChangedFieldNo);
    end;

    /// <summary>
    /// Verify if all necessary fields are populated for provided service lines based on service management setup.
    /// </summary>
    /// <param name="PassedServLine">Provided service lines. </param>
    ///<remarks>If 'PassedServLine' is empty, service lines will be filter to the current service header. </remarks>
    procedure TestMandatoryFields(var PassedServLine: Record "Service Line")
    var
        IsHandled: Boolean;
    begin
        OnBeforeTestMandatoryFields(Rec, PassedServLine);

        GetServiceMgtSetup();
        CheckMandSalesPersonOrderData(ServiceMgtSetup);
        PassedServLine.Reset();
        ServLine.Reset();
        ServLine.SetRange("Document Type", "Document Type");
        ServLine.SetRange("Document No.", "No.");

        IsHandled := false;
        OnTestMandatoryFieldsOnBeforePassedServLineFind(Rec, ServLine, PassedServLine, IsHandled);
        if IsHandled then
            exit;

        if PassedServLine.Find('-') then
            repeat
                if (PassedServLine."Qty. to Ship" <> 0) or
                   (PassedServLine."Qty. to Invoice" <> 0) or
                   (PassedServLine."Qty. to Consume" <> 0)
                then begin
                    if ("Document Type" = "Document Type"::Order) and
                       "Link Service to Service Item" and
                       (PassedServLine.Type in [PassedServLine.Type::Item, PassedServLine.Type::Resource])
                    then
                        PassedServLine.TestField("Service Item Line No.", ErrorInfo.Create());

                    case PassedServLine.Type of
                        PassedServLine.Type::Item:
                            if ServiceMgtSetup."Unit of Measure Mandatory" then
                                PassedServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                        PassedServLine.Type::Resource:
                            begin
                                if ServiceMgtSetup."Work Type Code Mandatory" then
                                    PassedServLine.TestField("Work Type Code", ErrorInfo.Create());
                                if ServiceMgtSetup."Unit of Measure Mandatory" then
                                    PassedServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                            end;
                        PassedServLine.Type::Cost:
                            if ServiceMgtSetup."Unit of Measure Mandatory" then
                                PassedServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                    end;

                    if PassedServLine."Job No." <> '' then
                        PassedServLine.TestField("Qty. to Consume", PassedServLine."Qty. to Ship", ErrorInfo.Create());
                end;
            until PassedServLine.Next() = 0
        else
            if ServLine.Find('-') then
                repeat
                    if (ServLine."Qty. to Ship" <> 0) or
                       (ServLine."Qty. to Invoice" <> 0) or
                       (ServLine."Qty. to Consume" <> 0)
                    then begin
                        if ("Document Type" = "Document Type"::Order) and
                           "Link Service to Service Item" and
                           (ServLine.Type in [ServLine.Type::Item, ServLine.Type::Resource])
                        then
                            ServLine.TestField("Service Item Line No.", ErrorInfo.Create());

                        case ServLine.Type of
                            ServLine.Type::Item:
                                if ServiceMgtSetup."Unit of Measure Mandatory" then
                                    ServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                            ServLine.Type::Resource:
                                begin
                                    if ServiceMgtSetup."Work Type Code Mandatory" then
                                        ServLine.TestField("Work Type Code", ErrorInfo.Create());
                                    if ServiceMgtSetup."Unit of Measure Mandatory" then
                                        ServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                                end;
                            ServLine.Type::Cost:
                                if ServiceMgtSetup."Unit of Measure Mandatory" then
                                    ServLine.TestField("Unit of Measure Code", ErrorInfo.Create());
                        end;

                        if ServLine."Job No." <> '' then
                            ServLine.TestField("Qty. to Consume", ServLine."Qty. to Ship", ErrorInfo.Create());
                    end;
                until ServLine.Next() = 0;
    end;

    /// <summary>
    /// Updates values of 'Response Date' and 'Response Time' based on related service item line.
    /// </summary>
    procedure UpdateResponseDateTime()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateResponseDateTime(Rec, CurrFieldNo, IsHandled);
        if IsHandled then
            exit;

        ServItemLine.Reset();
        ServItemLine.SetCurrentKey("Document Type", "Document No.", "Response Date");
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        if ServItemLine.Find('-') then begin
            "Response Date" := ServItemLine."Response Date";
            "Response Time" := ServItemLine."Response Time";
            Modify(true);
        end;
    end;

    local procedure UpdateStartingDateTime()
    begin
        OnBeforeUpdateStartingDateTime(Rec, ValidatingFromLines, ServiceMgtSetup);
        if ValidatingFromLines then
            exit;
        ServItemLine.Reset();
        ServItemLine.SetCurrentKey("Document Type", "Document No.", "Starting Date");
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        ServItemLine.SetFilter("Starting Date", '<>%1', 0D);
        if ServItemLine.Find('-') then begin
            "Starting Date" := ServItemLine."Starting Date";
            "Starting Time" := ServItemLine."Starting Time";
            Modify(true);
        end else begin
            "Starting Date" := 0D;
            "Starting Time" := 0T;
        end;
    end;

    local procedure UpdateFinishingDateTime()
    begin
        OnBeforeUpdateFinishingDateTime(Rec, ValidatingFromLines, ServiceMgtSetup);
        if ValidatingFromLines then
            exit;
        ServItemLine.Reset();
        ServItemLine.SetCurrentKey("Document Type", "Document No.", "Finishing Date");
        ServItemLine.Ascending := false;
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        ServItemLine.SetFilter("Finishing Date", '<>%1', 0D);
        if ServItemLine.Find('-') then begin
            "Finishing Date" := ServItemLine."Finishing Date";
            "Finishing Time" := ServItemLine."Finishing Time";
            Modify(true);
        end else begin
            "Finishing Date" := 0D;
            "Finishing Time" := 0T;
        end;
    end;

    local procedure PriceMsgIfServLinesExist(ChangedFieldName: Text[100])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePriceMsgIfServLinesExist(Rec, ChangedFieldName, IsHandled);
        if IsHandled then
            exit;

        if ServLineExists() then
            Message(
              Text019,
              ChangedFieldName);
    end;

    /// <summary>
    /// Checks if service item line exists for current service header record.
    /// </summary>
    /// <returns>Returns 'true' if service item line exists, otherwise 'false'. </returns>
    procedure ServItemLineExists(): Boolean
    var
        ServItemLine: Record "Service Item Line";
    begin
        ServItemLine.Reset();
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        exit(not ServItemLine.IsEmpty);
    end;

    /// <summary>
    /// Checks if service line exists for current service header record.
    /// </summary>
    /// <returns>Returns 'true' if service line exists, otherwise 'false'. </returns>
    procedure ServLineExists(): Boolean
    begin
        ServLine.Reset();
        ServLine.SetRange("Document Type", "Document Type");
        ServLine.SetRange("Document No.", "No.");
        exit(not ServLine.IsEmpty);
    end;

    procedure MessageIfServLinesExist(ChangedFieldName: Text[100])
    begin
        if ServLineExists() and not HideValidationDialog then
            Message(
              Text021,
              ChangedFieldName, TableCaption);
    end;

    local procedure ValidateServPriceGrOnServItem()
    begin
        ServItemLine.Reset();
        ServItemLine.SetRange("Document Type", "Document Type");
        ServItemLine.SetRange("Document No.", "No.");
        OnValidateServPriceGrOnServItemOnAfterServItemLineSetFilters(Rec, ServItemLine);
        if ServItemLine.Find('-') then begin
            ServItemLine.SetServHeader(Rec);
            repeat
                if ServItemLine."Service Price Group Code" <> '' then begin
                    ServItemLine.Validate("Service Price Group Code");
                    ServItemLine.Modify();
                end;
            until ServItemLine.Next() = 0
        end;
    end;

    /// <summary>
    /// Sets value to the global 'HideValidationDialog' which indicates if messages or confirmation dialogs should be shown.
    /// </summary>
    /// <param name="NewHideValidationDialog">New boolean value for 'HideValidationDialog'. </param>
    /// <remarks>If set to 'true' no message or confirmation dialog will be shown. </remarks>
    procedure SetHideValidationDialog(NewHideValidationDialog: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetHideValidationDialog(Rec, HideValidationDialog, NewHideValidationDialog, IsHandled);
        if not IsHandled then
            HideValidationDialog := NewHideValidationDialog;
    end;

    /// <summary>
    /// Indicates if of values 'Sarting Date', 'Starting Time', 'Finishing Date' and 'Finishing Time' will be taken from related service item line for current service header.
    /// Also it controls if field 'Fault Reason Code' should be populated on related service item lines.
    /// </summary>
    /// <param name="NewValidatingFromLines">New value for 'ValidatingFromLines'. </param>
    ///<remarks>If 'true' transfer won't be done. </remarks>
    procedure SetValidatingFromLines(NewValidatingFromLines: Boolean)
    begin
        ValidatingFromLines := NewValidatingFromLines;
        OnAfterSetValidatingFromLines(Rec, ValidatingFromLines);
    end;

    /// <summary>
    /// Test if a setup for services number series is defined in the service management setup record, also if a corresponding general journal template setup exist.
    /// </summary>
    procedure TestNoSeries()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeTestNoSeries(Rec, IsHandled);
        if IsHandled then
            exit;

        GeneralLedgerSetup.GetRecordOnce();
        if not GeneralLedgerSetup."Journal Templ. Name Mandatory" then
            case "Document Type" of
                "Document Type"::Quote:
                    ServiceMgtSetup.TestField("Service Quote Nos.");
                "Document Type"::Order:
                    ServiceMgtSetup.TestField("Service Order Nos.");
            end
        else begin
            case "Document Type" of
                "Document Type"::Quote:
                    ServiceMgtSetup.TestField("Service Quote Nos.");
                "Document Type"::Order:
                    ServiceMgtSetup.TestField("Service Order Nos.");
            end;
            if "Document Type" <> "Document Type"::"Credit Memo" then begin
                ServiceMgtSetup.TestField("Serv. Inv. Template Name");
                if "Journal Templ. Name" = '' then
                    GenJournalTemplate.Get(ServiceMgtSetup."Serv. Inv. Template Name")
                else
                    GenJournalTemplate.Get("Journal Templ. Name");
            end else begin
                ServiceMgtSetup.TestField("Serv. Cr. Memo Templ. Name");
                if "Journal Templ. Name" = '' then
                    GenJournalTemplate.Get(ServiceMgtSetup."Serv. Cr. Memo Templ. Name")
                else
                    GenJournalTemplate.Get("Journal Templ. Name");
            end;
            GenJournalTemplate.TestField("Posting No. Series");
            GlobalNoSeries.Get(GenJournalTemplate."Posting No. Series");
            GlobalNoSeries.TestField("Default Nos.", true);
        end;
    end;

    /// <summary>
    /// Gets a number series code for the current service header record based on 'Document Type'.
    /// </summary>
    /// <returns>Returns found number series code. </returns>
    procedure GetNoSeriesCode() NoSeriesCode: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetNoSeries(Rec, NoSeriesCode, IsHandled);
        if IsHandled then
            exit(NoSeriesCode);

        case "Document Type" of
            "Document Type"::Quote:
                exit(ServiceMgtSetup."Service Quote Nos.");
            "Document Type"::Order:
                exit(ServiceMgtSetup."Service Order Nos.");
            "Document Type"::Invoice:
                exit(ServiceMgtSetup."Service Invoice Nos.");
            "Document Type"::"Credit Memo":
                exit(ServiceMgtSetup."Service Credit Memo Nos.");
        end;

        OnAfterGetNoSeriesCode(Rec, ServiceMgtSetup, NoSeriesCode);
    end;

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

        case "Document Type" of
            "Document Type"::Quote:
                NoSeries.TestManual(ServiceMgtSetup."Service Quote Nos.");
            "Document Type"::Order:
                NoSeries.TestManual(ServiceMgtSetup."Service Order Nos.");
            "Document Type"::Invoice:
                NoSeries.TestManual(ServiceMgtSetup."Service Invoice Nos.");
            "Document Type"::"Credit Memo":
                NoSeries.TestManual(ServiceMgtSetup."Service Credit Memo Nos.");
        end;
    end;

    local procedure UpdateCont(CustomerNo: Code[20])
    var
        ContBusRel: Record "Contact Business Relation";
        Cont: Record Contact;
        Cust: Record Customer;
    begin
        if Cust.Get(CustomerNo) then begin
            Clear(ServOrderMgt);
            ContactNo := ServOrderMgt.FindContactInformation(Cust."No.");
            if Cont.Get(ContactNo) then begin
                "Contact No." := Cont."No.";
                "Contact Name" := Cont.Name;
                "Phone No." := Cont."Phone No.";
                "Fax No." := Cont."Fax No.";
                "E-Mail" := Cont."E-Mail";
            end else begin
                if Cust."Primary Contact No." <> '' then
                    "Contact No." := Cust."Primary Contact No."
                else
                    if ContBusRel.FindByRelation(ContBusRel."Link to Table"::Customer, "Customer No.") then
                        "Contact No." := ContBusRel."Contact No."
                    else
                        "Contact No." := '';
                "Contact Name" := Cust.Contact;
            end;
        end;
        OnAfterUpdateCont(Rec, Cust, Cont);
    end;

    local procedure UpdateBillToCont(CustomerNo: Code[20])
    var
        ContBusRel: Record "Contact Business Relation";
        Cont: Record Contact;
        Cust: Record Customer;
    begin
        if Cust.Get(CustomerNo) then begin
            Clear(ServOrderMgt);
            ContactNo := ServOrderMgt.FindContactInformation("Bill-to Customer No.");
            if Cont.Get(ContactNo) then begin
                "Bill-to Contact No." := Cont."No.";
                "Bill-to Contact" := Cont.Name;
            end else begin
                if Cust."Primary Contact No." <> '' then
                    "Bill-to Contact No." := Cust."Primary Contact No."
                else
                    if ContBusRel.FindByRelation(ContBusRel."Link to Table"::Customer, "Bill-to Customer No.") then
                        "Bill-to Contact No." := ContBusRel."Contact No."
                    else
                        "Bill-to Contact No." := '';
                "Bill-to Contact" := Cust.Contact;
            end;
        end;

        OnAfterUpdateBillToCont(Rec, Cust, Cont);
    end;

    local procedure UpdateCust(ContactNo: Code[20])
    var
        ContBusinessRelation: Record "Contact Business Relation";
        Cust: Record Customer;
        Cont: Record Contact;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateCust(ContactNo, IsHandled);
        if IsHandled then
            exit;

        if Cont.Get(ContactNo) then begin
            "Contact No." := Cont."No.";
            "Phone No." := Cont."Phone No.";
            "E-Mail" := Cont."E-Mail";
        end else begin
            "Phone No." := '';
            "Fax No." := '';
            "E-Mail" := '';
            "Contact Name" := '';
            exit;
        end;

        if Cont.Type = Cont.Type::Person then
            "Contact Name" := Cont.Name
        else
            if Cust.Get("Customer No.") then
                "Contact Name" := Cust.Contact
            else
                "Contact Name" := '';

        if ContBusinessRelation.FindByContact(ContBusinessRelation."Link to Table"::Customer, Cont."Company No.") then begin
            if ("Customer No." <> '') and
               ("Customer No." <> ContBusinessRelation."No.")
            then
                Error(Text037, Cont."No.", Cont.Name, "Customer No.");

            if "Customer No." = '' then begin
                SkipContact := true;
                Validate("Customer No.", ContBusinessRelation."No.");
                SkipContact := false;
            end;
        end else
            Error(Text039, Cont."No.", Cont.Name);

        if ("Customer No." = "Bill-to Customer No.") or
           ("Bill-to Customer No." = '')
        then
            Validate("Bill-to Contact No.", "Contact No.");

        OnAfterUpdateCust(Rec);
    end;

    local procedure UpdateBillToCust(ContactNo: Code[20])
    var
        ContBusinessRelation: Record "Contact Business Relation";
        Cust: Record Customer;
        Cont: Record Contact;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateBillToCust(Rec, ContactNo, IsHandled);
        if IsHandled then
            exit;

        if Cont.Get(ContactNo) then begin
            "Bill-to Contact No." := Cont."No.";
            if Cont.Type = Cont.Type::Person then
                "Bill-to Contact" := Cont.Name
            else
                if Cust.Get("Bill-to Customer No.") then
                    "Bill-to Contact" := Cust.Contact
                else
                    "Bill-to Contact" := '';
            OnUpdateBillToCustOnAfterUpdateBillToContact(Rec, Cust, Cont);
        end else begin
            "Bill-to Contact" := '';
            exit;
        end;

        if ContBusinessRelation.FindByContact(ContBusinessRelation."Link to Table"::Customer, Cont."Company No.") then begin
            if "Bill-to Customer No." = '' then begin
                SkipBillToContact := true;
                Validate("Bill-to Customer No.", ContBusinessRelation."No.");
                SkipBillToContact := false;
            end else
                if "Bill-to Customer No." <> ContBusinessRelation."No." then
                    Error(Text037, Cont."No.", Cont.Name, "Bill-to Customer No.");
        end else
            Error(Text039, Cont."No.", Cont.Name);
    end;

    procedure CheckCreditMaxBeforeInsert(HideCreditCheckDialogue: Boolean)
    var
        ServHeader: Record "Service Header";
        ContBusinessRelation: Record "Contact Business Relation";
        Cont: Record Contact;
        ServCheckCreditLimit: Codeunit "Serv. Check Credit Limit";
        IsHandled: Boolean;
    begin
        if HideCreditCheckDialogue then
            exit;

        IsHandled := false;
        OnBeforeCheckCreditMaxBeforeInsert(Rec, IsHandled);
        if not IsHandled then
            if GetFilter("Customer No.") <> '' then begin
                if GetRangeMin("Customer No.") = GetRangeMax("Customer No.") then begin
                    ServHeader."Bill-to Customer No." := GetRangeMin("Customer No.");
                    ServCheckCreditLimit.ServiceHeaderCheck(ServHeader);
                end
            end else
                if GetFilter("Contact No.") <> '' then
                    if GetRangeMin("Contact No.") = GetRangeMax("Contact No.") then begin
                        Cont.Get(GetRangeMin("Contact No."));
                        if ContBusinessRelation.FindByContact(ContBusinessRelation."Link to Table"::Customer, Cont."Company No.") then begin
                            ServHeader."Bill-to Customer No." := ContBusinessRelation."No.";
                            ServCheckCreditLimit.ServiceHeaderCheck(ServHeader);
                        end;
                    end;
    end;

    /// <summary>
    /// Updates service order change log based on changes done to the current service header record.
    /// </summary>
    /// <param name="OldServHeader">Source service header record. </param>
    procedure UpdateServiceOrderChangeLog(var OldServHeader: Record "Service Header")
    begin
        if Status <> OldServHeader.Status then
            ServLogMgt.ServHeaderStatusChange(Rec, OldServHeader);

        if "Customer No." <> OldServHeader."Customer No." then
            ServLogMgt.ServHeaderCustomerChange(Rec, OldServHeader);

        if "Ship-to Code" <> OldServHeader."Ship-to Code" then
            ServLogMgt.ServHeaderShiptoChange(Rec, OldServHeader);

        if "Contract No." <> OldServHeader."Contract No." then
            ServLogMgt.ServHeaderContractNoChanged(Rec, OldServHeader);

        OnAfterUpdateServiceOrderChangeLog(Rec, OldServHeader);
    end;

    local procedure GetPostingNoSeriesCode() PostingNos: Code[20]
    var
        IsHandled: Boolean;
    begin
        GetServiceMgtSetup();
        IsHandled := false;
        OnBeforeGetPostingNoSeriesCode(Rec, ServiceMgtSetup, PostingNos, IsHandled);
        if IsHandled then
            exit;

        GeneralLedgerSetup.GetRecordOnce();
        if GeneralLedgerSetup."Journal Templ. Name Mandatory" then begin
            GenJournalTemplate.Get("Journal Templ. Name");
            PostingNos := GenJournalTemplate."Posting No. Series";
        end else
            if "Document Type" in ["Document Type"::"Credit Memo"] then
                PostingNos := ServiceMgtSetup."Posted Serv. Credit Memo Nos."
            else
                PostingNos := ServiceMgtSetup."Posted Service Invoice Nos.";

        OnAfterGetPostingNoSeriesCode(Rec, PostingNos);
    end;

    local procedure CheckDocumentTypeAlreadyUsed()
    var
        ServiceShipmentHeader: Record "Service Shipment Header";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckDocumentTypeAlreadyUsed(Rec, ServiceShipmentHeader, IsHandled);
        if IsHandled then
            exit;

        if "Document Type" = "Document Type"::Order then begin
            ServiceShipmentHeader.SetRange("Order No.", "No.");
            if not ServiceShipmentHeader.IsEmpty() then
                Error(Text008, Format("Document Type"), FieldCaption("No."), "No.");
        end;
    end;

    /// <summary>
    /// Initialize values for the new service header record.
    /// </summary>
    procedure InitInsert()
    var
        IsHandled: Boolean;
    begin
        GetServiceMgtSetup();

        IsHandled := false;
        OnInitInsertOnBeforeInitSeries(Rec, xRec, IsHandled);
        if not IsHandled then
            if "No." = '' then begin
                TestNoSeries();
                "No. Series" := GetNoSeriesCode();
                if NoSeries.AreRelated("No. Series", xRec."No. Series") then
                    "No. Series" := xRec."No. Series";
                "No." := NoSeries.GetNextNo("No. Series", "Posting Date");
            end;

        CheckDocumentTypeAlreadyUsed();
        OnInsertOnBeforeInitRecord(Rec, xRec);
        InitRecord();
    end;

    /// <summary>
    /// Initialize values for the new service header record.
    /// </summary>
    procedure InitRecord()
    var
        ServiceDocumentArchiveMgmt: Codeunit "Service Document Archive Mgmt.";
    begin
        GetServiceMgtSetup();
        GeneralLedgerSetup.GetRecordOnce();
        SetDefaultNoSeries();

        if "Document Type" in ["Document Type"::Order, "Document Type"::Invoice, "Document Type"::Quote] then begin
            "Order Date" := WorkDate();
            "Order Time" := Time;
        end;

        InitPostingDate();

        "Default Response Time (Hours)" := ServiceMgtSetup."Default Response Time (Hours)";
        "Link Service to Service Item" := ServiceMgtSetup."Link Service to Service Item";

        InitVATDate();

        if Cust.Get("Customer No.") then
            Validate("Location Code", UserSetupMgt.GetLocation(2, Cust."Location Code", "Responsibility Center"));
        OnInitRecordOnAfterValidateLocationCode(Rec, xRec);

        if "Document Type" in ["Document Type"::"Credit Memo"] then begin
            GeneralLedgerSetup.GetRecordOnce();
            Correction := GeneralLedgerSetup."Mark Cr. Memos as Corrections";
        end;

        "Posting Description" := Format("Document Type") + ' ' + "No.";

        Reserve := Reserve::Optional;

        SetResponsibilityCenter();

        "Doc. No. Occurrence" := ServiceDocumentArchiveMgmt.GetNextOccurrenceNo(DATABASE::"Service Header", Rec."Document Type", Rec."No.");

        OnAfterInitRecord(Rec);
    end;

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

        if Cust.Get("Customer No.") then
            if Cust."Responsibility Center" <> '' then
                "Responsibility Center" := UserSetupMgt.GetRespCenter(2, Cust."Responsibility Center")
            else
                "Responsibility Center" := UserSetupMgt.GetRespCenter(2, "Responsibility Center")
        else
            "Responsibility Center" := UserSetupMgt.GetServiceFilter();
    end;

    local procedure InitPostingDate()
    begin
        if "Posting Date" = 0D then
            "Posting Date" := WorkDate();

        if "Document Date" = 0D then
            "Document Date" := WorkDate();

        OnAfterInitPostingDate(Rec);
    end;

    local procedure InitVATDate()
    begin
        "VAT Reporting Date" := GeneralLedgerSetup.GetVATDate("Posting Date", "Document Date");
    end;

    local procedure SetDefaultNoSeries()
    var
        PostingNoSeries: Code[20];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetDefaultNoSeries(Rec, xRec, IsHandled);
        if not IsHandled then begin
            GeneralLedgerSetup.GetRecordOnce();
            if GeneralLedgerSetup."Journal templ. Name Mandatory" then begin
                if "Journal Templ. Name" = '' then begin
                    if not IsCreditDocType() then
                        GenJournalTemplate.Get(ServiceMgtSetup."Serv. Inv. Template Name")
                    else
                        GenJournalTemplate.Get(ServiceMgtSetup."Serv. Cr. Memo Templ. Name");
                    "Journal Templ. Name" := GenJournalTemplate.Name;
                end else
                    GenJournalTemplate.Get("Journal Templ. Name");
                PostingNoSeries := GenJournalTemplate."Posting No. Series";
            end else
                if IsCreditDocType() then
                    PostingNoSeries := ServiceMgtSetup."Posted Serv. Credit Memo Nos."
                else
                    PostingNoSeries := ServiceMgtSetup."Posted Service Invoice Nos.";

            case "Document Type" of
                "Document Type"::Quote, "Document Type"::Order:
                    begin
                        if NoSeries.IsAutomatic(PostingNoSeries) then
                            "Posting No. Series" := PostingNoSeries;
                        if NoSeries.IsAutomatic(ServiceMgtSetup."Posted Service Shipment Nos.") then
                            "Shipping No. Series" := ServiceMgtSetup."Posted Service Shipment Nos.";
                    end;
                "Document Type"::Invoice:
                    begin
                        if ("No. Series" <> '') and (ServiceMgtSetup."Service Invoice Nos." = PostingNoSeries) then
                            "Posting No. Series" := "No. Series"
                        else
                            if NoSeries.IsAutomatic(PostingNoSeries) then
                                "Posting No. Series" := PostingNoSeries;
                        if ServiceMgtSetup."Shipment on Invoice" then
                            if NoSeries.IsAutomatic(ServiceMgtSetup."Posted Service Shipment Nos.") then
                                "Shipping No. Series" := ServiceMgtSetup."Posted Service Shipment Nos.";
                    end;
                "Document Type"::"Credit Memo":
                    if ("No. Series" <> '') and (ServiceMgtSetup."Service Credit Memo Nos." = PostingNoSeries) then
                        "Posting No. Series" := "No. Series"
                    else
                        if NoSeries.IsAutomatic(PostingNoSeries) then
                            "Posting No. Series" := PostingNoSeries;
            end;
        end;

        OnAfterSetDefaultNoSeries(Rec);
    end;

    local procedure InitRecordFromContact()
    begin
        Init();
        GetServiceMgtSetup();
        InitRecord();
        OnInitRecordFromContactOnAfterInitRecord(Rec, xRec);
        "No. Series" := xRec."No. Series";
        if xRec."Shipping No." <> '' then begin
            "Shipping No. Series" := xRec."Shipping No. Series";
            "Shipping No." := xRec."Shipping No.";
        end;
        if xRec."Posting No." <> '' then begin
            "Posting No. Series" := xRec."Posting No. Series";
            "Posting No." := xRec."Posting No.";
        end;
    end;

    local procedure GetCust(CustNo: Code[20])
    begin
        if not (("Document Type" = "Document Type"::Quote) and (CustNo = '')) then begin
            if CustNo <> Cust."No." then
                Cust.Get(CustNo);
        end else
            Clear(Cust);
    end;

    procedure SendToPost(CodeunitId: Integer) IsSuccess: Boolean
    var
        TempServLine: Record "Service Line" temporary;
    begin
        exit(SendToPostWithLines(CodeunitId, TempServLine));
    end;

    procedure SendToPostWithLines(CodeunitId: Integer; var TempServLine: Record "Service Line" temporary) IsSuccess: Boolean
    var
        ErrorContextElement: Codeunit "Error Context Element";
        ErrorMessageMgt: Codeunit "Error Message Management";
        ErrorMessageHandler: Codeunit "Error Message Handler";
        ServPostYesNo: Codeunit "Service-Post (Yes/No)";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSendToPostWithLines(Rec, TempServLine, CodeunitId, IsHandled, IsSuccess);
        if IsHandled then
            exit(IsSuccess);

        Commit();
        ErrorMessageMgt.Activate(ErrorMessageHandler);
        ErrorMessageMgt.PushContext(ErrorContextElement, RecordId, 0, '');
        if CodeunitId = Codeunit::"Service-Post (Yes/No)" then begin
            ServPostYesNo.SetGlobalServiceHeader(Rec);
            IsSuccess := ServPostYesNo.Run(TempServLine);
            ServPostYesNo.GetGlobalServiceHeader(Rec);
        end else
            IsSuccess := Codeunit.Run(CodeunitId, Rec);

        if not IsSuccess then
            ErrorMessageHandler.ShowErrors();
    end;

    local procedure ShippedServLinesExist(): Boolean
    begin
        ServLine.Reset();
        ServLine.SetRange("Document Type", "Document Type");
        ServLine.SetRange("Document No.", "No.");
        ServLine.SetFilter("Quantity Shipped", '<>0');
        exit(ServLine.Find('-'));
    end;

    local procedure UpdateShipToAddress()
    var
        Location: Record Location;
        CompanyInfo: Record "Company Information";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateShipToAddress(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Document Type" = "Document Type"::"Credit Memo" then begin
            if "Location Code" <> '' then begin
                Location.Get("Location Code");
                SetShipToAddress(
                  Location.Name, Location."Name 2", Location.Address, Location."Address 2",
                  Location.City, Location."Post Code", Location.County, Location."Country/Region Code");
                "Ship-to Phone" := Location."Phone No.";
                "Ship-to Contact" := Location.Contact;
            end else begin
                CompanyInfo.Get();
                "Ship-to Code" := '';
                SetShipToAddress(
                  CompanyInfo."Ship-to Name", CompanyInfo."Ship-to Name 2", CompanyInfo."Ship-to Address", CompanyInfo."Ship-to Address 2",
                  CompanyInfo."Ship-to City", CompanyInfo."Ship-to Post Code", CompanyInfo."Ship-to County",
                  CompanyInfo."Ship-to Country/Region Code");
                "Ship-to Phone" := CompanyInfo."Ship-to Phone No.";
                "Ship-to Contact" := CompanyInfo."Ship-to Contact";
            end;
            "VAT Country/Region Code" := "Country/Region Code";
        end;

        OnAfterUpdateShipToAddress(Rec);
    end;

    /// <summary>
    /// Sets shipment information from provided parameters for the current service header record.
    /// </summary>
    /// <param name="ShipToName">Provided name information. </param>
    /// <param name="ShipToName2">Provided name 2 information. </param>
    /// <param name="ShipToAddress">Provided address information. </param>
    /// <param name="ShipToAddress2">Provided address 2 information. </param>
    /// <param name="ShipToCity">Provided city information. </param>
    /// <param name="ShipToPostCode">Provided post code information. </param>
    /// <param name="ShipToCounty">Provided county information. </param>
    /// <param name="ShipToCountryRegionCode">Provided country/region code information. </param>
    procedure SetShipToAddress(ShipToName: Text[100]; ShipToName2: Text[50]; ShipToAddress: Text[100]; ShipToAddress2: Text[50]; ShipToCity: Text[30]; ShipToPostCode: Code[20]; ShipToCounty: Text[30]; ShipToCountryRegionCode: Code[10])
    begin
        "Ship-to Name" := ShipToName;
        "Ship-to Name 2" := ShipToName2;
        "Ship-to Address" := ShipToAddress;
        "Ship-to Address 2" := ShipToAddress2;
        Validate("Ship-to Country/Region Code", ShipToCountryRegionCode);
        "Ship-to City" := ShipToCity;
        "Ship-to Post Code" := ShipToPostCode;
        "Ship-to County" := ShipToCounty;
    end;

    /// <summary>
    /// Runs confirmation dialog to confirm deletion of related service document record.
    /// </summary>
    /// <returns>Returns 'true' if delete is confirmed, otherwise 'false'. </returns>
    procedure ConfirmDeletion(): Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
    begin
        ServPost.TestDeleteHeader(Rec, ServShptHeader, ServInvHeader, ServCrMemoHeader);
        if ServShptHeader."No." <> '' then
            if not ConfirmManagement.GetResponseOrDefault(
                 StrSubstNo(Text053, ServShptHeader."No."), true)
            then
                exit;
        if ServInvHeader."No." <> '' then
            if not ConfirmManagement.GetResponseOrDefault(
                 StrSubstNo(Text054, ServInvHeader."No."), true)
            then
                exit;
        if ServCrMemoHeader."No." <> '' then
            if not ConfirmManagement.GetResponseOrDefault(
                 StrSubstNo(Text013, ServCrMemoHeader."No."), true)
            then
                exit;
        exit(true);
    end;

    local procedure CopyReservEntryToTemp(OldServLine: Record "Service Line")
    begin
        ReservEntry.Reset();
        ReservEntry.SetSourceFilter(
          DATABASE::"Service Line", OldServLine."Document Type".AsInteger(), OldServLine."Document No.", OldServLine."Line No.", false);
        if ReservEntry.FindSet() then
            repeat
                TempReservEntry := ReservEntry;
                TempReservEntry.Insert();
            until ReservEntry.Next() = 0;
        ReservEntry.DeleteAll();
    end;

    local procedure CopyReservEntryFromTemp(OldServLine: Record "Service Line"; NewSourceRefNo: Integer)
    begin
        TempReservEntry.Reset();
        TempReservEntry.SetSourceFilter(
          DATABASE::"Service Line", OldServLine."Document Type".AsInteger(), OldServLine."Document No.", OldServLine."Line No.", false);
        if TempReservEntry.FindSet() then
            repeat
                ReservEntry := TempReservEntry;
                ReservEntry."Source Ref. No." := NewSourceRefNo;
                if not ReservEntry.Insert() then;
            until TempReservEntry.Next() = 0;
        TempReservEntry.DeleteAll();
    end;

    /// <summary>
    /// Depicts document dimensions for overview. If changes are made, they will be saved to the current record.
    /// </summary>
    procedure ShowDocDim()
    var
        OldDimSetID: Integer;
    begin
        OldDimSetID := "Dimension Set ID";
        "Dimension Set ID" :=
          DimMgt.EditDimensionSet(
            Rec, "Dimension Set ID", StrSubstNo('%1 %2', "Document Type", "No."),
            "Shortcut Dimension 1 Code", "Shortcut Dimension 2 Code");
        OnShowDocDimOnBeforeUpdateAllLineDim(Rec, OldDimSetID, CurrFieldNo);
        if OldDimSetID <> "Dimension Set ID" then begin
            Modify();
            if ServItemLineExists() or ServLineExists() then
                UpdateAllLineDim("Dimension Set ID", OldDimSetID);
        end;
    end;

    procedure LookupAdjmtValueEntries(QtyType: Option General,Invoicing)
    var
        ItemLedgEntry: Record "Item Ledger Entry";
        ServiceLine: Record "Service Line";
        ServiceShptLine: Record "Service Shipment Line";
        TempValueEntry: Record "Value Entry" temporary;
    begin
        ServiceLine.SetRange("Document Type", "Document Type");
        ServiceLine.SetRange("Document No.", "No.");
        TempValueEntry.Reset();
        TempValueEntry.DeleteAll();

        case "Document Type" of
            "Document Type"::Order, "Document Type"::Invoice:
                if ServiceLine.FindSet() then
                    repeat
                        if (ServiceLine.Type = ServiceLine.Type::Item) and (ServiceLine.Quantity <> 0) then
                            if ServiceLine."Shipment No." <> '' then begin
                                ServiceShptLine.SetRange("Document No.", ServiceLine."Shipment No.");
                                ServiceShptLine.SetRange("Line No.", ServiceLine."Shipment Line No.");
                            end else begin
                                ServiceShptLine.SetCurrentKey("Order No.", "Order Line No.");
                                ServiceShptLine.SetRange("Order No.", ServiceLine."Document No.");
                                ServiceShptLine.SetRange("Order Line No.", ServiceLine."Line No.");
                            end;
                        ServiceShptLine.SetRange(Correction, false);
                        if QtyType = QtyType::Invoicing then
                            ServiceShptLine.SetFilter("Qty. Shipped Not Invoiced", '<>0');

                        if ServiceShptLine.FindSet() then
                            repeat
                                ServiceShptLine.FilterPstdDocLnItemLedgEntries(ItemLedgEntry);
                                if ItemLedgEntry.FindSet() then
                                    repeat
                                        CreateTempAdjmtValueEntries(TempValueEntry, ItemLedgEntry."Entry No.");
                                    until ItemLedgEntry.Next() = 0;
                            until ServiceShptLine.Next() = 0;
                    until ServiceLine.Next() = 0;
        end;
        PAGE.RunModal(0, TempValueEntry);
    end;

    local procedure CreateTempAdjmtValueEntries(var TempValueEntry: Record "Value Entry" temporary; ItemLedgEntryNo: Integer)
    var
        ValueEntry: Record "Value Entry";
    begin
        ValueEntry.SetCurrentKey("Item Ledger Entry No.");
        ValueEntry.SetRange("Item Ledger Entry No.", ItemLedgEntryNo);
        if ValueEntry.FindSet() then
            repeat
                if ValueEntry.Adjustment then begin
                    TempValueEntry := ValueEntry;
                    if TempValueEntry.Insert() then;
                end;
            until ValueEntry.Next() = 0;
    end;

#if not CLEAN27
    [Obsolete('Call CalculateIncDiscForHeader on codeunit "Service-Calc. Discount" directly instead', '27.0')]
    procedure CalcInvDiscForHeader()
    var
        ServiceInvDisc: Codeunit "Service-Calc. Discount";
    begin
        ServiceInvDisc.CalculateIncDiscForHeader(Rec);
    end;
#endif
    procedure SetSecurityFilterOnRespCenter()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetSecurityFilterOnRespCenter(Rec, IsHandled);
        if IsHandled then
            exit;

        if UserSetupMgt.GetServiceFilter() <> '' then begin
            FilterGroup(2);
            SetRange("Responsibility Center", UserSetupMgt.GetServiceFilter());
            FilterGroup(0);
        end;
    end;

#if not CLEAN27
    /// <summary>
    /// Runs page service statistic for current service header record.
    /// </summary>
    /// <remarks>Commit will be triggered. </remarks>
    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    procedure OpenStatistics()
    var
        StatPageID: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeOpenStatistics(Rec, IsHandled);
        if IsHandled then
            exit;

        CalcInvDiscForHeader();
        Commit();
        StatPageID := Page::"Service Statistics";
        OnOpenStatisticsOnAfterSetStatPageID(Rec, StatPageID);
        SkipStatsPrep := true;
        Page.RunModal(StatPageID, Rec);
        ResetSkipStatisticsPreparationFlag();
    end;

    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    procedure OpenOrderStatistics()
    var
        ServiceLine: Record "Service Line";
        ServiceLines: Page "Service Lines";
        StatPageID: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeOpenOrderStatistics(Rec, IsHandled);
        if IsHandled then
            exit;

        SalesReceivablesSetup.GetRecordOnce();
        if SalesReceivablesSetup."Calc. Inv. Discount" then begin
            ServiceLine.Reset();
            ServiceLine.SetRange("Document Type", "Document Type");
            ServiceLine.SetRange("Document No.", "No.");
            if ServiceLine.FindFirst() then begin
                ServiceLines.SetTableView(ServiceLine);
                ServiceLines.CalcInvDisc(ServiceLine);
                Commit();
            end;
        end;

        StatPageID := Page::"Service Order Statistics";
        OnOpenOrderStatisticsOnAfterSetStatPageID(Rec, StatPageID);
        SkipStatsPrep := true;
        Page.RunModal(StatPageID, Rec);
        ResetSkipStatisticsPreparationFlag();
    end;

    [Obsolete('The statistics action will be replaced with the SOrderStatistics action. The new action uses RunObject and does not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    procedure SkipStatisticsPreparation(): Boolean
    begin
        exit(SkipStatsPrep)
    end;

    [Obsolete('The statistics action will be replaced with the ServiceOrderStatistics action. The new action uses RunObject and does not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    procedure ResetSkipStatisticsPreparationFlag()
    begin
        SkipStatsPrep := false;
    end;
#endif
    local procedure CheckMandSalesPersonOrderData(ServiceMgtSetup: Record "Service Mgt. Setup")
    begin
        if ServiceMgtSetup."Salesperson Mandatory" then
            TestField("Salesperson Code", ErrorInfo.Create());

        if "Document Type" = "Document Type"::Order then begin
            if ServiceMgtSetup."Service Order Type Mandatory" and ("Service Order Type" = '') then
                Error(
                    ErrorInfo.Create(
                        StrSubstNo(
                            Text018,
                            FieldCaption("Service Order Type"), TableCaption(),
                            FieldCaption("Document Type"), Format("Document Type"),
                            FieldCaption("No."), Format("No.")),
                        true,
                        Rec));
            if ServiceMgtSetup."Service Order Start Mandatory" then begin
                TestField("Starting Date", ErrorInfo.Create());
                TestField("Starting Time", ErrorInfo.Create());
            end;
            if ServiceMgtSetup."Service Order Finish Mandatory" then begin
                TestField("Finishing Date", ErrorInfo.Create());
                TestField("Finishing Time", ErrorInfo.Create());
            end;
            if ServiceMgtSetup."Fault Reason Code Mandatory" and not ValidatingFromLines then begin
                ServItemLine.Reset();
                ServItemLine.SetRange("Document Type", "Document Type");
                ServItemLine.SetRange("Document No.", "No.");
                if ServItemLine.Find('-') then
                    repeat
                        ServItemLine.TestField("Fault Reason Code", ErrorInfo.Create());
                    until ServItemLine.Next() = 0;
            end;
        end;
    end;

    /// <summary>
    /// Sets 'Ship-to' address information from 'ShipToAddr'.
    /// </summary>
    /// <param name="ShipToAddr">Source ship-to address record. </param>
    procedure SetShipToCustomerAddressFieldsFromShipToAddr(ShipToAddr: Record "Ship-to Address")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyShipToCustomerAddressFieldsFromShipToAddr(Rec, ShipToAddr, IsHandled);
        if IsHandled then
            exit;

        SetShipToAddress(
            ShipToAddr.Name, ShipToAddr."Name 2", ShipToAddr.Address, ShipToAddr."Address 2",
            ShipToAddr.City, ShipToAddr."Post Code", ShipToAddr.County, ShipToAddr."Country/Region Code");
        "Ship-to Contact" := ShipToAddr.Contact;
        "Ship-to Phone" := ShipToAddr."Phone No.";
        if ShipToAddr."Location Code" <> '' then
            "Location Code" := ShipToAddr."Location Code";
        "Ship-to Fax No." := ShipToAddr."Fax No.";
        "Ship-to E-Mail" := ShipToAddr."E-Mail";

        Validate("Shipping Agent Code", ShipToAddr."Shipping Agent Code");
        Validate("Shipping Agent Service Code", ShipToAddr."Shipping Agent Service Code");

        if ShipToAddr."Tax Area Code" <> '' then
            "Tax Area Code" := ShipToAddr."Tax Area Code";
        "Tax Liable" := ShipToAddr."Tax Liable";

        OnAfterCopyShipToCustomerAddressFieldsFromShipToAddr(Rec, ShipToAddr);
    end;


    local procedure CopyShipToCustomerAddressFieldsFromCust(var SellToCustomer: Record Customer)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyShipToCustomerAddressFieldsFromCustomer(Rec, SellToCustomer, IsHandled);
        if IsHandled then
            exit;

        SetShipToAddress(
          SellToCustomer.Name, SellToCustomer."Name 2", SellToCustomer.Address, SellToCustomer."Address 2",
          SellToCustomer.City, SellToCustomer."Post Code", SellToCustomer.County, SellToCustomer."Country/Region Code");
        "Ship-to Contact" := SellToCustomer.Contact;
        "Ship-to Phone" := SellToCustomer."Phone No.";
        "Tax Area Code" := SellToCustomer."Tax Area Code";
        "Tax Liable" := SellToCustomer."Tax Liable";
        if SellToCustomer."Location Code" <> '' then
            "Location Code" := SellToCustomer."Location Code";
        "Ship-to Fax No." := SellToCustomer."Fax No.";
        "Ship-to E-Mail" := SellToCustomer."E-Mail";

        Validate("Shipping Agent Code", SellToCustomer."Shipping Agent Code");
        Validate("Shipping Agent Service Code", SellToCustomer."Shipping Agent Service Code");

        OnAfterCopyShipToCustomerAddressFieldsFromCustomer(Rec, SellToCustomer);
    end;

    local procedure CopyAppliestoFieldsFromCustLedgerEntry(CustLedgerEntry: Record "Cust. Ledger Entry")
    begin
        "Applies-to Doc. Type" := CustLedgerEntry."Document Type";
        "Applies-to Doc. No." := CustLedgerEntry."Document No.";

        OnAfterCopyAppliestoFieldsFromCustLedgerEntry(Rec, CustLedgerEntry);
    end;

    procedure WhsePickConflict(DocType: Enum "Service Document Type"; DocNo: Code[20]; ShippingAdvice: Enum "Sales Header Shipping Advice"): Boolean
    var
        WarehouseActivityLine: Record "Warehouse Activity Line";
        ServiceLine: Record "Service Line";
    begin
        if ShippingAdvice <> ShippingAdvice::Complete then
            exit(false);
        WarehouseActivityLine.SetCurrentKey("Source Type", "Source Subtype", "Source No.");
        WarehouseActivityLine.SetRange("Source Type", DATABASE::"Service Line");
        WarehouseActivityLine.SetRange("Source Subtype", DocType);
        WarehouseActivityLine.SetRange("Source No.", DocNo);
        if WarehouseActivityLine.IsEmpty() then
            exit(false);
        ServiceLine.SetRange("Document Type", DocType);
        ServiceLine.SetRange("Document No.", DocNo);
        ServiceLine.SetRange(Type, ServiceLine.Type::Item);
        if ServiceLine.IsEmpty() then
            exit(false);
        exit(true);
    end;

    procedure InvPickConflictResolutionTxt(): Text[500]
    begin
        exit(StrSubstNo(Text062, TableCaption(), FieldCaption("Shipping Advice"), Format("Shipping Advice")));
    end;

    procedure WhseShipmentConflict(DocType: Enum "Service Document Type"; DocNo: Code[20]; ShippingAdvice: Enum "Sales Header Shipping Advice"): Boolean
    var
        WarehouseShipmentLine: Record "Warehouse Shipment Line";
    begin
        if ShippingAdvice <> ShippingAdvice::Complete then
            exit(false);
        WarehouseShipmentLine.SetCurrentKey("Source Type", "Source Subtype", "Source No.", "Source Line No.");
        WarehouseShipmentLine.SetRange("Source Type", DATABASE::"Service Line");
        WarehouseShipmentLine.SetRange("Source Subtype", DocType);
        WarehouseShipmentLine.SetRange("Source No.", DocNo);
        if WarehouseShipmentLine.IsEmpty() then
            exit(false);
        exit(true);
    end;

    procedure WhseShpmtConflictResolutionTxt(): Text[500]
    begin
        exit(StrSubstNo(Text063, TableCaption(), FieldCaption("Shipping Advice"), Format("Shipping Advice")));
    end;

    local procedure GetShippingTime(CalledByFieldNo: Integer)
    var
        ShippingAgentServices: Record "Shipping Agent Services";
    begin
        if (CalledByFieldNo <> CurrFieldNo) and (CurrFieldNo <> 0) then
            exit;

        ShippingAgentServices.SetLoadFields("Shipping Time");
        if ShippingAgentServices.Get("Shipping Agent Code", "Shipping Agent Service Code") then
            "Shipping Time" := ShippingAgentServices."Shipping Time"
        else begin
            GetCust("Customer No.");
            "Shipping Time" := Cust."Shipping Time"
        end;
        if not (CalledByFieldNo in [FieldNo("Shipping Agent Code"), FieldNo("Shipping Agent Service Code")]) then
            Validate("Shipping Time");
    end;

    local procedure CheckHeaderDimension()
    begin
        if ("Contract No." <> '') and ("Document Type" = "Document Type"::Invoice) then
            Error(Text066);
    end;

    local procedure CreateServiceLines(var TempServLine: Record "Service Line" temporary; var ExtendedTextAdded: Boolean; var TempServiceCommentLine: Record "Service Comment Line" temporary)
    var
        ServiceTransferExtText: Codeunit "Service Transfer Ext. Text";
    begin
        ServLine.Init();
        ServLine."Line No." := 0;
        TempServLine.Find('-');
        ExtendedTextAdded := false;

        repeat
            if TempServLine."Attached to Line No." = 0 then begin
                ServLine.Init();
                ServLine.SetHideReplacementDialog(true);
                ServLine.SetHideCostWarning(true);
                ServLine."Line No." := ServLine."Line No." + 10000;
                ServLine."Price Calculation Method" := "Price Calculation Method";
                ServLine.Validate(Type, TempServLine.Type);
                if TempServLine."No." <> '' then begin
                    ServLine.Validate("No.", TempServLine."No.");
                    if ServLine.Type <> ServLine.Type::" " then begin
                        ServLine.Validate("Unit of Measure Code", TempServLine."Unit of Measure Code");
                        ServLine.Validate("Variant Code", TempServLine."Variant Code");
                        if TempServLine.Quantity <> 0 then
                            ServLine.Validate(Quantity, TempServLine.Quantity);
                    end;
                end;

                ServLine."Serv. Price Adjmt. Gr. Code" := TempServLine."Serv. Price Adjmt. Gr. Code";
                ServLine."Document No." := TempServLine."Document No.";
                ServLine."Service Item No." := TempServLine."Service Item No.";
                ServLine."Appl.-to Service Entry" := TempServLine."Appl.-to Service Entry";
                ServLine."Service Item Line No." := TempServLine."Service Item Line No.";
                ServLine.Validate(Description, TempServLine.Description);
                ServLine.Validate("Description 2", TempServLine."Description 2");

                if TempServLine."No." <> '' then begin
                    TempLinkToServItem := "Link Service to Service Item";
                    if "Link Service to Service Item" then begin
                        "Link Service to Service Item" := false;
                        Modify(true);
                    end;
                    ServLine."Spare Part Action" := TempServLine."Spare Part Action";
                    ServLine."Component Line No." := TempServLine."Component Line No.";
                    ServLine."Replaced Item No." := TempServLine."Replaced Item No.";
                    ServLine.Validate("Work Type Code", TempServLine."Work Type Code");

                    ServLine."Location Code" := TempServLine."Location Code";
                    if ServLine.Type <> ServLine.Type::" " then begin
                        if ServLine.Type = ServLine.Type::Item then begin
                            ServLine.Validate("Variant Code", TempServLine."Variant Code");
                            if ServLine."Location Code" <> '' then
                                ServLine."Bin Code" := TempServLine."Bin Code";
                        end;
                        ServLine."Fault Reason Code" := TempServLine."Fault Reason Code";
                        ServLine."Exclude Warranty" := TempServLine."Exclude Warranty";
                        ServLine."Exclude Contract Discount" := TempServLine."Exclude Contract Discount";
                        ServLine.Validate("Contract No.", TempServLine."Contract No.");
                        ServLine.Validate(Warranty, TempServLine.Warranty);
                    end;
                    ServLine."Fault Area Code" := TempServLine."Fault Area Code";
                    ServLine."Symptom Code" := TempServLine."Symptom Code";
                    ServLine."Resolution Code" := TempServLine."Resolution Code";
                    ServLine."Fault Code" := TempServLine."Fault Code";
                    ServLine.Validate("Dimension Set ID", TempServLine."Dimension Set ID");
                end;
                "Link Service to Service Item" := TempLinkToServItem;

                OnBeforeInsertServLineOnServLineRecreation(ServLine, TempServLine);
                ServLine.Insert();
                ExtendedTextAdded := false;
            end else
                if not ExtendedTextAdded then begin
                    ServiceTransferExtText.ServCheckIfAnyExtText(ServLine, true);
                    ServiceTransferExtText.InsertServExtText(ServLine);
                    OnAfterTransferExtendedTextForServLineRecreation(ServLine);
                    ServLine.Find('+');
                    ExtendedTextAdded := true;
                end;
            RestoreServiceCommentLine(TempServiceCommentLine, TempServLine."Line No.", ServLine."Line No.");
            OnCreateServiceLinesOnBeforeCopyReservEntryFromTemp(ServLine, TempServLine, Rec, xRec);
            CopyReservEntryFromTemp(TempServLine, ServLine."Line No.");
        until TempServLine.Next() = 0;
        RestoreServiceCommentLine(TempServiceCommentLine, 0, 0);
    end;

    procedure SetCustomerFromFilter()
    var
        CustomerNo: Code[20];
    begin
        CustomerNo := GetFilterCustNo();
        if CustomerNo = '' then begin
            FilterGroup(2);
            CustomerNo := GetFilterCustNo();
            FilterGroup(0);
        end;
        if CustomerNo <> '' then
            Validate("Customer No.", CustomerNo);

        OnAfterSetCustomerFromFilter(Rec);
    end;

    local procedure GetFilterCustNo(): Code[20]
    begin
        if GetFilter("Customer No.") <> '' then
            if GetRangeMin("Customer No.") = GetRangeMax("Customer No.") then
                exit(GetRangeMax("Customer No."));
    end;

    local procedure UpdateShipToAddressFromGeneralAddress(FieldNumber: Integer)
    begin
        if ("Ship-to Code" <> '') or ShipToAddressModified() then
            exit;

        case FieldNumber of
            FieldNo("Ship-to Address"):
                if xRec.Address = "Ship-to Address" then
                    "Ship-to Address" := Address;
            FieldNo("Ship-to Address 2"):
                if xRec."Address 2" = "Ship-to Address 2" then
                    "Ship-to Address 2" := "Address 2";
            FieldNo("Ship-to City"), FieldNo("Ship-to Post Code"):
                begin
                    if xRec.City = "Ship-to City" then
                        "Ship-to City" := City;
                    if xRec."Post Code" = "Ship-to Post Code" then
                        "Ship-to Post Code" := "Post Code";
                    if xRec.County = "Ship-to County" then
                        "Ship-to County" := County;
                    if xRec."Country/Region Code" = "Ship-to Country/Region Code" then
                        "Ship-to Country/Region Code" := "Country/Region Code";
                end;
            FieldNo("Ship-to County"):
                if xRec.County = "Ship-to County" then
                    "Ship-to County" := County;
            FieldNo("Ship-to Country/Region Code"):
                if xRec."Country/Region Code" = "Ship-to Country/Region Code" then
                    "Ship-to Country/Region Code" := "Country/Region Code";
            Rec.FieldNo("Ship-to Phone"):
                if xRec."Phone No." = "Ship-to Phone" then
                    "Ship-to Phone" := "Phone No.";
            Rec.FieldNo("Ship-to Phone 2"):
                if xRec."Phone No. 2" = "Ship-to Phone 2" then
                    "Ship-to Phone 2" := "Phone No. 2";
        end;
        OnAfterUpdateShipToAddressFromGeneralAddress(Rec, xRec, FieldNumber);
    end;

    procedure CopyCustomerFilter()
    var
        CustomerFilter: Text;
    begin
        CustomerFilter := GetFilter("Customer No.");
        if CustomerFilter <> '' then begin
            FilterGroup(2);
            SetFilter("Customer No.", CustomerFilter);
            FilterGroup(0)
        end;
    end;

    /// <summary>
    /// Transfers relevant field values from provided customer to the current service header record.
    /// </summary>
    /// <param name="Cust">Source customer record. </param>
    local procedure CopyCustomerFields(Cust: Record Customer)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyCustomerFields(Rec, Cust, SkipContact, SkipBillToContact, IsHandled);
        if IsHandled then
            exit;

        Name := Cust.Name;
        "Name 2" := Cust."Name 2";
        Address := Cust.Address;
        "Address 2" := Cust."Address 2";
        City := Cust.City;
        "Post Code" := Cust."Post Code";
        County := Cust.County;
        "Country/Region Code" := Cust."Country/Region Code";
        "VAT Country/Region Code" := "Country/Region Code";
        if not SkipContact then begin
            "Contact Name" := Cust.Contact;
            "Phone No." := Cust."Phone No.";
            "E-Mail" := Cust."E-Mail";
        end;
        "Gen. Bus. Posting Group" := Cust."Gen. Bus. Posting Group";
        "VAT Bus. Posting Group" := Cust."VAT Bus. Posting Group";
        "Tax Area Code" := Cust."Tax Area Code";
        "Tax Liable" := Cust."Tax Liable";
        "VAT Registration No." := Cust.GetVATRegistrationNo();
        "Shipping Advice" := Cust."Shipping Advice";
        "Responsibility Center" := UserSetupMgt.GetRespCenter(2, Cust."Responsibility Center");
        Validate("Location Code", UserSetupMgt.GetLocation(2, Cust."Location Code", "Responsibility Center"));

        OnAfterCopyCustomerFields(Rec, Cust);
    end;

    local procedure CopyBillToCustomerFields(Cust: Record Customer)
    var
        PaymentTerms: Record "Payment Terms";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyBillToCustFields(Rec, Cust, SkipBillToContact, CurrFieldNo, IsHandled);
        if IsHandled then
            exit;

        "Bill-to Name" := Cust.Name;
        "Bill-to Name 2" := Cust."Name 2";
        "Bill-to Address" := Cust.Address;
        "Bill-to Address 2" := Cust."Address 2";
        "Bill-to City" := Cust.City;
        "Bill-to Post Code" := Cust."Post Code";
        "Bill-to County" := Cust.County;
        "Bill-to Country/Region Code" := Cust."Country/Region Code";
        if not SkipBillToContact then
            "Bill-to Contact" := Cust.Contact;
        "Payment Terms Code" := Cust."Payment Terms Code";
        if "Document Type" = "Document Type"::"Credit Memo" then begin
            "Payment Method Code" := '';
            if PaymentTerms.Get("Payment Terms Code") then
                if PaymentTerms."Calc. Pmt. Disc. on Cr. Memos" then
                    "Payment Method Code" := Cust."Payment Method Code"
        end else
            "Payment Method Code" := Cust."Payment Method Code";
        GeneralLedgerSetup.GetRecordOnce();
        if GeneralLedgerSetup."Bill-to/Sell-to VAT Calc." = GeneralLedgerSetup."Bill-to/Sell-to VAT Calc."::"Bill-to/Pay-to No." then begin
            "VAT Bus. Posting Group" := Cust."VAT Bus. Posting Group";
            "VAT Registration No." := Cust.GetVATRegistrationNo();
            "VAT Country/Region Code" := Cust."Country/Region Code";
            "Gen. Bus. Posting Group" := Cust."Gen. Bus. Posting Group";
        end;
        "Customer Posting Group" := Cust."Customer Posting Group";
        "Currency Code" := Cust."Currency Code";
        "Customer Price Group" := Cust."Customer Price Group";
        "Prices Including VAT" := Cust."Prices Including VAT";
        "Price Calculation Method" := Cust.GetPriceCalculationMethod();
        "Allow Line Disc." := Cust."Allow Line Disc.";
        "Invoice Disc. Code" := Cust."Invoice Disc. Code";
        "Customer Disc. Group" := Cust."Customer Disc. Group";
        "Language Code" := Cust."Language Code";
        "Format Region" := Cust."Format Region";
        SetSalespersonCode(Cust."Salesperson Code", "Salesperson Code");
        Reserve := Cust.Reserve;
        "Combine Shipments" := Cust."Combine Service Shipments";

        OnAfterCopyBillToCustomerFields(Rec, Cust, SkipBillToContact);
    end;

    local procedure ShipToAddressModified(): Boolean
    begin
        if (xRec.Address <> "Ship-to Address") or
           (xRec."Address 2" <> "Ship-to Address 2") or
           (xRec.City <> "Ship-to City") or
           (xRec.County <> "Ship-to County") or
           (xRec."Post Code" <> "Ship-to Post Code") or
           (xRec."Country/Region Code" <> "Ship-to Country/Region Code")
        then
            exit(true);
        exit(false);
    end;

    local procedure GetShipmentMethodCode()
    var
        ShipToAddress: Record "Ship-to Address";
    begin
        if "Ship-to Code" <> '' then begin
            ShipToAddress.SetLoadFields("Shipment Method Code");
            ShipToAddress.Get("Customer No.", "Ship-to Code");
            if ShipToAddress."Shipment Method Code" <> '' then begin
                Validate("Shipment Method Code", ShipToAddress."Shipment Method Code");
                exit;
            end;
        end;

        if "Customer No." <> '' then begin
            GetCust("Customer No.");
            Validate("Shipment Method Code", Cust."Shipment Method Code");
        end;
    end;

    procedure ConfirmCloseUnposted(): Boolean
    var
        InstructionMgt: Codeunit "Instruction Mgt.";
    begin
        if ServLineExists() or ServItemLineExists() then
            if InstructionMgt.IsUnpostedEnabledForRecord(Rec) then
                exit(InstructionMgt.ShowConfirm(DocumentNotPostedClosePageQst, InstructionMgt.QueryPostOnCloseCode()));
        exit(true)
    end;

    local procedure ConfirmChangeContractNo(): Boolean
    var
        ServContractLine: Record "Service Contract Line";
        ConfirmManagement: Codeunit "Confirm Management";
        Confirmed: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeConfirmUpdateContractNo(Rec, Confirmed, HideValidationDialog, IsHandled);
        if IsHandled then
            exit(Confirmed);

        Confirmed :=
          ConfirmManagement.GetResponseOrDefault(
            StrSubstNo(
              Text029, ServContractLine.FieldCaption("Next Planned Service Date"),
              ServContractLine.TableCaption(), FieldCaption("Contract No.")), true);

        exit(Confirmed);
    end;

    local procedure SetDefaultSalesperson()
    var
        UserSetup: Record "User Setup";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetDefaultSalesperson(Rec, IsHandled);
        if IsHandled then
            exit;

        if not UserSetup.Get(UserId) then
            exit;

        if UserSetup."Salespers./Purch. Code" <> '' then
            Validate("Salesperson Code", UserSetup."Salespers./Purch. Code");
    end;

    local procedure SetCompanyBankAccount()
    var
        BankAccount: Record "Bank Account";
    begin
        Validate("Company Bank Account Code", BankAccount.GetDefaultBankAccountNoForCurrency("Currency Code"));
        OnAfterSetCompanyBankAccount(Rec, xRec);
    end;

    procedure ValidateSalesPersonOnServiceHeader(ServiceHeader2: Record "Service Header"; IsTransaction: Boolean; IsPostAction: Boolean)
    begin
        if ServiceHeader2."Salesperson Code" <> '' then
            if Salesperson.Get(ServiceHeader2."Salesperson Code") then
                if Salesperson.VerifySalesPersonPurchaserPrivacyBlocked(Salesperson) then begin
                    if IsTransaction then
                        Error(
                            ErrorInfo.Create(
                                Salesperson.GetPrivacyBlockedTransactionText(Salesperson, IsPostAction, true),
                                true,
                                Salesperson));
                    if not IsTransaction then
                        Error(
                            ErrorInfo.Create(
                                Salesperson.GetPrivacyBlockedGenericText(Salesperson, true),
                                true,
                                Salesperson));
                end;
    end;

    procedure UpdateShipToSalespersonCode()
    var
        ShipToAddress: Record "Ship-to Address";
        SalespersonCode: Code[20];
        IsHandled: Boolean;
        IsSalesPersonCodeAssigned: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateShipToSalespersonCode(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Ship-to Code" <> '' then begin
            ShipToAddress.SetLoadFields("Salesperson Code");
            ShipToAddress.Get("Customer No.", "Ship-to Code");
            if ShipToAddress."Salesperson Code" <> '' then begin
                SetSalespersonCode(ShipToAddress."Salesperson Code", SalespersonCode);
                Validate("Salesperson Code", SalespersonCode);
                IsSalesPersonCodeAssigned := true;
            end;
        end;

        if not IsSalesPersonCodeAssigned then begin
            IsHandled := false;
            OnUpdateShiptoSalespersonCodeNotAssigned(Rec, IsHandled);
            if not IsHandled then
                if ("Bill-to Customer No." <> '') then begin
                    GetCust("Bill-to Customer No.");
                    SetSalespersonCode(Cust."Salesperson Code", SalespersonCode);
                    Validate("Salesperson Code", SalespersonCode);
                    if Rec."Customer No." <> '' then
                        GetCust(Rec."Customer No.");
                end else
                    SetDefaultSalesperson();
        end;
    end;

    procedure SetSalespersonCode(SalesPersonCodeToCheck: Code[20]; var SalesPersonCodeToAssign: Code[20])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetSalespersonCode(Rec, SalesPersonCodeToCheck, SalesPersonCodeToAssign, IsHandled);
        if IsHandled then
            exit;

        if SalesPersonCodeToCheck <> '' then
            if Salesperson.Get(SalesPersonCodeToCheck) then
                if Salesperson.VerifySalesPersonPurchaserPrivacyBlocked(Salesperson) then
                    SalesPersonCodeToAssign := ''
                else
                    SalesPersonCodeToAssign := SalesPersonCodeToCheck;
    end;

    local procedure RevertCurrencyCodeAndPostingDate()
    begin
        "Currency Code" := xRec."Currency Code";
        "Posting Date" := xRec."Posting Date";
        Modify();
    end;

    procedure GetHideValidationDialog(): Boolean
    begin
        exit(HideValidationDialog);
    end;

    /// <summary>
    /// Gets document type for current service header record.
    /// </summary>
    /// <returns>Returns one of full names of document types 'Service Quote', 'Service Order', 'Service Invoice', 'Service Credit Memo'. </returns>
    procedure GetFullDocTypeTxt() FullDocTypeTxt: Text
    var
        IsHandled: Boolean;
    begin
        OnBeforeGetFullDocTypeTxt(Rec, FullDocTypeTxt, IsHandled);

        if IsHandled then
            exit;

        FullDocTypeTxt := SelectStr("Document Type".AsInteger() + 1, FullServiceTypesTxt);
    end;

    local procedure ConfirmRecalculatePrice() Result: Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeConfirmRecalculatePrice(Rec, HideValidationDialog, Result, IsHandled);
        if IsHandled then
            exit(Result);

        Result := ConfirmManagement.GetResponseOrDefault(StrSubstNo(Text055, FieldCaption("Prices Including VAT"), ServLine.FieldCaption("Unit Price")), true);
    end;

    local procedure ConfirmRecreateServLines(ChangedFieldName: Text[100]) Result: Boolean
    var
        ConfirmManagement: Codeunit "Confirm Management";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeConfirmRecreateServLines(Rec, xRec, ChangedFieldName, HideValidationDialog, Result, IsHandled);
        if IsHandled then
            exit;

        if HideValidationDialog or not GuiAllowed() then
            Result := true
        else
            Result := ConfirmManagement.GetResponseOrDefault(StrSubstNo(Text012, ChangedFieldName), true);
    end;

    /// <summary>
    /// Gets the value for the global variable 'ServiceMgtSetup'.
    /// </summary>
    procedure GetServiceMgtSetup()
    begin
        ServiceMgtSetup.GetRecordOnce();

        OnAfterGetServiceMgtSetup(ServiceMgtSetup, Rec, CurrFieldNo);
    end;

    local procedure CheckCustomerPostingGroupChange()
    var
        BilltoCustomer: Record Customer;
        PostingGroupChangeInterface: Interface "Posting Group Change Method";
        IsHandled: Boolean;
    begin
        OnBeforeCheckCustomerPostingGroupChange(Rec, xRec, IsHandled);
        if IsHandled then
            exit;
        if ("Customer Posting Group" <> xRec."Customer Posting Group") and (xRec."Customer Posting Group" <> '') then begin
            TestField("Bill-to Customer No.");
            BillToCustomer.Get("Bill-to Customer No.");
            GetServiceMgtSetup();
            if ServiceMgtSetup."Allow Multiple Posting Groups" then begin
                BillToCustomer.TestField("Allow Multiple Posting Groups");
                PostingGroupChangeInterface := ServiceMgtSetup."Check Multiple Posting Groups";
                PostingGroupChangeInterface.ChangePostingGroup("Customer Posting Group", xRec."Customer Posting Group", Rec);
            end;
        end;
    end;

    procedure CheckBusPostingGroups(): Boolean
    var
        ApplicationAreaMgmt: Codeunit System.Environment.Configuration."Application Area Mgmt.";
        IsHandled: Boolean;
        Result: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckBusPostingGroups(Result, IsHandled);
        if IsHandled then
            exit(Result);

        exit(not ApplicationAreaMgmt.IsSalesTaxEnabled());
    end;

    /// <summary>
    /// Checks if the current service header field 'Type' value is 'Credit Memo'.
    /// </summary>
    /// <returns>Returns 'true' if value of field 'Type' from current service header is 'Credit Memo', otherwise 'false'. </returns>
    procedure IsCreditDocType(): Boolean
    begin
        exit("Document Type" = "Document Type"::"Credit Memo");
    end;

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

    local procedure InitDefaultDimensionSources(var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; FieldNo: Integer)
    begin
        DimMgt.AddDimSource(DefaultDimSource, Database::Customer, Rec."Bill-to Customer No.", FieldNo = Rec.FieldNo("Bill-to Customer No."));
        DimMgt.AddDimSource(DefaultDimSource, Database::"Salesperson/Purchaser", Rec."Salesperson Code", FieldNo = Rec.FieldNo("Salesperson Code"));
        DimMgt.AddDimSource(DefaultDimSource, Database::"Responsibility Center", Rec."Responsibility Center", FieldNo = Rec.FieldNo("Responsibility Center"));
        DimMgt.AddDimSource(DefaultDimSource, Database::"Service Contract Header", Rec."Contract No.", FieldNo = Rec.FieldNo("Contract No."));
        DimMgt.AddDimSource(DefaultDimSource, Database::"Service Order Type", Rec."Service Order Type", FieldNo = Rec.FieldNo("Service Order Type"));
        DimMgt.AddDimSource(DefaultDimSource, Database::Location, Rec."Location Code", FieldNo = Rec.FieldNo("Location Code"));

        OnAfterInitDefaultDimensionSources(Rec, DefaultDimSource, FieldNo);
    end;

    procedure ServiceLinesEditable() IsEditable: Boolean;
    begin
        IsEditable := Rec."Customer No." <> '';

        OnAfterServiceLinesEditable(Rec, IsEditable);
    end;

    internal procedure PerformManualRelease()
    var
        ReleaseServiceDoc: Codeunit "Release Service Document";
    begin
        if Rec."Release Status" <> Rec."Release Status"::"Released to Ship" then begin
            ReleaseServiceDoc.PerformManualRelease(Rec);
            Commit();
        end;
    end;

    internal procedure GetQtyReservedFromStockState() Result: Enum "Reservation From Stock"
    var
        ServiceLineReserve: Codeunit "Service Line-Reserve";
        QtyReservedFromStock: Decimal;
    begin
        QtyReservedFromStock := ServiceLineReserve.GetReservedQtyFromInventory(Rec);
        if QtyReservedFromStock = 0 then
            exit(Result::None);

        if QtyReservedFromStock = CalculateReservableOutstandingQuantityBase() then
            exit(Result::Full);

        exit(Result::Partial);
    end;

    local procedure CalculateReservableOutstandingQuantityBase() OutstandingQtyBase: Decimal
    var
        RemQtyBaseInvtItemServiceLine: Query RemQtyBaseInvtItemServiceLine;
    begin
        RemQtyBaseInvtItemServiceLine.SetServiceLineFilter(Rec);
        if RemQtyBaseInvtItemServiceLine.Open() then
            if RemQtyBaseInvtItemServiceLine.Read() then
                OutstandingQtyBase := RemQtyBaseInvtItemServiceLine.Outstanding_Qty___Base_;
        RemQtyBaseInvtItemServiceLine.Close();
    end;

    local procedure PrepareDeleteServiceInvoice()
    var
        ServiceContractHeader: Record "Service Contract Header";
        ServiceContractLine: Record "Service Contract Line";
        ServiceLine: Record "Service Line";
        TempServiceLine: Record "Service Line" temporary;
        ServLedgEntriesPost: Codeunit "ServLedgEntries-Post";
        ServContractMgt: Codeunit ServContractManagement;
        ConfirmManagement: Codeunit "Confirm Management";
    begin
        ServiceLine.SetRange("Document Type", ServiceLine."Document Type"::Invoice);
        ServiceLine.SetRange("Document No.", Rec."No.");
        ServiceLine.SetFilter("Appl.-to Service Entry", '>%1', 0);
        if ServiceLine.IsEmpty() then
            exit;
        if ServiceLine.FindSet() then
            GetAllContractLinesForInvoice(ServiceLine, TempServiceLine);

        if not ConfirmManagement.GetResponseOrDefault(RestoreInvoiceDatesOnDeleteInvQst, false) then
            exit;

        if not ServiceContractHeader.Get(ServiceContractHeader."Contract Type"::Contract, Rec."Contract No.") then
            exit;

        TempServiceLine.SetRange("Document No.", ServiceLine."Document No.");
        if TempServiceLine.FindSet() then
            repeat
                if ServiceContractHeader.Get(ServiceContractHeader."Contract Type"::Contract, TempServiceLine."Contract No.") then
                    CheckServiceLedgerEntriesCanBeReversed(TempServiceLine."Contract No.", Rec."No.");
            until TempServiceLine.Next() = 0;

        ServLedgEntriesPost.UnapplyOpenServiceLines(ServiceLine);
        TempServiceLine.SetRange("Document No.", ServiceLine."Document No.");
        if TempServiceLine.FindSet() then
            repeat
                if ServiceContractHeader.Get(ServiceContractHeader."Contract Type"::Contract, TempServiceLine."Contract No.") then begin
                    ServiceContractHeader.SuspendStatusCheck(true);
                    if not RestoreServiceContractDates(ServiceContractHeader) then
                        Error(CannotRestoreInvoiceDatesErr);
                    ServiceContractHeader.Modify(true);

                    ServContractMgt.FilterServiceContractLine(ServiceContractLine, ServiceContractHeader."Contract No.", ServiceContractHeader."Contract Type", 0);
                    ServiceContractLine.SetFilter(
                      "Starting Date", '<=%1|%2..%3', ServiceContractHeader."Next Invoice Date",
                      ServiceContractHeader."Next Invoice Period Start", ServiceContractHeader."Next Invoice Period End");
                    if ServiceContractLine.FindSet() then
                        repeat
                            if ServiceContractHeader."Last Invoice Date" = 0D then
                                ServiceContractLine."Invoiced to Date" := 0D
                            else
                                CalcContractLineInvoicedToDate(ServiceContractLine, ServiceContractHeader, Rec."No.");
                            ServiceContractLine.Modify(true);
                        until ServiceContractLine.Next() = 0;
                end;
            until TempServiceLine.Next() = 0;
    end;

    local procedure GetAllContractLinesForInvoice(ServiceLine: Record "Service Line"; var TempServiceLine: Record "Service Line" temporary)
    var
        ServiceLine2: Record "Service Line";
    begin
        ServiceLine2.CopyFilters(ServiceLine);
        serviceLine2.SetFilter("Contract No.", '<>%1', '');
        if ServiceLine2.FindSet() then
            repeat
                TempServiceLine := ServiceLine2;
                TempServiceLine.Insert();
            until ServiceLine2.Next() = 0;
    end;

    local procedure CheckServiceLedgerEntriesCanBeReversed(ContractNo: Code[20]; ServiceInvoiceNo: Code[20])
    var
        ServiceLedgerEntry: Record "Service Ledger Entry";
        LastPostingDate: Date;
    begin
        ServiceLedgerEntry.Reset();
        ServiceLedgerEntry.SetLoadFields("Posting Date");
        ServiceLedgerEntry.SetCurrentKey("Service Contract No.", "Posting Date");
        ServiceLedgerEntry.SetRange("Service Contract No.", ContractNo);
        ServiceLedgerEntry.SetRange("Document Type", ServiceLedgerEntry."Document Type"::" ");
        ServiceLedgerEntry.SetRange("Document No.", ServiceInvoiceNo);
        ServiceLedgerEntry.SetRange(Open, false);
        if not ServiceLedgerEntry.IsEmpty() then
            Error(CannotDeletePostedInvoiceErr);

        ServiceLedgerEntry.SetRange(Open);
        ServiceLedgerEntry.FindLast();
        LastPostingDate := ServiceLedgerEntry."Posting Date";

        ServiceLedgerEntry.Reset();
        ServiceLedgerEntry.SetCurrentKey("Service Contract No.", "Posting Date");
        ServiceLedgerEntry.SetRange("Service Contract No.", ContractNo);
        ServiceLedgerEntry.SetRange("Document Type", ServiceLedgerEntry."Document Type"::Invoice);
        ServiceLedgerEntry.SetFilter("Posting Date", '>%1', LastPostingDate);
        if not ServiceLedgerEntry.IsEmpty() then
            Error(CannotDeleteWhenNextInvPostedErr);

        ServiceLedgerEntry.SetRange("Document Type", ServiceLedgerEntry."Document Type"::" ");
        ServiceLedgerEntry.SetRange(Open, true);
        if not ServiceLedgerEntry.IsEmpty() then
            Error(CannotDeleteWhenNextInvExistsErr);
    end;

    local procedure RestoreServiceContractDates(var ServiceContractHeader: Record "Service Contract Header"): Boolean
    var
        ServDocReg: Record "Service Document Register";
    begin
        if not ServDocReg.Get(
              ServDocReg."Source Document Type"::Contract, ServiceContractHeader."Contract No.",
              ServDocReg."Destination Document Type"::Invoice, Rec."No.")
        then
            exit(false);

        if (ServDocReg."Next Invoice Date" = 0D) and (ServDocReg."Last Invoice Date" = 0D) then
            exit(false);

        if ServDocReg."Invoice Period" <> ServiceContractHeader."Invoice Period" then
            Error(InvoicePeriodChangedErr);

        ServiceContractHeader."Last Invoice Date" := ServDocReg."Last Invoice Date";
        ServiceContractHeader."Next Invoice Date" := ServDocReg."Next Invoice Date";
        ServiceContractHeader."Next Invoice Period Start" := ServDocReg."Next Invoice Period Start";
        ServiceContractHeader."Next Invoice Period End" := ServDocReg."Next Invoice Period End";
        if ServiceContractHeader.Prepaid then
            ServiceContractHeader."Last Invoice Period End" := ServiceContractHeader."Next Invoice Date" - 1;

        ServiceContractHeader.CalcFields("No. of Posted Invoices", "No. of Unposted Invoices");
        if (ServiceContractHeader."No. of Posted Invoices" = 0) and (ServiceContractHeader."No. of Unposted Invoices" = 1) then
            ServiceContractHeader."Last Invoice Date" := 0D;

        if ServiceContractHeader."Last Invoice Date" = 0D then
            ServiceContractHeader."Last Invoice Period End" := 0D;

        exit(true);
    end;

    local procedure CalcContractLineInvoicedToDate(var ServiceContractLine: Record "Service Contract Line"; ServiceContractHeader: Record "Service Contract Header"; ExcludeDocNo: Code[20])
    var
        ServiceLedgerEntry: Record "Service Ledger Entry";
        ServContractMgt: Codeunit ServContractManagement;
        OriginalServiceLedgerEntryNos: List of [Integer];
        ReversedServiceLedgerEntryNos: Dictionary of [Integer, Boolean];
        OriginalServiceLedgerEntryNo: Integer;
        InvoicedServiceLedgerEntryExists: Boolean;
    begin
        ServiceLedgerEntry.SetLoadFields("Entry No.", "Applies-to Entry No.");
        ServiceLedgerEntry.SetCurrentKey("Service Contract No.", "Service Item No. (Serviced)", "Entry Type", "Applies-to Entry No.");
        ServiceLedgerEntry.SetRange("Service Contract No.", ServiceContractLine."Contract No.");
        ServiceLedgerEntry.SetRange("Service Item No. (Serviced)", ServiceContractLine."Service Item No.");
        ServiceLedgerEntry.SetRange("Entry Type", ServiceLedgerEntry."Entry Type"::Sale);
        ServiceLedgerEntry.SetFilter("Document No.", '<>%1', ExcludeDocNo);
        if ServiceLedgerEntry.FindSet() then
            repeat
                if ServiceLedgerEntry."Applies-to Entry No." = 0 then
                    OriginalServiceLedgerEntryNos.Add(ServiceLedgerEntry."Entry No.")
                else
                    if not ReversedServiceLedgerEntryNos.ContainsKey(ServiceLedgerEntry."Applies-to Entry No.") then
                        ReversedServiceLedgerEntryNos.Add(ServiceLedgerEntry."Applies-to Entry No.", true);
            until ServiceLedgerEntry.Next() = 0;

        foreach OriginalServiceLedgerEntryNo in OriginalServiceLedgerEntryNos do
            if not ReversedServiceLedgerEntryNos.ContainsKey(OriginalServiceLedgerEntryNo) then begin
                InvoicedServiceLedgerEntryExists := true;
                break;
            end;

        if not InvoicedServiceLedgerEntryExists then
            ServiceContractLine."Invoiced to Date" := 0D
        else
            ServContractMgt.CalcInvoicedToDate(ServiceContractLine, ServiceContractLine."Starting Date", ServiceContractHeader."Next Invoice Period Start" - 1);
    end;

    /// <summary>
    /// Transfers relevant field values from current service header to the provided general journal line.
    /// </summary>
    /// <param name="GenJournalLine">Destination general journal line. </param>
    procedure CopyToGenJournalLine(var GenJournalLine: Record "Gen. Journal Line")
    begin
        GenJournalLine."Source Currency Code" := "Currency Code";
        GenJournalLine.Correction := Correction;
        GenJournalLine."VAT Base Discount %" := "VAT Base Discount %";
        GenJournalLine."Sell-to/Buy-from No." := "Customer No.";
        GenJournalLine."Bill-to/Pay-to No." := "Bill-to Customer No.";
        GenJournalLine."Country/Region Code" := "VAT Country/Region Code";
        GenJournalLine."VAT Registration No." := "VAT Registration No.";
        GenJournalLine."Source Type" := GenJournalLine."Source Type"::Customer;
        GenJournalLine."Source No." := "Bill-to Customer No.";
        GenJournalLine."Posting No. Series" := "Posting No. Series";
        GenJournalLine."Ship-to/Order Address Code" := "Ship-to Code";
        GenJournalLine."EU 3-Party Trade" := "EU 3-Party Trade";
        GenJournalLine."Salespers./Purch. Code" := "Salesperson Code";
        GenJournalLine."Your Reference" := "Your Reference";
        if GenJournalLine."Account Type" = GenJournalLine."Account Type"::Customer then
            GenJournalLine."Posting Group" := "Customer Posting Group";
        GeneralLedgerSetup.GetRecordOnce();
        if GeneralLedgerSetup."Journal Templ. Name Mandatory" then
            GenJournalLine."Journal Template Name" := "Journal Templ. Name";

        OnAfterCopyToGenJnlLine(GenJournalLine, Rec);
    end;

    /// <summary>
    /// Transfers apply-to document information from current service header to the provided general journal line.
    /// </summary>
    /// <param name="GenJournalLine">Destination general journal line. </param>
    procedure CopyToGenJournalLineApplyTo(var GenJournalLine: Record "Gen. Journal Line")
    begin
        GenJournalLine."Applies-to Doc. Type" := "Applies-to Doc. Type";
        GenJournalLine."Applies-to Doc. No." := "Applies-to Doc. No.";
        GenJournalLine."Applies-to ID" := "Applies-to ID";
        GenJournalLine."Allow Application" := "Bal. Account No." = '';

        OnAfterCopyToGenJnlLineApplyTo(GenJournalLine, Rec);
    end;

    /// <summary>
    /// Transfers payment information from current service header to the provided general journal line.
    /// </summary>
    /// <param name="GenJournalLine">Destination general journal line. </param>
    procedure CopyToGenJournalLinePayment(var GenJournalLine: Record "Gen. Journal Line")
    begin
        GenJournalLine."Due Date" := "Due Date";
        GenJournalLine."Payment Terms Code" := "Payment Terms Code";
        GenJournalLine."Payment Method Code" := "Payment Method Code";
        GenJournalLine."Pmt. Discount Date" := "Pmt. Discount Date";
        GenJournalLine."Payment Discount %" := "Payment Discount %";
        GenJournalLine."Direct Debit Mandate ID" := "Direct Debit Mandate ID";

        OnAfterCopyToGenJnlLinePayment(GenJournalLine, Rec);
    end;

    /// <summary>
    /// Transfers relevant field values from current service header to the provided item journal line.
    /// </summary>
    /// <param name="ItemJournalLine">Destination general journal line. </param>
    procedure CopyToItemJnlLine(var ItemJournalLine: Record "Item Journal Line")
    begin
        ItemJournalLine."Document Date" := Rec."Document Date";
        ItemJournalLine."Order Date" := Rec."Order Date";
        ItemJournalLine."Source Posting Group" := Rec."Customer Posting Group";
        ItemJournalLine."Salespers./Purch. Code" := Rec."Salesperson Code";
        ItemJournalLine."Reason Code" := Rec."Reason Code";
        ItemJournalLine."Source Type" := ItemJournalLine."Source Type"::Customer;
        ItemJournalLine."Source No." := Rec."Customer No.";
        ItemJournalLine."Shpt. Method Code" := Rec."Shipment Method Code";
        ItemJournalLine."Price Calculation Method" := Rec."Price Calculation Method";

        if Rec.IsCreditDocType() then
            ItemJournalLine."Country/Region Code" := Rec."Country/Region Code"
        else
            if Rec."Ship-to Country/Region Code" <> '' then
                ItemJournalLine."Country/Region Code" := Rec."Ship-to Country/Region Code"
            else
                ItemJournalLine."Country/Region Code" := Rec."Country/Region Code";

        OnAfterCopyToItemJnlLine(ItemJournalLine, Rec);
    end;

    procedure CopyToResJournalLine(var ResJournalLine: Record "Res. Journal Line")
    begin
        ResJournalLine."Document Date" := Rec."Document Date";
        ResJournalLine."Reason Code" := Rec."Reason Code";
        ResJournalLine."Order No." := Rec."No.";

        OnAfterCopyToResJournalLine(ResJournalLine, Rec);
    end;

    procedure SetWorkDescription(NewWorkDescription: Text)
    var
        OutStream: OutStream;
    begin
        Clear("Work Description");
        Rec."Work Description".CreateOutStream(OutStream, TextEncoding::UTF8);
        OutStream.WriteText(NewWorkDescription);
        Modify();
    end;

    procedure GetWorkDescription() WorkDescription: Text
    var
        TypeHelper: Codeunit "Type Helper";
        InStream: InStream;
    begin
        Rec.CalcFields("Work Description");
        Rec."Work Description".CreateInStream(InStream, TextEncoding::UTF8);
        exit(TypeHelper.TryReadAsTextWithSepAndFieldErrMsg(InStream, TypeHelper.LFSeparator(), Rec.FieldName("Work Description")));
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitDefaultDimensionSources(var ServiceHeader: Record "Service Header"; var DefaultDimSource: List of [Dictionary of [Integer, Code[20]]]; FieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterServiceLinesEditable(ServiceHeader: Record "Service Header"; var IsEditable: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetFullDocTypeTxt(var ServiceHeader: Record "Service Header"; var FullDocTypeTxt: Text; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateCurrencyFactor(var ServiceHeader: Record "Service Header"; var CurrencyExchangeRate: Record "Currency Exchange Rate"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateShipToAddress(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateStartingDateTime(var ServiceHeader: Record "Service Header"; ValidatingFromLines: Boolean; var ServiceMgtSetup: Record "Service Mgt. Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateFinishingDateTime(var ServiceHeader: Record "Service Header"; ValidatingFromLines: Boolean; var ServiceMgtSetup: Record "Service Mgt. Setup")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePriceMsgIfServLinesExist(ServiceHeader: Record "Service Header"; ChangedFieldName: Text[100]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyCustomerFields(var ServiceHeader: Record "Service Header"; Customer: Record Customer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyBillToCustomerFields(var ServiceHeader: Record "Service Header"; Customer: Record Customer; SkipBillToContact: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyShipToCustomerAddressFieldsFromCustomer(var ServiceHeader: Record "Service Header"; SellToCustomer: Record Customer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyShipToCustomerAddressFieldsFromShipToAddr(var ServiceHeader: Record "Service Header"; ShipToAddress: Record "Ship-to Address")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetNoSeriesCode(var ServiceHeader: Record "Service Header"; ServiceMgtSetup: Record "Service Mgt. Setup"; var NoSeriesCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetPostingNoSeriesCode(var ServiceHeader: Record "Service Header"; var PostingNos: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitRecord(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetCompanyBankAccount(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetValidatingFromLines(var ServiceHeader: Record "Service Header"; var ValidatingFromLines: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateBillToCont(var ServiceHeader: Record "Service Header"; Customer: Record Customer; Contact: Record Contact)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateShipToAddress(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateServLinesByFieldNo(var ServiceHeader: Record "Service Header"; var ServiceLine: Record "Service Line"; ChangedFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateShipToAddressFromGeneralAddress(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; FieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateServLineByChangedFieldName(ServiceHeader: Record "Service Header"; var ServiceLine: Record "Service Line"; ChangedFieldName: Text[100]; ChangedFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateServLinesByFieldNoOnAfterServLineSetFilters(var ServiceLine: Record "Service Line"; var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; ChangedFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateDim(var ServiceHeader: Record "Service Header"; DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateShortcutDimCode(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateCont(var ServiceHeader: Record "Service Header"; Customer: Record Customer; Contact: Record Contact)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateCust(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferExtendedTextForServLineRecreation(var ServLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeCheckBlockedCustomer(var Customer: Record Customer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckDocumentTypeAlreadyUsed(var ServiceHeader: Record "Service Header"; var ServShptHeader: Record "Service Shipment Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConfirmUpdateContractNo(var ServiceHeader: Record "Service Header"; var Confirmed: Boolean; var HideValidationDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyShipToCustomerAddressFieldsFromCustomer(var ServiceHeader: Record "Service Header"; Customer: Record Customer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyShipToCustomerAddressFieldsFromShipToAddr(var ServiceHeader: Record "Service Header"; ShipToAddress: Record "Ship-to Address"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateDim(var ServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetNoSeries(var ServiceHeader: Record "Service Header"; var NoSeriesCode: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetPostingNoSeriesCode(var ServiceHeader: Record "Service Header"; ServiceMgtSetup: Record "Service Mgt. Setup"; var PostingNos: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLookupAppliesToDocNo(var ServiceHeader: Record "Service Header"; var CustLedgEntry: Record "Cust. Ledger Entry"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertServLineOnServLineRecreation(var ServiceLine: Record "Service Line"; var TempServiceLine: Record "Service Line" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnModify(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnInsert(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterOnInsert(var ServiceHeader: Record "Service Header")
    begin
    end;
#if not CLEAN27
    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeOpenOrderStatistics(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeOpenStatistics(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;
#endif
    [IntegrationEvent(false, false)]
    local procedure OnBeforeTestMandatoryFields(var ServiceHeader: Record "Service Header"; var ServiceLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTestNoSeries(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTestNoSeriesManual(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateBillToCust(var ServiceHeader: Record "Service Header"; ContactNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateAppliesToDocNo(var ServiceHeader: Record "Service Header"; var CustLedgEntry: Record "Cust. Ledger Entry"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateServiceZoneCode(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateShortcutDimCode(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header"; FieldNumber: Integer; var ShortcutDimCode: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateAllLineDim(var ServiceHeader: Record "Service Header"; NewParentDimSetID: Integer; OldParentDimSetID: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeUpdateCust(ContactNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateDimOnBeforeUpdateLines(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CurrentFieldNo: Integer; OldDimSetID: Integer; DefaultDimSource: List of [Dictionary of [Integer, Code[20]]])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupContractNoOnAfterServContractHeaderSetFilters(var ServiceHeader: Record "Service Header"; var ServiceContractHeader: Record "Service Contract Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRecreateServLinesOnBeforeUpdateLines(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateAppliestoDocNoOnAfterSetFilters(var CustLedgerEntry: Record "Cust. Ledger Entry"; var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoOnBeforeDeleteLines(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoOnBeforeModify(var ServiceHeader: Record "Service Header"; CallingFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateVATBaseDiscountPctOnBeforeUpdateLineAmounts(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    internal procedure RunOnValidatePaymentTermsCodeOnBeforeValidateDueDate(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
        OnValidatePaymentTermsCodeOnBeforeValidateDueDate(ServiceHeader, IsHandled);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePaymentTermsCodeOnBeforeValidateDueDate(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    internal procedure RunOnValidatePaymentTermsCodeOnBeforeCalcPmtDiscDate(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
        OnValidatePaymentTermsCodeOnBeforeCalcPmtDiscDate(ServiceHeader, IsHandled)
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePaymentTermsCodeOnBeforeCalcPmtDiscDate(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePricesIncludingVATOnAfterCalcRecalculatePrice(var ServiceHeader: Record "Service Header"; var ServiceLine: Record "Service Line"; var RecalculatePrice: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShipToCodeOnBeforeDeleteLines(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShipToCodeOnAfterCalcShouldUpdateShipToAddressFields(var ServiceHeader: Record "Service Header"; var ShouldUpdateShipToAddressFields: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateServiceDocumentStatusOnAfterServItemLineSetFilters(var ServiceHeader: Record "Service Header"; var ServiceItemLine: Record "Service Item Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateServPriceGrOnServItemOnAfterServItemLineSetFilters(var ServiceHeader: Record "Service Header"; var ServiceItemLine: Record "Service Item Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConfirmRecalculatePrice(ServiceHeader: Record "Service Header"; var HideValidationDialog: Boolean; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetSalespersonCode(var ServiceHeader: Record "Service Header"; SalesPersonCodeToCheck: Code[20]; var SalesPersonCodeToAssign: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateShipToSalespersonCode(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateShiptoSalespersonCodeNotAssigned(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetResponsibilityCenter(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeShowPostedDocsToPrintCreatedMsg(var ShowPostedDocsToPrint: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeRecreateServLines(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; ChangedFieldName: Text[100]; var IsHandled: Boolean; CurrentFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeConfirmRecreateServLines(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; ChangedFieldName: Text[100]; var HideValidationDialog: Boolean; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetDefaultNoSeries(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetDefaultNoSeries(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetSecurityFilterOnRespCenter(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertOnBeforeInitRecord(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInitInsertOnBeforeInitSeries(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInitRecordOnAfterValidateLocationCode(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateAllLineDimOnBeforeGetServLineNewDimSetID(var ServLine: Record "Service Line"; NewParentDimSetID: Integer; OldParentDimSetID: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateAllLineDimOnBeforeGetServItemLineNewDimSetID(var ServItemLine: Record "Service Item Line"; NewParentDimSetID: Integer; OldParentDimSetID: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateBillToCustOnAfterUpdateBillToContact(var ServiceHeader: Record "Service Header"; Customer: Record Customer; Contact: Record Contact)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRecreateServLinesOnAfterServLineSetFilters(var ServLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRecreateServLinesOnBeforeServLineDeleteAll(var ServiceHeader: Record "Service Header"; var ServLine: Record "Service Line"; CurrFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRecreateServLinesOnAfterTempServLineDeleteAll(ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTestMandatoryFieldsOnBeforePassedServLineFind(ServiceHeader: Record "Service Header"; var ServiceLine: Record "Service Line"; var PassedServiceLine: Record "Service Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetServiceMgtSetup(var ServSetup: Record "Service Mgt. Setup"; ServiceHeader: Record "Service Header"; CurrFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnShowDocDimOnBeforeUpdateAllLineDim(var Rec: Record "Service Header"; OldDimSetID: Integer; CurrFieldNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoAfterInit(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateCity(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidatePostCode(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateBillToCity(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateBillToPostCode(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateShipToCity(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateShipToPostCode(var ServiceHeader: Record "Service Header"; var PostCodeRec: Record "Post Code"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShipToCodeOnBeforeConfirmDeleteLines(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckCustomerPostingGroupChange(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnValidateBillToCustomerNoOnBeforeConfirmChange(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnValidateCustomerNoOnBeforeShippedServLinesExist(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateFinishingTimeOnBeforeCheckServItemLines(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var ServiceItemLine: Record "Service Item Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateStatusFinishedOnAferUpdateFinishingDateTime(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateServiceOrderTypeOnBeforeCreateDim(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateAllLineDimOnBeforeGetResponse(var ServiceHeader: Record "Service Header"; NewParentDimSetID: Integer; OldParentDimSetID: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateAssignedUserIdOnBeforeCheckRespCenter(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoOnBeforeValidateBillToCustomerNo(var ServiceHeader: Record "Service Header"; Customer: Record Customer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoOnBeforeValidateServiceZoneCode(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShiptoCodeBeforeConfirmDialog(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShipToCodeOnBeforeValidateServiceZoneCode(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateContractNo(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteOnBeforeServItemLineDelete(var ServiceItemLine: Record "Service Item Line"; ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteHeaderOnBeforeDeleteRelatedRecords(var ServiceHeader: Record "Service Header"; var ServShptHeader: Record "Service Shipment Header"; var ServInvHeader: Record "Service Invoice Header"; var ServCrMemoHeader: Record "Service Cr.Memo Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateCustomerNo(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateCustomerNoOnBeforeVerifyShipToCode(var ServiceHeader: Record "Service Header"; var SkipBillToContact: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBillToCustomerNoOnBeforeCopyBillToCustomerFields(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBillToCustomerNoOnBeforeRecreateServLines(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateShortcutDimCodeOnBeforeUpdateUpdateAllLineDim(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; FieldNumber: Integer);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeLookupContactNo(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateResponsibilityCenter(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateServLinesByFieldNoOnBeforeAskQst(var ServiceHeader: Record "Service Header"; AskQuestion: Boolean; ChangedFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckCreditMaxBeforeInsert(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterUpdateServiceOrderChangeLog(var ServiceHeader: Record "Service Header"; var OldServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyCustomerFields(var ServiceHeader: Record "Service Header"; Customer: Record Customer; var SkipContact: Boolean; var SkipBillToContact: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyBillToCustFields(var ServiceHeader: Record "Service Header"; Customer: Record Customer; var SkipBillToContact: Boolean; CurrFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetHideValidationDialog(var ServiceHeader: Record "Service Header"; var HideValidationDialog: Boolean; NewHideValidationDialog: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateExternalDocumentNo(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header"; CurrentFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateServiceLinesOnBeforeCopyReservEntryFromTemp(var ServiceLine: Record "Service Line"; var TempServiceLine: Record "Service Line" temporary; var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetDefaultSalesperson(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetCustomerFromFilter(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyToGenJnlLine(var GenJournalLine: Record "Gen. Journal Line"; ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyToGenJnlLineApplyTo(var GenJournalLine: Record "Gen. Journal Line"; ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyToGenJnlLinePayment(var GenJournalLine: Record "Gen. Journal Line"; ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyToItemJnlLine(var ItemJournalLine: Record "Item Journal Line"; ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyToResJournalLine(var ResJournalLine: Record "Res. Journal Line"; ServiceHeader: Record "Service Header")
    begin
    end;

#if not CLEAN27
    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnOpenStatisticsOnAfterSetStatPageID(var ServiceHeader: Record "Service Header"; var StatPageID: Integer)
    begin
    end;

    [Obsolete('The new statistics actions use RunObject and do not run the action trigger. Use a page extension to modify the behaviour.', '27.0')]
    [IntegrationEvent(false, false)]
    local procedure OnOpenOrderStatisticsOnAfterSetStatPageID(var ServiceHeader: Record "Service Header"; var StatPageID: Integer)
    begin
    end;
#endif
    [IntegrationEvent(false, false)]
    local procedure OnDeleteOnBeforeArchiveServiceDocument(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnDelete(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckBusPostingGroups(var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyAppliestoFieldsFromCustLedgerEntry(var ServiceHeader: Record "Service Header"; var CustLedgerEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidatePaymentTerms(var ServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInitPostingDate(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateBillToCustomerNo(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header"; var Customer: Record Customer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateCurrencyFactorOnAfterSetCurrencyDate(var ServiceHeader: Record "Service Header"; var GeneralLedgerSetup: Record "General Ledger Setup"; var CurrencyDate: Date)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePostingDateOnAfterCheckPostingDate(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePostingDateOnAfterUpdatePostingDateOnLines(var ServiceHeader: Record "Service Header"; HideValidationDialog: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidatePostingDateOnAfterValidateVATReportingDate(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateDocumentDateOnAfterValidateVATReportingDate(var ServiceHeader: Record "Service Header"; var xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeleteOnBeforeShowPostedDocsToPrint(var ServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSendToPostWithLines(var ServiceHeader: Record "Service Header"; var TempServiceLine: Record "Service Line" temporary; PostingCodeunitID: Integer; var IsHandled: Boolean; var IsSuccess: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateStartingDate(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateStartingTime(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateFinishingDate(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateFinishingTime(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateOrderDate(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateStatus(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateResponseDateTime(var ServiceHeader: Record "Service Header"; CallingFieldNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnValidateBillToCustomerNoOnAfterSetFilters(var ServiceLine: Record "Service Line"; var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterValidateAppliesToDocNo(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header"; CustLedgEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateAllLineDimOnBeforeServiceLineModify(var ServiceLine: Record "Service Line"; var xServiceLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateAllLineDimOnAfterServiceLineModify(var ServiceLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterLookupAppliesToDocNo(var ServiceHeader: Record "Service Header"; var CustLedgEntry: Record "Cust. Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInitRecordFromContactOnAfterInitRecord(var ServiceHeader: Record "Service Header"; xServiceHeader: Record "Service Header")
    begin
    end;
}