Quem faz o quê
Seu canal
Cobra, pede a numeração, imprime e injeta o pedido. Não conhece regras fiscais de
nenhum país.
Fire
Resolve a loja, o emissor e o provedor. Grava a solicitação, pede os números e responde o
que pode ser impresso.
O provedor fiscal
Traduz para os códigos do órgão, numera com o vocabulário do seu país, e envia o
documento à autoridade.
O órgão tributário
Autoriza ou rejeita. O veredito chega depois de o cliente já ter ido embora com o
comprovante.
Um único contrato, todos os países. O Fire resolve internamente qual provedor
corresponde a cada país. Sua integração é a mesma no Equador, no Brasil ou na Venezuela: o
que muda é quais campos vêm preenchidos na resposta, não a forma de pedir.
A linha do tempo
Os passos 1 a 5 acontecem com o cliente esperando no caixa: são segundos. Do 6 em diante o seu canal já não participa.Onde aparecem os dados fiscais
A numeração não fica trancada neste endpoint. Ela percorre o ciclo de vida do pedido em dois momentos distintos, e convém não misturá-los.1. O que compensamos na injeção
Quando você injeta o pedido, o Fire o enriquece com a numeração que já obteve. Esses dados viajam nos eventos do ciclo de vida normal:
Aqui ainda não há veredito do órgão: há números impressos e uma venda registrada.
2. O que o callback fiscal compensa
Minutos depois, o provedor avisa ao Fire o que a autoridade resolveu. Esse callback é o que dispara os dois eventos do desfecho:Essa é a separação que precisa ficar clara de ponta a ponta: a numeração você pede e ela
compensa o pedido; a autorização chega sozinha e compensa o desfecho. Um documento
numerado pode nunca chegar a
order.invoiced se o órgão o rejeitar.O campo que precisa ser lido: data.fiscalRepresentation
A numeração chega nesse bloco, em todos os eventos do pedido — os cinco das duas tabelas
acima.
A chave viaja sempre. Chega em null quando não se tentou numerar — agregadores, países
sem representação fiscal, ou comércios com a numeração desativada — e traz o bloco quando
houve tentativa. Ramifique pelo valor, nunca pela presença da chave:
null e o motivo em
failure — esse caso precisa ser tratado, porque antes era invisível.
E trazer o bloco também não significa que o comprovante esteja autorizado: isso quem diz é
lastKnown.fiscal.status, o único dos dois que é atualizado.
O que o bloco traz
Três camadas, e convém não misturá-las:
Os três campos do provedor não são a mesma coisa, e por isso viajam separados:
providerCodeé nosso identificador de adaptador (hio). Diz com qual integração se numerou.providerIdentityé do provedor e tem forma:name,versionereference. Essareferenceé a que você cita a ele quando um caso precisa ser escalado — não é a suaIdempotency-Key.providerMetadataé uma bolsa opaca: sem forma garantida, as chaves são do provedor e podem mudar sem aviso. Serve para colar num ticket de suporte.
compensates aponta para a nota de venda que ela
cancela, e a nota de venda inteira fica em history. Cada entrada de history tem
exatamente as mesmas chaves que o bloco acima, então se leem igual.
A referência completa do bloco, campo a campo, está em
order.opened.
As três regras que é preciso entender
Numerado não é autorizado
Numerado não é autorizado
A resposta traz dois estados, e eles nunca se fundem:
requestStatus— consegui números para imprimir?documentStatus— o órgão autorizou?
PENDING. Isso não é um problema: na maioria dos
países o comprovante é entregue antes de a autoridade vê-lo. Se a sua integração juntar os
dois num campo só, em algum momento você vai dizer a um cliente que a nota está autorizada
quando ela só tem número.A Fire não te trava, mas a conta pode
A Fire não te trava, mas a conta pode
A Fire nunca devolve um erro que te deixa sem saber o que fazer. Falhe o que falhar, a
resposta traz uma decisão explícita em
policy.numberingFailure.action.O que mudou: essa decisão nem sempre é seguir. A conta configura, por vendor, o que
acontece quando não deu para numerar.CONTINUE— o padrão, e o comportamento de sempre. Imprima conformeprinting.mode—normalmente um ticket não fiscal— e injete o pedido do mesmo jeito. O comprovante se resolve depois.REFUND— devolva a cobrança no balcão e não injete o pedido. Essa venda não aconteceu; tem que ser reportada ou não fica rastro de que houve dinheiro envolvido.
Quem decide o que se imprime é o Fire, não você
Quem decide o que se imprime é o Fire, não você
O bloco
printing não é uma dedução de haver ou não documento: é uma regra legal do
país. No Equador, em contingência, o comprovante existe e é impresso mesmo sem o órgão
tê-lo visto; num país que proíba imprimir antes da autorização, printable viria false
com o documento presente.Se cada canal deduzisse essa regra por conta própria, algum a implementaria errado — e
esse erro só aparece numa auditoria.Idempotência: três camadas
Uma venda cobrada duas vezes é um problema de dinheiro; uma venda numerada duas vezes é um problema fiscal, e não se corrige com um deploy. Por isso há três barreiras:1
Sua Idempotency-Key
Você a gera, uma por venda, e a reutiliza em cada nova tentativa daquela mesma venta. É o
que impede que uma queda de rede consuma um segundo sequencial.Se reutilizá-la com um corpo diferente, o Fire responde
409: são duas operações
distintas.2
A chave natural
país + orderCode + operação. Protege mesmo que o seu canal gere uma Idempotency-Key
nova a cada tentativa — o erro de implementação mais comum.É também a razão pela qual o orderCode precisa ser único por conta e país: se duas
lojas usarem o mesmo, o Fire corta antes de emitir.3
A do provedor
A mesma trinca, do outro lado. As duas chaves serem idênticas é o que faz uma colisão
aparecer nas duas pontas ao mesmo tempo, em vez de surgir meses depois como dois
comprovantes para uma venda.
Cancelar
Pede-se comoperation: "CANCEL" e o mesmo orderCode da venda original. Nada mais.
Seu ponto de venda não precisa guardar nenhum identificador nosso: o Fire encontra o
documento original pela chave natural. Isso é deliberado — um quiosque reinstalado ou um caixa
substituído perderiam esse dado, e a venda nunca mais poderia ser cancelada. Já o orderCode
está impresso no ticket.
Com qual instrumento o cancelamento se materializa é decisão do país: no Equador é uma nota de
crédito com sequencial próprio; no Brasil, um evento de cancelamento que não gera documento
novo.
E a partir daí o pedido leva a nota de crédito no topo. Os eventos seguintes trazem
documentType: "CREDIT_NOTE" em fiscalRepresentation, com compensates apontando para a nota
de venda cancelada e a nota de venda inteira em history.
Se você perder a resposta
Acontece: a rede cai logo depois de o Fire numerar. O comprovante existe e você não o tem.items[] com todos os documentos daquele pedido — podem ser dois, a nota e o
cancelamento. É por isso que o orderCode precisa ser a mesma string na numeração e na
injeção: é a única coisa que sobra na sua mão.
Antes de ir para produção
Seu
orderCode é único por conta e país, e é o mesmo na numeração e na injeção.Você guarda a
Idempotency-Key junto com o pedido e a reutiliza nas tentativas.Cada dispositivo declara seu
device.externalId — dois caixas da mesma loja não o compartilham.Você ramifica por
printing.mode, e não pelo código HTTP.Você imprime
documentNumber tal como chega, sem recompô-lo a partir de establecimiento, puntoEmision e secuencial.Você percorre
countryData em vez de indexar chaves fixas: quem as define é o país que numerou, e na Venezuela não há claveAcceso.Você percorre as chaves de
graphic em vez de procurar campos fixos.Você não ramifica pelas chaves de
providerMetadata: é a bolsa opaca do provedor e muda sem aviso.Sua conciliação contempla que, após um cancelamento, o documento do topo é a nota de crédito e a nota de venda está em
history.Diante de
202 você imprime provisório e injeta assim mesmo, sem repetir em loop.Referência do endpoint
Campos, respostas e exemplos por país.

