Rule at a Glance
| ID | Severity | Context (XPath) |
|---|---|---|
| Series ref. BR-37 | Fatal (error) | ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator=true] |
| Schematron ID: ibr-038 | Fields: IBT-104 (Document level charge reason), IBT-105 (Document level charge reason code) | ||
Classification
Transaction Data — BR-37 is the companion rule to BR-35. Where BR-35 requires a document-level charge to carry an amount, BR-37 requires the same charge block to explain itself — either through a free-text reason or a coded reason drawn from the UNCL 7161 charge reason code list.
What the Rule Is Checking
For a document-level AllowanceCharge with ChargeIndicator true, the rule checks that either cbc:AllowanceChargeReason or cbc:AllowanceChargeReasonCode is present. Either satisfies the rule on its own; both may be provided together. A charge block with an amount but neither a reason nor a reason code fails as a fatal error.
Why This Rule Exists
A charge amount by itself tells the buyer and the tax authority that the invoice total was increased, but not on what basis. The reason field closes that gap. On the buyer's side, an unexplained addition to the invoice value is difficult to match against a purchase order or a commercial agreement — the accounts payable function needs to know whether the added amount is freight, insurance, or an administrative fee before it can approve payment with confidence.
The coded reason also matters for reporting. A business that regularly applies delivery charges, rush fees, and insurance premiums as separate document-level charges can only distinguish between them in aggregate if the reason is coded consistently. A free-text description alone makes that kind of downstream analysis considerably harder to automate.
UAE Data Example
PASSES ✓: Document-level charge, Amount = 200.00 AED, AllowanceChargeReason = "Freight and delivery". Reason present as free text; rule passes.
PASSES ✓: Document-level charge, Amount = 75.00 AED, AllowanceChargeReasonCode populated from UNCL 7161, no free-text reason. Coded reason alone satisfies the rule.
FAILS ✗: Document-level charge, Amount = 90.00 AED, no AllowanceChargeReason and no AllowanceChargeReasonCode. Fatal error — the addition has a value but no stated basis.
What Your ERP / IT Team Must Ensure
- Where your billing module applies standard surcharges — freight, insurance, handling — confirm a reason description is captured at the point the charge is configured, so it is available consistently at invoice generation rather than reconstructed afterwards.
- Decide whether your extraction logic maps to the free-text reason, the UNCL 7161 coded reason, or both. The coded reason supports consistent reporting across recurring charge types; free text does not aggregate cleanly.
- For charges that vary by shipment or transaction — a one-off customs handling fee, for instance — ensure the reason text is specific enough to be meaningful on its own, since these will not always map neatly to a standard code.
- Include a negative test case — a charge with an amount but no reason — in your pre-submission validation suite to confirm BR-37 is caught before transmission.
Related Rules
BR-35 (ibr-036) requires the amount on the same document-level charge block. BR-38 (ibr-044) applies the equivalent reason requirement to a line-level charge (IBG-28). BR-33 (ibr-033) applies the mirrored requirement to a document-level allowance rather than a charge.
