Skip to main content
Estás viendo el contrato actual (v1.2) de order.invoiced. v1.2 agrega data.fiscalRepresentation: la numeración fiscal que el punto de venta obtuvo antes de inyectar la orden. Viaja siempre: en null cuando no se intentó numerar, y con contenido cuando sí —numberingStatus dice cómo terminó—. Que traiga contenido no significa que el comprobante esté autorizado. Solo aditivo — nada de lo que ya leías cambió.El bloque lleva el documento fiscal vigente de la orden: los campos que significan lo mismo en todo país arriba, los identificadores del ente dentro de countryData con el vocabulario de su país, y los documentos anteriores en history. Cuando una anulación numera, la nota de crédito pasa arriba y la factura baja al histórico — con compensates apuntando a ella.
order.invoiced dispara cuando la autoridad fiscal del país autoriza el documento fiscal asociado a una orden — SEFAZ en Brasil, SRI en Ecuador, DIAN en Colombia, AFIP en Argentina, SII en Chile, SENIAT en Venezuela. Lo emite el pipeline fiscal de Fire, que se integra con tu proveedor fiscal como proveedor de documentos. Este evento es separado de order.completed: la orden se paga primero (order.completed), después Fire pide la emisión fiscal vía tu proveedor fiscal, y order.invoiced dispara solo cuando la autoridad fiscal devuelve la autorización.

Condición de disparo

Fire emite order.invoiced una vez por documento fiscal, la primera vez que todo lo siguiente es verdadero:
  • La orden está en una tienda con facturación fiscal habilitada (storeFiscalConfig.enabled === true)
  • Se emitió un documento fiscal a tu proveedor fiscal
  • tu proveedor fiscal reporta que la autoridad fiscal autorizó el documento (el status transiciona a authorized; en Brasil esto corresponde al código cStat de autorización SEFAZ)

Qué hay en trigger.data

Mismo snapshot V4 que order.completed más un bloque top-level fiscal con las referencias del documento autorizado. Los campos varían por país — abajo se muestra Brasil (chaveAcesso, protocolo); otros países llevan sus identificadores propios (cufe en CO, claveAcceso en EC, cae en AR, etc.). Ver el callback fiscal genérico para el contrato por país. El status de la orden permanece "COMPLETED" y paymentStatus permanece "SUCCEEDED" — la autorización fiscal no cambia el status de orden.

Ejemplo — payload real de producción (BR, sanitizado)

Referencia de data.fiscal

object
Referencias del documento autorizado por SEFAZ.

Dónde viven los totales fiscales

Los valores agregados fiscales (vBC, vNF, vICMS, etc.) no están dentro de data.fiscal — están en data.payments.metadata.fiscal, el mismo lugar donde order.completed los lleva. order.invoiced no los duplica; trata el snapshot de la orden como la única fuente de verdad para los agregados monetarios. La clasificación por línea (NCM, CFOP, CSOSN, fiscalCategoryCode) vive en data.orderLines[n].metadata.fiscal. Igual que en order.completed. El bloque data.store.storeFiscalConfig lleva la identidad del emisor (CNPJ, legalName, tradeName) — también igual a order.completed.

Handler de ejemplo

data.policy y data.lastKnown

Todos los eventos de orden llevan estos dos bloques, no solo este. Se agregaron junto con el ciclo de pago diferido y son agregados en v1.1, aditivos: los consumidores existentes siguen funcionando sin cambios.
El detalle campo por campo está en order.opened, el evento donde estos bloques más importan.

Errores comunes

  • status === "authorized", no "COMPLETED". El data.status (status de la orden) es "COMPLETED"; el status fiscal está en data.fiscal.status.
  • pdfUrl y xmlUrl pueden ser efímeros. En producción, tu proveedor fiscal puede firmar/expirar estos links. Descarga y persiste los artefactos al recibir, en lugar de linkear clientes directamente a tu proveedor fiscal.
  • cStat a menudo es null. No hagas lógica que dependa de él. Usa status === "authorized" y protocolo como señales autoritativas.
  • No hay evento para rejected / denied / error. Si SEFAZ rechaza el documento, no dispara evento hoy. El status del documento fiscal se persiste internamente pero no se dispara flow. Vigila esto en el roadmap.
  • El país ya no vive en el nombre del evento. order.invoiced dispara para todos los países; usa fiscal.countryCode para filtrar. Los campos del bloque fiscal varían por país (chaveAcesso/protocolo en BR, cufe en CO, claveAcceso en EC, etc.).

Eventos relacionados

order.completed

Dispara antes de este evento — la orden misma.

order.reversed

Dispara después si el documento se cancela en SEFAZ.

data.fiscalRepresentation

La numeración fiscal que el punto de venta obtuvo antes de inyectar la orden: cobra, pide los identificadores, imprime el comprobante y recién después inyecta. Por eso viaja en la orden y no en un evento fiscal aparte — cuando la orden nace, esto ya ocurrió.
Que este bloque exista NO significa que el comprobante esté autorizado. Son los números que se imprimieron en la caja; el veredicto del ente lo da lastKnown.fiscal.status. Un ticket que diga “autorizado” solo porque el bloque está presente declara algo que puede no haber pasado.
La clave viaja siempre. Llega en null cuando no se intentó numerar —agregadores, países sin representación fiscal, o comercios con la numeración desactivada— y con el bloque cuando sí se intentó. Que traiga bloque significa que se intentó numerar, no que se numeró: numberingStatus dice cómo terminó el intento, y failure por qué cuando no terminó bien. Ramificá por valor, no por presencia de la clave:
El veredicto del ente no lo altera. Lo que el cliente se llevó impreso no cambia porque el organismo después autorice o rechace; para eso está lastKnown.fiscal, que es lo que sí se mueve. Lo que sí lo reemplaza es un documento nuevo. El bloque lleva el documento fiscal vigente de la orden. Mientras solo hubo uno, era siempre la factura; cuando una anulación produce una nota de crédito, arriba queda la nota — documentType dice cuál es— y la factura baja a history, entera y con sus propios identificadores del ente. No se pierde: se mueve. compensates apunta a ella por su número, así que la relación entre los dos queda explícita.

Cuando la numeración falla

Una venta puede cobrarse y quedarse sin comprobante fiscal. Ese caso también viaja, y hay que contemplarlo: los identificadores vienen en null y el motivo en failure.
Ramificá por failure.scope:
  • TECHNICAL — imprimí “en trámite” y seguí. Puede resolverse solo.
  • FUNCTIONAL — hay un dato mal y reintentar no lo arregla. Requiere corrección.
lastKnown.fiscal.sourceEvent ahora informa la procedencia real. Antes se deducía del estado, y un processing sembrado al inyectar se reportaba como fiscal.callback sin que ningún callback hubiera ocurrido. Ahora ese caso dice order.injected. Si ramificás por este campo, contemplá el valor nuevo.