SAFTCheck

invoice.currency.exchange

Los documentos en moneda extranjera necesitan un bloque <Currency> completo

Cuando un documento declara una moneda distinta del EUR, CurrencyCode + CurrencyAmount + ExchangeRate deben estar todos presentes.

Qué comprueba

Un documento emitido en una moneda distinta del euro lleva un bloque <Currency> dentro de su <DocumentTotals>. El bloque tiene tres hijos, todos obligatorios:

  • CurrencyCode: el código ISO 4217 de la moneda original (por ejemplo USD, GBP, BRL).
  • CurrencyAmount: el total bruto del documento en esa moneda.
  • ExchangeRate: el tipo de cambio usado para convertir el documento a euros.

SAFTCheck comprueba facturas (Invoice), documentos de trabajo (WorkDocument) y recibos (Payment). La regla se dispara cuando falta cualquiera de los tres o está vacío, o cuando ExchangeRate no es un número mayor que cero.

Un ejemplo correcto

Una factura de 1.000,00 USD convertida a 0,92, de modo que los totales en euros son 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 los demás importes del documento (líneas, NetTotal, GrossTotal) siguen en euros. Solo CurrencyAmount está en la moneda original.

Por qué importa

La AT trabaja en euros: el IVA y los totales del SAF-T están todos en EUR, y el tipo de cambio es lo que vincula un documento en moneda extranjera con ellos. El esquema oficial ya obliga a incluir los tres hijos siempre que el bloque esté presente, así que un elemento ausente también aparece como error de esquema. Sin embargo, ese error es difícil de leer, y el esquema acepta un ExchangeRate de 0, que nunca puede ser correcto. Esta regla, en cambio, indica el documento y el campo que falta.

Ejemplos

Bloque CurrencyVeredicto
USD / 1000.00 / 0.92✓
USD / 1000.00 / 0✗ ExchangeRate debe ser mayor que 0
USD / 1000.00 / (falta)✗ Falta ExchangeRate
USD / (vacío) / 0.92✗ Falta CurrencyAmount
EUR / 920.00 / 1✗ Error de esquema: EUR no es un código permitido, porque los documentos en euros no deben tener bloque Currency
(sin bloque Currency)✓ Documento en euros, la regla no se aplica

Causas habituales

  • El ERP escribe un bloque Currency en todos los documentos, incluidos los que están en euros, con EUR y un tipo de cambio de 1. El esquema solo admite aquí códigos de monedas extranjeras, así que hay que quitar el bloque.
  • No se registró el tipo de cambio al emitir el documento (a menudo en facturas creadas a mano o documentos importados de otro sistema), así que la exportación escribe un tipo vacío o cero.
  • Confundir la moneda del cliente con la del documento: un cliente extranjero facturado en euros no necesita bloque Currency.

Cómo corregir

  1. Si el documento es realmente en moneda extranjera, registra el tipo de cambio en el documento en tu ERP (el Banco de Portugal publica tipos de referencia diarios) y vuelve a exportar.
  2. Si el documento es en euros, cambia la configuración de exportación del ERP para que no escriba un bloque <Currency> en los documentos en euros.

En la página del resultado, el hallazgo muestra de qué documento se trata (por ejemplo Invoice[12].Currency) y qué campos faltan o no son válidos.

Relacionado

Otras reglas