BR-28The Item gross price (BT-148) shall NOT be negative.
Official rule text
A line's gross price (BT-148) may not be negative — the list price before the discount, not the net price of BR-27. Unlike that one it is optional: with no gross price there is nothing for BR-28 to report.
- 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 BR-28 happen?
Whoever sets the net price negative usually sets the gross price negative too, both coming from one source. The two rules therefore almost always report together.
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
(cac:Price/cac:AllowanceCharge/cbc:BaseAmount) >= 0 or not(exists(cac:Price/cac:AllowanceCharge/cbc:BaseAmount))- CII
(ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:ChargeAmount >= 0) or not(ram:SpecifiedLineTradeAgreement/ram:GrossPriceProductTradePrice/ram:ChargeAmount)
Source: rule set v2026-08-31
How do you fix BR-28?
Keep cac:Price/cac:AllowanceCharge/cbc:BaseAmount in UBL, or ram:GrossPriceProductTradePrice/ram:ChargeAmount in CII, positive, and put the sign where the norm provides for it — see BR-27. Once a gross price is sent, PEPPOL-EN16931-R046 also requires it to reconcile: net price = gross price − discount.
In the XML
A UBL fragment. The CII path is named above — same change, different element names.
<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><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
- The core EN 16931 rules — which fields an invoice has to carry
- BR-27 — Negative net price (BT-146)
- BR-29 — If both Invoicing period start date (BT-73) and Invoicing period end date (BT-74) are given then the Invoicing period end date (BT-74) shall be later or equal to the Invoicing period start date (BT-73).
NormAPI provides technical validation, not tax or legal advice.