Codeunit 5923 Service-Quote to Order

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

Procedures, 1Events, 22

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Service/Document/ServiceQuotetoOrder.Codeunit.al415 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.Foundation.NoSeries;
using Microsoft.Inventory.Availability;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Service.Comment;
using Microsoft.Service.Loaner;
using Microsoft.Service.Maintenance;
using Microsoft.Service.Setup;
using System.Automation;
using System.Utilities;

codeunit 5923 "Service-Quote to Order"
{
    Permissions = TableData "Loaner Entry" = rm,
                  TableData "Service Order Allocation" = rimd;
    TableNo = "Service Header";

    trigger OnRun()
    var
        ServQuoteLine: Record "Service Line";
        Customer: Record Customer;
        ServCheckCreditLimit: Codeunit "Serv. Check Credit Limit";
        DocType: Enum "Sales Document Type";
        SkipDelete: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeRun(Rec, IsHandled);
        if IsHandled then
            exit;

        ServOrderHeader := Rec;

        ServMgtSetup.Get();

        ServOrderHeader."Document Type" := Rec."Document Type"::Order;
        OnRunOnAfterGetServMgtSetup(ServOrderHeader, Rec);
        Customer.Get(Rec."Customer No.");
        IsHandled := false;
        OnRunOnBeforeCheckBlockedCustOnDocs(ServOrderHeader, Rec, IsHandled);
        if not IsHandled then begin
            Customer.CheckBlockedCustOnDocs(Customer, DocType::Quote, false, false);
            if Rec."Customer No." <> Rec."Bill-to Customer No." then begin
                Customer.Get(Rec."Bill-to Customer No.");
                Customer.CheckBlockedCustOnDocs(Customer, DocType::Quote, false, false);
            end;
        end;

        Rec.ValidateSalesPersonOnServiceHeader(Rec, true, false);

        ServCheckCreditLimit.ServiceHeaderCheck(ServOrderHeader);

        CheckServiceItemBlockedForAll(Rec);
        CheckItemServiceBlocked(Rec);

        TransferQuoteToOrderLines(ServQuoteLine, Rec, ServOrderLine, ServOrderHeader);

        MakeOrder(Rec);

        SkipDelete := false;
        OnBeforeServHeaderDelete(Rec, SkipDelete);
        if not SkipDelete then
            Rec.Delete(true);
    end;

    var
        ServMgtSetup: Record "Service Mgt. Setup";
        RepairStatus: Record "Repair Status";
        ServItemLine: Record "Service Item Line";
        ServItemLine2: Record "Service Item Line";
        ServOrderLine: Record "Service Line";
        ServOrderLine2: Record "Service Line";
        ServOrderAlloc: Record "Service Order Allocation";
        ServOrderHeader: Record "Service Header";
        LoanerEntry: Record "Loaner Entry";
        ServCommentLine: Record "Service Comment Line";
        ServCommentLine2: Record "Service Comment Line";
        ServLogMgt: Codeunit ServLogManagement;
        ServiceLineReserve: Codeunit "Service Line-Reserve";

    local procedure TestNoSeries()
    begin
        ServMgtSetup.TestField("Service Order Nos.");
    end;

    local procedure GetNoSeriesCode() NoSeriesCode: Code[20]
    begin
        NoSeriesCode := ServMgtSetup."Service Order Nos.";

        OnAfterGetNoSeriesCode(ServOrderHeader, ServMgtSetup, NoSeriesCode);
    end;

    procedure ReturnOrderNo(): Code[20]
    begin
        exit(ServOrderHeader."No.");
    end;

    local procedure InsertServHeader(var ServiceHeaderOrder: Record "Service Header"; ServiceHeaderQuote: Record "Service Header")
    begin
        OnBeforeInsertServHeader(ServiceHeaderOrder, ServiceHeaderQuote);

        ServiceHeaderOrder.Insert(true);
        ServiceHeaderOrder."Document Date" := ServiceHeaderQuote."Document Date";
        ServiceHeaderOrder."Shortcut Dimension 1 Code" := ServiceHeaderQuote."Shortcut Dimension 1 Code";
        ServiceHeaderOrder."Shortcut Dimension 2 Code" := ServiceHeaderQuote."Shortcut Dimension 2 Code";
        ServiceHeaderOrder."Dimension Set ID" := ServiceHeaderQuote."Dimension Set ID";
        ServiceHeaderOrder."Location Code" := ServiceHeaderQuote."Location Code";
        ServiceHeaderQuote.CalcFields("Work Description");
        ServiceHeaderOrder."Work Description" := ServiceHeaderQuote."Work Description";
        OnBeforeServiceHeaderOrderModify(ServiceHeaderOrder, ServiceHeaderQuote);
        ServiceHeaderOrder.Modify();

        OnAfterInsertServHeader(ServiceHeaderOrder, ServiceHeaderQuote);
    end;

    local procedure MakeOrder(ServiceHeader: Record "Service Header")
    var
        ApprovalsMgmt: Codeunit "Approvals Mgmt.";
        RecordLinkManagement: Codeunit "Record Link Management";
        NoSeries: Codeunit "No. Series";
        SkipDelete: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeMakeOrder(ServiceHeader, ServOrderHeader, IsHandled);
        if IsHandled then
            exit;

        ServOrderHeader."No." := '';
        ServOrderHeader."No. Printed" := 0;
        ServOrderHeader.Validate(Status, ServOrderHeader.Status::Pending);
        ServOrderHeader."Order Date" := WorkDate();
        ServOrderHeader."Order Time" := Time;
        ServOrderHeader."Actual Response Time (Hours)" := 0;
        ServOrderHeader."Service Time (Hours)" := 0;
        ServOrderHeader."Starting Date" := 0D;
        ServOrderHeader."Starting Time" := 0T;
        ServOrderHeader."Finishing Date" := 0D;
        ServOrderHeader."Finishing Time" := 0T;
        ServOrderHeader."Posting Date" := 0D;

        IsHandled := false;
        OnMakeOrderOnBeforeTestNoSeries(ServOrderHeader, IsHandled);
        if not IsHandled then begin
            TestNoSeries();
            ServOrderHeader."No. Series" := GetNoSeriesCode();
            ServOrderHeader."No." := NoSeries.GetNextNo(ServOrderHeader."No. Series");

            ServOrderHeader."Quote No." := ServiceHeader."No.";
        end;
        RecordLinkManagement.CopyLinks(ServiceHeader, ServOrderHeader);
        InsertServHeader(ServOrderHeader, ServiceHeader);

        ServCommentLine.Reset();
        ServCommentLine.SetRange("Table Name", ServCommentLine."Table Name"::"Service Header");
        ServCommentLine.SetRange("Table Subtype", ServiceHeader."Document Type");
        ServCommentLine.SetRange("No.", ServiceHeader."No.");
        ServCommentLine.SetRange("Table Line No.", 0);
        if ServCommentLine.Find('-') then
            repeat
                ServCommentLine2 := ServCommentLine;
                ServCommentLine2."Table Subtype" := ServOrderHeader."Document Type";
                ServCommentLine2."No." := ServOrderHeader."No.";
                OnBeforeServCommentLineInsert(ServCommentLine2, ServiceHeader, ServOrderHeader);
                ServCommentLine2.Insert();
            until ServCommentLine.Next() = 0;

        ServOrderAlloc.Reset();
        ServOrderAlloc.SetCurrentKey("Document Type", "Document No.", Status);
        ServOrderAlloc.SetRange("Document Type", ServiceHeader."Document Type");
        ServOrderAlloc.SetRange("Document No.", ServiceHeader."No.");
        ServOrderAlloc.SetRange(Status, ServOrderAlloc.Status::Active);
        while ServOrderAlloc.FindFirst() do begin
            ServOrderAlloc."Document Type" := ServOrderHeader."Document Type";
            ServOrderAlloc."Document No." := ServOrderHeader."No.";
            ServOrderAlloc."Service Started" := true;
            ServOrderAlloc.Status := ServOrderAlloc.Status::"Reallocation Needed";
            ServOrderAlloc.Modify();
        end;

        ServItemLine.Reset();
        ServItemLine.SetRange("Document Type", ServiceHeader."Document Type");
        ServItemLine.SetRange("Document No.", ServiceHeader."No.");
        if ServItemLine.Find('-') then
            repeat
                ServItemLine2 := ServItemLine;
                ServItemLine2."Document Type" := ServOrderHeader."Document Type";
                ServItemLine2."Document No." := ServOrderHeader."No.";
                ServItemLine2."Starting Date" := 0D;
                ServItemLine2."Starting Time" := 0T;
                ServItemLine2."Actual Response Time (Hours)" := 0;
                ServItemLine2."Finishing Date" := 0D;
                ServItemLine2."Finishing Time" := 0T;
                RepairStatus.Reset();
                RepairStatus.SetRange(Initial, true);
                if RepairStatus.FindFirst() then
                    ServItemLine2."Repair Status Code" := RepairStatus.Code;
                OnBeforeServiceItemLineInsert(ServItemLine2, ServItemLine, ServOrderHeader);
                ServItemLine2.Insert(true);
                OnAfterInsertServiceLine(ServItemLine2, ServItemLine);
            until ServItemLine.Next() = 0;

        ServOrderHeader.UpdateResponseDateTime();

        LoanerEntry.Reset();
        LoanerEntry.SetCurrentKey("Document Type", "Document No.");
        LoanerEntry.SetRange("Document Type", ServiceHeader."Document Type".AsInteger() + 1);
        LoanerEntry.SetRange("Document No.", ServiceHeader."No.");
        while LoanerEntry.FindFirst() do begin
            LoanerEntry."Document Type" := LoanerEntry.GetDocTypeFromServDocType(ServOrderHeader."Document Type");
            LoanerEntry."Document No." := ServOrderHeader."No.";
            LoanerEntry.Modify();
        end;

        ServCommentLine.Reset();
        ServCommentLine.SetRange("Table Name", ServCommentLine."Table Name"::"Service Header");
        ServCommentLine.SetRange("Table Subtype", ServiceHeader."Document Type");
        ServCommentLine.SetRange("No.", ServiceHeader."No.");
        ServCommentLine.SetFilter("Table Line No.", '>%1', 0);
        if ServCommentLine.Find('-') then
            repeat
                ServCommentLine2 := ServCommentLine;
                ServCommentLine2."Table Subtype" := ServOrderHeader."Document Type";
                ServCommentLine2."No." := ServOrderHeader."No.";
                OnMakeOrderOnBeforeServCommentLine2Insert(ServCommentLine2, ServCommentLine);
                ServCommentLine2.Insert();
            until ServCommentLine.Next() = 0;

        ServOrderLine.Reset();
        ServOrderLine.SetRange("Document Type", ServiceHeader."Document Type");
        ServOrderLine.SetRange("Document No.", ServiceHeader."No.");
        if ServOrderLine.Find('-') then
            repeat
                ServOrderLine2 := ServOrderLine;
                ServOrderLine2."Document Type" := ServOrderHeader."Document Type";
                ServOrderLine2."Document No." := ServOrderHeader."No.";
                ServOrderLine2."Posting Date" := ServOrderHeader."Posting Date";
                IsHandled := false;
                OnBeforeServOrderLineInsert(ServOrderLine2, ServOrderLine, ServOrderHeader, IsHandled);
                if not IsHandled then
                    ServOrderLine2.Insert();
                OnAfterServOrderLineInsert(ServOrderLine2, ServOrderLine);
                ServiceLineReserve.TransServLineToServLine(ServOrderLine, ServOrderLine2, ServOrderLine.Quantity);
            until ServOrderLine.Next() = 0;

        ServLogMgt.ServOrderQuoteChanged(ServOrderHeader, ServiceHeader);
        ApprovalsMgmt.CopyApprovalEntryQuoteToOrder(
            ServiceHeader.RecordId, ServOrderHeader."No.", ServOrderHeader.RecordId);

        SkipDelete := false;
        OnBeforeServLineDeleteAll(ServiceHeader, ServOrderHeader, SkipDelete);
        if not SkipDelete then
            ApprovalsMgmt.DeleteApprovalEntries(ServiceHeader.RecordId);
    end;

    local procedure TransferQuoteToOrderLines(var ServiceQuoteLine: Record "Service Line"; var ServiceQuoteHeader: Record "Service Header"; var ServiceOrderLine: Record "Service Line"; var ServiceOrderHeader: Record "Service Header")
    var
        ServItemCheckAvail: Codeunit "Serv. Item Check Avail.";
        IsHandled: Boolean;
    begin
        ServiceQuoteLine.Reset();
        ServiceQuoteLine.SetRange("Document Type", ServiceQuoteHeader."Document Type");
        ServiceQuoteLine.SetRange("Document No.", ServiceQuoteHeader."No.");
        ServiceQuoteLine.SetRange(Type, ServiceQuoteLine.Type::Item);
        ServiceQuoteLine.SetFilter("No.", '<>%1', '');
        OnTransferQuoteToOrderLinesOnAfterServiceQuoteLineSetFilters(ServiceQuoteLine);
        if ServiceQuoteLine.FindSet() then
            repeat
                IsHandled := false;
                OnBeforeTransferQuoteLineToOrderLineLoop(ServiceQuoteLine, ServiceQuoteHeader, ServiceOrderHeader, IsHandled, ServiceOrderLine, ServOrderLine);
                if not IsHandled then begin
                    ServiceOrderLine := ServiceQuoteLine;
                    ServiceLineReserve.TransServLineToServLine(
                      ServiceQuoteLine, ServiceOrderLine, ServiceQuoteLine."Outstanding Qty. (Base)");
                    ServiceOrderLine."Line No." := 0;
                    ServiceOrderLine.Validate("Reserved Qty. (Base)");
                    if GuiAllowed then
                        if ServItemCheckAvail.ServiceInvLineCheck(ServiceOrderLine) then
                            ServItemCheckAvail.RaiseUpdateInterruptedError();
                end;
            until ServiceQuoteLine.Next() = 0;
    end;

    local procedure CheckServiceItemBlockedForAll(ServiceQuoteHeader: Record "Service Header")
    var
        ServiceItemLine: Record "Service Item Line";
        ServOrderManagement: Codeunit ServOrderManagement;
    begin
        ServiceItemLine.SetLoadFields("Service Item No.");
        ServiceItemLine.SetRange("Document Type", ServiceQuoteHeader."Document Type");
        ServiceItemLine.SetRange("Document No.", ServiceQuoteHeader."No.");
        ServiceItemLine.SetFilter("Service Item No.", '<>%1', '');
        if ServiceItemLine.FindSet() then
            repeat
                ServOrderManagement.CheckServiceItemBlockedForAll(ServiceItemLine);
            until ServiceItemLine.Next() = 0;
    end;

    local procedure CheckItemServiceBlocked(ServiceQuoteHeader: Record "Service Header")
    var
        ServiceQuoteLine: Record "Service Line";
        ServOrderManagement: Codeunit ServOrderManagement;
    begin
        ServiceQuoteLine.SetLoadFields("No.", "Variant Code");
        ServiceQuoteLine.SetRange("Document Type", ServiceQuoteHeader."Document Type");
        ServiceQuoteLine.SetRange("Document No.", ServiceQuoteHeader."No.");
        ServiceQuoteLine.SetRange(Type, ServiceQuoteLine.Type::Item);
        ServiceQuoteLine.SetFilter("No.", '<>%1', '');
        if ServiceQuoteLine.FindSet() then
            repeat
                ServOrderManagement.CheckItemServiceBlocked(ServiceQuoteLine);
            until ServiceQuoteLine.Next() = 0;
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertServHeader(var ServiceHeaderOrder: Record "Service Header"; ServiceHeaderQuote: Record "Service Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnAfterServOrderLineInsert(var ServiceOrderLine2: Record "Service Line"; ServiceOrderLine: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertServHeader(var ServiceHeaderOrder: Record "Service Header"; ServiceHeaderQuote: Record "Service Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeServCommentLineInsert(var ServiceCommentLine: Record "Service Comment Line"; ServiceQuoteHeader: Record "Service Header"; ServiceOrderHeader: Record "Service Header")
    begin
    end;

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeServOrderLineInsert(var ServiceOrderLine2: Record "Service Line"; ServiceOrderLine: Record "Service Line"; ServOrderHeader: Record "Service Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeServiceHeaderOrderModify(var ServiceOrderHeader: Record "Service Header"; ServiceQuoteHeader: Record "Service Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTransferQuoteLineToOrderLineLoop(var ServiceQuoteLine: Record "Service Line"; var ServiceQuoteHeader: Record "Service Header"; var ServiceOrderHeader: Record "Service Header"; var IsHandled: Boolean; var ServiceOrderLine: Record "Service Line"; var ServiceOrderLineGlobal: Record "Service Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnMakeOrderOnBeforeServCommentLine2Insert(var ServiceCommentLine2: Record "Service Comment Line"; var ServiceCommentLine: Record "Service Comment Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnRunOnAfterGetServMgtSetup(var ServOrderHeader: Record "Service Header"; Rec: Record "Service Header")
    begin
    end;

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

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

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