Archivos QBO: INTU.BID, FITID y por qué fallan las importaciones

Un archivo .qbo es OFX 1.02 con dos peculiaridades de Intuit atornilladas encima. Esas dos son las que provocan las dos quejas que la gente tiene de verdad. Todo lo que sigue está sacado del propio exportador de este conversor, src/export/qbo.ts — no de la página de marketing de otro conversor.

QuickBooks etiqueta mi importación con el banco equivocado

Por un solo número. Un archivo .qbo lleva un elemento <INTU.BID>, y QuickBooks lo coteja con el registro de Intuit de bancos que tienen un acuerdo Web Connect. Un identificador arbitrario se rechaza, así que todos los conversores incluyen uno registrado como valor por defecto — y el más habitual, 3000, pertenece a Wells Fargo. Por eso un extracto de Chase puede importarse bajo una etiqueta de Wells Fargo.

Es cosmético. El identificador decide el nombre y el logotipo de la entidad que se muestran durante la importación. No decide dónde acaban los movimientos — la cuenta real de QuickBooks la sigue eligiendo usted en el cuadro de diálogo de importación. Un archivo mal etiquetado resulta confuso, no incorrecto.

Este conversor usa 3000 por defecto por la misma razón que todos, lo dice en la página en lugar de ocultarlo y permite sustituirlo: el campo ID de banco QBO junto a los botones de descarga, ?intuBid= en la API o --intu-bid en la CLI. Para encontrar el identificador de su banco, abra un .qbo generado por el propio banco y lea la línea <INTU.BID> — esa es la fuente fidedigna, y la única a la que le remitiremos.

Volví a convertir el extracto y no se importó nada

Es <FITID> haciendo su trabajo. Cada movimiento lleva un identificador de movimiento de la entidad financiera, y QuickBooks recuerda los que ya ha visto en una cuenta — de forma permanente. Un movimiento cuyo FITID se importó antes se omite en silencio. Eso es lo que impide que una reimportación duplique su registro.

El identificador tiene que ser, entonces, estable entre exportaciones de un mismo extracto y único dentro de él. Aquí es sha1(número de cuenta | fecha | importe en centavos | primeros 48 caracteres de la descripción), truncado a 24 caracteres hexadecimales, con un contador -1, -2 añadido al final cuando un extracto lista realmente el mismo movimiento dos veces el mismo día.

La consecuencia que conviene conocer: el identificador se deriva del movimiento, así que si corrige un importe antes de exportar, el FITID de esa fila cambia y QuickBooks lo trata como un movimiento nuevo. Corrija primero, importe una sola vez.

Los campos de los que depende que el archivo llegue a abrirse

ElementoQué haceQué escribe este conversor
INTU.BIDIdentificador de la entidad; debe ser uno que Intuit reconozca3000, salvo que lo sustituya
FITIDIdentificador por movimiento; evita duplicados al reimportarsha1 del movimiento, estable
BANKIDNúmero de ruta bancaria000000000, salvo que lo sustituya
ACCTTYPECHECKING / SAVINGS / MONEYMRKT / CREDITLINEsu elección; determina el conjunto de mensajes
DTSTART / DTENDPeriodo que cubre la lista de movimientosampliado para abarcar todas las filas del archivo
TRNAMTImporte con signonegativo para las salidas de dinero

Fuente: src/export/qbo.ts.

Una tarjeta de crédito no es una cuenta bancaria

OFX coloca los extractos de tarjeta en otro conjunto de mensajes: <CREDITCARDMSGSRSV1> con <CCACCTFROM>, y no <BANKMSGSRSV1> con <BANKACCTFROM>. Exporte un extracto de tarjeta como Cuenta corriente y QuickBooks se ofrecerá a importarlo en una cuenta bancaria. Elegir Tarjeta de crédito cambia el sobre entero, no solo una etiqueta.

DTSTART y DTEND pueden descartar filas en silencio

Un importador está en su derecho de ignorar los movimientos con fecha fuera del periodo declarado, y los extractos listan con toda normalidad una fila contabilizada el día antes de que empezara el periodo. Este conversor amplía el periodo para cubrir todos los movimientos que realmente están en el archivo — un error que encontramos y corregimos, no una funcionalidad.

El archivo le parece mal formado a un validador XML

Es lo previsto. OFX 1.02 es SGML, no XML: los elementos hoja no tienen etiqueta de cierre, así que <TRNAMT>-84.97 termina en el salto de línea. Un validador que espera </TRNAMT> está leyendo la especificación equivocada. El bloque de cabecera situado encima de <OFX> son, igualmente, simples líneas de clave–valor.

Los acentos salen aplanados

La cabecera declara ENCODING:USASCII, así que el cuerpo tiene que ser ASCII de verdad. Los caracteres latinos con acento se transliteran (Zürich → Zurich); todo lo que no tiene equivalente ASCII se convierte en ?. Los nombres de beneficiario, además, se recortan a 32 caracteres — el límite de OFX para <NAME> — y la descripción completa se escribe en <MEMO>, que es adonde fue a parar el resto de una descripción truncada.

QuickBooks Online también acepta CSV — harina de otro costal

El archivo .qbo es para Web Connect de QuickBooks Desktop. La carga manual de QuickBooks Online admite CSV en su lugar, y acepta exactamente dos estructuras de columnas: tres columnas (Date, Description, Amount, salidas de dinero en negativo) o cuatro (Date, Description, Credit, Debit). Dos cosas sorprenden a todo el mundo:

La exportación CSV de este conversor incluye un ajuste preestablecido QuickBooks Online que produce las dos estructuras de columnas en el sentido de Intuit, quita las columnas con las que QuickBooks se atragantaría y divide automáticamente los extractos largos en partes importables.

Lo que esta página no le va a decir

Qué INTU.BID corresponde a su banco concreto. Circulan listas publicadas, son extraoficiales, y un identificador equivocado produce exactamente la confusión que esta página existe para explicar. Léalo de un .qbo emitido por su propio banco.