SAFTCheck
Docs / currency-exchange
invoice.currency.exchange

Foreign-currency documents need a complete <Currency> block

When a document declares a non-EUR currency, CurrencyCode + CurrencyAmount + ExchangeRate must all be present.

What this checks

When a sales / payment / work document declares a non-EUR currency via a <Currency> block, three children are mandatory:

  • CurrencyCode — ISO-4217 (e.g. USD, GBP, BRL).
  • CurrencyAmount — gross amount in the foreign currency.
  • ExchangeRate — positive numeric rate to EUR on the document date.

If any of those is missing, empty or non-positive, the rule fires.

Why AT cares

AT's tax engine converts every foreign-currency document to EUR for VAT and SAF-T aggregates. Without an exchange rate it can't do the conversion, and the document is rejected on intake. XSD only enforces presence of <Currency> when the element exists at all — it doesn't enforce all three children together.

Examples

Currency blockVerdict
USD / 100.00 / 0.92
USD / 100.00 / 0✗ ExchangeRate must be > 0
USD / 100.00 / (missing)✗ ExchangeRate missing
(no Currency block)✓ EUR document, rule doesn't fire

How to fix

If the document is genuinely in a foreign currency, edit it in your ERP to record the day's exchange rate (Banco de Portugal publishes daily reference rates). If the document is in EUR, drop the spurious <Currency> element from the export.

Other rules

Usamos una cookie de sesión para iniciar sesión, una cookie de idioma para la preferencia lingüística y Tawk.to para el widget de chat en vivo (que establece sus propias cookies al abrir el chat). Google Analytics (GA4) se carga solo después de que aceptes, con anonimización de IP; sin rastreadores publicitarios. Consulta nuestra Política de Privacidad.