Codeunit 5805 Item Charge Assgnt. (Purch.)

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

Procedures, 27Events, 45Obsolete, 4

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Purchases/Document/ItemChargeAssgntPurch.Codeunit.al1141 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.UOM;
using Microsoft.Inventory.Transfer;
using Microsoft.Purchases.History;
using Microsoft.Sales.History;

codeunit 5805 "Item Charge Assgnt. (Purch.)"
{
    Permissions = TableData "Purchase Header" = r,
                  TableData "Purchase Line" = r,
                  TableData "Purch. Rcpt. Line" = r,
                  TableData "Item Charge Assignment (Purch)" = rimd,
                  TableData "Return Shipment Line" = r;

    trigger OnRun()
    begin
    end;

    var
        UOMMgt: Codeunit "Unit of Measure Management";

        SuggestItemChargeMsg: Label 'Select how to distribute the assigned item charge when the document has more than one line of type Item.';
        EquallyTok: Label 'Equally';
        ByAmountTok: Label 'By Amount';
        ByWeightTok: Label 'By Weight';
        ByVolumeTok: Label 'By Volume';
        ItemChargesNotAssignedErr: Label 'No item charges were assigned.';
        ItemChargeAssignedMenu4Lbl: Label '%1,%2,%3,%4', Locked = true;
        ItemChargeAssignedMenu3Lbl: Label '%1,%2,%3', Locked = true;

    procedure InsertItemChargeAssignment(ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; ApplToDocType: Enum "Purchase Applies-to Document Type"; ApplToDocNo2: Code[20]; ApplToDocLineNo2: Integer; ItemNo2: Code[20]; Description2: Text[100]; var NextLineNo: Integer)
    begin
        InsertItemChargeAssignmentWithValues(
          ItemChargeAssgntPurch, ApplToDocType, ApplToDocNo2, ApplToDocLineNo2, ItemNo2, Description2, 0, 0, NextLineNo);
    end;

    procedure InsertItemChargeAssignmentWithValues(FromItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; ApplToDocType: Enum "Purchase Applies-to Document Type"; FromApplToDocNo: Code[20]; FromApplToDocLineNo: Integer; FromItemNo: Code[20]; FromDescription: Text[100]; QtyToAssign: Decimal; AmountToAssign: Decimal; var NextLineNo: Integer)
    var
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
    begin
        InsertItemChargeAssignmentWithValuesTo(
          FromItemChargeAssgntPurch, ApplToDocType, FromApplToDocNo, FromApplToDocLineNo, FromItemNo, FromDescription,
          QtyToAssign, AmountToAssign, NextLineNo, ItemChargeAssgntPurch);
    end;

    procedure InsertItemChargeAssignmentWithValuesTo(
        FromItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; ApplToDocType: Enum "Purchase Applies-to Document Type";
        FromApplToDocNo: Code[20]; FromApplToDocLineNo: Integer; FromItemNo: Code[20]; FromDescription: Text[100];
        QtyToAssign: Decimal; AmountToAssign: Decimal; var NextLineNo: Integer; var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeInsertItemChargeAssignmentWithValuesTo(FromItemChargeAssgntPurch, ItemChargeAssgntPurch, ApplToDocType, FromApplToDocNo, FromApplToDocLineNo, FromItemNo, FromDescription, NextLineNo, QtyToAssign, AmountToAssign, IsHandled);
        if IsHandled then
            exit;

        NextLineNo := NextLineNo + 10000;

        ItemChargeAssgntPurch."Document No." := FromItemChargeAssgntPurch."Document No.";
        ItemChargeAssgntPurch."Document Type" := FromItemChargeAssgntPurch."Document Type";
        ItemChargeAssgntPurch."Document Line No." := FromItemChargeAssgntPurch."Document Line No.";
        ItemChargeAssgntPurch."Item Charge No." := FromItemChargeAssgntPurch."Item Charge No.";
        ItemChargeAssgntPurch."Line No." := NextLineNo;
        ItemChargeAssgntPurch."Applies-to Doc. No." := FromApplToDocNo;
        ItemChargeAssgntPurch."Applies-to Doc. Type" := ApplToDocType;
        ItemChargeAssgntPurch."Applies-to Doc. Line No." := FromApplToDocLineNo;
        ItemChargeAssgntPurch."Item No." := FromItemNo;
        ItemChargeAssgntPurch.Description := FromDescription;
        ItemChargeAssgntPurch."Unit Cost" := FromItemChargeAssgntPurch."Unit Cost";
        if QtyToAssign <> 0 then begin
            ItemChargeAssgntPurch."Amount to Assign" := AmountToAssign;
            ItemChargeAssgntPurch.Validate("Qty. to Assign", QtyToAssign);
        end;
        OnBeforeInsertItemChargeAssgntWithAssignValues(ItemChargeAssgntPurch, FromItemChargeAssgntPurch);
        ItemChargeAssgntPurch.Insert();
    end;

    procedure Summarize(var TempToItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var ToItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
        TempToItemChargeAssignmentPurch.SetCurrentKey("Applies-to Doc. Type", "Applies-to Doc. No.", "Applies-to Doc. Line No.");
        if TempToItemChargeAssignmentPurch.FindSet() then
            repeat
                if (TempToItemChargeAssignmentPurch."Item Charge No." <> ToItemChargeAssignmentPurch."Item Charge No.") or
                   (TempToItemChargeAssignmentPurch."Applies-to Doc. No." <> ToItemChargeAssignmentPurch."Applies-to Doc. No.") or
                   (TempToItemChargeAssignmentPurch."Applies-to Doc. Line No." <> ToItemChargeAssignmentPurch."Applies-to Doc. Line No.")
                then begin
                    if ToItemChargeAssignmentPurch."Line No." <> 0 then
                        ToItemChargeAssignmentPurch.Insert();
                    ToItemChargeAssignmentPurch := TempToItemChargeAssignmentPurch;
                    ToItemChargeAssignmentPurch."Qty. to Assign" := 0;
                    ToItemChargeAssignmentPurch."Amount to Assign" := 0;
                    ToItemChargeAssignmentPurch."Qty. to Handle" := 0;
                    ToItemChargeAssignmentPurch."Amount to Handle" := 0;
                end;
                ToItemChargeAssignmentPurch."Qty. to Assign" += TempToItemChargeAssignmentPurch."Qty. to Assign";
                ToItemChargeAssignmentPurch."Amount to Assign" += TempToItemChargeAssignmentPurch."Amount to Assign";
                ToItemChargeAssignmentPurch."Qty. to Handle" += TempToItemChargeAssignmentPurch."Qty. to Handle";
                ToItemChargeAssignmentPurch."Amount to Handle" += TempToItemChargeAssignmentPurch."Amount to Handle";
            until TempToItemChargeAssignmentPurch.Next() = 0;
        if ToItemChargeAssignmentPurch."Line No." <> 0 then
            ToItemChargeAssignmentPurch.Insert();
    end;

    procedure CreateDocChargeAssgnt(LastItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; ReceiptNo: Code[20])
    var
        FromPurchLine: Record "Purchase Line";
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
        NextLineNo: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateDocChargeAssgn(LastItemChargeAssgntPurch, FromPurchLine, ReceiptNo, IsHandled);
        if not IsHandled then begin
            FromPurchLine.SetRange("Document Type", LastItemChargeAssgntPurch."Document Type");
            FromPurchLine.SetRange("Document No.", LastItemChargeAssgntPurch."Document No.");
            FromPurchLine.SetRange(Type, FromPurchLine.Type::Item);
            OnCreateDocChargeAssgntOnAfterFromPurchLineSetFilters(LastItemChargeAssgntPurch, FromPurchLine);
            if FromPurchLine.Find('-') then begin
                NextLineNo := LastItemChargeAssgntPurch."Line No.";
                ItemChargeAssgntPurch.Reset();
                ItemChargeAssgntPurch.SetRange("Document Type", LastItemChargeAssgntPurch."Document Type");
                ItemChargeAssgntPurch.SetRange("Document No.", LastItemChargeAssgntPurch."Document No.");
                ItemChargeAssgntPurch.SetRange("Document Line No.", LastItemChargeAssgntPurch."Document Line No.");
                ItemChargeAssgntPurch.SetRange("Applies-to Doc. No.", LastItemChargeAssgntPurch."Document No.");
                repeat
                    if (FromPurchLine.Quantity <> 0) and
                       (FromPurchLine.Quantity <> FromPurchLine."Quantity Invoiced") and
                       (not FromPurchLine.IsWorkCenter()) and
                       ((ReceiptNo = '') or (FromPurchLine."Receipt No." = ReceiptNo)) and
                       FromPurchLine."Allow Item Charge Assignment"
                    then begin
                        ItemChargeAssgntPurch.SetRange("Applies-to Doc. Line No.", FromPurchLine."Line No.");
                        if not ItemChargeAssgntPurch.FindFirst() then
                            InsertItemChargeAssignment(
                                LastItemChargeAssgntPurch, FromPurchLine."Document Type",
                                FromPurchLine."Document No.", FromPurchLine."Line No.",
                                FromPurchLine."No.", FromPurchLine.Description, NextLineNo);
                    end;
                until FromPurchLine.Next() = 0;
            end;
        end;

        OnAfterCreateDocChargeAssgnt(LastItemChargeAssgntPurch, ReceiptNo);
    end;

    procedure CreateRcptChargeAssgnt(var FromPurchRcptLine: Record "Purch. Rcpt. Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        NextLine: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateRcptChargeAssgnt(FromPurchRcptLine, ItemChargeAssgntPurch, IsHandled);
        if IsHandled then
            exit;

        CheckFromPurchRcptLineWorkCenter(FromPurchRcptLine);
        NextLine := ItemChargeAssgntPurch."Line No.";
        ItemChargeAssgntPurch2.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch2.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch2.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch2.SetRange(
          "Applies-to Doc. Type", ItemChargeAssgntPurch2."Applies-to Doc. Type"::Receipt);
        repeat
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. No.", FromPurchRcptLine."Document No.");
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. Line No.", FromPurchRcptLine."Line No.");
            if not ItemChargeAssgntPurch2.FindFirst() then
                InsertItemChargeAssignment(
                    ItemChargeAssgntPurch, ItemChargeAssgntPurch2."Applies-to Doc. Type"::Receipt,
                    FromPurchRcptLine."Document No.", FromPurchRcptLine."Line No.",
                    FromPurchRcptLine."No.", FromPurchRcptLine.Description, NextLine);
        until FromPurchRcptLine.Next() = 0;
    end;

    local procedure CheckFromPurchRcptLineWorkCenter(FromPurchRcptLine: Record "Purch. Rcpt. Line")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckFromPurchRcptLineWorkCenter(FromPurchRcptLine, IsHandled);
        if IsHandled then
            exit;

        FromPurchRcptLine.TestWorkCenterNo();
    end;

    procedure CreateTransferRcptChargeAssgnt(var FromTransRcptLine: Record "Transfer Receipt Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        NextLine: Integer;
    begin
        NextLine := ItemChargeAssgntPurch."Line No.";
        ItemChargeAssgntPurch2.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch2.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch2.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch2.SetRange(
          "Applies-to Doc. Type", ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Transfer Receipt");
        repeat
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. No.", FromTransRcptLine."Document No.");
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. Line No.", FromTransRcptLine."Line No.");
            if not ItemChargeAssgntPurch2.FindFirst() then
                InsertItemChargeAssignment(
                    ItemChargeAssgntPurch, ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Transfer Receipt",
                    FromTransRcptLine."Document No.", FromTransRcptLine."Line No.",
                    FromTransRcptLine."Item No.", FromTransRcptLine.Description, NextLine);
        until FromTransRcptLine.Next() = 0;
    end;

    procedure CreateShptChargeAssgnt(var FromReturnShptLine: Record "Return Shipment Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        NextLine: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateShptChargeAssgnt(FromReturnShptLine, ItemChargeAssgntPurch, IsHandled);
        if not IsHandled then
            FromReturnShptLine.TestField("Job No.", '');
        NextLine := ItemChargeAssgntPurch."Line No.";
        ItemChargeAssgntPurch2.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch2.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch2.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch2.SetRange(
          "Applies-to Doc. Type", ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Return Shipment");
        repeat
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. No.", FromReturnShptLine."Document No.");
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. Line No.", FromReturnShptLine."Line No.");
            if not ItemChargeAssgntPurch2.FindFirst() then
                InsertItemChargeAssignment(
                    ItemChargeAssgntPurch, ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Return Shipment",
                    FromReturnShptLine."Document No.", FromReturnShptLine."Line No.",
                    FromReturnShptLine."No.", FromReturnShptLine.Description, NextLine);
        until FromReturnShptLine.Next() = 0;
    end;

    procedure CreateSalesShptChargeAssgnt(var FromSalesShptLine: Record "Sales Shipment Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        NextLine: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateSalesShptChargeAssgnt(FromSalesShptLine, ItemChargeAssgntPurch, IsHandled);
        if not IsHandled then
            FromSalesShptLine.TestField("Job No.", '');
        NextLine := ItemChargeAssgntPurch."Line No.";
        ItemChargeAssgntPurch2.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch2.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch2.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch2.SetRange(
          "Applies-to Doc. Type", ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Sales Shipment");
        repeat
            IsHandled := false;
            OnCreateSalesShptChargeAssgntOnBeforeInsertItemChargeAssignment(FromSalesShptLine, ItemChargeAssgntPurch, NextLine, IsHandled);
            if not IsHandled then begin
                ItemChargeAssgntPurch2.SetRange("Applies-to Doc. No.", FromSalesShptLine."Document No.");
                ItemChargeAssgntPurch2.SetRange("Applies-to Doc. Line No.", FromSalesShptLine."Line No.");
                if not ItemChargeAssgntPurch2.FindFirst() then
                    InsertItemChargeAssignment(
                        ItemChargeAssgntPurch, ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Sales Shipment",
                        FromSalesShptLine."Document No.", FromSalesShptLine."Line No.",
                        FromSalesShptLine."No.", FromSalesShptLine.Description, NextLine);
            end;
        until FromSalesShptLine.Next() = 0;
    end;

    procedure CreateReturnRcptChargeAssgnt(var FromReturnRcptLine: Record "Return Receipt Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)";
        NextLine: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCreateReturnRcptChargeAssgnt(FromReturnRcptLine, ItemChargeAssgntPurch, IsHandled);
        if not IsHandled then
            FromReturnRcptLine.TestField("Job No.", '');
        NextLine := ItemChargeAssgntPurch."Line No.";
        ItemChargeAssgntPurch2.SetRange("Document Type", ItemChargeAssgntPurch."Document Type");
        ItemChargeAssgntPurch2.SetRange("Document No.", ItemChargeAssgntPurch."Document No.");
        ItemChargeAssgntPurch2.SetRange("Document Line No.", ItemChargeAssgntPurch."Document Line No.");
        ItemChargeAssgntPurch2.SetRange(
          "Applies-to Doc. Type", ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Return Receipt");
        repeat
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. No.", FromReturnRcptLine."Document No.");
            ItemChargeAssgntPurch2.SetRange("Applies-to Doc. Line No.", FromReturnRcptLine."Line No.");
            if not ItemChargeAssgntPurch2.FindFirst() then
                InsertItemChargeAssignment(
                    ItemChargeAssgntPurch, ItemChargeAssgntPurch2."Applies-to Doc. Type"::"Return Receipt",
                    FromReturnRcptLine."Document No.", FromReturnRcptLine."Line No.",
                    FromReturnRcptLine."No.", FromReturnRcptLine.Description, NextLine);
        until FromReturnRcptLine.Next() = 0;
    end;

    procedure SuggestAssgnt(PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal)
    begin
        SuggestAssgnt(PurchLine, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToAssign, TotalAmtToAssign)
    end;

    procedure SuggestAssgnt(PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal)
    var
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
        Selection: Integer;
        SelectionTxt: Text;
        SuggestItemChargeMenuTxt: Text;
        SuggestItemChargeMessageTxt: Text;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSuggestAssgnt(PurchLine, ItemChargeAssgntPurch, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToHandle, TotalAmtToHandle, Selection, SelectionTxt, SuggestItemChargeMenuTxt, SuggestItemChargeMessageTxt, IsHandled);
        if IsHandled then
            exit;

        PurchLine.TestField("Qty. to Invoice");
        ItemChargeAssgntPurch.SetRange("Document Type", PurchLine."Document Type");
        ItemChargeAssgntPurch.SetRange("Document No.", PurchLine."Document No.");
        ItemChargeAssgntPurch.SetRange("Document Line No.", PurchLine."Line No.");
        if ItemChargeAssgntPurch.IsEmpty() then
            exit;

        ItemChargeAssgntPurch.SetRange("Applies-to Doc. Type", ItemChargeAssgntPurch."Applies-to Doc. Type"::"Transfer Receipt");

        IsHandled := false;
        OnSuggestAssgntOnAfterItemChargeAssgntPurchSetFilters(ItemChargeAssgntPurch, PurchLine, TotalQtyToAssign, TotalAmtToAssign, IsHandled);
        if IsHandled then
            exit;

        Selection := 1;
        if ItemChargeAssgntPurch.IsEmpty() then
            SuggestItemChargeMenuTxt :=
              StrSubstNo(ItemChargeAssignedMenu4Lbl, AssignEquallyMenuText(), AssignByAmountMenuText(), AssignByWeightMenuText(), AssignByVolumeMenuText())
        else
            SuggestItemChargeMenuTxt :=
              StrSubstNo(ItemChargeAssignedMenu3Lbl, AssignEquallyMenuText(), AssignByWeightMenuText(), AssignByVolumeMenuText());
        ItemChargeAssgntPurch.SetRange("Applies-to Doc. Type");

        if ItemChargeAssgntPurch.Count > 1 then begin
            Selection := 2;
            SuggestItemChargeMessageTxt := SuggestItemChargeMsg;
            OnBeforeShowSuggestItemChargeAssignStrMenu(PurchLine, SuggestItemChargeMenuTxt, SuggestItemChargeMessageTxt, Selection);
            if SuggestItemChargeMenuTxt = '' then
                exit;
            if StrLen(DelChr(SuggestItemChargeMenuTxt, '=', DelChr(SuggestItemChargeMenuTxt, '=', ','))) > 1 then
                Selection := StrMenu(SuggestItemChargeMenuTxt, Selection, SuggestItemChargeMessageTxt)
            else
                Selection := 1;
        end;
        if Selection = 0 then
            exit;

        SelectionTxt := SelectStr(Selection, SuggestItemChargeMenuTxt);
        OnSuggestAssgntOnBeforeAssignItemCharges(PurchLine, ItemChargeAssgntPurch);
        AssignItemCharges(PurchLine, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToHandle, TotalAmtToHandle, SelectionTxt);
    end;

    procedure AssignItemCharges(PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; SelectedOptionValue: Integer)
    begin
        AssignItemCharges(PurchLine, TotalQtyToAssign, TotalAmtToAssign, GetSelectionText(SelectedOptionValue));
    end;

    local procedure GetSelectionText(OptionValue: Integer): Text
    var
        SuggestItemChargeMenuTxt: Text;
    begin
        SuggestItemChargeMenuTxt :=
            StrSubstNo(ItemChargeAssignedMenu4Lbl, AssignEquallyMenuText(), AssignByAmountMenuText(), AssignByWeightMenuText(), AssignByVolumeMenuText());
        exit(SelectStr(OptionValue + 1, SuggestItemChargeMenuTxt));
    end;

    procedure AssignItemCharges(PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; SelectionTxt: Text)
    begin
        AssignItemCharges(PurchLine, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToAssign, TotalAmtToAssign, SelectionTxt);
    end;

    procedure AssignItemCharges(PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal; SelectionTxt: Text)
    var
        Currency: Record Currency;
        PurchHeader: Record "Purchase Header";
        ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)";
        ItemChargesAssigned: Boolean;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAssignItemCharges(PurchLine, TotalQtyToAssign, TotalAmtToAssign, IsHandled, TotalQtyToHandle, TotalAmtToHandle, SelectionTxt);
        if IsHandled then
            exit;

        PurchLine.TestField("Qty. to Invoice");
        PurchHeader.Get(PurchLine."Document Type", PurchLine."Document No.");
        if not Currency.Get(PurchHeader."Currency Code") then
            Currency.InitRoundingPrecision();

        ItemChargeAssgntPurch.SetRange("Document Type", PurchLine."Document Type");
        ItemChargeAssgntPurch.SetRange("Document No.", PurchLine."Document No.");
        ItemChargeAssgntPurch.SetRange("Document Line No.", PurchLine."Line No.");

        if not ItemChargeAssgntPurch.IsEmpty() then begin
            ItemChargeAssgntPurch.ModifyAll("Amount to Assign", 0);
            ItemChargeAssgntPurch.ModifyAll("Qty. to Assign", 0);
            ItemChargeAssgntPurch.ModifyAll("Amount to Handle", 0);
            ItemChargeAssgntPurch.ModifyAll("Qty. to Handle", 0);
            OnAssignItemChargesFromLineOnAfterItemChargeAssignmentModifyAll(PurchLine, ItemChargeAssgntPurch);
            ItemChargeAssgntPurch.FindSet();

            case SelectionTxt of
                AssignEquallyMenuText():
                    AssignEqually(ItemChargeAssgntPurch, Currency, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToHandle, TotalAmtToHandle);
                AssignByAmountMenuText():
                    AssignByAmount(ItemChargeAssgntPurch, Currency, PurchHeader, TotalQtyToAssign, TotalAmtToAssign, TotalQtyToHandle, TotalAmtToHandle);
                AssignByWeightMenuText():
                    AssignByWeight(ItemChargeAssgntPurch, Currency, TotalQtyToAssign);
                AssignByVolumeMenuText():
                    AssignByVolume(ItemChargeAssgntPurch, Currency, TotalQtyToAssign);
                else begin
                    OnAssignItemCharges(
                      SelectionTxt, ItemChargeAssgntPurch, Currency, PurchHeader, TotalQtyToAssign, TotalAmtToAssign, ItemChargesAssigned);
                    if not ItemChargesAssigned then
                        Error(ItemChargesNotAssignedErr);
                end;
            end;
        end;
    end;

    procedure AssignEquallyMenuText(): Text
    begin
        exit(EquallyTok)
    end;

    procedure AssignByAmountMenuText(): Text
    begin
        exit(ByAmountTok)
    end;

    procedure AssignByWeightMenuText(): Text
    begin
        exit(ByWeightTok)
    end;

    procedure AssignByVolumeMenuText(): Text
    begin
        exit(ByVolumeTok)
    end;

    procedure ReverseItemChargeAssgnt(ItemChargeAssgnt: Record "Item Charge Assignment (Purch)"; CancelledQuantity: Decimal)
    begin
        if ItemChargeAssgnt."Qty. Assigned" = 0 then
            exit;

        ItemChargeAssgnt."Qty. Assigned" -= CancelledQuantity;
        ItemChargeAssgnt."Qty. to Assign" += CancelledQuantity;
        ItemChargeAssgnt.Validate("Qty. to Handle", ItemChargeAssgnt."Qty. to Assign");
        ItemChargeAssgnt.Modify();
    end;

    local procedure AssignEqually(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal)
    var
        TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary;
        RemainingNumOfLines: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAssignEqually(ItemChargeAssgntPurch, Currency, TotalQtyToAssign, TotalAmtToAssign, IsHandled);
        if IsHandled then
            exit;

        repeat
            if not ItemChargeAssgntPurch.PurchLineInvoiced() then begin
                TempItemChargeAssgntPurch := ItemChargeAssgntPurch;
                TempItemChargeAssgntPurch.Insert();
            end;
        until ItemChargeAssgntPurch.Next() = 0;

        if TempItemChargeAssgntPurch.FindSet(true) then begin
            RemainingNumOfLines := TempItemChargeAssgntPurch.Count();
            repeat
                ItemChargeAssgntPurch.Get(
                  TempItemChargeAssgntPurch."Document Type",
                  TempItemChargeAssgntPurch."Document No.",
                  TempItemChargeAssgntPurch."Document Line No.",
                  TempItemChargeAssgntPurch."Line No.");
                ItemChargeAssgntPurch."Qty. to Assign" := Round(TotalQtyToAssign / RemainingNumOfLines, UOMMgt.QtyRndPrecision());
                ItemChargeAssgntPurch."Amount to Assign" :=
                  Round(
                    ItemChargeAssgntPurch."Qty. to Assign" / TotalQtyToAssign * TotalAmtToAssign,
                    Currency."Amount Rounding Precision");
                ItemChargeAssgntPurch."Qty. to Handle" := ItemChargeAssgntPurch."Qty. to Assign";
                ItemChargeAssgntPurch."Amount to Handle" := ItemChargeAssgntPurch."Amount to Assign";
                OnAssignEquallyOnAfterAmountToAssignCalculated(ItemChargeAssgntPurch);
                TotalQtyToAssign -= ItemChargeAssgntPurch."Qty. to Assign";
                TotalAmtToAssign -= ItemChargeAssgntPurch."Amount to Assign";
                TotalQtyToHandle -= ItemChargeAssgntPurch."Qty. to Handle";
                TotalAmtToHandle -= ItemChargeAssgntPurch."Amount to Handle";
                RemainingNumOfLines := RemainingNumOfLines - 1;
                OnAssignEquallyOnBeforeItemChargeAssignmentPurchModify(ItemChargeAssgntPurch);
                ItemChargeAssgntPurch.Modify();
                OnAssignEquallyOnAfterItemChargeAssignmentPurchModify(ItemChargeAssgntPurch);
            until TempItemChargeAssgntPurch.Next() = 0;
        end;
        TempItemChargeAssgntPurch.DeleteAll();
    end;

    local procedure AssignByAmount(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; PurchHeader: Record "Purchase Header"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal)
    var
        TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary;
        PurchLine: Record "Purchase Line";
        PurchRcptLine: Record "Purch. Rcpt. Line";
        CurrExchRate: Record "Currency Exchange Rate";
        ReturnRcptLine: Record "Return Receipt Line";
        ReturnShptLine: Record "Return Shipment Line";
        SalesShptLine: Record "Sales Shipment Line";
        CurrencyCode: Code[10];
        TotalAppliesToDocLineAmount: Decimal;
    begin
        repeat
            if not ItemChargeAssgntPurch.PurchLineInvoiced() then begin
                TempItemChargeAssgntPurch := ItemChargeAssgntPurch;
                case ItemChargeAssgntPurch."Applies-to Doc. Type" of
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::Quote,
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::Order,
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::Invoice,
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Order",
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::"Credit Memo":
                        begin
                            GetPurchLineForItemChargeAssgntPurch(PurchLine, ItemChargeAssgntPurch);
                            TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                              Abs(PurchLine."Line Amount");
                        end;
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::Receipt:
                        begin
                            PurchRcptLine.Get(
                              ItemChargeAssgntPurch."Applies-to Doc. No.",
                              ItemChargeAssgntPurch."Applies-to Doc. Line No.");
                            CurrencyCode := PurchRcptLine.GetCurrencyCodeFromHeader();
                            if CurrencyCode = PurchHeader."Currency Code" then
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  Abs(PurchRcptLine."Item Charge Base Amount")
                            else
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    PurchHeader."Posting Date", CurrencyCode, PurchHeader."Currency Code",
                                    Abs(PurchRcptLine."Item Charge Base Amount"));
                        end;
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Shipment":
                        begin
                            ReturnShptLine.Get(
                              ItemChargeAssgntPurch."Applies-to Doc. No.",
                              ItemChargeAssgntPurch."Applies-to Doc. Line No.");
                            CurrencyCode := ReturnShptLine.GetCurrencyCode();
                            if CurrencyCode = PurchHeader."Currency Code" then
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  Abs(ReturnShptLine."Item Charge Base Amount")
                            else
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    PurchHeader."Posting Date", CurrencyCode, PurchHeader."Currency Code",
                                    Abs(ReturnShptLine."Item Charge Base Amount"));
                        end;
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::"Sales Shipment":
                        begin
                            SalesShptLine.Get(
                              ItemChargeAssgntPurch."Applies-to Doc. No.",
                              ItemChargeAssgntPurch."Applies-to Doc. Line No.");
                            CurrencyCode := SalesShptLine.GetCurrencyCode();
                            if CurrencyCode = PurchHeader."Currency Code" then
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  Abs(SalesShptLine."Item Charge Base Amount")
                            else
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    PurchHeader."Posting Date", CurrencyCode, PurchHeader."Currency Code",
                                    Abs(SalesShptLine."Item Charge Base Amount"));
                        end;
                    ItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Receipt":
                        begin
                            ReturnRcptLine.Get(
                              ItemChargeAssgntPurch."Applies-to Doc. No.",
                              ItemChargeAssgntPurch."Applies-to Doc. Line No.");
                            CurrencyCode := ReturnRcptLine.GetCurrencyCode();
                            if CurrencyCode = PurchHeader."Currency Code" then
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  Abs(ReturnRcptLine."Item Charge Base Amount")
                            else
                                TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" :=
                                  CurrExchRate.ExchangeAmtFCYToFCY(
                                    PurchHeader."Posting Date", CurrencyCode, PurchHeader."Currency Code",
                                    Abs(ReturnRcptLine."Item Charge Base Amount"));
                        end;
                end;
                OnAssignByAmountOnAfterAssignAppliesToDocLineAmount(ItemChargeAssgntPurch, TempItemChargeAssgntPurch, PurchHeader, TotalQtyToAssign, TotalAmtToAssign);
                if TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" <> 0 then
                    TempItemChargeAssgntPurch.Insert()
                else begin
                    ItemChargeAssgntPurch."Amount to Assign" := 0;
                    ItemChargeAssgntPurch."Qty. to Assign" := 0;
                    ItemChargeAssgntPurch."Amount to Handle" := 0;
                    ItemChargeAssgntPurch."Qty. to Handle" := 0;
                    ItemChargeAssgntPurch.Modify();
                end;
                TotalAppliesToDocLineAmount += TempItemChargeAssgntPurch."Applies-to Doc. Line Amount";
            end;
        until ItemChargeAssgntPurch.Next() = 0;

        if TempItemChargeAssgntPurch.FindSet(true) then
            repeat
                ItemChargeAssgntPurch.Get(
                  TempItemChargeAssgntPurch."Document Type",
                  TempItemChargeAssgntPurch."Document No.",
                  TempItemChargeAssgntPurch."Document Line No.",
                  TempItemChargeAssgntPurch."Line No.");
                if TotalQtyToAssign <> 0 then begin
                    ItemChargeAssgntPurch."Qty. to Assign" :=
                      Round(
                        TempItemChargeAssgntPurch."Applies-to Doc. Line Amount" / TotalAppliesToDocLineAmount * TotalQtyToAssign,
                        UOMMgt.QtyRndPrecision());
                    ItemChargeAssgntPurch."Amount to Assign" :=
                      Round(
                        ItemChargeAssgntPurch."Qty. to Assign" / TotalQtyToAssign * TotalAmtToAssign,
                        Currency."Amount Rounding Precision");
                    ItemChargeAssgntPurch."Qty. to Handle" := ItemChargeAssgntPurch."Qty. to Assign";
                    ItemChargeAssgntPurch."Amount to Handle" := ItemChargeAssgntPurch."Amount to Assign";
                    OnAssignByAmountOnAfterAmountToAssignCalculated(ItemChargeAssgntPurch, TempItemChargeAssgntPurch);
                    TotalQtyToAssign -= ItemChargeAssgntPurch."Qty. to Assign";
                    TotalAmtToAssign -= ItemChargeAssgntPurch."Amount to Assign";
                    TotalQtyToHandle -= ItemChargeAssgntPurch."Qty. to Handle";
                    TotalAmtToHandle -= ItemChargeAssgntPurch."Amount to Handle";
                    TotalAppliesToDocLineAmount -= TempItemChargeAssgntPurch."Applies-to Doc. Line Amount";
                    OnAssignByAmountOnBeforeItemChargeAssignmentPurchModify(ItemChargeAssgntPurch);
                    ItemChargeAssgntPurch.Modify();
                    OnAssignByAmountOnAfterItemChargeAssignmentPurchModify(ItemChargeAssgntPurch);
                end;
            until TempItemChargeAssgntPurch.Next() = 0;
        TempItemChargeAssgntPurch.DeleteAll();
    end;

    local procedure GetPurchLineForItemChargeAssgntPurch(var PurchaseLine: Record "Purchase Line"; var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetPurchLineForItemChargeAssgntPurch(PurchaseLine, ItemChargeAssgntPurch, IsHandled);
        if IsHandled then
            exit;

        PurchaseLine.Get(ItemChargeAssgntPurch."Applies-to Doc. Type", ItemChargeAssgntPurch."Applies-to Doc. No.", ItemChargeAssgntPurch."Applies-to Doc. Line No.");
    end;

    local procedure AssignByWeight(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; TotalQtyToAssign: Decimal)
    var
        TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary;
        LineAray: array[3] of Decimal;
        TotalGrossWeight: Decimal;
        QtyRemainder: Decimal;
        AmountRemainder: Decimal;
    begin
        repeat
            if not ItemChargeAssgntPurch.PurchLineInvoiced() then begin
                TempItemChargeAssgntPurch.Init();
                TempItemChargeAssgntPurch := ItemChargeAssgntPurch;
                TempItemChargeAssgntPurch.Insert();
                GetItemValues(TempItemChargeAssgntPurch, LineAray);
                TotalGrossWeight := TotalGrossWeight + (LineAray[2] * LineAray[1]);
            end;
        until ItemChargeAssgntPurch.Next() = 0;
        OnAssignByWeightOnAfterCalcTotalGrossWeight(ItemChargeAssgntPurch, TotalGrossWeight, TempItemChargeAssgntPurch);

        QtyRemainder := 0;
        AmountRemainder := 0;
        if TempItemChargeAssgntPurch.FindSet(true) then
            repeat
                GetItemValues(TempItemChargeAssgntPurch, LineAray);
                if TotalGrossWeight <> 0 then
                    TempItemChargeAssgntPurch."Qty. to Assign" :=
                      (TotalQtyToAssign * LineAray[2] * LineAray[1]) / TotalGrossWeight + QtyRemainder
                else
                    TempItemChargeAssgntPurch."Qty. to Assign" := 0;
                TempItemChargeAssgntPurch."Qty. to Handle" := TempItemChargeAssgntPurch."Qty. to Assign";
                AssignPurchItemCharge(ItemChargeAssgntPurch, TempItemChargeAssgntPurch, Currency, QtyRemainder, AmountRemainder);
            until TempItemChargeAssgntPurch.Next() = 0;
        OnAssignByWeightOnBeforeTempItemChargeAssgntPurchDelete(ItemChargeAssgntPurch, QtyRemainder, TotalQtyToAssign, Currency);
        TempItemChargeAssgntPurch.DeleteAll();
    end;

    local procedure AssignByVolume(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; TotalQtyToAssign: Decimal)
    var
        TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary;
        LineAray: array[3] of Decimal;
        TotalUnitVolume: Decimal;
        QtyRemainder: Decimal;
        AmountRemainder: Decimal;
    begin
        repeat
            if not ItemChargeAssgntPurch.PurchLineInvoiced() then begin
                TempItemChargeAssgntPurch.Init();
                TempItemChargeAssgntPurch := ItemChargeAssgntPurch;
                TempItemChargeAssgntPurch.Insert();
                GetItemValues(TempItemChargeAssgntPurch, LineAray);
                TotalUnitVolume := TotalUnitVolume + (LineAray[3] * LineAray[1]);
            end;
        until ItemChargeAssgntPurch.Next() = 0;
        OnAssignByVolumeOnAfterCalcTotalUnitVolume(ItemChargeAssgntPurch, TotalUnitVolume, TempItemChargeAssgntPurch);

        QtyRemainder := 0;
        if TempItemChargeAssgntPurch.FindSet(true) then
            repeat
                GetItemValues(TempItemChargeAssgntPurch, LineAray);
                if TotalUnitVolume <> 0 then
                    TempItemChargeAssgntPurch."Qty. to Assign" :=
                      (TotalQtyToAssign * LineAray[3] * LineAray[1]) / TotalUnitVolume + QtyRemainder
                else
                    TempItemChargeAssgntPurch."Qty. to Assign" := 0;
                TempItemChargeAssgntPurch."Qty. to Handle" := TempItemChargeAssgntPurch."Qty. to Assign";
                AssignPurchItemCharge(ItemChargeAssgntPurch, TempItemChargeAssgntPurch, Currency, QtyRemainder, AmountRemainder);
            until TempItemChargeAssgntPurch.Next() = 0;
        TempItemChargeAssgntPurch.DeleteAll();
    end;

    procedure AssignPurchItemCharge(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; ItemChargeAssgntPurch2: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; var QtyRemainder: Decimal; var AmountRemainder: Decimal)
    begin
        ItemChargeAssgntPurch.Get(
          ItemChargeAssgntPurch2."Document Type",
          ItemChargeAssgntPurch2."Document No.",
          ItemChargeAssgntPurch2."Document Line No.",
          ItemChargeAssgntPurch2."Line No.");
        ItemChargeAssgntPurch."Qty. to Assign" := Round(ItemChargeAssgntPurch2."Qty. to Assign", UOMMgt.QtyRndPrecision());
        ItemChargeAssgntPurch."Amount to Assign" :=
          ItemChargeAssgntPurch."Qty. to Assign" * ItemChargeAssgntPurch."Unit Cost" + AmountRemainder;
        AmountRemainder := ItemChargeAssgntPurch."Amount to Assign" -
          Round(ItemChargeAssgntPurch."Amount to Assign", Currency."Amount Rounding Precision");
        QtyRemainder := ItemChargeAssgntPurch2."Qty. to Assign" - ItemChargeAssgntPurch."Qty. to Assign";
        ItemChargeAssgntPurch."Amount to Assign" :=
          Round(ItemChargeAssgntPurch."Amount to Assign", Currency."Amount Rounding Precision");
        ItemChargeAssgntPurch."Qty. to Handle" := ItemChargeAssgntPurch."Qty. to Assign";
        ItemChargeAssgntPurch."Amount to Handle" := ItemChargeAssgntPurch."Amount to Assign";
        OnAssignPurchItemChargeOnBeforeItemChargeAssignmentPurchModify(ItemChargeAssgntPurch);
        ItemChargeAssgntPurch.Modify();
    end;

    procedure GetItemValues(TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    var
        PurchLine: Record "Purchase Line";
        PurchRcptLine: Record "Purch. Rcpt. Line";
        ReturnShptLine: Record "Return Shipment Line";
        TransferRcptLine: Record "Transfer Receipt Line";
        SalesShptLine: Record "Sales Shipment Line";
        ReturnRcptLine: Record "Return Receipt Line";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetItemValues(TempItemChargeAssgntPurch, DecimalArray, IsHandled);
        if not IsHandled then begin

            Clear(DecimalArray);
            case TempItemChargeAssgntPurch."Applies-to Doc. Type" of
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::Quote,
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::Order,
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::Invoice,
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Order",
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Credit Memo":
                    begin
                        PurchLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. Type", TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := PurchLine.Quantity;
                        DecimalArray[2] := PurchLine."Gross Weight";
                        DecimalArray[3] := PurchLine."Unit Volume";
                        OnGetItemValuesOnAfterGetPurchLine(PurchLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::Receipt:
                    begin
                        PurchRcptLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := PurchRcptLine.Quantity;
                        DecimalArray[2] := PurchRcptLine."Gross Weight";
                        DecimalArray[3] := PurchRcptLine."Unit Volume";
                        OnGetItemValuesOnAfterGetPurchRcptLine(PurchRcptLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Receipt":
                    begin
                        ReturnRcptLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := ReturnRcptLine.Quantity;
                        DecimalArray[2] := ReturnRcptLine."Gross Weight";
                        DecimalArray[3] := ReturnRcptLine."Unit Volume";
                        OnGetItemValuesOnAfterGetReturnRcptLine(ReturnRcptLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Return Shipment":
                    begin
                        ReturnShptLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := ReturnShptLine.Quantity;
                        DecimalArray[2] := ReturnShptLine."Gross Weight";
                        DecimalArray[3] := ReturnShptLine."Unit Volume";
                        OnGetItemValuesOnAfterGetReturnShptLine(ReturnShptLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Transfer Receipt":
                    begin
                        TransferRcptLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := TransferRcptLine.Quantity;
                        DecimalArray[2] := TransferRcptLine."Gross Weight";
                        DecimalArray[3] := TransferRcptLine."Unit Volume";
                        OnGetItemValuesOnAfterGetTransferRcptLine(TransferRcptLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
                TempItemChargeAssgntPurch."Applies-to Doc. Type"::"Sales Shipment":
                    begin
                        SalesShptLine.Get(TempItemChargeAssgntPurch."Applies-to Doc. No.", TempItemChargeAssgntPurch."Applies-to Doc. Line No.");
                        DecimalArray[1] := SalesShptLine.Quantity;
                        DecimalArray[2] := SalesShptLine."Gross Weight";
                        DecimalArray[3] := SalesShptLine."Unit Volume";
                        OnGetItemValuesOnAfterGetSalesShptLine(SalesShptLine, TempItemChargeAssgntPurch, DecimalArray);
                    end;
            end;
        end;

        OnAfterGetItemValues(TempItemChargeAssgntPurch, DecimalArray);
    end;

    procedure SuggestAssgntFromLine(var FromItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    var
        Currency: Record Currency;
        PurchHeader: Record "Purchase Header";
        ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)";
        TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary;
        TotalAmountToAssign: Decimal;
        TotalQtyToAssign: Decimal;
        TotalAmountToHandle: Decimal;
        TotalQtyToHandle: Decimal;
        ItemChargeAssgntLineAmt: Decimal;
        ItemChargeAssgntLineQty: Decimal;
    begin
        PurchHeader.Get(FromItemChargeAssignmentPurch."Document Type", FromItemChargeAssignmentPurch."Document No.");
        if not Currency.Get(PurchHeader."Currency Code") then
            Currency.InitRoundingPrecision();

        GetItemChargeAssgntLineAmounts(
          FromItemChargeAssignmentPurch."Document Type", FromItemChargeAssignmentPurch."Document No.", FromItemChargeAssignmentPurch."Document Line No.",
          ItemChargeAssgntLineQty, ItemChargeAssgntLineAmt);

        if not ItemChargeAssignmentPurch.Get(FromItemChargeAssignmentPurch."Document Type", FromItemChargeAssignmentPurch."Document No.", FromItemChargeAssignmentPurch."Document Line No.", FromItemChargeAssignmentPurch."Line No.") then
            exit;

        ItemChargeAssignmentPurch."Qty. to Assign" := FromItemChargeAssignmentPurch."Qty. to Assign";
        ItemChargeAssignmentPurch."Amount to Assign" := FromItemChargeAssignmentPurch."Amount to Assign";
        ItemChargeAssignmentPurch."Qty. to Handle" := FromItemChargeAssignmentPurch."Qty. to Handle";
        ItemChargeAssignmentPurch."Amount to Handle" := FromItemChargeAssignmentPurch."Amount to Handle";
        OnSuggestAssgntFromLineOnBeforeItemChargeAssignmentPurchModify(ItemChargeAssignmentPurch);
        ItemChargeAssignmentPurch.Modify();

        ItemChargeAssignmentPurch.SetRange("Document Type", FromItemChargeAssignmentPurch."Document Type");
        ItemChargeAssignmentPurch.SetRange("Document No.", FromItemChargeAssignmentPurch."Document No.");
        ItemChargeAssignmentPurch.SetRange("Document Line No.", FromItemChargeAssignmentPurch."Document Line No.");
        ItemChargeAssignmentPurch.CalcSums("Qty. to Assign", "Amount to Assign", "Qty. to Handle", "Amount to Handle");
        TotalQtyToAssign := ItemChargeAssignmentPurch."Qty. to Assign";
        TotalAmountToAssign := ItemChargeAssignmentPurch."Amount to Assign";
        TotalQtyToHandle := ItemChargeAssignmentPurch."Qty. to Handle";
        TotalAmountToHandle := ItemChargeAssignmentPurch."Amount to Handle";

        if TotalAmountToAssign = ItemChargeAssgntLineAmt then begin
            FromItemChargeAssignmentPurch.Find();
            exit;
        end;

        if TotalQtyToAssign = ItemChargeAssgntLineQty then begin
            TotalAmountToAssign := ItemChargeAssgntLineAmt;
            TotalAmountToHandle := ItemChargeAssgntLineAmt;
            ItemChargeAssignmentPurch.FindSet();
            repeat
                if not ItemChargeAssignmentPurch.PurchLineInvoiced() then begin
                    TempItemChargeAssgntPurch := ItemChargeAssignmentPurch;
                    TempItemChargeAssgntPurch.Insert();
                end;
            until ItemChargeAssignmentPurch.Next() = 0;

            if TempItemChargeAssgntPurch.FindSet() then
                repeat
                    ItemChargeAssignmentPurch.Get(
                      TempItemChargeAssgntPurch."Document Type",
                      TempItemChargeAssgntPurch."Document No.",
                      TempItemChargeAssgntPurch."Document Line No.",
                      TempItemChargeAssgntPurch."Line No.");
                    if TotalQtyToAssign <> 0 then begin
                        ItemChargeAssignmentPurch."Amount to Assign" :=
                          Round(
                            ItemChargeAssignmentPurch."Qty. to Assign" / TotalQtyToAssign * TotalAmountToAssign,
                            Currency."Amount Rounding Precision");
                        if TotalQtyToHandle <> 0 then
                            ItemChargeAssignmentPurch."Amount to Handle" :=
                              Round(
                                ItemChargeAssignmentPurch."Qty. to Handle" / TotalQtyToHandle * TotalAmountToHandle,
                                Currency."Amount Rounding Precision");
                        TotalQtyToAssign -= ItemChargeAssignmentPurch."Qty. to Assign";
                        TotalAmountToAssign -= ItemChargeAssignmentPurch."Amount to Assign";
                        TotalQtyToHandle -= ItemChargeAssignmentPurch."Qty. to Handle";
                        TotalAmountToHandle -= ItemChargeAssignmentPurch."Amount to Handle";
                        ItemChargeAssignmentPurch.Modify();
                    end;
                until TempItemChargeAssgntPurch.Next() = 0;
        end;

        ItemChargeAssignmentPurch.Get(FromItemChargeAssignmentPurch."Document Type", FromItemChargeAssignmentPurch."Document No.", FromItemChargeAssignmentPurch."Document Line No.", FromItemChargeAssignmentPurch."Line No.");

        FromItemChargeAssignmentPurch := ItemChargeAssignmentPurch;
    end;

    local procedure GetItemChargeAssgntLineAmounts(DocumentType: Enum "Purchase Document Type"; DocumentNo: Code[20]; DocumentLineNo: Integer; var ItemChargeAssgntLineQty: Decimal; var ItemChargeAssgntLineAmt: Decimal)
    var
        PurchLine: Record "Purchase Line";
        PurchHeader: Record "Purchase Header";
        Currency: Record Currency;
    begin
        PurchHeader.Get(DocumentType, DocumentNo);
        if not Currency.Get(PurchHeader."Currency Code") then
            Currency.InitRoundingPrecision();

        PurchLine.Get(DocumentType, DocumentNo, DocumentLineNo);
        PurchLine.TestField(Type, PurchLine.Type::"Charge (Item)");
        PurchLine.TestField("No.");
        PurchLine.TestField(Quantity);

        if (PurchLine."Inv. Discount Amount" = 0) and
           (PurchLine."Line Discount Amount" = 0) and
           (not PurchHeader."Prices Including VAT")
        then
            ItemChargeAssgntLineAmt := PurchLine."Line Amount"
        else
            if PurchHeader."Prices Including VAT" then
                ItemChargeAssgntLineAmt :=
                  Round((PurchLine."Line Amount" - PurchLine."Inv. Discount Amount") / (1 + PurchLine."VAT %" / 100),
                    Currency."Amount Rounding Precision")
            else
                ItemChargeAssgntLineAmt := PurchLine."Line Amount" - PurchLine."Inv. Discount Amount";

        ItemChargeAssgntLineAmt :=
          Round(
            ItemChargeAssgntLineAmt * (PurchLine."Qty. to Invoice" / PurchLine.Quantity),
            Currency."Amount Rounding Precision");
        ItemChargeAssgntLineQty := PurchLine."Qty. to Invoice";
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCreateDocChargeAssgnt(var LastItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var ReceiptNo: Code[20])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterGetItemValues(var TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByWeightOnAfterCalcTotalGrossWeight(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; TotalGrossWeight: Decimal; var TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByVolumeOnAfterCalcTotalUnitVolume(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; TotalUnitVolume: Decimal; var TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByWeightOnBeforeTempItemChargeAssgntPurchDelete(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; QtyRemainder: Decimal; QtyToAssign: Decimal; Currency: Record Currency)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateDocChargeAssgntOnAfterFromPurchLineSetFilters(var LastItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var FromPurchLine: Record "Purchase Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAssignItemCharges(var PurchaseLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; var IsHandled: Boolean; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal; SelectionTxt: Text)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAssignEqually(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateDocChargeAssgn(var LastItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var FromPurchLine: Record "Purchase Line"; ReceiptNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateRcptChargeAssgnt(var FromPurchRcptLine: Record "Purch. Rcpt. Line"; ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateShptChargeAssgnt(var FromReturnShptLine: Record "Return Shipment Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateSalesShptChargeAssgnt(var FromSalesShptLine: Record "Sales Shipment Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCreateReturnRcptChargeAssgnt(var FromReturnRcptLine: Record "Return Receipt Line"; ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetItemValues(var TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertItemChargeAssgntWithAssignValues(var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; FromItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeShowSuggestItemChargeAssignStrMenu(PurchLine: Record "Purchase Line"; var SuggestItemChargeMenuTxt: Text; var SuggestItemChargeMessageTxt: Text; var Selection: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetPurchLineForItemChargeAssgntPurch(var PurchaseLine: Record "Purchase Line"; var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignItemCharges(SelectionTxt: Text; var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; Currency: Record Currency; PurchaseHeader: Record "Purchase Header"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; var ItemChargesAssigned: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignEquallyOnAfterAmountToAssignCalculated(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignEquallyOnAfterItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignEquallyOnBeforeItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByAmountOnAfterAmountToAssignCalculated(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; TempItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByAmountOnAfterItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByAmountOnBeforeItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSuggestAssgntOnAfterItemChargeAssgntPurchSetFilters(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; PurchLine: Record "Purchase Line"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSuggestAssgntOnBeforeAssignItemCharges(var PurchaseLine: Record "Purchase Line"; ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignByAmountOnAfterAssignAppliesToDocLineAmount(ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; var TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; PurchHeader: Record "Purchase Header"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCreateSalesShptChargeAssgntOnBeforeInsertItemChargeAssignment(var FromSalesShipmentLine: Record "Sales Shipment Line"; ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; NextLine: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetPurchLine(PurchaseLine: Record "Purchase Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetPurchRcptLine(PurchRcptLine: Record "Purch. Rcpt. Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetReturnRcptLine(ReturnReceiptLine: Record "Return Receipt Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetReturnShptLine(ReturnShipmentLine: Record "Return Shipment Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetTransferRcptLine(TransferReceiptLine: Record "Transfer Receipt Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnGetItemValuesOnAfterGetSalesShptLine(SalesShipmentLine: Record "Sales Shipment Line"; TempItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)" temporary; var DecimalArray: array[3] of Decimal)
    begin
    end;

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

    [IntegrationEvent(true, false)]
    local procedure OnBeforeSuggestAssgnt(var PurchaseLine: Record "Purchase Line"; var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)"; TotalQtyToAssign: Decimal; TotalAmtToAssign: Decimal; TotalQtyToHandle: Decimal; TotalAmtToHandle: Decimal; var Selection: Integer; var SelectionTxt: Text; var SuggestItemChargeMenuTxt: Text; var SuggestItemChargeMessageTxt: Text; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignPurchItemChargeOnBeforeItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSuggestAssgntFromLineOnBeforeItemChargeAssignmentPurchModify(var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAssignItemChargesFromLineOnAfterItemChargeAssignmentModifyAll(PurchLine: Record "Purchase Line"; var ItemChargeAssignmentPurch: Record "Item Charge Assignment (Purch)")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeInsertItemChargeAssignmentWithValuesTo(var FromItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var ItemChargeAssgntPurch: Record "Item Charge Assignment (Purch)"; var ApplToDocType: Enum "Purchase Applies-to Document Type"; var FromApplToDocNo: Code[20]; var FromApplToDocLineNo: Integer; var FromItemNo: Code[20]; var FromDescription: Text[100]; var NextLineNo: Integer; var QtyToAssign: Decimal; var AmountToAssign: Decimal; var IsHandled: Boolean)
    begin
    end;
}