Skip to content

Ironfang Finance - Rule reference

BR-CL-05: Use an ISO 4217 code for the VAT accounting currency

cbc:TaxCurrencyCode must be a code on the pinned ISO 4217 alphabetic list, such as EUR. The withdrawn HRK, numeric codes and lower case are rejected.

EN 16931Fatal: the document is invalidCode listsVAT

On this page

The short answer

BR-CL-05 fails when cbc:TaxCurrencyCode, the currency in which the seller accounts for VAT, is not a code on the ISO 4217 alphabetic list pinned with this release. Write the three-letter code of that currency in upper case: EUR in the corrected example, where the failing one had HRK.

HRK was the code of the Croatian kuna, which the euro replaced in 2023, and it is no longer on the list. The failing invoice also carried HRK as the currency of its VAT total in the accounting currency, so that amount was rejected too.

What the rule checks

The rule reads cbc:TaxCurrencyCode and nothing else, and only when the document has one. The element is optional: an invoice whose VAT is accounted for in the invoice currency leaves it out and is not checked here.

The code is trimmed and then looked up case-sensitively. When tried, 978, the numeric ISO code for the euro, and the word EURO both failed. EUR with spaces around it passed this rule but was reported by BR-53, because the currencyID of EUR on the VAT total no longer matched the code as written.

The pinned list has a gap: STN, the current code for the São Tomé and Príncipe dobra, is missing, while the older STD is still there. When tried, STN in both places failed this rule and BR-CL-03; STD passed the EN 16931 layer and was rejected on the amount by PEPPOL-EN16931-CL007, whose list has it the other way round.

Only the code is judged. That it differs from cbc:DocumentCurrencyCode is checked by PEPPOL-EN16931-R005, and that a VAT total exists in that currency by BR-53.

TermMeaningUBL element
BT-6VAT accounting currency codecbc:TaxCurrencyCode
BT-111Invoice total VAT amount in accounting currencycac:TaxTotal/cbc:TaxAmount (in the tax total without cac:TaxSubtotal)

How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

  • The VAT accounting currency is set once in configuration and still holds a code that has since been withdrawn, such as HRK after Croatia moved to the euro.
  • The currency is stored as its ISO numeric code, 978 for the euro, and written through unchanged.
  • A currency name or an abbreviation such as EURO is typed where the code belongs.
  • A formatter lower-cases codes, or the value was entered by hand in lower case.

How to fix it

  1. Find the currency in which the seller keeps its VAT accounts for this supply; for a seller reporting VAT in euro it is EUR.
  2. Write its ISO 4217 alphabetic code, three upper-case letters with no spaces, in cbc:TaxCurrencyCode.
  3. Use the same code as the currencyID of the cbc:TaxAmount in the second cac:TaxTotal, the one without a breakdown, which states the VAT total converted into that currency.
  4. If VAT is accounted for in the invoice currency after all, remove cbc:TaxCurrencyCode and the second tax total instead.
  5. Review stored currency settings when a country changes its currency; a code that was valid when it was configured can later drop off the list.

Validate your corrected invoice

Before and after

These are fragments, not complete documents. The complete synthetic documents they come from are linked below.

Fragment of the failing invoice: the VAT accounting currency and its VAT total are both in HRK

<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>HRK</cbc:TaxCurrencyCode>
<!-- buyer reference, parties and the first tax total omitted from this fragment -->
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="HRK">5.80</cbc:TaxAmount>
</cac:TaxTotal>

Fragment of the corrected invoice: EUR in both places

<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>
<!-- buyer reference, parties and the first tax total omitted from this fragment -->
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">5.80</cbc:TaxAmount>
</cac:TaxTotal>

Two values differ, HRK in the failing invoice and EUR in the corrected one: cbc:TaxCurrencyCode and the currencyID of the VAT total in that currency. BR-CL-05 is reported on the currency code. BR-CL-03 and PEPPOL-EN16931-CL007 are reported on the cbc:TaxAmount of the second cac:TaxTotal, which carries the same invalid code as its currency. Correcting the code in both places clears all three.

What the validator reported

Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.

Where it applies

  • Applies to Invoice and CreditNote; when tried, a credit note with HRK in both places reported the same three rules.
  • The Peppol layer does not test cbc:TaxCurrencyCode against a currency list. When tried with only that element changed to HRK, the Peppol layer reported PEPPOL-EN16931-R055, which found no VAT total in the accounting currency, and the EN 16931 layer added BR-53 to this rule.
  • The list is the same ISO 4217 snapshot that BR-CL-03 and BR-CL-04 apply to amounts and to the document currency.

Scope and source

Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.

The official definition of BR-CL-05 carries the normative wording and test. This page is our explanation of it, not a copy.

Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.