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.

Fails
<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>
Fixed
<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.