Table 290 VAT Amount Line

App
Base Application
Namespace
Microsoft.Finance.VAT.Calculation
Versions
17-28

Fields, 27Keys, 1Procedures, 32Events, 35Obsolete, 7

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/VAT/Calculation/VATAmountLine.Table.al1271 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.Finance.VAT.Calculation;

using Microsoft.Finance.Currency;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Finance.SalesTax;
using Microsoft.Finance.VAT.Clause;
using Microsoft.Foundation.Enums;
using Microsoft.Purchases.History;
using Microsoft.Sales.History;

/// <summary>
/// Stores VAT calculation data for document lines grouped by VAT identifier and calculation parameters.
/// Supports VAT amount calculations, invoice discounts, and non-deductible VAT processing for sales and purchase transactions.
/// </summary>
/// <remarks>
/// Primary temporary table used during VAT calculations and document posting.
/// Key integrations: VAT posting, invoice posting, sales/purchase document processing.
/// Extensibility: Multiple integration events for VAT calculation customization.
/// </remarks>
#pragma warning disable AS0109
table 290 "VAT Amount Line"
{
    Caption = 'VAT Amount Line';
    DataClassification = CustomerContent;
    TableType = Temporary;

    fields
    {
        /// <summary>
        /// VAT percentage used for VAT calculations on document lines with this VAT identifier.
        /// </summary>
        field(1; "VAT %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'VAT %';
            ToolTip = 'Specifies the VAT % that was used on the sales or purchase lines with this VAT Identifier.';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        /// <summary>
        /// Total net amount excluding VAT for document lines with this VAT identifier.
        /// </summary>
        field(2; "VAT Base"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'VAT Base';
            ToolTip = 'Specifies the total net amount (amount excluding VAT) for sales or purchase lines with a specific VAT Identifier.';
            Editable = false;
        }
        /// <summary>
        /// Total VAT amount calculated for document lines with this VAT identifier.
        /// </summary>
        field(3; "VAT Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'VAT Amount';
            ToolTip = 'Specifies the amount of VAT that is included in the total amount.';

            trigger OnValidate()
            begin
                TestField("VAT %");
                TestField("VAT Base");
                if "VAT Amount" / "VAT Base" < 0 then
                    Error(Text002, FieldCaption("VAT Amount"));
                "VAT Difference" := "VAT Amount" - "Calculated VAT Amount";
                NonDeductibleVAT.ValidateVATAmountInVATAmountLine(Rec);
            end;
        }
        /// <summary>
        /// Total amount including VAT for document lines with this VAT identifier.
        /// </summary>
        field(4; "Amount Including VAT"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Amount Including VAT';
            ToolTip = 'Specifies the net amount, including VAT, for this line.';
            Editable = false;
        }
        /// <summary>
        /// VAT identifier that groups VAT posting setup combinations for VAT calculations.
        /// </summary>
        field(5; "VAT Identifier"; Code[20])
        {
            Caption = 'VAT Identifier';
            ToolTip = 'Specifies the VAT Identifier value.';
            Editable = false;
        }
        /// <summary>
        /// Total line amount before invoice discount for document lines with this VAT identifier.
        /// </summary>
        field(6; "Line Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Line Amount';
            ToolTip = 'Specifies the total amount for sales or purchase lines with a specific VAT identifier.';
            Editable = false;
        }
        /// <summary>
        /// Base amount eligible for invoice discount calculation.
        /// </summary>
        field(7; "Inv. Disc. Base Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Inv. Disc. Base Amount';
            ToolTip = 'Specifies the invoice discount base amount.';
            Editable = false;
        }
        /// <summary>
        /// Invoice discount amount applied to document lines with this VAT identifier.
        /// </summary>
        field(8; "Invoice Discount Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Invoice Discount Amount';
            ToolTip = 'Specifies the invoice discount amount for a specific VAT identifier.';

            trigger OnValidate()
            begin
                TestField("Inv. Disc. Base Amount");
                if "Invoice Discount Amount" / "Inv. Disc. Base Amount" > 1 then
                    Error(
                      InvoiceDiscAmtIsGreaterThanBaseAmtErr,
                      FieldCaption("Invoice Discount Amount"), "Inv. Disc. Base Amount");
                "VAT Base" := CalcLineAmount();
            end;
        }
        /// <summary>
        /// VAT calculation method determining how VAT is calculated for this VAT identifier.
        /// </summary>
        field(9; "VAT Calculation Type"; Enum "Tax Calculation Type")
        {
            Caption = 'VAT Calculation Type';
            ToolTip = 'Specifies how VAT will be calculated for purchases or sales of items with this particular combination of VAT business posting group and VAT product posting group.';
            Editable = false;
        }
        /// <summary>
        /// Tax group code used for sales tax calculations in US localization.
        /// </summary>
        field(10; "Tax Group Code"; Code[20])
        {
            Caption = 'Tax Group Code';
            Editable = false;
            TableRelation = "Tax Group";
        }
        /// <summary>
        /// Quantity sum for document lines with this VAT identifier.
        /// </summary>
        field(11; Quantity; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Quantity';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        /// <summary>
        /// Indicates whether VAT amounts have been manually modified from calculated values.
        /// </summary>
        field(12; Modified; Boolean)
        {
            Caption = 'Modified';
        }
        /// <summary>
        /// Indicates use tax calculation for reverse charge VAT scenarios.
        /// </summary>
        field(13; "Use Tax"; Boolean)
        {
            Caption = 'Use Tax';
        }
        /// <summary>
        /// System-calculated VAT amount before manual adjustments or VAT differences.
        /// </summary>
        field(14; "Calculated VAT Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Calculated VAT Amount';
            ToolTip = 'Specifies the calculated VAT amount and is only used for reference when the user changes the VAT Amount manually.';
            Editable = false;
        }
        /// <summary>
        /// Difference between calculated VAT amount and manually entered VAT amount.
        /// </summary>
        field(15; "VAT Difference"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'VAT Difference';
            ToolTip = 'Specifies the difference between the calculated VAT amount and a VAT amount that you have entered manually.';
            Editable = false;
        }
        /// <summary>
        /// Indicates whether line amounts are positive values for proper VAT calculation grouping.
        /// </summary>
        field(16; Positive; Boolean)
        {
            Caption = 'Positive';
        }
        /// <summary>
        /// Indicates whether this VAT amount line includes prepayment amounts.
        /// </summary>
        field(17; "Includes Prepayment"; Boolean)
        {
            Caption = 'Includes Prepayment';
        }
        /// <summary>
        /// VAT clause code providing additional VAT reporting information and text.
        /// </summary>
        field(18; "VAT Clause Code"; Code[20])
        {
            Caption = 'VAT Clause Code';
            TableRelation = "VAT Clause";
        }
        /// <summary>
        /// Tax category code used for electronic VAT reporting and compliance.
        /// </summary>
        field(19; "Tax Category"; Code[10])
        {
            Caption = 'Tax Category';
        }
        /// <summary>
        /// Payment discount amount applied to document lines with this VAT identifier.
        /// </summary>
        field(20; "Pmt. Discount Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Pmt. Discount Amount';
            Editable = false;
        }
        /// <summary>
        /// Non-deductible VAT percentage for partial VAT deduction scenarios.
        /// </summary>
        field(6200; "Non-Deductible VAT %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Non-Deductible VAT %';
            DecimalPlaces = 0 : 5;
            Editable = false;
        }
        /// <summary>
        /// VAT base amount that is non-deductible according to non-deductible VAT percentage.
        /// </summary>
        field(6201; "Non-Deductible VAT Base"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Non-Deductible VAT Base';
            ToolTip = 'Specifies the amount of the transaction for which VAT is not applied due to the type of goods or services purchased.';
            Editable = false;
        }
        /// <summary>
        /// VAT amount that is non-deductible and will be added to the expense or asset cost.
        /// </summary>
        field(6202; "Non-Deductible VAT Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Non-Deductible VAT Amount';
            ToolTip = 'Specifies the amount of VAT that is not deducted due to the type of goods or services purchased.';

            trigger OnValidate()
            begin
                NonDeductibleVAT.ValidateNonDeductibleVATInVATAmountLine(Rec);
            end;
        }
        /// <summary>
        /// System-calculated non-deductible VAT amount before manual adjustments.
        /// </summary>
        field(6203; "Calc. Non-Ded. VAT Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Calculated Non-Deductible VAT Amount';
            ToolTip = 'Specifies the calculated Non-Deductible VAT amount and is only used for reference when the user changes the Non-Deductible VAT Amount manually.';
            Editable = false;
        }
        /// <summary>
        /// VAT base amount that is deductible and can be claimed back from tax authorities.
        /// </summary>
        field(6204; "Deductible VAT Base"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Deductible VAT Base';
            ToolTip = 'Specifies the amount of the transaction for which VAT is applied due to the type of goods or services purchased.';
            Editable = false;
        }
        /// <summary>
        /// VAT amount that is deductible and can be claimed back from tax authorities.
        /// </summary>
        field(6205; "Deductible VAT Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Deductible VAT Amount';
            ToolTip = 'Specifies the amount of VAT that is deducted due to the type of goods or services purchased.';
            Editable = false;
        }
        /// <summary>
        /// Difference between calculated and manually entered non-deductible VAT amounts.
        /// </summary>
        field(6206; "Non-Deductible VAT Diff."; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = '';
            Caption = 'Non-Deductible VAT Difference';
            Editable = false;
        }
    }

    keys
    {
        key(Key1; "VAT Identifier", "VAT Calculation Type", "Tax Group Code", "Use Tax", Positive)
        {
            Clustered = true;
        }
    }

    fieldgroups
    {
    }

    var
        Currency: Record Currency;
        NonDeductibleVAT: Codeunit "Non-Deductible VAT";
        AllowVATDifference: Boolean;
        GlobalsInitialized: Boolean;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label '%1% VAT';
#pragma warning restore AA0470
        Text001: Label 'VAT Amount';
#pragma warning disable AA0470
        Text002: Label '%1 must not be negative.';
        Text004: Label '%1 for %2 must not exceed %3 = %4.';
        Text005: Label '%1 must not exceed %2 = %3.';
#pragma warning restore AA0470
#pragma warning restore AA0074
#pragma warning disable AA0470
        InvoiceDiscAmtIsGreaterThanBaseAmtErr: Label 'The maximum %1 that you can apply is %2.', Comment = '1 Invoice Discount Amount that should be set 2 Maximum Amount that you can assign';
#pragma warning restore AA0470

    /// <summary>
    /// Validates VAT difference against maximum allowed VAT difference limits.
    /// </summary>
    /// <param name="NewCurrencyCode">Currency code for VAT difference validation</param>
    /// <param name="NewAllowVATDifference">Whether VAT differences are allowed on this document</param>
    procedure CheckVATDifference(NewCurrencyCode: Code[10]; NewAllowVATDifference: Boolean)
    var
        GLSetup: Record "General Ledger Setup";
    begin
        InitGlobals(NewCurrencyCode, NewAllowVATDifference);
        if not AllowVATDifference then
            TestField("VAT Difference", 0);
        if Abs("VAT Difference") > Currency."Max. VAT Difference Allowed" then
            if NewCurrencyCode <> '' then
                Error(
                  Text004, FieldCaption("VAT Difference"), Currency.Code,
                  Currency.FieldCaption("Max. VAT Difference Allowed"), Currency."Max. VAT Difference Allowed")
            else begin
                if GLSetup.Get() then;
                if Abs("VAT Difference") > GLSetup."Max. VAT Difference Allowed" then
                    Error(
                      Text005, FieldCaption("VAT Difference"),
                      GLSetup.FieldCaption("Max. VAT Difference Allowed"), GLSetup."Max. VAT Difference Allowed");
            end;

        OnAfterCheckVATDifference(Rec, NewCurrencyCode, NewAllowVATDifference);
    end;

    local procedure InitGlobals(NewCurrencyCode: Code[10]; NewAllowVATDifference: Boolean)
    begin
        if GlobalsInitialized then
            exit;

        Currency.Initialize(NewCurrencyCode);
        AllowVATDifference := NewAllowVATDifference;
        GlobalsInitialized := true;
    end;

    /// <summary>
    /// Inserts or updates VAT amount line with calculated amounts, combining with existing line if found.
    /// </summary>
    /// <returns>True if line was successfully inserted or updated, false if amounts are zero</returns>
    procedure InsertLine() Result: Boolean
    var
        VATAmountLine: Record "VAT Amount Line";
        IsHandled: Boolean;
        SkipZeroVatAmounts: Boolean;
    begin
        IsHandled := false;
        Result := true;
        SkipZeroVatAmounts := true;
        OnInsertLine(Rec, IsHandled, Result, SkipZeroVatAmounts);
        if IsHandled then
            exit(Result);

        if ("VAT Base" = 0) and ("Amount Including VAT" = 0) and SkipZeroVatAmounts then
            exit(false);

        Validate(Positive, "Line Amount" >= 0);
        OnInsertLineOnAfterValidatePositive(Rec);
        VATAmountLine := Rec;
        if Find() then begin
            "Line Amount" += VATAmountLine."Line Amount";
            "Inv. Disc. Base Amount" += VATAmountLine."Inv. Disc. Base Amount";
            "Invoice Discount Amount" += VATAmountLine."Invoice Discount Amount";
            Quantity += VATAmountLine.Quantity;
            "VAT Base" += VATAmountLine."VAT Base";
            "Amount Including VAT" += VATAmountLine."Amount Including VAT";
            "VAT Difference" += VATAmountLine."VAT Difference";
            "Pmt. Discount Amount" += VATAmountLine."Pmt. Discount Amount";
            "VAT Amount" := "Amount Including VAT" - "VAT Base";
            "Calculated VAT Amount" += VATAmountLine."Calculated VAT Amount";
            NonDeductibleVAT.Increment(Rec, VATAmountLine);
            OnInsertLineOnBeforeModify(Rec, VATAmountLine);
            Modify();
        end else begin
            "VAT Amount" := "Amount Including VAT" - "VAT Base";
            OnInsertLineOnBeforeInsert(Rec, VATAmountLine);
            Insert();
        end;

        exit(true);
    end;

    /// <summary>
    /// Retrieves VAT amount line by sequential number from the recordset.
    /// </summary>
    /// <param name="Number">Sequential number (1 for first line, otherwise next line)</param>
    procedure GetLine(Number: Integer)
    begin
        if Number = 1 then
            Find('-')
        else
            Next();
    end;

    /// <summary>
    /// Generates descriptive text for VAT amount display based on VAT percentage.
    /// </summary>
    /// <returns>Formatted text showing VAT percentage or generic "VAT Amount" text</returns>
    procedure VATAmountText() Result: Text[30]
    var
        TempVATAmountLine: Record "VAT Amount Line" temporary;
        FullCount: Integer;
        VATPercentage: Decimal;
    begin
        VATPercentage := 0;
        FullCount := Count;
        if FullCount = 1 then begin
            FindFirst();
            if "VAT %" <> 0 then
                VATPercentage := "VAT %";
        end else
            if FullCount > 1 then begin
                CopyFromRec(TempVATAmountLine);
                TempVATAmountLine.FindFirst();
                if TempVATAmountLine."VAT %" <> 0 then begin
                    TempVATAmountLine.SetRange("VAT %", TempVATAmountLine."VAT %");
                    if TempVATAmountLine.Count = FullCount then
                        VATPercentage := TempVATAmountLine."VAT %";
                end;
            end;
        if VATPercentage = 0 then
            Result := Text001
        else
            Result := StrSubstNo(Text000, VATPercentage);
        OnAfterVATAmountText(VATPercentage, FullCount, Result);
    end;

    /// <summary>
    /// Calculates total line amount across all VAT amount lines with optional VAT subtraction.
    /// </summary>
    /// <param name="SubtractVAT">Whether to subtract VAT from line amounts</param>
    /// <param name="CurrencyCode">Currency code for rounding precision</param>
    /// <returns>Total line amount</returns>
    procedure GetTotalLineAmount(SubtractVAT: Boolean; CurrencyCode: Code[10]): Decimal
    var
        LineAmount: Decimal;
    begin
        if SubtractVAT then
            Currency.Initialize(CurrencyCode);

        LineAmount := 0;

        if Find('-') then
            repeat
                if SubtractVAT then
                    LineAmount :=
                      LineAmount + Round("Line Amount" / (1 + "VAT %" / 100), Currency."Amount Rounding Precision")
                else
                    LineAmount := LineAmount + "Line Amount";
            until Next() = 0;

        exit(LineAmount);
    end;

    /// <summary>
    /// Calculates total VAT amount across all VAT amount lines in the recordset.
    /// </summary>
    /// <returns>Total VAT amount</returns>
    procedure GetTotalVATAmount() VATAmount: Decimal
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetTotalVATAmount(Rec, VATAmount, IsHandled);
        if IsHandled then
            exit(VATAmount);

        CalcSums("VAT Amount");
        exit("VAT Amount");
    end;

    /// <summary>
    /// Calculates total invoice discount amount across all VAT amount lines.
    /// </summary>
    /// <returns>Total invoice discount amount</returns>
    procedure GetTotalInvDiscAmount(): Decimal
    begin
        CalcSums("Invoice Discount Amount");
        exit("Invoice Discount Amount");
    end;

    /// <summary>
    /// Calculates total invoice discount base amount with optional VAT subtraction.
    /// </summary>
    /// <param name="SubtractVAT">Whether to subtract VAT from base amounts</param>
    /// <param name="CurrencyCode">Currency code for rounding precision</param>
    /// <returns>Total invoice discount base amount</returns>
    procedure GetTotalInvDiscBaseAmount(SubtractVAT: Boolean; CurrencyCode: Code[10]): Decimal
    var
        InvDiscBaseAmount: Decimal;
    begin
        if SubtractVAT then
            Currency.Initialize(CurrencyCode);

        InvDiscBaseAmount := 0;

        if Find('-') then
            repeat
                if SubtractVAT then
                    InvDiscBaseAmount :=
                      InvDiscBaseAmount +
                      Round("Inv. Disc. Base Amount" / (1 + "VAT %" / 100), Currency."Amount Rounding Precision")
                else
                    InvDiscBaseAmount := InvDiscBaseAmount + "Inv. Disc. Base Amount";
            until Next() = 0;
        exit(InvDiscBaseAmount);
    end;

    /// <summary>
    /// Calculates total VAT base amount across all VAT amount lines.
    /// </summary>
    /// <returns>Total VAT base amount</returns>
    procedure GetTotalVATBase(): Decimal
    begin
        CalcSums("VAT Base");
        exit("VAT Base");
    end;

    /// <summary>
    /// Calculates total amount including VAT across all VAT amount lines.
    /// </summary>
    /// <returns>Total amount including VAT</returns>
    procedure GetTotalAmountInclVAT(): Decimal
    begin
        CalcSums("Amount Including VAT");
        exit("Amount Including VAT");
    end;

    /// <summary>
    /// Calculates total VAT discount amount based on rounding differences.
    /// </summary>
    /// <param name="CurrencyCode">Currency code for rounding precision</param>
    /// <param name="NewPricesIncludingVAT">Whether prices include VAT</param>
    /// <returns>Total VAT discount amount</returns>
    procedure GetTotalVATDiscount(CurrencyCode: Code[10]; NewPricesIncludingVAT: Boolean): Decimal
    var
        VATDiscount: Decimal;
        VATBase: Decimal;
    begin
        Currency.Initialize(CurrencyCode);

        VATDiscount := 0;

        if Find('-') then
            repeat
                if NewPricesIncludingVAT then
                    VATBase += CalcLineAmount() * "VAT %" / (100 + "VAT %")
                else
                    VATBase += "VAT Base" * "VAT %" / 100;
                VATDiscount :=
                  VATDiscount +
                  Round(
                    VATBase,
                    Currency."Amount Rounding Precision", Currency.VATRoundingDirection()) -
                  "VAT Amount" + "VAT Difference";
                VATBase := VATBase - Round(VATBase, Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
            until Next() = 0;
        exit(VATDiscount);
    end;

    /// <summary>
    /// Checks whether any VAT amount line has been manually modified.
    /// </summary>
    /// <returns>True if any line has Modified flag set</returns>
    procedure GetAnyLineModified(): Boolean
    begin
        if Find('-') then
            repeat
                if Modified then
                    exit(true);
            until Next() = 0;
        exit(false);
    end;

    /// <summary>
    /// Distributes invoice discount amount proportionally across VAT amount lines.
    /// </summary>
    /// <param name="NewInvoiceDiscount">Total invoice discount to distribute</param>
    /// <param name="NewCurrencyCode">Currency code for calculations</param>
    /// <param name="NewPricesIncludingVAT">Whether prices include VAT</param>
    /// <param name="NewVATBaseDiscPct">VAT base discount percentage</param>
    procedure SetInvoiceDiscountAmount(NewInvoiceDiscount: Decimal; NewCurrencyCode: Code[10]; NewPricesIncludingVAT: Boolean; NewVATBaseDiscPct: Decimal)
    var
        TotalInvDiscBaseAmount: Decimal;
        NewRemainder: Decimal;
    begin
        InitGlobals(NewCurrencyCode, false);
        TotalInvDiscBaseAmount := GetTotalInvDiscBaseAmount(false, Currency.Code);
        if TotalInvDiscBaseAmount = 0 then
            exit;
        Find('-');
        repeat
            if "Inv. Disc. Base Amount" <> 0 then begin
                if TotalInvDiscBaseAmount = 0 then
                    NewRemainder := 0
                else
                    NewRemainder :=
                      NewRemainder + NewInvoiceDiscount * "Inv. Disc. Base Amount" / TotalInvDiscBaseAmount;
                if "Invoice Discount Amount" <> Round(NewRemainder, Currency."Amount Rounding Precision") then begin
                    Validate(
                      "Invoice Discount Amount", Round(NewRemainder, Currency."Amount Rounding Precision"));
                    CalcVATFields(NewCurrencyCode, NewPricesIncludingVAT, NewVATBaseDiscPct);
                    Modified := true;
                    Modify();
                end;
                NewRemainder := NewRemainder - "Invoice Discount Amount";
            end;
        until Next() = 0;
    end;

    /// <summary>
    /// Applies invoice discount percentage to VAT amount lines with proportional distribution.
    /// </summary>
    /// <param name="NewInvoiceDiscountPct">Invoice discount percentage to apply</param>
    /// <param name="NewCurrencyCode">Currency code for calculations</param>
    /// <param name="NewPricesIncludingVAT">Whether prices include VAT</param>
    /// <param name="CalcInvDiscPerVATID">Whether to calculate discount per VAT identifier</param>
    /// <param name="NewVATBaseDiscPct">VAT base discount percentage</param>
    procedure SetInvoiceDiscountPercent(NewInvoiceDiscountPct: Decimal; NewCurrencyCode: Code[10]; NewPricesIncludingVAT: Boolean; CalcInvDiscPerVATID: Boolean; NewVATBaseDiscPct: Decimal)
    var
        NewRemainder: Decimal;
    begin
        InitGlobals(NewCurrencyCode, false);
        if Find('-') then
            repeat
                if "Inv. Disc. Base Amount" <> 0 then begin
                    NewRemainder :=
                      NewRemainder + NewInvoiceDiscountPct * "Inv. Disc. Base Amount" / 100;
                    if "Invoice Discount Amount" <> Round(NewRemainder, Currency."Amount Rounding Precision") then begin
                        Validate(
                          "Invoice Discount Amount", Round(NewRemainder, Currency."Amount Rounding Precision"));
                        CalcVATFields(NewCurrencyCode, NewPricesIncludingVAT, NewVATBaseDiscPct);
                        "VAT Difference" := 0;
                        Modified := true;
                        Modify();
                    end;
                    if CalcInvDiscPerVATID then
                        NewRemainder := 0
                    else
                        NewRemainder := NewRemainder - "Invoice Discount Amount";
                end;
            until Next() = 0;
    end;

    local procedure GetCalculatedVAT(NewCurrencyCode: Code[10]; NewPricesIncludingVAT: Boolean; NewVATBaseDiscPct: Decimal): Decimal
    begin
        InitGlobals(NewCurrencyCode, false);

        if NewPricesIncludingVAT then
            exit(
              Round(
                CalcLineAmount() * "VAT %" / (100 + "VAT %") * (1 - NewVATBaseDiscPct / 100),
                Currency."Amount Rounding Precision", Currency.VATRoundingDirection()));

        exit(
          Round(
            CalcLineAmount() * "VAT %" / 100 * (1 - NewVATBaseDiscPct / 100),
            Currency."Amount Rounding Precision", Currency.VATRoundingDirection()));
    end;

    /// <summary>
    /// Calculates line amount after subtracting invoice discount from original line amount.
    /// </summary>
    /// <returns>Net line amount used for VAT calculations</returns>
    procedure CalcLineAmount() LineAmount: Decimal
    begin
        LineAmount := "Line Amount" - "Invoice Discount Amount";

        OnAfterCalcLineAmount(Rec, LineAmount);
    end;

    /// <summary>
    /// Recalculates VAT amounts and VAT base based on current line amount and VAT parameters.
    /// </summary>
    /// <param name="NewCurrencyCode">Currency code for rounding precision</param>
    /// <param name="NewPricesIncludingVAT">Whether prices include VAT</param>
    /// <param name="NewVATBaseDiscPct">VAT base discount percentage</param>
    procedure CalcVATFields(NewCurrencyCode: Code[10]; NewPricesIncludingVAT: Boolean; NewVATBaseDiscPct: Decimal)
    begin
        OnBeforeCalcVATFields(Rec, NewVATBaseDiscPct);
        InitGlobals(NewCurrencyCode, false);

        "VAT Amount" := GetCalculatedVAT(NewCurrencyCode, NewPricesIncludingVAT, NewVATBaseDiscPct);

        if NewPricesIncludingVAT then begin
            if NewVATBaseDiscPct = 0 then begin
                "Amount Including VAT" := CalcLineAmount();
                "VAT Base" := "Amount Including VAT" - "VAT Amount";
            end else begin
                "VAT Base" :=
                  Round(CalcLineAmount() / (1 + "VAT %" / 100), Currency."Amount Rounding Precision");
                "Amount Including VAT" := "VAT Base" + "VAT Amount";
            end;
        end else begin
            "VAT Base" := CalcLineAmount();
            "Amount Including VAT" := "VAT Base" + "VAT Amount";
        end;
        "Calculated VAT Amount" := "VAT Amount";
        "VAT Difference" := 0;
        NonDeductibleVAT.Update(Rec, Currency);
        Modified := true;

        OnAfterCalcVATFields(Rec, NewPricesIncludingVAT, NewVATBaseDiscPct, Currency);
    end;

    local procedure CalcValueLCY(Value: Decimal; PostingDate: Date; CurrencyCode: Code[10]; CurrencyFactor: Decimal): Decimal
    var
        CurrencyExchangeRate: Record "Currency Exchange Rate";
    begin
        exit(CurrencyExchangeRate.ExchangeAmtFCYToLCY(PostingDate, CurrencyCode, Value, CurrencyFactor));
    end;

    /// <summary>
    /// Converts VAT base amount from foreign currency to local currency using exchange rate.
    /// </summary>
    /// <param name="PostingDate">Date for exchange rate lookup</param>
    /// <param name="CurrencyCode">Foreign currency code</param>
    /// <param name="CurrencyFactor">Currency exchange factor</param>
    /// <returns>VAT base amount in local currency</returns>
    procedure GetBaseLCY(PostingDate: Date; CurrencyCode: Code[10]; CurrencyFactor: Decimal): Decimal
    begin
        exit(Round(CalcValueLCY("VAT Base", PostingDate, CurrencyCode, CurrencyFactor)));
    end;

    /// <summary>
    /// Calculates VAT amount in local currency by converting from foreign currency.
    /// </summary>
    /// <param name="PostingDate">Date for exchange rate lookup</param>
    /// <param name="CurrencyCode">Foreign currency code</param>
    /// <param name="CurrencyFactor">Currency exchange factor</param>
    /// <returns>VAT amount in local currency</returns>
    procedure GetAmountLCY(PostingDate: Date; CurrencyCode: Code[10]; CurrencyFactor: Decimal): Decimal
    begin
        exit(
          Round(CalcValueLCY("Amount Including VAT", PostingDate, CurrencyCode, CurrencyFactor)) -
          Round(CalcValueLCY("VAT Base", PostingDate, CurrencyCode, CurrencyFactor)));
    end;

    /// <summary>
    /// Deducts amounts from current VAT amount lines using corresponding lines from another recordset.
    /// </summary>
    /// <param name="VATAmountLineDeduct">VAT amount line recordset containing amounts to deduct</param>
    procedure DeductVATAmountLine(var VATAmountLineDeduct: Record "VAT Amount Line")
    begin
        if FindSet() then
            repeat
                VATAmountLineDeduct := Rec;
                if VATAmountLineDeduct.Find() then begin
                    "VAT Base" -= VATAmountLineDeduct."VAT Base";
                    "VAT Amount" -= VATAmountLineDeduct."VAT Amount";
                    "Amount Including VAT" -= VATAmountLineDeduct."Amount Including VAT";
                    "Line Amount" -= VATAmountLineDeduct."Line Amount";
                    "Inv. Disc. Base Amount" -= VATAmountLineDeduct."Inv. Disc. Base Amount";
                    "Invoice Discount Amount" -= VATAmountLineDeduct."Invoice Discount Amount";
                    "Calculated VAT Amount" -= VATAmountLineDeduct."Calculated VAT Amount";
                    "VAT Difference" -= VATAmountLineDeduct."VAT Difference";
                    NonDeductibleVAT.DeductNonDedValuesFromVATAmountLine(Rec, VATAmountLineDeduct);
                    OnDeductVATAmountLineOnBeforeModify(Rec, VATAmountLineDeduct);
                    Modify();
                end;
            until Next() = 0;
    end;

    internal procedure ApplyNonDeductibleVAT(NonDeductibleVAT: Decimal)
    begin
        "VAT Base" += NonDeductibleVAT;
        "VAT Amount" -= NonDeductibleVAT;
        "Line Amount" += NonDeductibleVAT;
        OnApplyNonDeductibleVATOnBeforeModify(Rec, NonDeductibleVAT);
        Modify();
    end;

    /// <summary>
    /// Updates VAT amount lines with calculated VAT amounts and totals based on currency, pricing settings, and tax configuration.
    /// Performs comprehensive VAT calculations including sales tax processing and currency conversions.
    /// </summary>
    /// <param name="TotalVATAmount">Total VAT amount calculated across all lines</param>
    /// <param name="Currency">Currency record for rounding and conversion</param>
    /// <param name="CurrencyFactor">Currency exchange factor for conversion calculations</param>
    /// <param name="PricesIncludingVAT">Whether prices include VAT or VAT is calculated on top</param>
    /// <param name="VATBaseDiscountPercHeader">VAT base discount percentage from document header</param>
    /// <param name="TaxAreaCode">Tax area code for sales tax calculations</param>
    /// <param name="TaxLiable">Whether the transaction is liable for sales tax</param>
    /// <param name="PostingDate">Posting date for tax rate determination</param>
    procedure UpdateLines(var TotalVATAmount: Decimal; Currency: Record Currency; CurrencyFactor: Decimal; PricesIncludingVAT: Boolean; VATBaseDiscountPercHeader: Decimal; TaxAreaCode: Code[20]; TaxLiable: Boolean; PostingDate: Date)
    var
        PrevVATAmountLine: Record "VAT Amount Line";
        SalesTaxCalculate: Codeunit "Sales Tax Calculate";
        VATBaseDiscountPerc: Decimal;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateLines(Rec, TotalVATAmount, Currency, CurrencyFactor, PricesIncludingVAT, VATBaseDiscountPercHeader, TaxAreaCode, TaxLiable, PostingDate, IsHandled);
        if IsHandled then
            exit;

        if FindSet() then
            repeat
                if (PrevVATAmountLine."VAT Identifier" <> "VAT Identifier") or
                   (PrevVATAmountLine."VAT Calculation Type" <> "VAT Calculation Type") or
                   (PrevVATAmountLine."Tax Group Code" <> "Tax Group Code") or
                   (PrevVATAmountLine."Use Tax" <> "Use Tax")
                then
                    PrevVATAmountLine.Init();
                OnUpdateLinesOnAfterInitPrevVATAmountLine(PrevVATAmountLine, Currency, PricesIncludingVAT, VATBaseDiscountPerc, Rec);

                VATBaseDiscountPerc := GetVATBaseDiscountPerc(VATBaseDiscountPercHeader);
                if PricesIncludingVAT then
                    case "VAT Calculation Type" of
                        "VAT Calculation Type"::"Normal VAT",
                        "VAT Calculation Type"::"Reverse Charge VAT":
                            begin
                                "VAT Base" :=
                                  CalcLineAmount() / (1 + "VAT %" / 100) - "VAT Difference";
                                OnUpdateLinesOnAfterCalcVATBase(Rec, Currency, PricesIncludingVAT);
                                "VAT Amount" :=
                                  "VAT Difference" +
                                  Round(
                                    PrevVATAmountLine."VAT Amount" +
                                    (CalcLineAmount() - "VAT Base" - "VAT Difference") *
                                    (1 - VATBaseDiscountPerc / 100),
                                    Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
                                if VATBaseDiscountPerc <> 0 then
                                    "VAT Base" := Round("VAT Base", Currency."Amount Rounding Precision")
                                else
                                    "VAT Base" := CalcLineAmount() - "VAT Amount";
                                OnUpdateLinesOnAfterCalcVATAmount(Rec, PrevVATAmountLine, Currency, VATBaseDiscountPerc, PricesIncludingVAT);
                                "Amount Including VAT" := "VAT Base" + "VAT Amount";
                                OnUpdateLinesOnAfterCalcAmountIncludingVATNormalVAT(Rec, PrevVATAmountLine, Currency, VATBaseDiscountPerc, PricesIncludingVAT);
                                NonDeductibleVAT.UpdateNonDeductibleAmountsWithDiffInVATAmountLine(Rec, Currency);
                                if Positive then
                                    PrevVATAmountLine.Init()
                                else begin
                                    PrevVATAmountLine := Rec;
                                    PrevVATAmountLine."VAT Amount" :=
                                      (CalcLineAmount() - "VAT Base" - "VAT Difference") *
                                      (1 - VATBaseDiscountPerc / 100);
                                    PrevVATAmountLine."VAT Amount" :=
                                      PrevVATAmountLine."VAT Amount" -
                                      Round(PrevVATAmountLine."VAT Amount", Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
                                end;
                            end;
                        "VAT Calculation Type"::"Full VAT":
                            begin
                                "VAT Base" := 0;
                                "VAT Amount" := "VAT Difference" + CalcLineAmount();
                                "Amount Including VAT" := "VAT Amount";
                                NonDeductibleVAT.UpdateNonDeductibleAmountsWithDiffInVATAmountLine(Rec, Currency);
                            end;
                        "VAT Calculation Type"::"Sales Tax":
                            begin
                                "Amount Including VAT" := CalcLineAmount();
                                if "Use Tax" then
                                    "VAT Base" := "Amount Including VAT"
                                else
                                    "VAT Base" :=
                                      Round(
                                        SalesTaxCalculate.ReverseCalculateTax(
                                          TaxAreaCode, "Tax Group Code", TaxLiable, PostingDate, "Amount Including VAT", Quantity, CurrencyFactor),
                                        Currency."Amount Rounding Precision");
                                OnAfterSalesTaxCalculateReverseCalculateTax(Rec, Currency, TaxAreaCode, TaxLiable, PostingDate, CurrencyFactor);
                                "VAT Amount" := "VAT Difference" + "Amount Including VAT" - "VAT Base";
                                if "VAT Base" = 0 then
                                    "VAT %" := 0
                                else
                                    "VAT %" := Round(100 * "VAT Amount" / "VAT Base", 0.00001);
                            end;
                    end
                else
                    case "VAT Calculation Type" of
                        "VAT Calculation Type"::"Normal VAT",
                        "VAT Calculation Type"::"Reverse Charge VAT":
                            begin
                                "VAT Base" := CalcLineAmount();
                                OnUpdateLinesOnAfterCalcVATBase(Rec, Currency, PricesIncludingVAT);
                                "VAT Amount" :=
                                  "VAT Difference" +
                                  Round(
                                    PrevVATAmountLine."VAT Amount" +
                                    "VAT Base" * "VAT %" / 100 * (1 - VATBaseDiscountPerc / 100),
                                    Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
                                OnUpdateLinesOnAfterCalcVATAmount(Rec, PrevVATAmountLine, Currency, VATBaseDiscountPerc, PricesIncludingVAT);
                                "Amount Including VAT" := CalcLineAmount() + "VAT Amount";
                                OnUpdateLinesOnAfterCalcAmountIncludingVATNormalVAT(Rec, PrevVATAmountLine, Currency, VATBaseDiscountPerc, PricesIncludingVAT);
                                NonDeductibleVAT.UpdateNonDeductibleAmountsWithDiffInVATAmountLine(Rec, Currency);
                                if Positive then
                                    PrevVATAmountLine.Init()
                                else
                                    if not "Includes Prepayment" then begin
                                        PrevVATAmountLine := Rec;
                                        PrevVATAmountLine."VAT Amount" :=
                                          "VAT Base" * "VAT %" / 100 * (1 - VATBaseDiscountPerc / 100);
                                        OnUpdateLinesOnAfterCalcPreVATAmountline(Rec, PrevVATAmountLine, Currency, VATBaseDiscountPerc);
                                        PrevVATAmountLine."VAT Amount" :=
                                          PrevVATAmountLine."VAT Amount" -
                                          Round(PrevVATAmountLine."VAT Amount", Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
                                    end;
                            end;
                        "VAT Calculation Type"::"Full VAT":
                            begin
                                "VAT Base" := 0;
                                "VAT Amount" := "VAT Difference" + CalcLineAmount();
                                "Amount Including VAT" := "VAT Amount";
                                NonDeductibleVAT.UpdateNonDeductibleAmountsWithDiffInVATAmountLine(Rec, Currency);
                            end;
                        "VAT Calculation Type"::"Sales Tax":
                            begin
                                OnUpdateLinesOnBeforeCalcSalesTaxVatBase(Rec);
                                "VAT Base" := CalcLineAmount();
                                OnUpdateLinesOnAfterCalcVATBaseSalesTax(Rec, Currency, PricesIncludingVAT);
                                if "Use Tax" then
                                    "VAT Amount" := 0
                                else
                                    "VAT Amount" :=
                                      SalesTaxCalculate.CalculateTax(
                                        TaxAreaCode, "Tax Group Code", TaxLiable, PostingDate, "VAT Base", Quantity, CurrencyFactor);
                                OnAfterSalesTaxCalculateCalculateTax(Rec, Currency, TaxAreaCode, TaxLiable, PostingDate, CurrencyFactor);
                                if "VAT Base" = 0 then
                                    "VAT %" := 0
                                else
                                    "VAT %" := Round(100 * "VAT Amount" / "VAT Base", 0.00001);
                                "VAT Amount" :=
                                  "VAT Difference" +
                                  Round("VAT Amount", Currency."Amount Rounding Precision", Currency.VATRoundingDirection());
                                "Amount Including VAT" := "VAT Base" + "VAT Amount";
                            end;
                    end;

                TotalVATAmount -= "VAT Amount";
                "Calculated VAT Amount" := "VAT Amount" - "VAT Difference";
                Modify();
            until Next() = 0;
    end;

    local procedure CopyFromRec(var TempVATAmountLine: Record "VAT Amount Line" temporary)
    var
        VATAmountLineCopy: Record "VAT Amount Line";
    begin
        if not IsTemporary() then begin
            VATAmountLineCopy.Copy(Rec);
            if VATAmountLineCopy.FindSet() then
                repeat
                    TempVATAmountLine := VATAmountLineCopy;
                    TempVATAmountLine.Insert();
                until VATAmountLineCopy.Next() = 0;
        end else
            TempVATAmountLine.Copy(Rec, true);
    end;

    /// <summary>
    /// Copies VAT-related fields from posted purchase invoice line to create VAT amount line for analysis or reporting.
    /// </summary>
    /// <param name="PurchInvLine">Posted purchase invoice line containing VAT information to copy</param>
    procedure CopyFromPurchInvLine(PurchInvLine: Record "Purch. Inv. Line")
    begin
        "VAT Identifier" := PurchInvLine."VAT Identifier";
        "VAT Calculation Type" := PurchInvLine."VAT Calculation Type";
        "Tax Group Code" := PurchInvLine."Tax Group Code";
        "Use Tax" := PurchInvLine."Use Tax";
        "VAT %" := PurchInvLine."VAT %";
        "VAT Base" := PurchInvLine.Amount;
        "VAT Amount" := PurchInvLine."Amount Including VAT" - PurchInvLine.Amount;
        "Amount Including VAT" := PurchInvLine."Amount Including VAT";
        "Line Amount" := PurchInvLine."Line Amount";
        OnCopyFromPurchInvLineOnAfterSetLineAmount(Rec, PurchInvLine);
        if PurchInvLine."Allow Invoice Disc." then
            "Inv. Disc. Base Amount" := PurchInvLine."Line Amount";
        "Invoice Discount Amount" := PurchInvLine."Inv. Discount Amount";
        "Pmt. Discount Amount" := PurchInvLine."Pmt. Discount Amount";
        Quantity := PurchInvLine."Quantity (Base)";
        "Calculated VAT Amount" :=
          PurchInvLine."Amount Including VAT" - PurchInvLine.Amount - PurchInvLine."VAT Difference";
        "VAT Difference" := PurchInvLine."VAT Difference";
        NonDeductibleVAT.CopyNonDedVATFromPurchInvLineToVATAmountLine(Rec, PurchInvLine);

        OnAfterCopyFromPurchInvLine(Rec, PurchInvLine);
    end;

    /// <summary>
    /// Copies VAT-related fields from posted purchase credit memo line to create VAT amount line for analysis or reporting.
    /// </summary>
    /// <param name="PurchCrMemoLine">Posted purchase credit memo line containing VAT information to copy</param>
    procedure CopyFromPurchCrMemoLine(PurchCrMemoLine: Record "Purch. Cr. Memo Line")
    begin
        "VAT Identifier" := PurchCrMemoLine."VAT Identifier";
        "VAT Calculation Type" := PurchCrMemoLine."VAT Calculation Type";
        "Tax Group Code" := PurchCrMemoLine."Tax Group Code";
        "Use Tax" := PurchCrMemoLine."Use Tax";
        "VAT %" := PurchCrMemoLine."VAT %";
        "VAT Base" := PurchCrMemoLine.Amount;
        "VAT Amount" := PurchCrMemoLine."Amount Including VAT" - PurchCrMemoLine.Amount;
        "Amount Including VAT" := PurchCrMemoLine."Amount Including VAT";
        "Line Amount" := PurchCrMemoLine."Line Amount";
        OnCopyFromPurchCrMemoLineOnAfterSetLineAmount(Rec, PurchCrMemoLine);
        if PurchCrMemoLine."Allow Invoice Disc." then
            "Inv. Disc. Base Amount" := PurchCrMemoLine."Line Amount";
        "Invoice Discount Amount" := PurchCrMemoLine."Inv. Discount Amount";
        "Pmt. Discount Amount" := PurchCrMemoLine."Pmt. Discount Amount";
        Quantity := PurchCrMemoLine."Quantity (Base)";
        "Calculated VAT Amount" :=
          PurchCrMemoLine."Amount Including VAT" - PurchCrMemoLine.Amount - PurchCrMemoLine."VAT Difference";
        "VAT Difference" := PurchCrMemoLine."VAT Difference";
        NonDeductibleVAT.CopyNonDedVATFromPurchCrMemoLineToVATAmountLine(Rec, PurchCrMemoLine);

        OnAfterCopyFromPurchCrMemoLine(Rec, PurchCrMemoLine);
    end;

    /// <summary>
    /// Copies VAT-related fields from posted sales invoice line to create VAT amount line for analysis or reporting.
    /// </summary>
    /// <param name="SalesInvoiceLine">Posted sales invoice line containing VAT information to copy</param>
    procedure CopyFromSalesInvLine(SalesInvoiceLine: Record "Sales Invoice Line")
    begin
        "VAT Identifier" := SalesInvoiceLine."VAT Identifier";
        "VAT Calculation Type" := SalesInvoiceLine."VAT Calculation Type";
        "Tax Group Code" := SalesInvoiceLine."Tax Group Code";
        "VAT %" := SalesInvoiceLine."VAT %";
        "VAT Base" := SalesInvoiceLine.Amount;
        "VAT Amount" := SalesInvoiceLine."Amount Including VAT" - SalesInvoiceLine.Amount;
        "Amount Including VAT" := SalesInvoiceLine."Amount Including VAT";
        "Line Amount" := SalesInvoiceLine."Line Amount";
        if SalesInvoiceLine."Allow Invoice Disc." then
            "Inv. Disc. Base Amount" := SalesInvoiceLine."Line Amount";
        "Invoice Discount Amount" := SalesInvoiceLine."Inv. Discount Amount";
        "Pmt. Discount Amount" := SalesInvoiceLine."Pmt. Discount Amount";
        Quantity := SalesInvoiceLine."Quantity (Base)";
        "Calculated VAT Amount" :=
          SalesInvoiceLine."Amount Including VAT" - SalesInvoiceLine.Amount - SalesInvoiceLine."VAT Difference";
        "VAT Difference" := SalesInvoiceLine."VAT Difference";

        OnAfterCopyFromSalesInvLine(Rec, SalesInvoiceLine);
    end;

    /// <summary>
    /// Copies VAT-related fields from posted sales credit memo line to create VAT amount line for analysis or reporting.
    /// </summary>
    /// <param name="SalesCrMemoLine">Posted sales credit memo line containing VAT information to copy</param>
    procedure CopyFromSalesCrMemoLine(SalesCrMemoLine: Record "Sales Cr.Memo Line")
    begin
        "VAT Identifier" := SalesCrMemoLine."VAT Identifier";
        "VAT Calculation Type" := SalesCrMemoLine."VAT Calculation Type";
        "Tax Group Code" := SalesCrMemoLine."Tax Group Code";
        "VAT %" := SalesCrMemoLine."VAT %";
        "VAT Base" := SalesCrMemoLine.Amount;
        "VAT Amount" := SalesCrMemoLine."Amount Including VAT" - SalesCrMemoLine.Amount;
        "Amount Including VAT" := SalesCrMemoLine."Amount Including VAT";
        "Line Amount" := SalesCrMemoLine."Line Amount";
        if SalesCrMemoLine."Allow Invoice Disc." then
            "Inv. Disc. Base Amount" := SalesCrMemoLine."Line Amount";
        "Invoice Discount Amount" := SalesCrMemoLine."Inv. Discount Amount";
        "Pmt. Discount Amount" := SalesCrMemoLine."Pmt. Discount Amount";
        Quantity := SalesCrMemoLine."Quantity (Base)";
        "Calculated VAT Amount" := SalesCrMemoLine."Amount Including VAT" - SalesCrMemoLine.Amount - SalesCrMemoLine."VAT Difference";
        "VAT Difference" := SalesCrMemoLine."VAT Difference";

        OnAfterCopyFromSalesCrMemoLine(Rec, SalesCrMemoLine);
    end;

    local procedure GetVATBaseDiscountPerc(VATBaseDiscountPerc: Decimal) NewVATBaseDiscountPerc: Decimal
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetVATBaseDiscountPerc(Rec, VATBaseDiscountPerc, NewVATBaseDiscountPerc, IsHandled);
        if not IsHandled then
            NewVATBaseDiscountPerc := VATBaseDiscountPerc;
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcLineAmount(var VATAmountLine: Record "VAT Amount Line"; var LineAmount: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCheckVATDifference(VATAmountLine: Record "VAT Amount Line"; NewCurrencyCode: Code[10]; NewAllowVATDifference: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromPurchInvLine(var VATAmountLine: Record "VAT Amount Line"; PurchInvLine: Record "Purch. Inv. Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromPurchCrMemoLine(var VATAmountLine: Record "VAT Amount Line"; PurchCrMemoLine: Record "Purch. Cr. Memo Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromSalesInvLine(var VATAmountLine: Record "VAT Amount Line"; SalesInvoiceLine: Record "Sales Invoice Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCopyFromSalesCrMemoLine(var VATAmountLine: Record "VAT Amount Line"; SalesCrMemoLine: Record "Sales Cr.Memo Line")
    begin
    end;



    [IntegrationEvent(false, false)]
    local procedure OnAfterSalesTaxCalculateCalculateTax(var VATAmountLine: Record "VAT Amount Line"; Currency: Record Currency; TaxAreaCode: Code[20]; TaxLiable: Boolean; PostingDate: Date; CurrencyFactor: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSalesTaxCalculateReverseCalculateTax(var VATAmountLine: Record "VAT Amount Line"; Currency: Record Currency; TaxAreaCode: Code[20]; TaxLiable: Boolean; PostingDate: Date; CurrencyFactor: Decimal)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterVATAmountText(VATPercentage: Decimal; FullCount: Integer; var Result: Text[30])
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetTotalVATAmount(var VATAmountLine: Record "VAT Amount Line"; var VATAmount: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertLineOnAfterValidatePositive(var VATAmountLine: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertLineOnBeforeInsert(var VATAmountLine: Record "VAT Amount Line"; var FromVATAmountLine: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertLineOnBeforeModify(var VATAmountLine: Record "VAT Amount Line"; FromVATAmountLine: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnInsertLine(var VATAmountLine: Record "VAT Amount Line"; var IsHandled: Boolean; var Result: Boolean; var SkipZeroVatAmounts: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterCalcVATAmount(var VATAmountLine: Record "VAT Amount Line"; PrevVATAmountLine: Record "VAT Amount Line"; var Currency: Record Currency; VATBaseDiscountPerc: Decimal; PricesIncludingVAT: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterCalcAmountIncludingVATNormalVAT(var VATAmountLine: Record "VAT Amount Line"; PrevVATAmountLine: Record "VAT Amount Line"; var Currency: Record Currency; VATBaseDiscountPerc: Decimal; PricesIncludingVAT: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnBeforeCalcSalesTaxVatBase(var VATAmountLine: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterCalcVATBase(var VATAmountLine: Record "VAT Amount Line"; Currency: Record Currency; PricesIncludingVAT: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterCalcVATBaseSalesTax(var VATAmountLine: Record "VAT Amount Line"; Currency: Record Currency; PricesIncludingVAT: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterCalcVATFields(var VATAmountLine: Record "VAT Amount Line"; NewPricesIncludingVAT: Boolean; NewVATBaseDiscPct: Decimal; Currency: Record Currency)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalcVATFields(var VATAmountLine: Record "VAT Amount Line"; var NewVATBaseDiscPct: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnDeductVATAmountLineOnBeforeModify(var VATAmountLine: Record "VAT Amount Line"; VATAmountLineDeduct: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetVATBaseDiscountPerc(var VATAmountLine: Record "VAT Amount Line"; VATBaseDiscountPerc: Decimal; var NewVATBaseDiscountPerc: decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterInitPrevVATAmountLine(var PrevVATAmountLine: Record "VAT Amount Line"; Currency: Record Currency; PricesIncludingVAT: Boolean; var VATBaseDiscountPerc: Decimal; var VATAmountLine: Record "VAT Amount Line")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnApplyNonDeductibleVATOnBeforeModify(var VATAmountLine: Record "VAT Amount Line"; NonDeductibleVAT: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCopyFromPurchInvLineOnAfterSetLineAmount(var VATAmountLine: Record "VAT Amount Line"; var PurchInvLine: Record "Purch. Inv. Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCopyFromPurchCrMemoLineOnAfterSetLineAmount(var VATAmountLine: Record "VAT Amount Line"; var PurchCrMemoLine: Record "Purch. Cr. Memo Line");
    begin
    end;

    [IntegrationEvent(false, false)]
    procedure OnBeforeUpdateLines(var VATAmountLine: Record "VAT Amount Line"; var TotalVATAmount: Decimal; Currency: Record Currency; CurrencyFactor: Decimal; PricesIncludingVAT: Boolean; VATBaseDiscountPercHeader: Decimal; TaxAreaCode: Code[20]; TaxLiable: Boolean; PostingDate: Date; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnUpdateLinesOnAfterCalcPreVATAmountline(var VATAmountLine: Record "VAT Amount Line"; var PreVATAmountLine: Record "VAT Amount Line"; var Currency: Record Currency; VATBaseDiscountPerc: Decimal)
    begin
    end;
}