Reference
Markdown exportPEPPOL-EN16931-R046 Item net price must equal item gross price minus item price discount
Under Peppol rule PEPPOL-EN16931-R046, whenever an invoice line states an item gross price in BT-148 (cbc:BaseAmount) and an item price discount in BT-147 (cbc:Amount), the item net price in BT-146 (cbc:PriceAmount) must satisfy the exact equality: net price = gross price − price discount. The rule applies only when the gross price is present, and the comparison uses exact decimal values with no rounding tolerance.
Problem Description
ERROR
Peppol BIS Billing 3.0 rule (OpenPeppol)
Context and Significance
Discrepancies between gross price, unit discount and net price trigger PEPPOL-EN16931-R046. Because the check has no rounding tolerance, a net price rounded to 2 decimals already fails when gross price and discount carry 4 decimals. The error also appears when a discount is exported in cbc:Amount but the net price still equals the gross price.
Solution
In your ERP pricing configuration, compute the net unit price as the gross unit price minus the unit price discount before exporting, using the same decimal precision for all three values. In UBL 2.1, within <cac:Price>, make <cbc:PriceAmount> exactly equal to <cac:AllowanceCharge><cbc:BaseAmount> minus <cbc:Amount>. If you do not state a gross price, omit cbc:BaseAmount; R046 is then not evaluated.
Quick actions
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
<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><cac:Price>
<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>