# PEPPOL-EN16931-R046 Item net price must equal item gross price minus item price discount

Under Peppol rule PEPPOL-EN16931-R046, whenever an invoice line item specifies an item gross price in BT-148 (GrossPrice) and an item price discount in BT-147 (PriceAllowance), the item net price in BT-146 (PriceAmount) must satisfy the exact mathematical equality: ItemNetPrice = ItemGrossPrice - ItemPriceAllowance. Peppol validation engines enforce strict rounding parity (typically to 2 to 4 decimal places) so that unit pricing calculations remain consistent across buyer and supplier ERP databases.

## Problem Description

Under Peppol rule PEPPOL-EN16931-R046, whenever an invoice line item specifies an item gross price in BT-148 (GrossPrice) and an item price discount in BT-147 (PriceAllowance), the item net price in BT-146 (PriceAmount) must satisfy the exact mathematical equality: ItemNetPrice = ItemGrossPrice - ItemPriceAllowance. Peppol validation engines enforce strict rounding parity (typically to 2 to 4 decimal places) so that unit pricing calculations remain consistent across buyer and supplier ERP databases.

> **ERROR**: XRechnung 3.0

## Context and Significance

Discrepancies between gross price, unit discount, and net price trigger PEPPOL-EN16931-R046. Price discount calculations must be mathematically exact.

## Solution

In your ERP pricing configuration, ensure that the net unit price is computed as the gross unit list price minus the unit price discount before exporting. In UBL 2.1 syntax, within <cac:Price>, ensure <cbc:PriceAmount> matches <cac:AllowanceCharge><cbc:Amount> subtracted from <cac:AllowanceCharge><cbc:BaseAmount> (or gross price). In UN/CEFACT CII syntax, ensure <ram:ChargeAmount> under <ram:NetPriceProductTradePrice> equals <ram:ChargeAmount> under <ram:GrossPriceProductTradePrice> minus <ram:ActualAmount> under <ram:AppliedTradeAllowanceCharge>.

- validate
- convert

## Valid Examples

- Gross price BT-148 = 100.00 EUR, Price discount BT-147 = 20.00 EUR, Net price BT-146 = 80.00 EUR
- Gross price BT-148 = 50.00 EUR, Price discount BT-147 = 5.00 EUR, Net price BT-146 = 45.00 EUR

## Invalid Examples

- Gross price 100.00 EUR minus discount 20.00 EUR exported with Net price = 85.00 EUR (Arithmetic mismatch)
- Price discount declared as 10.00 EUR but Net price equals Gross price without deduction

## Code Examples

### Valid XML
```
<cac:Price>
  <cbc:PriceAmount currencyID="EUR">80.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="EUR">20.00</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">100.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

### Invalid XML
```
<cac:Price>
  <!-- 100.00 - 20.00 must equal 80.00, not 85.00 -->
  <cbc:PriceAmount currencyID="EUR">85.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="EUR">20.00</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">100.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

## Affected Fields

- [BT-146 Item net price](/resources/xrechnung/bt-146-item-net-price)
- [BT-148 Item gross price](/resources/xrechnung/bt-148-item-gross-price)
- [BT-147 Item price discount](/resources/xrechnung/bt-147-item-price-discount)
- [BG-29 Price details](/resources/xrechnung)

## Related Rules

- [BR-24](/resources/kosit-validator-errors/br-24-invoice-line-net-amount-must-be-present)
- [PEPPOL-EN16931-R120](/resources/kosit-validator-errors/peppol-en16931-r120-line-net-amount-formula)

## Validation Tools

- [Official KoSIT Validator](https://erechnungsvalidator.service-bw.de/): Validate your XRechnung files against all BR-DE rules.
- [Convert PDF to XRechnung](/pdf-to-xrechnung): Automatic validation error fixes when converting.

## Related Resources

- [Official Specification](https://xeinkauf.de/xrechnung/)
- [Test Suite](https://github.com/itplr-kosit/xrechnung-testsuite)
- [Complete Error List](/resources/kosit-validator-errors): Overview of all German XRechnung validation rules.
