Saltearse al contenido

Facturar en España

Estados de un comprobante

En España la factura nace expedida. Cuando la API responde, el comprobante ya está registrado en la cadena VERI*FACTU y tiene validez legal; lo que queda es comunicarlo a la AEAT.

Diagrama: registrado pasa a autorizado, autorizado con avisos o no autorizadoregistradoautorizadoautorizado_con_avisosno_autorizadoya tiene validez legalrespuesta de la AEAT
La factura es válida desde registrado; la AEAT solo confirma la recepción del registro.

La factura está expedida, numerada y su registro forma parte de la cadena VERI*FACTU. Tiene validez legal. Está pendiente de enviarse a la AEAT, lo que ocurre en menos de un minuto.

Es el estado con el que responde POST /invoices/issue, con código 201.

Qué hacer: nada. Puedes entregar la factura al cliente y descargar el PDF.

La AEAT aceptó el registro. Llega referencia_aeat (el CSV del envío) y fecha_envio.

Qué hacer: guardar el CSV si tu sistema lleva ese control. Has terminado.

La AEAT lo aceptó pero señaló algo. El registro es válido; el aviso está en mensajes[].

Qué hacer: revisar el aviso. Suele indicar un dato mejorable que conviene corregir en las siguientes facturas, no en esta.

La AEAT rechazó el registro. mensajes[] dice por qué, con el código de error de la AEAT.

Qué hacer: corregir la factura desde Olympus, que genera la subsanación correspondiente. No hay reintento por la API: el registro ya existe y reenviarlo daría el mismo rechazo.

La factura se anuló en Olympus.

El envío a la AEAT se agrupa y sale cada minuto. Lo normal es ver autorizado en menos de dos minutos desde la emisión.

Como la factura ya es válida en registrado, el retraso no bloquea nada: no hay motivo para esperar al estado final antes de entregar la factura o cerrar la venta.

factura = client.get(f"/invoices/{factura_id}").json()
if factura["estado"] == "no_autorizado":
avisar_al_equipo(factura["mensajes"])

No hace falta consultar en bucle: con revisar una vez al día lo que quedó en no_autorizado basta.

# Rechazadas de la última semana: requieren una subsanación.
client.get("/invoices", params={"estado": "no_autorizado", "desde": hace_una_semana})

Si integras los dos países, esto es lo que cambia:

EcuadorEspaña
Respuesta de la emisión202201
Estado inicialpendienteregistrado
¿Válida al responder?No, falta que el SRI autoriceSí
Esperar antes de entregarlaConvieneNo hace falta
Estados posiblespendiente, enviado, autorizado, no_autorizado, error_envio, anuladoregistrado, autorizado, autorizado_con_avisos, no_autorizado, anulado
Reintento manualSí, POST /retryNo hace falta

Filtrar el listado por un estado del otro país da 400: cada negocio solo conoce los suyos.