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.

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