O percurso
orderCode
e a cola no pedido. Dali em diante ela trafega em data.fiscalRepresentation de
order.opened, order.completed,
order.invoiced, order.cancelled
e order.reversed.
Campo a campo
Equador, que é o blocodocument de /fiscal/ec/prekeys:
Um exemplo completo, com dados reais:
O bloco acima sempre tem as mesmas chaves, com
null naquelas que não se
aplicam — é contra isso que você programa. O que muda por país vive dentro de
countryData, e ali trafegam apenas as chaves do país que numerou: um comprovante
equatoriano não leva cufe, nem um colombiano claveAcceso.Os quatro casos, completos
Estes são todos os estados que o bloco pode ter, e qual resposta sua os produz. O bloco acima sempre traz as mesmas 12 chaves: o que muda são os valores e o conteúdo decountryData.
GENERATED — você numerou, há comprovante
GENERATED — você numerou, há comprovante
Você devolveu O integrador imprime e concilia.
2xx com document.countryData traz o vocabulário do SRI e nada de outros países.FAILED_FINAL — você rejeitou e retentar não adianta
FAILED_FINAL — você rejeitou e retentar não adianta
Você devolveu não-É uma venda cobrada sem comprovante fiscal. O integrador compensa do seu lado e
devolve o comprovante pelo callback. Retentar não resolve: é preciso corrigir o dado.
2xx com retryable: false.FAILED_RETRYABLE — você rejeitou, mas dá para retentar
FAILED_RETRYABLE — você rejeitou, mas dá para retentar
Você devolveu não-Mesmo bloco que o anterior; muda o
2xx com retryable: true.numberingStatus e o scope. Não há
comprovante, mas pode vir a haver: o canal retenta com o mesmo orderCode.PENDING — você não respondeu
PENDING — você não respondeu
Houve timeout ou a conexão caiu. Você nunca produz este estado: dizê-lo
implicaria ter respondido.
E o caso sem numeração
Quando a venda não passou por nenhum provedor — o comércio não fatura, ou o país não tem gateway fiscal — o bloco inteiro trafega emnull:
documentType hoje é sempre SALE_INVOICE nos eventos do pedido. CREDIT_NOTE
existe no contrato — é produzido por operation: "CANCEL" — mas a numeração do cancelamento
ainda não é anexada ao pedido. Quando for habilitada, é o mesmo bloco com
documentType: "CREDIT_NOTE".Três campos que convém entender bem
provider e metadata — dois blocos, dois destinos
Eles se parecem e não são a mesma coisa, então trafegam separados:
Nenhum dos dois leva
providerCode: esse é o nosso identificador de adaptador e já
trafega à parte, acima do bloco.
provider.reference é a única razão pela qual este bloco tem forma. Quando algo
dá errado, é o que o integrador cita para você encontrar a operação nos seus registros.
Enterrado em uma bolsa opaca — onde, por contrato, ninguém deve programar — ele não cumpria essa
função.metadata chega ao integrador sem ser tocado, em providerMetadata. Não
o interpretamos, não o validamos, não o renomeamos.
Isso tem duas faces:
E do outro lado: ninguém deve programar contra as suas chaves. Ele é declarado opaco justamente
para que você possa mudá-lo sem quebrar ninguém. Se um dado é importante o bastante para
que o integrador ramifique por ele, ele não vai em metadata — vai no contrato.
graphic — é a única coisa que não pode ser derivada
Todo o resto da resposta pode ser reconstruído ou composto. graphic não: o QR da
NFC-e brasileira é uma URL assinada com um hash que só o emitente pode construir. Se ele não
chegar, o comprovante é impresso sem QR.
Ele trafega tal como veio, sem transformação: o FIRE o repassa ao ponto de venda, que o renderiza
com a sua própria biblioteca. Não geramos imagens deste lado — o tamanho e a resolução dependem
da impressora, e isso só quem imprime sabe.
failure — habilita a compensação na outra ponta
Quando a numeração falha, o erro não fica em um log: ele trafega no evento. A venda
foi cobrada do mesmo jeito e o integrador precisa saber que ela ficou sem comprovante fiscal.
Com isso ele pode compensar do seu lado e devolver o comprovante pelo callback. Sem isso, uma
venda cobrada sem comprovante é indistinguível de uma conta que não fatura.
Por isso failure.code tem que ser estável e failure.message acionável: quem os lê não é só
a nossa equipe de suporte, é o sistema do cliente final.
O que NÃO trafega para os eventos
E o veredito do órgão, à parte
fiscalRepresentation são os números que foram impressos, e eles nunca mudam. O fato de
existirem não significa que o órgão autorizou o comprovante.
O veredito chega depois pelo seu callback e trafega em outro lugar do evento:

