El recorrido
orderCode
y la pega a la orden. Desde ahí viaja en data.fiscalRepresentation de
order.opened, order.completed,
order.invoiced, order.cancelled
y order.reversed.
Campo por campo
Ecuador, que es el bloquedocument de /fiscal/ec/prekeys:
Un ejemplo completo, con datos reales:
El bloque de arriba siempre tiene las mismas claves, en
null las que no
apliquen — es contra eso que programás. Lo que cambia por país vive adentro de
countryData, y ahí viajan solo las claves del país que numeró: un comprobante
ecuatoriano no lleva cufe, ni uno colombiano claveAcceso.Los cuatro casos, completos
Estos son todos los estados que puede tener el bloque, y qué respuesta tuya los produce. El bloque de arriba siempre trae las mismas 12 claves: lo que cambia son los valores y el contenido decountryData.
GENERATED — numeraste, hay comprobante
GENERATED — numeraste, hay comprobante
Devolviste El integrador imprime y concilia.
2xx con document.countryData trae el vocabulario del SRI y nada de otros países.FAILED_FINAL — rechazaste y reintentar no sirve
FAILED_FINAL — rechazaste y reintentar no sirve
Devolviste no-Es una venta cobrada sin comprobante fiscal. El integrador compensa de su lado y
devuelve el comprobante por el callback. Reintentar no lo arregla: hay que corregir el dato.
2xx con retryable: false.FAILED_RETRYABLE — rechazaste, pero se puede reintentar
FAILED_RETRYABLE — rechazaste, pero se puede reintentar
Devolviste no-Mismo bloque que el anterior; cambia el
2xx con retryable: true.numberingStatus y el scope. No hay
comprobante, pero puede haberlo: el canal reintenta con el mismo orderCode.PENDING — no respondiste
PENDING — no respondiste
Hubo timeout o se cortó la conexión. Vos nunca producís este estado: decirlo
implicaría haber contestado.
Y el caso sin numeración
Cuando la venta no pasó por ningún proveedor —el comercio no factura, o el país no tiene gateway fiscal— el bloque entero viaja ennull:
documentType hoy siempre es SALE_INVOICE en los eventos de la orden. CREDIT_NOTE
existe en el contrato —lo produce operation: "CANCEL"— pero la numeración de la anulación
todavía no se adjunta a la orden. Cuando se habilite, es el mismo bloque con
documentType: "CREDIT_NOTE".Tres campos que conviene entender bien
provider y metadata — dos bloques, dos destinos
Se parecen y no son lo mismo, así que viajan por separado:
Ninguno de los dos lleva
providerCode: ese es nuestro identificador de adaptador y ya
viaja aparte, arriba del bloque.
provider.reference es la única razón por la que este bloque tiene forma. Cuando algo
sale mal, es lo que el integrador te cita para que encuentres la operación en tus registros.
Enterrado en una bolsa opaca —donde por contrato nadie debe programar— no cumplía esa
función.metadata llega al integrador sin tocar, en providerMetadata. No lo
interpretamos, no lo validamos, no lo renombramos.
Eso tiene dos caras:
Y del otro lado: nadie debe programar contra sus claves. Está declarado opaco justamente
para que puedas cambiarlo sin romper a nadie. Si un dato es lo bastante importante como para
que el integrador ramifique por él, no va en metadata — va en el contrato.
graphic — es lo único que no se puede derivar
Todo lo demás de la respuesta se puede reconstruir o componer. graphic no: el QR de la
NFC-e brasileña es una URL firmada con un hash que solo puede construir el emisor. Si no
llega, el comprobante se imprime sin QR.
Viaja tal cual, sin transformar: FIRE se lo pasa al punto de venta, que lo renderiza con su
propia librería. No generamos imágenes de este lado — el tamaño y la resolución dependen de
la impresora, y eso solo lo sabe quien imprime.
failure — le habilita la compensación al otro extremo
Cuando la numeración falla, el error no se queda en un log: viaja en el evento. La venta
se cobró igual y el integrador necesita saber que quedó sin comprobante fiscal.
Con eso puede compensar de su lado y devolver el comprobante por el callback. Sin eso, una
venta cobrada sin comprobante es indistinguible de una cuenta que no factura.
Por eso failure.code tiene que ser estable y failure.message accionable: no los lee solo
nuestro equipo de soporte, los lee el sistema del cliente final.
Lo que NO viaja a los eventos
Y el veredicto del ente, aparte
fiscalRepresentation son los números que se imprimieron, y no cambian nunca. Que existan
no significa que el ente haya autorizado el comprobante.
El veredicto llega después por tu callback y viaja en otro lugar del evento:

