- v1.2 · atual
- v1.1 · anterior
- v1 · descontinuado
- v0 · descontinuado
Você está lendo o contrato atual (v1.2) de
order.invoiced. v1.2 adiciona data.fiscalRepresentation: a numeração fiscal que o ponto de venda obteve antes de injetar o pedido. Viaja sempre: em null quando não se tentou numerar, e preenchido quando sim — numberingStatus diz como terminou. Trazer conteúdo não significa que o comprovante esteja autorizado. Apenas aditivo — nada do que você já lia mudou.O bloco carrega o documento fiscal vigente do pedido: os campos que significam o mesmo em qualquer país no topo, os identificadores do órgão dentro de countryData no vocabulário do seu país, e os documentos anteriores em history. Quando um cancelamento numera, a nota de crédito passa ao topo e a de venda desce para o histórico — com compensates apontando para ela.order.invoiced dispara quando a autoridade fiscal do país autoriza o documento fiscal associado a um pedido — SEFAZ no Brasil, SRI no Equador, DIAN na Colômbia, AFIP na Argentina, SII no Chile, SENIAT na Venezuela. É emitido pelo pipeline fiscal do Fire, que se integra com o seu provedor fiscal como provedor de documentos.
Este evento é separado de order.completed: o pedido é pago primeiro (order.completed), depois o Fire pede a emissão fiscal via seu provedor fiscal, e order.invoiced dispara apenas quando a autoridade fiscal retorna a autorização.
Condição de disparo
O Fire emiteorder.invoiced uma vez por documento fiscal, na primeira vez em que tudo o seguinte é verdade:
- O pedido está em uma loja com faturamento fiscal habilitado (
storeFiscalConfig.enabled === true) - Um documento fiscal foi emitido para o seu provedor fiscal
- O seu provedor fiscal reporta que a autoridade fiscal autorizou o documento (o
statustransiciona paraauthorized; no Brasil isso corresponde ao códigocStatde autorização SEFAZ)
O que tem em trigger.data
Mesmo snapshot V4 que order.completed mais um bloco top-level fiscal com as referências do documento autorizado. Os campos variam por país — abaixo é mostrado o Brasil (chaveAcesso, protocolo); outros países carregam seus próprios identificadores (cufe na CO, claveAcceso no EC, cae na AR, etc.). Veja o callback fiscal genérico para o contrato por país.
O status do pedido permanece "COMPLETED" e paymentStatus permanece "SUCCEEDED" — a autorização fiscal não muda o status do pedido.
Exemplo — payload real de produção (BR, sanitizado)
Referência de data.fiscal
object
Referências do documento autorizado pela SEFAZ.
Onde vivem os totais fiscais
Os valores agregados fiscais (vBC, vNF, vICMS, etc.) não estão dentro dedata.fiscal — estão em data.payments.metadata.fiscal, o mesmo lugar onde order.completed os carrega. order.invoiced não os duplica; trate o snapshot do pedido como a única fonte de verdade para os agregados monetários.
A classificação por linha (NCM, CFOP, CSOSN, fiscalCategoryCode) vive em data.orderLines[n].metadata.fiscal. Igual a order.completed.
O bloco data.store.storeFiscalConfig carrega a identidade do emissor (CNPJ, legalName, tradeName) — também igual a order.completed.
Handler de exemplo
data.policy e data.lastKnown
Todos os eventos de pedido carregam estes dois blocos, não só este. Foram
adicionados junto com o ciclo de pagamento diferido e são adicionados na v1.1, aditivos:
consumidores existentes continuam funcionando sem alteração.
order.opened,
o evento onde estes blocos mais importam.
Erros comuns
status === "authorized", não"COMPLETED". Odata.status(status do pedido) é"COMPLETED"; o status fiscal está emdata.fiscal.status.pdfUrlexmlUrlpodem ser efêmeros. Em produção, o seu provedor fiscal pode assinar/expirar esses links. Baixe e persista os artefatos ao receber, em vez de linkar clientes diretamente ao seu provedor fiscal.cStatfrequentemente énull. Não faça lógica que dependa dele. Usestatus === "authorized"eprotocolocomo sinais autoritativos.- Não há evento para
rejected/denied/error. Se a SEFAZ rejeita o documento, nenhum evento dispara hoje. O status do documento fiscal é persistido internamente mas não dispara flow. Fique atento no roadmap. - O país não vive mais no nome do evento.
order.invoiceddispara para todos os países; usefiscal.countryCodepara filtrar. Os campos do blocofiscalvariam por país (chaveAcesso/protocolo no BR, cufe na CO, claveAcceso no EC, etc.).
Eventos relacionados
order.completed
Dispara antes deste evento — o pedido em si.
order.reversed
Dispara depois se o documento for cancelado na SEFAZ.
data.fiscalRepresentation
A numeração fiscal que o ponto de venda obteve antes de injetar o pedido:
cobra, pede os identificadores, imprime o comprovante e só então injeta. Por isso
viaja no pedido e não em um evento fiscal separado — quando o pedido nasce, isso
já aconteceu.
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.
Trazer o bloco significa que se tentou numerar, não que foi numerado:
numberingStatus diz como a tentativa terminou, e failure por quê quando não
terminou bem.
Ramifique pelo valor, não pela presença da chave:
lastKnown.fiscal,
que é o que de fato se move.
O que o substitui é um documento novo. O bloco carrega o documento fiscal
vigente do pedido. Enquanto houve apenas um, era sempre a nota de venda;
quando um cancelamento produz uma nota de crédito, é ela que fica no topo —
documentType diz qual é — e a nota de venda desce para history, inteira e
com seus próprios identificadores do órgão. Não se perde: se move. compensates
aponta para ela pelo número, então a relação fica explícita.
Quando a numeração falha
Uma venda pode ser cobrada e ficar sem comprovante fiscal. Esse caso também viaja, e precisa ser tratado: os identificadores vêmnull e o motivo em
failure.
failure.scope:
TECHNICAL— imprima “em trâmite” e siga. Pode se resolver sozinho.FUNCTIONAL— há um dado errado e repetir não resolve. Precisa correção. O que muda élastKnown.fiscal.
lastKnown.fiscal.sourceEvent agora informa a procedência real. Antes era
deduzida do status, e um processing semeado na injeção era reportado como
fiscal.callback sem que nenhum callback tivesse ocorrido. Esse caso agora diz
order.injected. Se você ramifica por este campo, contemple o valor novo.
