Codeunit 74 Purch.-Get Receipt, source in 29

Source29

src/Layers/W1/BaseApp/Purchases/Document/PurchGetReceipt.Codeunit.al635 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.Purchases.Document;

using Microsoft.Finance.Currency;
using Microsoft.Foundation.Attachment;
using Microsoft.Foundation.UOM;
using Microsoft.Purchases.History;
using Microsoft.Purchases.Setup;

codeunit 74 "Purch.-Get Receipt"
{
    TableNo = "Purchase Line";

    trigger OnRun()
    begin
        CheckHeader(Rec);

        PurchRcptLine.SetCurrentKey("Pay-to Vendor No.");
        PurchRcptLine.SetRange("Pay-to Vendor No.", PurchHeader."Pay-to Vendor No.");
        PurchRcptLine.SetRange("Buy-from Vendor No.", PurchHeader."Buy-from Vendor No.");
        PurchRcptLine.SetFilter("Qty. Rcd. Not Invoiced", '<>0');
        PurchRcptLine.SetRange("Currency Code", PurchHeader."Currency Code");

        OnAfterPurchRcptLineSetFilters(PurchRcptLine, PurchHeader);

        GetReceipts.SetTableView(PurchRcptLine);
        GetReceipts.LookupMode := true;
        GetReceipts.SetPurchHeader(PurchHeader);
        GetReceipts.RunModal();
    end;

    var
#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'The %1 on the %2 %3 and the %4 %5 must be the same.';
#pragma warning restore AA0470
#pragma warning restore AA0074
        PurchHeader: Record "Purchase Header";
        PurchLine: Record "Purchase Line";
        TempPurchaseLine: Record "Purchase Line" temporary;
        PurchRcptHeader: Record "Purch. Rcpt. Header";
        PurchRcptLine: Record "Purch. Rcpt. Line";
        UOMMgt: Codeunit "Unit of Measure Management";
        GetReceipts: Page "Get Receipt Lines";
        LineListHasAttachments: Dictionary of [Code[20], Boolean];

    procedure CreateInvLines(var PurchRcptLine2: Record "Purch. Rcpt. Line")
    var
        TransferLine: Boolean;
        PrepmtAmtToDeductRounding: Decimal;
        IsHandled: Boolean;
        ShowDifferentPayToVendMsg: Boolean;
        OrderNoList: List of [Code[20]];
    begin
        IsHandled := false;
        OnBeforeCreateInvLines(PurchRcptLine2, TransferLine, IsHandled);
        if not IsHandled then begin
            TempPurchaseLine.DeleteAll();

            PurchRcptLine2.SetFilter("Qty. Rcd. Not Invoiced", '<>0');
            OnCreateInvLinesOnBeforeFind(PurchRcptLine2, PurchHeader);
            if PurchRcptLine2.Find('-') then begin
                PurchLine.LockTable();
                PurchLine.SetRange("Document Type", PurchHeader."Document Type");
                PurchLine.SetRange("Document No.", PurchHeader."No.");
                PurchLine."Document Type" := PurchHeader."Document Type";
                PurchLine."Document No." := PurchHeader."No.";

                OnBeforeInsertLines(PurchHeader, PurchLine);

                repeat
                    IsHandled := false;
                    OnCreateInvLinesOnBeforeInsertLineIteration(PurchRcptLine2, PurchRcptHeader, PurchHeader, PurchLine, TransferLine, IsHandled);
                    if not IsHandled then
                        if PurchRcptHeader."No." <> PurchRcptLine2."Document No." then begin
                            PurchRcptHeader.Get(PurchRcptLine2."Document No.");
                            TransferLine := true;
                            if PurchRcptHeader."Currency Code" <> PurchHeader."Currency Code" then begin
                                Message(
                                  Text000,
                                  PurchHeader.FieldCaption("Currency Code"),
                                  PurchHeader.TableCaption(), PurchHeader."No.",
                                  PurchRcptHeader.TableCaption(), PurchRcptHeader."No.");
                                TransferLine := false;
                            end;
                            ShowDifferentPayToVendMsg := PurchRcptHeader."Pay-to Vendor No." <> PurchHeader."Pay-to Vendor No.";
                            OnCreateInvLinesOnAfterCalcShowNotSameVendorsMessage(PurchHeader, PurchRcptHeader, TransferLine, ShowDifferentPayToVendMsg);
                            if ShowDifferentPayToVendMsg then begin
                                Message(
                                  Text000,
                                  PurchHeader.FieldCaption("Pay-to Vendor No."),
                                  PurchHeader.TableCaption(), PurchHeader."No.",
                                  PurchRcptHeader.TableCaption(), PurchRcptHeader."No.");
                                TransferLine := false;
                            end;
                            OnBeforeTransferLineToPurchaseDoc(PurchRcptHeader, PurchRcptLine2, PurchHeader, TransferLine);
                        end;
                    InsertInvoiceLineFromReceiptLine(PurchRcptLine2, TransferLine, PrepmtAmtToDeductRounding);
                    if PurchRcptLine2."Order No." <> '' then
                        if not OrderNoList.Contains(PurchRcptLine2."Order No.") then
                            OrderNoList.Add(PurchRcptLine2."Order No.");
                until PurchRcptLine2.Next() = 0;

                UpdateItemChargeLines();

                AdjustPrepmtAmtToDeductRoundingOrderLineWise(PrepmtAmtToDeductRounding, PurchHeader);

                if PurchLine.Find() then;

                OnAfterInsertLines(PurchHeader);

                CalcInvoiceDiscount(PurchLine);
                OnAfterCalcInvoiceDiscount(PurchHeader);

                if TransferLine then
                    AdjustPrepmtAmtToDeductRounding(PurchLine, PrepmtAmtToDeductRounding);
                CopyDocumentAttachments(OrderNoList, PurchHeader);
            end;
        end;

        OnAfterCreateInvLines(PurchHeader, PurchLine);
    end;

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

        PurchHeader.Get(PurchaseLine."Document Type", PurchaseLine."Document No.");
        PurchHeader.TestField("Document Type", PurchHeader."Document Type"::Invoice);
        PurchHeader.TestStatusOpen();
    end;

    local procedure InsertInvoiceLineFromReceiptLine(var PurchRcptLine2: Record "Purch. Rcpt. Line"; TransferLine: Boolean; var PrepmtAmtToDeductRounding: Decimal)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeInsertInvoiceLineFromReceiptLine(PurchRcptHeader, PurchRcptLine2, PurchHeader, TransferLine, PrepmtAmtToDeductRounding, IsHandled);
        if IsHandled then
            exit;

        if TransferLine then begin
            PurchRcptLine := PurchRcptLine2;
            CheckPurchRcptLineVATBusPostingGroup(PurchRcptLine, PurchHeader);
            OnInsertInvoiceLineFromReceiptLineOnBeforeInsertInvLine(PurchRcptLine, PurchLine);
            PurchRcptLine.InsertInvLineFromRcptLine(PurchLine);
            OnInsertInvoiceLineFromRcptLineOnBeforeCalcUpdatePrepmtAmt(PurchRcptLine);
            CalcUpdatePrepmtAmtToDeductRounding(PurchRcptLine, PurchLine, PrepmtAmtToDeductRounding);
            CopyDocumentAttachments(PurchRcptLine, PurchLine);
        end;
        OnAfterInsertInvoiceLineFromReceiptLine(PurchRcptLine, PurchLine, PurchRcptLine2, TransferLine);
    end;

    procedure SetPurchHeader(var PurchHeader2: Record "Purchase Header")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetPurchHeader(PurchHeader, PurchHeader2, IsHandled);
        if IsHandled then
            exit;

        PurchHeader.Get(PurchHeader2."Document Type", PurchHeader2."No.");
        PurchHeader.TestField("Document Type", PurchHeader."Document Type"::Invoice);
    end;

    local procedure UpdateItemChargeLines()
    var
        PurchRcptLineLocal: Record "Purch. Rcpt. Line";
        PurchaseLineChargeItemUpdate: Record "Purchase Line";
    begin
        PurchaseLineChargeItemUpdate.SetRange("Document Type", PurchLine."Document Type");
        PurchaseLineChargeItemUpdate.SetRange("Document No.", PurchLine."Document No.");
        PurchaseLineChargeItemUpdate.SetRange(Type, PurchaseLineChargeItemUpdate.Type::"Charge (Item)");
        if PurchaseLineChargeItemUpdate.FindSet() then
            repeat
                if PurchRcptLineLocal.Get(
                    PurchaseLineChargeItemUpdate."Receipt No.", PurchaseLineChargeItemUpdate."Receipt Line No.")
                then
                    GetItemChargeAssgnt(PurchRcptLineLocal, PurchaseLineChargeItemUpdate."Qty. to Invoice");
            until PurchaseLineChargeItemUpdate.Next() = 0;

        if PurchLine.Find() then;
    end;

    procedure GetItemChargeAssgnt(var PurchRcptLine: Record "Purch. Rcpt. Line"; QtyToInvoice: Decimal)
    var
        PurchOrderLine: Record "Purchase Line";
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetItemChargeAssgnt(PurchRcptLine, QtyToInvoice, IsHandled);
        if IsHandled then
            exit;

        if not PurchOrderLine.Get(PurchOrderLine."Document Type"::Order, PurchRcptLine."Order No.", PurchRcptLine."Order Line No.") then
            exit;

        ItemChargeAssgntPurch.LockTable();
        ItemChargeAssgntPurch.Reset();
        ItemChargeAssgntPurch.SetRange("Document Type", PurchOrderLine."Document Type");
        ItemChargeAssgntPurch.SetRange("Document No.", PurchOrderLine."Document No.");
        ItemChargeAssgntPurch.SetRange("Document Line No.", PurchOrderLine."Line No.");
        ItemChargeAssgntPurch.CalcSums("Qty. to Assign");
        if ItemChargeAssgntPurch."Qty. to Assign" <> 0 then
            CopyItemChargeAssgnt(
              PurchOrderLine, PurchRcptLine, ItemChargeAssgntPurch."Qty. to Assign", QtyToInvoice / ItemChargeAssgntPurch."Qty. to Assign");
    end;

    local procedure CopyItemChargeAssgnt(PurchOrderLine: Record "Purchase Line"; PurchRcptLine: Record "Purch. Rcpt. Line"; QtyToAssign: Decimal; QtyFactor: Decimal)
    var
        PurchRcptLine2: Record "Purch. Rcpt. Line";
        PurchLine2: Record "Purchase Line";
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        Currency: Record Currency;
        InsertChargeAssgnt: Boolean;
        LineQtyToAssign: Decimal;
    begin
        ItemChargeAssgntPurch.SetRange("Document Type", PurchOrderLine."Document Type");
        ItemChargeAssgntPurch.SetRange("Document No.", PurchOrderLine."Document No.");
        ItemChargeAssgntPurch.SetRange("Document Line No.", PurchOrderLine."Line No.");
        if ItemChargeAssgntPurch.FindSet() then
            repeat
                if ItemChargeAssgntPurch."Qty. to Assign" <> 0 then begin
                    ItemChargeAssgntPurch2 := ItemChargeAssgntPurch;
                    ItemChargeAssgntPurch2."Qty. to Assign" :=
                      Round(QtyFactor * ItemChargeAssgntPurch2."Qty. to Assign", UOMMgt.QtyRndPrecision());
                    ItemChargeAssgntPurch2.Validate("Qty. to Handle", ItemChargeAssgntPurch2."Qty. to Assign");
                    PurchLine2.SetRange("Receipt No.", PurchRcptLine."Document No.");
                    PurchLine2.SetRange("Receipt Line No.", PurchRcptLine."Line No.");
                    PurchLine2.SetAutoCalcFields("Qty. to Assign");
                    if PurchLine2.Find('-') then
                        repeat
                            InsertChargeAssgnt := PurchLine2."Qty. to Assign" <> PurchLine2.Quantity;
                        until (PurchLine2.Next() = 0) or InsertChargeAssgnt;

                    if InsertChargeAssgnt then begin
                        ItemChargeAssgntPurch2."Document Type" := PurchLine2."Document Type";
                        ItemChargeAssgntPurch2."Document No." := PurchLine2."Document No.";
                        ItemChargeAssgntPurch2."Document Line No." := PurchLine2."Line No.";
                        ItemChargeAssgntPurch2."Qty. Assigned" := 0;
                        LineQtyToAssign :=
                          ItemChargeAssgntPurch2."Qty. to Assign" - GetQtyAssignedInNewLine(ItemChargeAssgntPurch2);
                        InsertChargeAssgnt := LineQtyToAssign <> 0;
                        if InsertChargeAssgnt then begin
                            if Abs(QtyToAssign) < Abs(LineQtyToAssign) then
                                ItemChargeAssgntPurch2."Qty. to Assign" := QtyToAssign;
                            if Abs(PurchLine2.Quantity - PurchLine2."Qty. to Assign") <
                               Abs(LineQtyToAssign)
                            then
                                ItemChargeAssgntPurch2."Qty. to Assign" :=
                                  PurchLine2.Quantity - PurchLine2."Qty. to Assign";
                            ItemChargeAssgntPurch2.Validate("Unit Cost");
                            if ItemChargeAssgntPurch."Qty. to Assign" <> 0 then begin
                                GetItemChargeAssgntCurrency(Currency, ItemChargeAssgntPurch2);
                                ItemChargeAssgntPurch2."Amount to Assign" :=
                                    Round(
                                        ItemChargeAssgntPurch2."Qty. to Assign" / ItemChargeAssgntPurch."Qty. to Assign" *
                                        ItemChargeAssgntPurch."Amount to Assign",
                                        Currency."Amount Rounding Precision");
                            end;
                            if ItemChargeAssgntPurch."Qty. to Handle" <> 0 then begin
                                GetItemChargeAssgntCurrency(Currency, ItemChargeAssgntPurch2);
                                ItemChargeAssgntPurch2."Amount to Handle" :=
                                    Round(
                                        ItemChargeAssgntPurch2."Qty. to Handle" / ItemChargeAssgntPurch."Qty. to Handle" *
                                        ItemChargeAssgntPurch."Amount to Handle",
                                        Currency."Amount Rounding Precision");
                            end;

                            if ItemChargeAssgntPurch2."Applies-to Doc. Type" = PurchOrderLine."Document Type" then begin
                                ItemChargeAssgntPurch2."Applies-to Doc. Type" := PurchLine2."Document Type";
                                ItemChargeAssgntPurch2."Applies-to Doc. No." := PurchLine2."Document No.";
                                SetReceiptPurchLineFilters(PurchRcptLine2, ItemChargeAssgntPurch, PurchLine2);
                                if PurchRcptLine2.FindFirst() then begin
                                    PurchLine2.SetCurrentKey("Document Type", "Receipt No.", "Receipt Line No.");
                                    PurchLine2.SetRange("Document Type", PurchLine2."Document Type"::Invoice);
                                    PurchLine2.SetRange("Receipt No.", PurchRcptLine2."Document No.");
                                    PurchLine2.SetRange("Receipt Line No.", PurchRcptLine2."Line No.");
                                    OnCopyItemChargeAssgntOnBeforeFindPurchLine2(PurchLine2, ItemChargeAssgntPurch2, PurchRcptLine);
                                    if PurchLine2.FindFirst() and (PurchLine2.Quantity <> 0) then begin
                                        OnCopyItemChargeAssgntOnAfterFindPurchLine2(PurchLine2, ItemChargeAssgntPurch2);
                                        ItemChargeAssgntPurch2."Applies-to Doc. Line No." := PurchLine2."Line No.";
                                    end else
                                        InsertChargeAssgnt := false;
                                end else
                                    InsertChargeAssgnt := false;
                            end;
                        end;
                    end;

                    if InsertChargeAssgnt and (ItemChargeAssgntPurch2."Qty. to Assign" <> 0) then begin
                        ItemChargeAssgntPurch2.Insert();
                        QtyToAssign := QtyToAssign - ItemChargeAssgntPurch2."Qty. to Assign";
                    end;
                end;
            until ItemChargeAssgntPurch.Next() = 0;
    end;

    local procedure SetReceiptPurchLineFilters(var PurchRcptLine2: Record "Purch. Rcpt. Line"; var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var PurchLine2: Record "Purchase Line")
    begin
        PurchRcptLine2.SetCurrentKey("Order No.", "Order Line No.");
        PurchRcptLine2.SetRange("Order No.", ItemChargeAssgntPurch."Applies-to Doc. No.");
        PurchRcptLine2.SetRange("Order Line No.", ItemChargeAssgntPurch."Applies-to Doc. Line No.");
        PurchRcptLine2.SetRange(Correction, false);
        PurchRcptLine2.SetFilter(Quantity, '<>0');
        if (PurchLine2."Receipt No." <> '') then
            if CheckPurchRcptLine(PurchLine2) then
                PurchRcptLine2.SetRange("Document No.", PurchLine2."Receipt No.");
    end;

    local procedure CheckPurchRcptLine(var PurchLine2: Record "Purchase Line"): Boolean
    var
        PurchRcptLine2: Record "Purch. Rcpt. Line";
    begin
        if PurchLine2."Receipt No." = '' then
            exit;
        PurchRcptLine2.SetRange("Document No.", PurchLine2."Receipt No.");
        PurchRcptLine2.SetRange(Type, PurchRcptLine2.Type::Item);
        PurchRcptLine2.SetFilter(Quantity, '<>0');
        if not PurchRcptLine2.IsEmpty() then
            exit(true);
    end;

    local procedure GetQtyAssignedInNewLine(ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"): Decimal
    begin
        ItemChargeAssgntPurch.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch.SetRange("Applies-to Doc. Type", ItemChargeAssgntPurch."Applies-to Doc. Type");
        ItemChargeAssgntPurch.SetRange("Applies-to Doc. No.", ItemChargeAssgntPurch."Applies-to Doc. No.");
        ItemChargeAssgntPurch.SetRange("Applies-to Doc. Line No.", ItemChargeAssgntPurch."Applies-to Doc. Line No.");
        ItemChargeAssgntPurch.CalcSums("Qty. to Assign");
        exit(ItemChargeAssgntPurch."Qty. to Assign");
    end;

    local procedure CalcInvoiceDiscount(var PurchLine: Record "Purchase Line")
    var
        PurchSetup: Record "Purchases & Payables Setup";
        PurchCalcDiscount: Codeunit "Purch.-Calc.Discount";
    begin
        PurchSetup.Get();
        if PurchSetup."Calc. Inv. Discount" then
            PurchCalcDiscount.CalculateInvoiceDiscountOnLine(PurchLine);
    end;

    local procedure CalcUpdatePrepmtAmtToDeductRounding(PurchRcptLine: Record "Purch. Rcpt. Line"; PurchaseLine: Record "Purchase Line"; var RoundingAmount: Decimal)
    var
        PurchOrderLine: Record "Purchase Line";
        Fraction: Decimal;
        FractionAmount: Decimal;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcUpdatePrepmtAmtToDeductRounding(PurchRcptLine, PurchaseLine, RoundingAmount, IsHandled);
        if IsHandled then
            exit;

        if (PurchaseLine."Prepayment %" > 0) and (PurchaseLine."Prepayment %" < 100) and
           (PurchaseLine."Document Type" = PurchaseLine."Document Type"::Invoice)
        then begin
            PurchOrderLine.Get(PurchOrderLine."Document Type"::Order, PurchRcptLine."Order No.", PurchRcptLine."Order Line No.");
            if (PurchOrderLine.Quantity - PurchOrderLine."Quantity Invoiced") <> 0 then begin
                Fraction := (PurchRcptline.Quantity - PurchRcptLine."Quantity Invoiced") / (PurchOrderLine.Quantity - PurchOrderLine."Quantity Invoiced");
                FractionAmount := Fraction * (PurchOrderLine."Prepmt. Amt. Inv." - PurchOrderLine."Prepmt Amt Deducted");
                RoundingAmount += PurchaseLine."Prepmt Amt to Deduct" - FractionAmount;
                if (PurchaseLine."Prepmt Amt to Deduct" - FractionAmount) <> 0 then
                    InsertTempPurchaseLine(PurchRcptLine, PurchOrderLine, PurchaseLine, FractionAmount);
            end else
                RoundingAmount := 0;
        end;
    end;

    local procedure AdjustPrepmtAmtToDeductRounding(var PurchaseLine: Record "Purchase Line"; RoundingAmount: Decimal)
    begin
        if Round(RoundingAmount) <> 0 then begin
            PurchaseLine."Prepmt Amt to Deduct" -= Round(RoundingAmount);
            PurchaseLine.Modify();
        end;
    end;

    local procedure CheckPurchRcptLineVATBusPostingGroup(PurchRcptLine: Record "Purch. Rcpt. Line"; PurchHeader: Record "Purchase Header")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeTestPurchRcptLineVATBusPostingGroup(PurchRcptLine, PurchHeader, IsHandled);
        if IsHandled then
            exit;

        PurchRcptLine.TestField("VAT Bus. Posting Group", PurchHeader."VAT Bus. Posting Group");
    end;

    procedure GetPurchOrderInvoices(var TempPurchInvHeader: Record "Purch. Inv. Header" temporary; OrderNo: Code[20])
    var
        PurchInvHeader: Record "Purch. Inv. Header";
        PurchInvoicesByOrder: Query "Purchase Invoices By Order";
    begin
        TempPurchInvHeader.Reset();
        TempPurchInvHeader.DeleteAll();

        PurchInvoicesByOrder.SetRange(Order_No_, OrderNo);
        PurchInvoicesByOrder.SetFilter(Quantity, '<>0');
        PurchInvoicesByOrder.Open();

        while PurchInvoicesByOrder.Read() do begin
            PurchInvHeader.Get(PurchInvoicesByOrder.Document_No_);
            TempPurchInvHeader := PurchInvHeader;
            TempPurchInvHeader.Insert();
        end;
    end;

    local procedure CopyDocumentAttachments(var PurchRcptLine2: Record "Purch. Rcpt. Line"; var PurchaseLine: Record "Purchase Line")
    var
        OrderPurchaseLine: Record "Purchase Line";
        DocumentAttachmentMgmt: Codeunit "Document Attachment Mgmt";
    begin
        if (PurchRcptLine2."Order No." = '') or (PurchRcptLine2."Order Line No." = 0) then
            exit;
        if not AnyLineHasAttachments(PurchRcptLine2."Order No.") then
            exit;
        OrderPurchaseLine.ReadIsolation := IsolationLevel::ReadCommitted;
        OrderPurchaseLine.SetLoadFields("Document Type", "Document No.", "Line No.");
        if OrderPurchaseLine.Get(OrderPurchaseLine."Document Type"::Order, PurchRcptLine2."Order No.", PurchRcptLine2."Order Line No.") then
            DocumentAttachmentMgmt.CopyAttachments(OrderPurchaseLine, PurchaseLine);
    end;

    local procedure CopyDocumentAttachments(OrderNoList: List of [Code[20]]; var PurchaseHeader: Record "Purchase Header")
    var
        OrderPurchaseHeader: Record "Purchase Header";
        DocumentAttachmentMgmt: Codeunit "Document Attachment Mgmt";
        OrderNo: Code[20];
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCopyDocumentAttachments(OrderNoList, PurchaseHeader, IsHandled);
        if IsHandled then
            exit;

        OrderPurchaseHeader.ReadIsolation := IsolationLevel::ReadCommitted;
        OrderPurchaseHeader.SetLoadFields("Document Type", "No.");
        foreach OrderNo in OrderNoList do
            if OrderHasAttachments(OrderNo) then
                if OrderPurchaseHeader.Get(OrderPurchaseHeader."Document Type"::Order, OrderNo) then
                    DocumentAttachmentMgmt.CopyAttachments(OrderPurchaseHeader, PurchaseHeader);
    end;

    local procedure OrderHasAttachments(DocNo: Code[20]): boolean
    begin
        exit(EntityHasAttachments(DocNo, Database::"Purchase Header"));
    end;

    local procedure AnyLineHasAttachments(DocNo: Code[20]): boolean
    begin
        if not LineListHasAttachments.ContainsKey(DocNo) then
            LineListHasAttachments.Add(DocNo, EntityHasAttachments(DocNo, Database::"Purchase Line"));
        exit(LineListHasAttachments.Get(DocNo));
    end;

    local procedure EntityHasAttachments(DocNo: Code[20]; TableNo: Integer): boolean
    var
        DocumentAttachment: Record "Document Attachment";
    begin
        DocumentAttachment.ReadIsolation := IsolationLevel::ReadUncommitted;
        DocumentAttachment.SetRange("Table ID", TableNo);
        DocumentAttachment.SetRange("Document Type", DocumentAttachment."Document Type"::Order);
        DocumentAttachment.SetRange("No.", DocNo);
        exit(not DocumentAttachment.IsEmpty());
    end;

    local procedure InsertTempPurchaseLine(PurchRcptLine: Record "Purch. Rcpt. Line"; PurchOrderLine: Record "Purchase Line"; PurchaseLine: Record "Purchase Line"; FractionAmount: Decimal)
    begin
        if not TempPurchaseLine.Get(TempPurchaseLine."Document Type"::Order, PurchRcptLine."Order No.", PurchRcptLine."Order Line No.") then begin
            TempPurchaseLine := PurchOrderLine;
            TempPurchaseLine.Amount := PurchaseLine."Prepmt Amt to Deduct" - FractionAmount;
            TempPurchaseLine."Receipt No." := PurchRcptLine."Document No.";
            TempPurchaseLine."Receipt Line No." := PurchRcptLine."Line No.";
            TempPurchaseLine.Insert();
        end else begin
            TempPurchaseLine.Amount += PurchaseLine."Prepmt Amt to Deduct" - FractionAmount;
            TempPurchaseLine."Receipt No." := PurchRcptLine."Document No.";
            TempPurchaseLine."Receipt Line No." := PurchRcptLine."Line No.";
            TempPurchaseLine.Modify();
        end;
    end;

    local procedure AdjustPrepmtAmtToDeductRoundingOrderLineWise(var PrepmtAmtToDeductRounding: Decimal; PurchaseHeader: Record "Purchase Header")
    var
        PurchaseLine: Record "Purchase Line";
    begin
        TempPurchaseLine.Reset();
        if TempPurchaseLine.FindSet() then
            repeat
                PurchaseLine.SetRange("Document Type", PurchaseHeader."Document Type");
                PurchaseLine.SetRange("Document No.", PurchaseHeader."No.");
                PurchaseLine.SetRange("Receipt No.", TempPurchaseLine."Receipt No.");
                PurchaseLine.SetRange("Receipt Line No.", TempPurchaseLine."Receipt Line No.");
                if PurchaseLine.FindFirst() then begin
                    AdjustPrepmtAmtToDeductRounding(PurchaseLine, TempPurchaseLine.Amount);
                    PrepmtAmtToDeductRounding -= TempPurchaseLine.Amount;
                end;
            until TempPurchaseLine.Next() = 0;
    end;

    local procedure GetItemChargeAssgntCurrency(var Currency: Record Currency; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        PurchLine: Record "Purchase Line";
    begin
        PurchLine.Get(ItemChargeAssgntPurch."Document Type", ItemChargeAssgntPurch."Document No.", ItemChargeAssgntPurch."Document Line No.");
        if not Currency.Get(PurchLine."Currency Code") then
            Currency.InitRoundingPrecision();
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcInvoiceDiscount(var PurchaseHeader: Record "Purchase Header")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnAfterInsertInvoiceLineFromReceiptLine(var PurchRcptLine: Record "Purch. Rcpt. Line"; var PurchLine: Record "Purchase Line"; PurchRcptLine2: Record "Purch. Rcpt. Line"; TransferLine: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPurchRcptLineSetFilters(var PurchRcptLine: Record "Purch. Rcpt. Line"; PurchaseHeader: Record "Purchase Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcUpdatePrepmtAmtToDeductRounding(PurchRcptLine: Record "Purch. Rcpt. Line"; PurchaseLine: Record "Purchase Line"; var RoundingAmount: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateInvLines(var PurchRcptLine: Record "Purch. Rcpt. Line"; var TransferLine: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertLines(var PurchaseHeader: Record "Purchase Header"; var PurchLine: Record "Purchase Line")
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertInvoiceLineFromReceiptLine(PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchRcptLine2: Record "Purch. Rcpt. Line"; PurchHeader: Record "Purchase Header"; TransferLine: Boolean; var PrepmtAmtToDeductRounding: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetItemChargeAssgnt(var PurchRcptLine: Record "Purch. Rcpt. Line"; QtyToInvoice: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetPurchHeader(var PurchHeader: Record "Purchase Header"; PurchHeader2: Record "Purchase Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTransferLineToPurchaseDoc(var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchRcptLine: Record "Purch. Rcpt. Line"; var PurchaseHeader: Record "Purchase Header"; var TransferLine: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateInvLinesOnBeforeFind(var PurchRcptLine: Record "Purch. Rcpt. Line"; var PurchHeader: Record "Purchase Header")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateInvLinesOnAfterCalcShowNotSameVendorsMessage(PurchHeader: Record "Purchase Header"; PurchRcptHeader: Record "Purch. Rcpt. Header"; var TransferLine: Boolean; var ShowDifferentPayToVendMsg: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeTestPurchRcptLineVATBusPostingGroup(PurchRcptLine: Record "Purch. Rcpt. Line"; PurchHeader: Record "Purchase Header"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertInvoiceLineFromRcptLineOnBeforeCalcUpdatePrepmtAmt(var PurchRcptLine: Record "Purch. Rcpt. Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertInvoiceLineFromReceiptLineOnBeforeInsertInvLine(var PurchRcptLine: Record "Purch. Rcpt. Line"; var PurchLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCopyItemChargeAssgntOnAfterFindPurchLine2(var PurchLine2: Record "Purchase Line"; var ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCopyItemChargeAssgntOnBeforeFindPurchLine2(var PurchLine2: Record "Purchase Line"; var ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)"; PurchRcptLine: Record "Purch. Rcpt. Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCopyDocumentAttachments(var OrderNoList: List of [Code[20]]; var PurchaseHeader: Record "Purchase Header"; var IsHandled: Boolean)
    begin
    end;

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

    [IntegrationEvent(false, false)]
    local procedure OnCreateInvLinesOnBeforeInsertLineIteration(var PurchRcptLine2: Record "Purch. Rcpt. Line"; var PurchRcptHeader: Record "Purch. Rcpt. Header"; var PurchaseHeader: Record "Purchase Header"; var PurchaseLine: Record "Purchase Line"; var TransferLine: Boolean; var IsHandled: Boolean)
    begin
    end;
}