Codeunit 86 Sales-Quote to Order

App
Base Application
Namespace
Microsoft.Sales.Document
Versions
17-28

Procedures, 2Events, 35Obsolete, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Sales/Document/SalesQuotetoOrder.Codeunit.al529 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.Sales.Document;

using Microsoft.Assembly.Document;
using Microsoft.CRM.Opportunity;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.ReceivablesPayables;
using Microsoft.Sales.Comment;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Setup;
using Microsoft.Utilities;
using System.Automation;
using System.Utilities;

/// <summary>
/// Converts a sales quote into a sales order for order processing and fulfillment.
/// </summary>
codeunit 86 "Sales-Quote to Order"
{
    TableNo = "Sales Header";

    trigger OnRun()
    var
        Cust: Record Customer;
        SalesCommentLine: Record "Sales Comment Line";
        ApprovalsMgmt: Codeunit "Approvals Mgmt.";
        SalesCalcDiscountByType: Codeunit "Sales - Calc Discount By Type";
        RecordLinkManagement: Codeunit "Record Link Management";
        ShouldRedistributeInvoiceAmount: Boolean;
        IsHandled: Boolean;
    begin
        OnBeforeOnRun(Rec);

        Rec.TestField("Document Type", Rec."Document Type"::Quote);
        ShouldRedistributeInvoiceAmount := SalesCalcDiscountByType.ShouldRedistributeInvoiceDiscountAmount(Rec);

        Rec.CheckSalesPostRestrictions();

        Cust.Get(Rec."Sell-to Customer No.");
        Cust.CheckBlockedCustOnDocs(Cust, Rec."Document Type"::Order, true, false);
        if Rec."Sell-to Customer No." <> Rec."Bill-to Customer No." then begin
            Cust.Get(Rec."Bill-to Customer No.");
            Cust.CheckBlockedCustOnDocs(Cust, Rec."Document Type"::Order, true, false);
        end;
        Rec.CalcFields("Amount Including VAT", "Work Description");
        OnRunOnAfterCalcAmountIncludingVAT(Rec);

        Rec.ValidateSalesPersonOnSalesHeader(Rec, true, false);

        Rec.CheckForBlockedLines();

        CheckInProgressOpportunities(Rec);

        CreateSalesHeader(Rec, Cust);

        TransferQuoteToOrderLines(SalesQuoteLine, Rec, SalesOrderLine, SalesOrderHeader, Cust);
        OnAfterInsertAllSalesOrderLines(SalesOrderLine, Rec, SalesOrderHeader);

        SalesSetup.Get();
        ArchiveSalesQuote(Rec);

        if SalesSetup."Default Posting Date" = SalesSetup."Default Posting Date"::"No Date" then begin
            SalesOrderHeader."Posting Date" := 0D;
            SalesOrderHeader.Modify();
        end;

        SalesCommentLine.CopyComments(Rec."Document Type".AsInteger(), SalesOrderHeader."Document Type".AsInteger(), Rec."No.", SalesOrderHeader."No.");
        RecordLinkManagement.CopyLinks(Rec, SalesOrderHeader);

        AssignItemCharges(Rec."Document Type", Rec."No.", SalesOrderHeader."Document Type", SalesOrderHeader."No.");

        MoveWonLostOpportunites(Rec, SalesOrderHeader);

        CopyApprovalEntryQuoteToOrder(Rec, SalesOrderHeader);

        IsHandled := false;
        OnBeforeDeleteSalesQuote(Rec, SalesOrderHeader, IsHandled, SalesQuoteLine);
        if not IsHandled then begin
            ApprovalsMgmt.DeleteApprovalEntries(Rec.RecordId);
            SalesCommentLine.DeleteComments(Rec."Document Type".AsInteger(), Rec."No.");
            Rec.DeleteLinks();
            Rec.Delete();
            SalesQuoteLine.DeleteAll();
            OnRunOnAfterSalesQuoteLineDeleteAll(Rec, SalesOrderHeader, SalesQuoteLine);
        end;

        if not ShouldRedistributeInvoiceAmount then
            SalesCalcDiscountByType.ResetRecalculateInvoiceDisc(SalesOrderHeader);

        OnAfterOnRun(Rec, SalesOrderHeader);
    end;

    var
        SalesQuoteLine: Record "Sales Line";
        SalesOrderHeader: Record "Sales Header";
        SalesOrderLine: Record "Sales Line";
        SalesSetup: Record "Sales & Receivables Setup";

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'An open %1 is linked to this %2. The %1 has to be closed before the %2 can be converted to an %3. Do you want to close the %1 now and continue the conversion?', Comment = 'An open Opportunity is linked to this Quote. The Opportunity has to be closed before the Quote can be converted to an Order. Do you want to close the Opportunity now and continue the conversion?';
        Text001: Label 'An open %1 is still linked to this %2. The conversion to an %3 was aborted.', Comment = 'An open Opportunity is still linked to this Quote. The conversion to an Order was aborted.';
#pragma warning restore AA0470
#pragma warning restore AA0074

    local procedure CopyApprovalEntryQuoteToOrder(SalesHeader: Record "Sales Header"; SalesOrderHeader: Record "Sales Header")
    var
        ApprovalsMgmt: Codeunit "Approvals Mgmt.";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyApprovalEntryQuoteToOrder(SalesHeader, SalesOrderHeader, IsHandled);
        if not IsHandled then
            ApprovalsMgmt.CopyApprovalEntryQuoteToOrder(SalesHeader.RecordId, SalesOrderHeader."No.", SalesOrderHeader.RecordId);
    end;

    local procedure CreateSalesHeader(SalesHeader: Record "Sales Header"; Customer: Record Customer)
    var
        GlSetup: Record "General Ledger Setup";
    begin
        OnBeforeCreateSalesHeader(SalesHeader);

        SalesOrderHeader := SalesHeader;
        SalesOrderHeader."Document Type" := SalesOrderHeader."Document Type"::Order;

        SalesOrderHeader."No. Printed" := 0;
        SalesOrderHeader.Status := SalesOrderHeader.Status::Open;
        SalesOrderHeader."No." := '';
        SalesOrderHeader."Quote No." := SalesHeader."No.";
        OnCreateSalesHeaderOnBeforeSalesOrderLineLockTable(SalesOrderHeader, SalesHeader);
        SalesOrderLine.LockTable();
        OnBeforeInsertSalesOrderHeader(SalesOrderHeader, SalesHeader);
        SalesOrderHeader.Insert(true);
        OnAfterInsertSalesOrderHeader(SalesOrderHeader, SalesHeader);

        SalesOrderHeader."Order Date" := SalesHeader."Order Date";
        if SalesHeader."Posting Date" <> 0D then
            SalesOrderHeader."Posting Date" := SalesHeader."Posting Date";

        SalesOrderHeader.InitFromSalesHeader(SalesHeader);
        SalesOrderHeader."Outbound Whse. Handling Time" := SalesHeader."Outbound Whse. Handling Time";
        SalesOrderHeader.Reserve := SalesHeader.Reserve;

        SalesOrderHeader."Prepayment %" := Customer."Prepayment %";
        if SalesOrderHeader."Posting Date" = 0D then
            SalesOrderHeader."Posting Date" := WorkDate();

        if SalesOrderHeader."VAT Registration No." = '' then
            SalesOrderHeader."VAT Registration No." := Customer."VAT Registration No.";

        SalesOrderHeader."VAT Reporting Date" := GlSetup.GetVATDate(SalesOrderHeader."Posting Date", SalesOrderHeader."Document Date");
        SalesOrderHeader.Validate("Posting Date");

        SalesHeader.CalcFields("Work Description");
        SalesOrderHeader."Work Description" := SalesHeader."Work Description";

        OnBeforeModifySalesOrderHeader(SalesOrderHeader, SalesHeader);
        SalesOrderHeader.Modify();

        OnAfterCreateSalesHeader(SalesOrderHeader, SalesHeader);
    end;

    local procedure ArchiveSalesQuote(var SalesHeader: Record "Sales Header")
    var
        ArchiveManagement: Codeunit ArchiveManagement;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeArchiveSalesQuote(SalesHeader, SalesOrderHeader, IsHandled);
        if IsHandled then
            exit;

        case SalesSetup."Archive Quotes" of
            SalesSetup."Archive Quotes"::Always:
                ArchiveManagement.ArchSalesDocumentNoConfirm(SalesHeader);
            SalesSetup."Archive Quotes"::Question:
                ArchiveManagement.ArchiveSalesDocument(SalesHeader);
        end;
    end;

    local procedure AssignItemCharges(FromDocType: Enum "Sales Document Type"; FromDocNo: Code[20]; ToDocType: Enum "Sales Document Type"; ToDocNo: Code[20])
    var
        ItemChargeAssgntSales: Record "Item Charge Assignment (Sales)";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAssignItemCharges(FromDocType.AsInteger(), FromDocNo, ToDocType.AsInteger(), ToDocNo, IsHandled);
        if IsHandled then
            exit;
        ItemChargeAssgntSales.Reset();
        ItemChargeAssgntSales.SetRange("Document Type", FromDocType);
        ItemChargeAssgntSales.SetRange("Document No.", FromDocNo);
        OnAssignItemChargesOnAfterItemChargeAssgntSalesSetFilters(ItemChargeAssgntSales, FromDocType, FromDocNo, ToDocType, ToDocNo);
        while ItemChargeAssgntSales.FindFirst() do begin
            ItemChargeAssgntSales.Delete();
            ItemChargeAssgntSales."Document Type" := SalesOrderHeader."Document Type";
            ItemChargeAssgntSales."Document No." := SalesOrderHeader."No.";
            if not (ItemChargeAssgntSales."Applies-to Doc. Type" in
                    [ItemChargeAssgntSales."Applies-to Doc. Type"::Shipment,
                     ItemChargeAssgntSales."Applies-to Doc. Type"::"Return Receipt"])
            then begin
                ItemChargeAssgntSales."Applies-to Doc. Type" := ToDocType;
                ItemChargeAssgntSales."Applies-to Doc. No." := ToDocNo;
            end;
            ItemChargeAssgntSales.Insert();
        end;
    end;

    /// <summary>
    /// Retrieves the created sales order header after conversion from a quote.
    /// </summary>
    /// <param name="SalesHeader2">Returns the sales order header that was created from the quote.</param>
    procedure GetSalesOrderHeader(var SalesHeader2: Record "Sales Header")
    begin
        SalesHeader2 := SalesOrderHeader;
    end;

    /// <summary>
    /// Specifies whether to hide validation dialogs during the conversion process.
    /// </summary>
    /// <param name="NewHideValidationDialog">True to suppress validation dialogs; false to show them.</param>
    procedure SetHideValidationDialog(NewHideValidationDialog: Boolean)
    begin
        if NewHideValidationDialog then
            exit;
    end;

    local procedure CheckInProgressOpportunities(var SalesHeader: Record "Sales Header")
    var
        Opp: Record Opportunity;
        TempOpportunityEntry: Record "Opportunity Entry" temporary;
        ConfirmManagement: Codeunit "Confirm Management";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckInProgressOpportunities(Opp, SalesHeader, IsHandled);
        if IsHandled then
            exit;

        FilterOpportunityForQuote(Opp, SalesHeader, true);
        if Opp.FindFirst() then begin
            if not ConfirmManagement.GetResponseOrDefault(
                 StrSubstNo(
                   Text000, Opp.TableCaption(), Opp."Sales Document Type"::Quote,
                   Opp."Sales Document Type"::Order), true)
            then
                Error('');
            TempOpportunityEntry.DeleteAll();
            TempOpportunityEntry.Init();
            TempOpportunityEntry.Validate("Opportunity No.", Opp."No.");
            TempOpportunityEntry."Sales Cycle Code" := Opp."Sales Cycle Code";
            TempOpportunityEntry."Contact No." := Opp."Contact No.";
            TempOpportunityEntry."Contact Company No." := Opp."Contact Company No.";
            TempOpportunityEntry."Salesperson Code" := Opp."Salesperson Code";
            TempOpportunityEntry."Campaign No." := Opp."Campaign No.";
            TempOpportunityEntry."Action Taken" := TempOpportunityEntry."Action Taken"::Won;
            TempOpportunityEntry."Calcd. Current Value (LCY)" := TempOpportunityEntry.GetSalesDocValue(SalesHeader);
            TempOpportunityEntry."Cancel Old To Do" := true;
            TempOpportunityEntry."Wizard Step" := 1;
            OnBeforeTempOpportunityEntryInsert(TempOpportunityEntry, SalesHeader);
            TempOpportunityEntry.Insert();
            TempOpportunityEntry.SetRange("Action Taken", TempOpportunityEntry."Action Taken"::Won);

            IsHandled := false;
            OnCheckInProgressOpportunitiesOnBeforeRunCloseOpportunityPage(TempOpportunityEntry, Opp, SalesHeader, IsHandled);
            if IsHandled then
                exit;
            PAGE.RunModal(PAGE::"Close Opportunity", TempOpportunityEntry);
            FilterOpportunityForQuote(Opp, SalesHeader, true);
            if Opp.FindFirst() then
                Error(Text001, Opp.TableCaption(), Opp."Sales Document Type"::Quote, Opp."Sales Document Type"::Order);
            Commit();
            SalesHeader.Get(SalesHeader."Document Type", SalesHeader."No.");
        end;
    end;

    local procedure MoveWonLostOpportunites(var SalesQuoteHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header")
    var
        Opp: Record Opportunity;
        OpportunityEntry: Record "Opportunity Entry";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeMoveWonLostOpportunites(SalesQuoteHeader, SalesOrderHeader, IsHandled);
        if not IsHandled then begin
            FilterOpportunityForQuote(Opp, SalesQuoteHeader, false);
            if Opp.FindFirst() then
                if Opp.Status = Opp.Status::Won then begin
                    Opp."Sales Document Type" := Opp."Sales Document Type"::Order;
                    Opp."Sales Document No." := SalesOrderHeader."No.";
                    Opp.Modify();
                    OpportunityEntry.Reset();
                    OpportunityEntry.SetCurrentKey(Active, "Opportunity No.");
                    OpportunityEntry.SetRange(Active, true);
                    OpportunityEntry.SetRange("Opportunity No.", Opp."No.");
                    if OpportunityEntry.FindFirst() then begin
                        OpportunityEntry."Calcd. Current Value (LCY)" := OpportunityEntry.GetSalesDocValue(SalesOrderHeader);
                        OpportunityEntry.Modify();
                    end;
                end else
                    if Opp.Status = Opp.Status::Lost then begin
                        Opp."Sales Document Type" := Opp."Sales Document Type"::" ";
                        Opp."Sales Document No." := '';
                        Opp.Modify();
                    end;
        end;
        OnAfterMoveWonLostOpportunity(SalesQuoteHeader, SalesOrderHeader, Opp);
    end;

    local procedure FilterOpportunityForQuote(var Opportunity: Record Opportunity; SalesHeader: Record "Sales Header"; InProgress: Boolean)
    begin
        Opportunity.Reset();
        Opportunity.SetCurrentKey("Sales Document Type", "Sales Document No.");
        Opportunity.SetRange("Sales Document Type", Opportunity."Sales Document Type"::Quote);
        Opportunity.SetRange("Sales Document No.", SalesHeader."No.");
        if InProgress then
            Opportunity.SetRange(Status, Opportunity.Status::"In Progress");
        OnAfterFilterOpportunityForQuote(Opportunity, SalesHeader);
    end;

    local procedure TransferQuoteToOrderLines(var SalesQuoteLine: Record "Sales Line"; var SalesQuoteHeader: Record "Sales Header"; var SalesOrderLine: Record "Sales Line"; var SalesOrderHeader: Record "Sales Header"; Customer: Record Customer)
    var
        ATOLink: Record "Assemble-to-Order Link";
        PrepmtMgt: Codeunit "Prepayment Mgt.";
        SalesLineReserve: Codeunit "Sales Line-Reserve";
        IsHandled: Boolean;
    begin
        SalesQuoteLine.Reset();
        SalesQuoteLine.SetRange("Document Type", SalesQuoteHeader."Document Type");
        SalesQuoteLine.SetRange("Document No.", SalesQuoteHeader."No.");
        OnTransferQuoteToOrderLinesOnAfterSetFilters(SalesQuoteLine, SalesQuoteHeader);
        if SalesQuoteLine.FindSet() then
            repeat
                IsHandled := false;
                OnBeforeTransferQuoteLineToOrderLineLoop(SalesQuoteLine, SalesQuoteHeader, SalesOrderHeader, IsHandled);
                if not IsHandled then begin
                    SalesOrderLine := SalesQuoteLine;
                    SalesOrderLine."Document Type" := SalesOrderHeader."Document Type";
                    SalesOrderLine."Document No." := SalesOrderHeader."No.";
                    SalesOrderLine."Shortcut Dimension 1 Code" := SalesQuoteLine."Shortcut Dimension 1 Code";
                    SalesOrderLine."Shortcut Dimension 2 Code" := SalesQuoteLine."Shortcut Dimension 2 Code";
                    SalesOrderLine."Dimension Set ID" := SalesQuoteLine."Dimension Set ID";
                    SalesOrderLine."Transaction Type" := SalesOrderHeader."Transaction Type";
                    OnTransferQuoteToOrderLinesOnBeforeUpdatePrepaymentPct(SalesQuoteLine, SalesQuoteHeader, SalesOrderLine, SalesOrderHeader, Customer);
                    if Customer."Prepayment %" <> 0 then
                        SalesOrderLine."Prepayment %" := Customer."Prepayment %";
                    PrepmtMgt.SetSalesPrepaymentPct(SalesOrderLine, SalesOrderHeader."Posting Date");
                    SalesOrderLine.Validate("Prepayment %");
                    IsHandled := false;
                    OnTransferQuoteToOrderLinesOnBeforeDefaultDeferralCode(SalesOrderLine, SalesOrderHeader, SalesQuoteLine, IsHandled);
                    if not IsHandled then
                        if SalesOrderLine."No." <> '' then
                            SalesOrderLine.DefaultDeferralCode();
                    OnBeforeInsertSalesOrderLine(SalesOrderLine, SalesOrderHeader, SalesQuoteLine, SalesQuoteHeader);
                    SalesOrderLine.Insert();
                    OnAfterInsertSalesOrderLine(SalesOrderLine, SalesOrderHeader, SalesQuoteLine, SalesQuoteHeader);
                    ATOLink.MakeAsmOrderLinkedToSalesOrderLine(SalesQuoteLine, SalesOrderLine);
                    OnTransferQuoteToOrderLinesOnAfterATOLinkMakeAsmOrderLinkedToSalesOrderLine(SalesQuoteLine, SalesOrderLine);
                    SalesLineReserve.TransferSaleLineToSalesLine(
                      SalesQuoteLine, SalesOrderLine, SalesQuoteLine."Outstanding Qty. (Base)");
                    SalesLineReserve.VerifyQuantity(SalesOrderLine, SalesQuoteLine);
                    if SalesOrderLine.Reserve = SalesOrderLine.Reserve::Always then
                        SalesOrderLine.AutoReserve();
                    OnTransferQuoteToOrderLinesOnAfterSalesOrderLineReserve(SalesOrderLine, SalesQuoteLine);
                end;
            until SalesQuoteLine.Next() = 0;
        OnAfterTransferQuoteToOrderLines(SalesQuoteLine, SalesQuoteHeader);
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterFilterOpportunityForQuote(var Opportunity: Record Opportunity; SalesHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterTransferQuoteToOrderLines(var SalesQuoteLine: Record "Sales Line"; var SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateSalesHeader(var SalesHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckInProgressOpportunities(Opp: Record Opportunity; var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeleteSalesQuote(var QuoteSalesHeader: Record "Sales Header"; var OrderSalesHeader: Record "Sales Header"; var IsHandled: Boolean; var SalesQuoteLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertSalesOrderHeader(var SalesOrderHeader: Record "Sales Header"; var SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifySalesOrderHeader(var SalesOrderHeader: Record "Sales Header"; SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertSalesOrderLine(var SalesOrderLine: Record "Sales Line"; SalesOrderHeader: Record "Sales Header"; SalesQuoteLine: Record "Sales Line"; SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertSalesOrderHeader(var SalesOrderHeader: Record "Sales Header"; SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertAllSalesOrderLines(var SalesOrderLine: Record "Sales Line"; SalesQuoteHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterMoveWonLostOpportunity(var SalesQuoteHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header"; var Opportunity: Record Opportunity)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterOnRun(var SalesHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignItemChargesOnAfterItemChargeAssgntSalesSetFilters(var ItemChargeAssgntSales: Record "Item Charge Assignment (Sales)"; FromDocType: Enum "Sales Document Type"; FromDocNo: Code[20]; ToDocType: Enum "Sales Document Type"; ToDocNo: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeArchiveSalesQuote(var SalesQuoteHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAssignItemCharges(FromDocType: Option; FromDocNo: Code[20]; ToDocType: Option; ToDocNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyApprovalEntryQuoteToOrder(var QuoteSalesHeader: Record "Sales Header"; var OrderSalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertSalesOrderLine(var SalesOrderLine: Record "Sales Line"; SalesOrderHeader: Record "Sales Header"; SalesQuoteLine: Record "Sales Line"; SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnRun(var SalesHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTempOpportunityEntryInsert(var TempOpportunityEntry: Record "Opportunity Entry" temporary; var SalesHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTransferQuoteLineToOrderLineLoop(var SalesQuoteLine: Record "Sales Line"; var SalesQuoteHeader: Record "Sales Header"; var SalesOrderHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCheckInProgressOpportunitiesOnBeforeRunCloseOpportunityPage(var TempOpportunityEntry: Record "Opportunity Entry" temporary; Opp: Record Opportunity; var SalesHeader: Record "Sales Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferQuoteToOrderLinesOnAfterSetFilters(var SalesQuoteLine: Record "Sales Line"; var SalesQuoteHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateSalesHeader(var SalesOrderHeader: Record "Sales Header"; SalesHeader: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRunOnAfterSalesQuoteLineDeleteAll(var SalesHeaderRec: Record "Sales Header"; SalesOrderHeader: Record "Sales Header"; SalesQuoteLine: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferQuoteToOrderLinesOnBeforeUpdatePrepaymentPct(var SalesQuoteLine: Record "Sales Line"; var SalesQuoteHeader: Record "Sales Header"; var SalesOrderLine: Record "Sales Line"; var SalesOrderHeader: Record "Sales Header"; var Customer: Record Customer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferQuoteToOrderLinesOnBeforeDefaultDeferralCode(var SalesLineOrder: Record "Sales Line"; var SalesHeaderOrder: Record "Sales Header"; var SalesLineQuote: Record "Sales Line"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferQuoteToOrderLinesOnAfterATOLinkMakeAsmOrderLinkedToSalesOrderLine(var SalesLineQuote: Record "Sales Line"; var SalesLineOrder: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateSalesHeaderOnBeforeSalesOrderLineLockTable(var SalesHeaderOrder: Record "Sales Header"; var SalesHeaderQuote: Record "Sales Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeMoveWonLostOpportunites(var QuoteSalesHeader: Record "Sales Header"; var OrderSalesHeader: Record "Sales Header"; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnTransferQuoteToOrderLinesOnAfterSalesOrderLineReserve(var SalesLineOrder: Record "Sales Line"; SalesLineQuote: Record "Sales Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRunOnAfterCalcAmountIncludingVAT(var SalesHeader: Record "Sales Header")
    begin
    end;
}