Eventos de la DIAN
Reporte de los eventos del ciclo de vida de la factura: acuse, reclamo, recibo y aceptación.
Esta página se lee antes de ejecutar: explica qué vas a enviar y qué se hace con ello. Al final están los enlaces a las funciones, en el orden en que conviene probarlas.
1 · El ciclo de vida de una factura
Reportar una factura a la DIAN no cierra la historia del documento: la abre. A partir de ahí el receptor —no el emisor— va reportando lo que pasa con ella: que la recibió, que recibió el bien o el servicio, y que la acepta o la reclama. Esa secuencia de hechos es el ciclo de vida, y cada hecho es un evento.
El ciclo importa por una razón muy concreta: cuando existen el recibo del bien o servicio y la aceptación —expresa o tácita—, la factura electrónica se convierte en título valor, es decir, en un documento negociable. Los eventos no son un trámite: son lo que le da ese carácter a la factura.
2 · Los cinco eventos
Los cinco comparten estructura: lo único que cambia entre uno y otro es el tdevento. El reclamo es el único que exige un
dato adicional, el motivo.
3 · El ApplicationResponse
Un evento no es una anotación sobre la factura: es un documento electrónico propio. Se transmite
como un ApplicationResponse,
con su propio identificador —un CUDE— y su propia firma. Su tipo de documento es 96,
y el sandbox lo fuerza, de modo que no hace falta enviarlo.
La factura afectada va en docreferencia,
identificada por su CUFE: es el dato con el que la DIAN localiza el documento sobre el que aplica el evento.
El bloque usuario identifica a la persona natural que firma que recibió o que acepta, con su tipo y número de documento, sus
nombres, sus apellidos, su cargo y su departamento. No es el emisor del evento: es quien responde por él.
En el XML sale en IssuerParty/Person.
La tabla de datos de cada ficha nombra el tipo de sus campos y desde ahí enlaza al título que dice qué va dentro. Las dos partes y el documento referenciado son los mismos objetos de facturación —TTercero y TDocumentoElectronico—, y están documentados allá.
El asterisco marca lo que hay que enviar, igual que en la tabla de datos de cada ficha, y «no se envía» los que calcula el Proveedor Tecnológico: van en la respuesta y en el XML, pero mandarlos no cambia nada porque se recalculan siempre. Lo que depende de otro dato lo dice la explicación del atributo.
TUsuario
Dónde llega: usuario del evento
Quién firma el evento. Es la persona que acepta, rechaza o acusa recibo del documento en nombre del receptor, y no se confunde con el receptor mismo: la DIAN pide identificar al funcionario, con su cargo y su área.
Desliza la tabla para verla completa.
- El evento va firmado por el receptor del documento original, de modo que en el JSON del evento el emisor es quien recibió la factura y el receptor es quien la emitió: los papeles se invierten.
4 · Cómo lo resuelve el sandbox
Lo primero que se mira es la numeración del documento. Si nunca se reportó, el documento sigue el proceso completo. Si ya se reportó, se compara con el que está guardado: llegando igual responde 200 con el estado del documento, su UUID y el documento adjunto, sin volver a reportarlo ni gastar otro consecutivo; llegando con datos distintos responde 409 con la regla 90 de la DIAN y entrega el XML del documento que sí quedó reportado. Para el documento nuevo siguen las validaciones: un incumplimiento responde 400 con una entrada por regla, cada una con su código de la DIAN, su código de InSoft y su mensaje. Solo cuando las pasa se construye el documento electrónico, se firma, se reporta a la DIAN y se espera su respuesta. Si la DIAN lo rechaza, el 400 trae sus mensajes; si no se pudo establecer conexión con ella, responde también 400 pidiendo reintentar más tarde, y en ese caso el documento no quedó reportado. Las validaciones van antes de construir, así que un documento que no va a ser aceptado se rechaza sin gastar un consecutivo.
Desliza el diagrama para verlo completo.
Ver la fuente Mermaid del diagrama
flowchart TD
A(["El documento llega en JSON"]) --> B{"¿Ya se reportó esa numeración?"}
B -- Sí --> G{"¿Llega igual que antes?"}
G -- Sí --> R0(["200 · estado, UUID y documento adjunto,<br/>sin volver a reportarlo"])
G -- No --> R1(["409 · regla 90, entrega el XML del documento"])
B -- No --> C{"¿Cumple las reglas?"}
C -- No --> R2(["400 · una entrada por regla incumplida,<br/>con su código DIAN y su código InSoft"])
C -- Sí --> D["Construye el documento y lo firma,<br/>lo reporta y espera a la DIAN"]
D --> E{"¿La DIAN lo aceptó?"}
E -- No --> R3(["400 · el rechazo de la DIAN, o «intente más tarde»<br/>si no hubo conexión"])
E -- Sí --> H(["200 · estado del documento, su UUID<br/>y el documento adjunto"])- El CUFE que referencies tiene que ser de una factura emitida antes desde este mismo portal: es la única que existe en habilitación bajo la empresa de pruebas.
- La DIAN no admite dos veces el mismo evento sobre la misma factura. Para repetir la prueba hay que emitir una factura nueva.
Los tres procesos que siguen son iguales para todas las funciones del portal. El primero contesta que
reemplaza el sandbox antes de reportar —en eventos se conservan el documento referenciado, el tipo de
evento y el usuario que lo suscribe, que es justo lo que estás probando—. El segundo, por qué un
reenvío puede responder 409 con la regla 90 de la
DIAN, y por qué ese 409 trae el documento adjunto. El tercero, por qué una función puede responder 401 aunque tu JSON esté perfecto.
El ambiente es siempre el de habilitación. La identidad del emisor y del receptor pasa a ser la de la empresa de pruebas, mientras se conservan la ubicación, las responsabilidades fiscales y los datos de contacto, porque son el caso de prueba del desarrollador. La resolución se reemplaza siempre por la del sandbox —en una nota, por su prefijo de nota—, sin conservar nada de la que llegue. La numeración la asigna el sandbox solo cuando el número llega con el valor `<auto>`; cualquier otro valor viaja tal como se escribió. Todo lo demás viaja tal como se envió —ítems, tributos, descuentos, anticipos y totales— y con eso se reporta a la DIAN. La respuesta corta es una línea: se reemplaza quién emite, no qué se factura.
Ver la fuente Mermaid del diagrama
flowchart TD
J(["Documento que envía el desarrollador"]) --> A["Ambiente: siempre habilitación"]
A --> B["Identidad del emisor y del receptor:<br/>la de la empresa de pruebas"]
B --> C["Se conservan ubicación, responsabilidades<br/>fiscales y datos de contacto"]
C --> D["Resolución y numeración:<br/>las del sandbox, si están registradas"]
D --> E["Todo lo demás viaja como se envió:<br/>ítems, tributos, descuentos y totales"]
E --> F(["Se reporta a la DIAN"])La numeración es la llave: un documento se identifica por el emisor, el tipo, el ambiente y su número. Si esa numeración no se ha reportado, el envío sigue su curso normal. Si ya se reportó, se vuelve a calcular el UUID del documento —el CUFE, el CUDE o el CUDS— y se compara con el del que está guardado: si coincide, el documento es el mismo y la respuesta es 200 con el que ya se había reportado, sin duplicarlo ni gastar otro consecutivo. Si no coincide, es decir si cambió cualquier dato que entra en el UUID, la respuesta es 409 con la regla 90 de la DIAN: rechazo porque el documento ya había sido enviado previamente. El 409 no es un callejón sin salida: trae el documento adjunto en base64, que es la forma de recuperar lo que ya se emitió. La misma regla 90 la puede aplicar la DIAN por su cuenta, aunque el Proveedor Tecnológico no tenga registro del documento, y la respuesta es la misma. Dos casos que conviene anticipar: la nota de ajuste de nómina responde 409 en todo reenvío, y en el sandbox enviar el número en «auto» evita el choque, porque cada envío toma un consecutivo nuevo.
Desliza el diagrama para verlo completo.
Ver la fuente Mermaid del diagrama
flowchart TD
A(["Se envía un documento<br/>con una numeración"]) --> B{"¿Esa numeración ya se reportó?"}
B -- No --> S(["Sigue el proceso normal de emisión"])
B -- Sí --> C{"¿El documento sigue siendo el mismo?"}
C -- Sí --> D(["200 · devuelve el que ya se reportó,<br/>sin duplicarlo"])
C -- No --> E(["409 · regla 90, rechazo, y entrega<br/>el XML del documento"])Toda función del sandbox pasa por la misma verificación. Si no llega el encabezado Authorization responde 400. Si llega pero el token no es válido, responde 401. Con el token válido comprueba que el desarrollador tenga perfil registrado y activo: si no lo tiene responde 401, y el mensaje distingue las tres causas —cuenta sin correo, perfil inexistente y perfil suspendido— para que no haya que adivinar cuál es. Lo observable es que un token válido no alcanza: la identidad sale siempre del token, y nada de lo que se envíe en la ruta o en el cuerpo cambia de qué desarrollador se trata. En la etapa productiva la compuerta comprueba además dos cosas contra el documento que se envía, y las dos responden 401: que el NIT del emisor sea el autorizado en la credencial, y que el tipo de documento electrónico corresponda al servicio autorizado —facturación no emite nómina, y al revés—. En el sandbox esas dos no se alcanzan a ver, porque el emisor lo fuerza el propio sandbox.
Desliza el diagrama para verlo completo.
Ver la fuente Mermaid del diagrama
flowchart TD
R(["Petición del desarrollador<br/>Authorization: Bearer idToken"]) --> T{"¿Viene el token?"}
T -- No --> E1(["400 · No se especificó el token<br/>de autenticación"])
T -- Sí --> F{"¿El token es válido?"}
F -- No --> E2(["401 · Token de autenticación no válido"])
F -- Sí --> Q{"¿Perfil registrado y activo?"}
Q -- No --> E4(["401 · Perfil no registrado o suspendido,<br/>con el motivo en el mensaje"])
Q -- Sí --> OK(["200 · Autorizado, continúa la operación"])5 · Ahora si, a probar
Los eventos son el último paso del recorrido porque necesitan una factura que exista. Si todavía no tienes un CUFE de habilitación, empieza por enviar una factura electrónica de venta.
- Primero: generar el XML sin reportarlo → En este grupo el orden importa más que en ninguno: la DIAN no admite dos veces el mismo evento sobre la misma factura, de modo que cada envío que sale mal quema esa factura para ese evento. Generar el XML no reporta nada y se puede repetir cuantas veces quieras con el mismo CUFE.
- Después: enviar eventos por tipo → La ficha trae un ejemplo por cada evento. El orden recomendado es el del ciclo: acuse, recibo del bien o servicio y aceptación. Con los dos últimos compruebas la conversión en título valor.
- Consultar los eventos de ese documento → Con el mismo CUFE, comprueba que la DIAN registró lo que reportaste y en qué orden.