PEPPOL-EN16931-R046Item net price MUST equal (Gross price - Allowance amount) when gross price is provided.
Official rule text
Where a gross price is given, the net price must follow from it exactly: gross price minus the price allowance, with no tolerance. The three numbers describe one calculation and have to add up.
- Severity
- Error
- Applies to
- CII, UBL
- Rule set
- v2026-08-31
- Checked on
Written and checked against the official KoSIT rule set by Dmytro Yalanskyi, NormAPI.
Why does PEPPOL-EN16931-R046 happen?
The net price comes from pricing and is already rounded, while the gross price and the discount are added for traceability out of condition records. A cent frequently sits between the two — and a cent is enough: the comparison is a plain equals on decimals, with no tolerance at all. The calculation rules in the norm are more forgiving; BR-CO-17, for one, allows a whole currency unit. CII adds two quirks of its own: a missing allowance is counted as 0 through u:decimalOrZero, and where several allowances are applied only the first one is read.
What the validator checks
The expression the official KoSIT rule set evaluates — not paraphrased, but read from the Schematron file it ships. UBL and CII address different document trees, so the same rule reads differently in each.
- UBL
not(cbc:BaseAmount) or xs:decimal(../cbc:PriceAmount) = xs:decimal(cbc:BaseAmount) - xs:decimal(cbc:Amount)- CII
not(ram:ChargeAmount) or xs:decimal(../ram:NetPriceProductTradePrice/ram:ChargeAmount) = xs:decimal(ram:ChargeAmount) - u:decimalOrZero(ram:AppliedTradeAllowanceCharge/ram:ActualAmount[1])
Source: rule set v2026-08-31
How do you fix PEPPOL-EN16931-R046?
Derive cbc:PriceAmount from cbc:BaseAmount minus the price allowance's cbc:Amount in UBL, or ram:ChargeAmount minus ram:ActualAmount in CII. If you cannot substantiate the gross price, omit it and the allowance — the net price alone is enough.
In the XML
A UBL fragment. The CII path is named above — same change, different element names.
<cac:Price>
<cbc:PriceAmount currencyID="EUR">105.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">10.00</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">110.00</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price><cac:Price>
<cbc:PriceAmount currencyID="EUR">100.00</cbc:PriceAmount>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:Amount currencyID="EUR">10.00</cbc:Amount>
<cbc:BaseAmount currencyID="EUR">110.00</cbc:BaseAmount>
</cac:AllowanceCharge>
</cac:Price>Related rules
NormAPI provides technical validation, not tax or legal advice.