invoice.currency.exchange
Documentos em moeda estrangeira precisam de um bloco <Currency> completo
Quando um documento declara uma moeda não-EUR, CurrencyCode + CurrencyAmount + ExchangeRate têm de estar todos presentes.
O que se verifica
Um documento emitido numa moeda que não o euro inclui um bloco <Currency> dentro de <DocumentTotals>. O bloco tem três filhos, todos obrigatórios:
CurrencyCode: o código ISO 4217 da moeda original (por exemploUSD,GBP,BRL).CurrencyAmount: o total bruto do documento nessa moeda.ExchangeRate: a taxa usada para converter o documento para euros.
O SAFTCheck verifica faturas (Invoice), documentos de conferência (WorkDocument) e recibos (Payment). A regra dispara quando qualquer um dos três está em falta ou vazio, ou quando ExchangeRate não é um número superior a zero.
Um exemplo correto
Uma fatura de 1.000,00 USD convertida à taxa de 0,92, pelo que os totais em euros são 920,00:
<DocumentTotals>
<TaxPayable>0.00</TaxPayable>
<NetTotal>920.00</NetTotal>
<GrossTotal>920.00</GrossTotal>
<Currency>
<CurrencyCode>USD</CurrencyCode>
<CurrencyAmount>1000.00</CurrencyAmount>
<ExchangeRate>0.92</ExchangeRate>
</Currency>
</DocumentTotals>
Todos os outros montantes do documento (linhas, NetTotal, GrossTotal) ficam em euros. Apenas CurrencyAmount está na moeda original.
Porque é importante
A AT trabalha em euros: o IVA e os totais do SAF-T estão todos em EUR, e a taxa é o que liga um documento em moeda estrangeira a esses valores. O esquema oficial já obriga aos três filhos sempre que o bloco existe, por isso um elemento em falta também aparece como erro de esquema. Esse erro, no entanto, é difícil de ler, e o esquema aceita um ExchangeRate de 0, que nunca pode estar certo. Esta regra indica antes o documento e o campo em falta.
Exemplos
| Bloco Currency | Veredicto |
|---|---|
USD / 1000.00 / 0.92 | ✓ |
USD / 1000.00 / 0 | ✗ ExchangeRate tem de ser superior a 0 |
USD / 1000.00 / (em falta) | ✗ ExchangeRate em falta |
USD / (vazio) / 0.92 | ✗ CurrencyAmount em falta |
EUR / 920.00 / 1 | ✗ Erro de esquema: EUR não é um código permitido, porque os documentos em euros não podem ter bloco Currency |
| (sem bloco Currency) | ✓ Documento em euros, a regra não se aplica |
Causas comuns
- O ERP escreve um bloco Currency em todos os documentos, incluindo os emitidos em euros, com
EURe taxa 1. O esquema só permite aqui códigos de moedas estrangeiras, por isso o bloco tem de ser retirado. - A taxa não foi registada quando o documento foi emitido (muitas vezes em faturas criadas manualmente ou documentos importados de outro sistema), e a exportação escreve uma taxa vazia ou zero.
- Moeda do cliente confundida com moeda do documento: um cliente estrangeiro faturado em euros não precisa de bloco Currency.
Como corrigir
- Se o documento é mesmo em moeda estrangeira, registe a taxa de câmbio no documento no seu ERP (o Banco de Portugal publica taxas de referência diárias) e volte a exportar.
- Se o documento é em euros, altere a definição de exportação do ERP para que não escreva um bloco
<Currency>em documentos em euros.
Na página do resultado, o aviso indica qual é o documento (por exemplo Invoice[12].Currency) e que campos estão em falta ou são inválidos.
Relacionado
- Reconciliação de totais: os totais dos blocos são comparados em euros.
- Mensagens de erro do SAF-T na AT: "Ficheiro inválido", "Rejeitado" e erros cvc-