ZUGFeRD / mustangproject

Open Source Java e-Invoicing library, validator and tool (Factur-X/ZUGFeRD, UNCEFACT/CII XRechnung)
http://www.mustangproject.org
Apache License 2.0
234 stars 132 forks source link

Tax calculation on allowance position #561

Open InnuceEAN opened 1 week ago

InnuceEAN commented 1 week ago

Parsing the following position which contains an allowance, but no CategoryTradeTax under the SpecifiedTradeAllowanceCharge element:

<ram:IncludedSupplyChainTradeLineItem>
    ...
    <ram:SpecifiedLineTradeAgreement>
        <ram:NetPriceProductTradePrice>
            <ram:ChargeAmount>128.49</ram:ChargeAmount>
            <ram:BasisQuantity unitCode="LTR">100.</ram:BasisQuantity>
        </ram:NetPriceProductTradePrice>
    </ram:SpecifiedLineTradeAgreement>
    <ram:SpecifiedLineTradeDelivery>
        <ram:BilledQuantity unitCode="LTR">56.69</ram:BilledQuantity>
    </ram:SpecifiedLineTradeDelivery>
    <ram:SpecifiedLineTradeSettlement>
        <ram:ApplicableTradeTax>
            <ram:TypeCode>VAT</ram:TypeCode>
            <ram:CategoryCode>S</ram:CategoryCode>
            <ram:RateApplicablePercent>19.00</ram:RateApplicablePercent>
        </ram:ApplicableTradeTax>
        <ram:SpecifiedTradeAllowanceCharge>
            <ram:ChargeIndicator>
                <udt:Indicator>false</udt:Indicator>
            </ram:ChargeIndicator>
            <ram:ActualAmount>3.40</ram:ActualAmount>
            <ram:Reason>Rebate</ram:Reason>
        </ram:SpecifiedTradeAllowanceCharge>
        <ram:SpecifiedTradeSettlementLineMonetarySummation>
            <ram:LineTotalAmount>69.44</ram:LineTotalAmount>
        </ram:SpecifiedTradeSettlementLineMonetarySummation>
    </ram:SpecifiedLineTradeSettlement>
</ram:IncludedSupplyChainTradeLineItem>

The tax on the position is given with 19%, itemTotalNetAmount is quantity netPrice = 56.69 1.2849 = 72.84. Also there is a rebate of 3.40. Now the TransactionCalculator is calculating tax on the itemTotalNetAmount without rebate because the "SpecifiedTradeAllowanceCharge" rebate position has no "CategoryTradeTax" and the importer only fetches the tax from the CategoryTradeTax: ZUGFeRDInvoiceImporter.java#L664

Is this behavior of the parser correct that no tax is calculated for the rebate or should there have been a CategoryTradeTax node under SpecifiedTradeAllowanceCharge? I'm struggling to find any information on which is correct.

The documentation available for download under https://www.ferd-net.de states under "7.1.11 Zuschläge, Abschläge und Rabatte bzw. Ermäßigungen":

Auf Positionsebene, analog zur Rechnungsposition mit gleichem MwSt-Steuersatz wie die Position (ansonsten müssen sie unabhängig voneinander eingefügt werden

Which might indicate an inheritance of the tax rate from the position, but I don't see any mention in BT-95 for that?

InnuceEAN commented 2 days ago

I think I understand now, the code mentioned above is written only for header level allowances which requires a CategoryTradeTax node for taxes, but also picks up the allowance on item level in my case.

On item level allowance the tax from the position shall be used.