Rule at a Glance

ID Severity Context (XPath)
Series ref. BR-94 | Schematron ID: ibr-111 Fatal (error) cac:InvoiceLine | cac:CreditNoteLine

Assert text: [ibr-111]-Item price discount (ibt-147) MUST occur maximum once.

Test: count(cac:Price/cac:AllowanceCharge/cbc:Amount) <= 1

Classification

Transaction Data. The rule governs how a single line's pricing is expressed at the moment the invoice is built, not how a master data record is maintained.

What the Rule Is Checking

Each invoice or credit note line may carry at most one Item price discount — the amount deducted from the item gross price (ibt-148) to arrive at the item net price (ibt-146). The schematron counts the cbc:Amount elements inside cac:Price/cac:AllowanceCharge and fails the document if more than one is present. Zero occurrences pass; the discount is optional. Two or more fail, whatever their individual values.

The rule constrains the price structure only. Line-level allowances and charges expressed at the document or line level through cac:AllowanceCharge outside cac:Price are a different construct and are not counted here.

Why This Rule Exists

Item price at line level is a three-value arithmetic statement: gross price minus discount equals net price. A single discount amount keeps that statement unambiguous and independently recalculable by the receiver and by the authority. Two discount elements would leave the relationship between them undefined — sequential, cumulative, or alternative — and no receiving system could reproduce the net price with confidence.

The commercial pressure runs the other way. Businesses routinely apply a contract discount and then a volume or promotional discount to the same item, and the instinct is to show both on the line. PINT AE requires the arithmetic result of that stacking to be expressed as one figure, with the individual components carried elsewhere if the business needs them visible.

UAE Data Example

PASSES ✓

<cac:Price>
  <cbc:PriceAmount currencyID="AED">850.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="AED">150.00</cbc:Amount>
    <cbc:BaseAmount currencyID="AED">1000.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>

Gross price AED 1,000.00, a single discount of AED 150.00, net price AED 850.00. A contract discount of AED 100.00 and a volume discount of AED 50.00 are combined into the one figure.

FAILS ✗

<cac:Price>
  <cbc:PriceAmount currencyID="AED">850.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:Amount currencyID="AED">100.00</cbc:Amount>
  </cac:AllowanceCharge>
  <cac:AllowanceCharge>
    <cbc:Amount currencyID="AED">50.00</cbc:Amount>
  </cac:AllowanceCharge>
</cac:Price>

Two discount amounts on one line. The net price is arithmetically correct and the document still fails, because the count exceeds one.

What Your ERP / IT Team Must Ensure

  • Pricing procedures that stack multiple discount condition types must aggregate them into a single output value before the PINT AE mapping runs, rather than emitting one allowance element per condition record.
  • Where the individual discount components carry commercial meaning the customer expects to see, carry them in line description or supporting document references, not as additional price allowance elements.
  • Confirm that the aggregated discount reconciles against the item gross price and item net price, since ibr-027 and ibr-028 separately prohibit negative values in both.
  • Test the specific configurations most likely to breach this: promotional pricing overlaid on contract pricing, and rebate accruals posted as a second line-level condition.
  • Distinguish price-level allowances from line-level and document-level allowances in the mapping specification, because they occupy different UBL locations and only the price-level one is constrained here.

Related Rules