Arquivos QBO: INTU.BID, FITID e por que as importações falham

Um arquivo .qbo é OFX 1.02 com duas peculiaridades da Intuit parafusadas por cima. São essas duas que provocam as duas reclamações que as pessoas realmente têm. Tudo o que segue foi lido do próprio exportador deste conversor, src/export/qbo.ts — não da página de marketing de outro conversor.

O QuickBooks rotula minha importação com o banco errado

Por causa de um único número. Um arquivo .qbo carrega um elemento <INTU.BID>, e o QuickBooks o valida contra o registro da Intuit de bancos que mantêm um acordo Web Connect. Um identificador arbitrário é rejeitado, então todo conversor traz um identificador registrado como padrão — e o mais comum, 3000, pertence ao Wells Fargo. É por isso que um extrato do Chase pode ser importado sob um rótulo do Wells Fargo.

É cosmético. O identificador decide o nome e o logotipo da instituição exibidos durante a importação. Ele não decide onde os lançamentos vão parar — quem escolhe a conta real do QuickBooks, na caixa de diálogo de importação, continua sendo você. Um arquivo mal rotulado é confuso, não errado.

Este conversor usa 3000 como padrão pela mesma razão que todos usam, diz isso na página em vez de esconder, e deixa você substituir: o campo ID do banco QBO ao lado dos botões de download, ?intuBid= na API ou --intu-bid na CLI. Para descobrir o identificador do seu banco, abra um .qbo gerado pelo próprio banco e leia a linha <INTU.BID> — essa é a fonte fidedigna, e a única que vamos indicar a você.

Converti o extrato de novo e nada foi importado

É o <FITID> fazendo o trabalho dele. Cada lançamento carrega um identificador de lançamento da instituição financeira, e o QuickBooks lembra dos que já viu em uma conta — para sempre. Um lançamento cujo FITID já foi importado antes é ignorado em silêncio. É isso que impede que uma reimportação duplique os lançamentos da sua conta.

O identificador tem que ser, então, estável entre exportações de um mesmo extrato e único dentro de uma mesma exportação. Aqui ele é sha1(número da conta | data | valor em centavos | primeiros 48 caracteres da descrição), truncado em 24 caracteres hexadecimais, com um contador -1, -2 acrescentado ao final quando um extrato realmente lista o mesmo lançamento duas vezes no mesmo dia.

A consequência que vale conhecer: o identificador deriva do lançamento, então, se você corrigir um valor antes de exportar, o FITID daquela linha muda e o QuickBooks o trata como um lançamento novo. Corrija primeiro, importe uma vez só.

Os campos que decidem se o arquivo chega a abrir

ElementoO que fazO que este conversor escreve
INTU.BIDIdentificador da instituição; precisa ser um que a Intuit reconheça3000, a menos que você o substitua
FITIDIdentificador por lançamento; evita duplicatas na reimportaçãosha1 do lançamento, estável
BANKIDNúmero de roteamento bancário000000000, a menos que você o substitua
ACCTTYPECHECKING / SAVINGS / MONEYMRKT / CREDITLINEsua escolha; determina o conjunto de mensagens
DTSTART / DTENDPeríodo que a lista de lançamentos cobreampliado para abranger todas as linhas do arquivo
TRNAMTValor com sinalnegativo para saídas de dinheiro

Fonte: src/export/qbo.ts.

Um cartão de crédito não é uma conta bancária

O OFX coloca os extratos de cartão em outro conjunto de mensagens: <CREDITCARDMSGSRSV1> com <CCACCTFROM>, e não <BANKMSGSRSV1> com <BANKACCTFROM>. Exporte um extrato de cartão como Conta corrente e o QuickBooks se oferece para importá-lo em uma conta bancária. Escolher Cartão de crédito troca o envelope inteiro, não só um rótulo.

DTSTART e DTEND podem descartar linhas em silêncio

Um importador tem o direito de ignorar lançamentos com data fora do período declarado, e os extratos listam com toda a naturalidade uma linha contabilizada um dia antes de o período começar. Este conversor amplia o período para cobrir todos os lançamentos que de fato estão no arquivo — um bug que encontramos e corrigimos, não uma funcionalidade.

O arquivo parece malformado para um validador XML

É para parecer mesmo. OFX 1.02 é SGML, não XML: os elementos folha não têm tag de fechamento, então <TRNAMT>-84.97 termina na quebra de linha. Um validador que espera </TRNAMT> está lendo a especificação errada. O bloco de cabeçalho acima de <OFX> é, do mesmo jeito, feito de simples linhas de chave–valor.

Os acentos saem achatados

O cabeçalho declara ENCODING:USASCII, então o corpo tem que ser ASCII de verdade. Os caracteres latinos com acento são transliterados (Zürich → Zurich); tudo o que não tem equivalente em ASCII vira ?. Os nomes de beneficiário, além disso, são cortados em 32 caracteres — o limite do OFX para <NAME> — e a descrição completa é escrita em <MEMO>, que é para onde foi o resto de uma descrição truncada.

O QuickBooks Online também aceita CSV — outra história

O arquivo .qbo é para o Web Connect do QuickBooks Desktop. O envio manual do QuickBooks Online, em vez disso, aceita CSV, e admite exatamente duas estruturas de colunas: três colunas (Date, Description, Amount, saídas de dinheiro em negativo) ou quatro (Date, Description, Credit, Debit). Duas coisas nisso surpreendem todo mundo:

A exportação CSV deste conversor tem uma predefinição QuickBooks Online que produz as duas estruturas de colunas no sentido da Intuit, remove as colunas com que o QuickBooks engasgaria e divide automaticamente os extratos longos em partes importáveis.

O que esta página não vai dizer a você

Qual INTU.BID corresponde ao seu banco específico. Circulam listas publicadas, elas são extraoficiais, e um identificador errado produz exatamente a confusão que esta página existe para explicar. Leia o número de um .qbo emitido pelo seu próprio banco.