# PEPPOL-EN16931-R055: Give the VAT total in the accounting currency the same sign as the invoice VAT total

The VAT totals in the invoice currency and in the VAT accounting currency must not be on opposite sides of zero. Zero goes with either sign.

- Layer: Peppol BIS Billing
- Severity: fatal (the document is invalid)
- Topics: VAT, Totals
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R055/
- Explanation last updated: 2026-09-24

## The short answer

`PEPPOL-EN16931-R055` fails when a document with `cbc:TaxCurrencyCode` states its VAT total in the invoice currency and in the accounting currency with opposite signs. Both are `cbc:TaxAmount` elements directly under a `cac:TaxTotal`, told apart by `currencyID`. Convert the invoice VAT total again and keep its sign: in the recorded example 5.00 GBP of VAT was stated as -5.80 EUR.

The rule also fails when one of the two amounts cannot be found, which is why it accompanies `BR-53` when the accounting-currency total is missing.

## What the rule checks

Without `cbc:TaxCurrencyCode` the rule passes straight away. With it, the rule picks out the tax total amount whose `currencyID` is the accounting currency and the one whose `currencyID` is the invoice currency, trimming spaces from both codes but not changing their case.

It passes when both amounts are zero or below, or both are zero or above. Zero on one side is therefore compatible with any sign on the other: when tried, 0.00 EUR against 5.00 GBP passed every layer.

Signs are all that is compared. The size of the converted amount, and the exchange rate behind it, are not checked by this rule or any other.

An amount that cannot be found fails the rule. If no tax total carries the accounting currency, because the amount was dropped or written with another `currencyID`, there is nothing to compare and the finding appears.

A negative document passes when both totals are negative. When tried, an invoice with -5.00 GBP and -5.80 EUR of VAT was valid, and the same invoice with 5.80 EUR reported this rule.

| Term | Meaning | UBL element |
|---|---|---|
| BT-110 | Invoice total VAT amount | `cac:TaxTotal/cbc:TaxAmount (currencyID equal to cbc:DocumentCurrencyCode)` |
| BT-111 | Invoice total VAT amount in accounting currency | `cac:TaxTotal/cbc:TaxAmount (currencyID equal to cbc:TaxCurrencyCode)` |
| BT-6 | VAT accounting currency code | `cbc:TaxCurrencyCode` |

## How an integration ends up here

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

- The converted amount is taken from a ledger posting, where output VAT is held as a negative credit, while the invoice VAT total is written as a positive figure.
- A credit or correction is produced by flipping signs, and the flip is applied to the invoice-currency amounts but not to the converted VAT total, or the other way round.
- The converted figure is computed from an absolute value, so a negative invoice ends up with a positive accounting-currency total.
- The converted figure is missing or carries the wrong `currencyID`, so the rule finds only one of the two amounts.

## How to fix it

1. Take the VAT total in the invoice currency from the `cac:TaxTotal` that holds the breakdown.
2. Convert that figure, sign included, into the accounting currency at the rate your VAT accounting requires, and round to two decimals.
3. Write the result to the `cbc:TaxAmount` of the tax total without a breakdown, with `currencyID` equal to `cbc:TaxCurrencyCode`.
4. If it is the invoice-currency total whose sign is wrong, correct it at source instead, and recalculate the breakdown and monetary totals that depend on it.

## Before and after

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

Fragment of the failing invoice: 5.00 of VAT in GBP, but -5.80 in the EUR accounting currency

```xml
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>
<!-- buyer reference and parties omitted from this fragment -->
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
  <!-- VAT breakdown omitted from this fragment -->
</cac:TaxTotal>
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">-5.80</cbc:TaxAmount>
</cac:TaxTotal>
```

Fragment of the corrected invoice: both VAT totals are positive

```xml
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:TaxCurrencyCode>EUR</cbc:TaxCurrencyCode>
<!-- buyer reference and parties omitted from this fragment -->
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
  <!-- VAT breakdown omitted from this fragment -->
</cac:TaxTotal>
<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">5.80</cbc:TaxAmount>
</cac:TaxTotal>
```

Only the EUR amount differs: -5.80 in the failing invoice, 5.80 in the corrected one. The failing document reports this rule and nothing else, because no other EN 16931 or Peppol rule looks at the value of the accounting-currency total. The 5.80 is an illustrative figure, and nothing relates it to the 5.00 in GBP.

### What the validator reported

- The failing invoice reports **PEPPOL-EN16931-R055**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/PEPPOL-EN16931-R055-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/tax-currency-valid.xml)

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 UBL `Invoice` and `CreditNote`. A credit note with -5.80 EUR against 5.00 GBP reported this rule when tried.
- Reported by the Peppol layer; the EN 16931 layer passes the recorded example.
- A stray accounting-currency total in a document without `cbc:TaxCurrencyCode` is not this rule's concern. `PEPPOL-EN16931-R054` reports it.

## Related rules

- [BR-53 requires the accounting-currency VAT total whose sign this rule checks](https://ironfang.uk/docs/finance/rules/BR-53.md)
- [PEPPOL-EN16931-R054 requires exactly one tax total without a breakdown for the accounting currency](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R054.md)
- [BR-CO-14 checks the invoice-currency VAT total against its breakdown](https://ironfang.uk/docs/finance/rules/BR-CO-14.md)
- [PEPPOL-EN16931-R005 requires the accounting currency to differ from the invoice currency](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R005.md)

## 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-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

[The official definition of PEPPOL-EN16931-R055](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/PEPPOL-EN16931-R055/) 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.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/PEPPOL-EN16931-R055)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
