Concepto del grupo

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

CódigoEventoLo reportaQué significa
030Acuse de recibo de la facturaEl receptorConfirma que recibió el documento. Es el primer evento del ciclo y no compromete nada sobre el bien o el servicio: solo dice «me llegó».
031ReclamoEl receptorRechaza la factura indicando el motivo en tdreclamo: documento con inconsistencias, mercancía no entregada, entregada parcialmente o servicio no prestado. Impide que opere la aceptación tácita.
032Recibo del bien o prestación del servicioEl receptorConfirma que recibió lo facturado, no solo el documento. Es el primero de los dos eventos que convierten la factura en título valor.
033Aceptación expresaEl receptorAcepta la factura de forma explícita, sin esperar los tres días hábiles de la aceptación tácita.
034Aceptación tácitaLa DIANLa genera la DIAN de forma automática cuando pasan tres días hábiles sin reclamo. Se puede reportar de forma explícita, pero no es lo habitual.

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 usuario que suscribe es una persona, no la empresa

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.

AtributoTipoQué es
tddocumento * string

Tipo de documento de identidad de la persona; el mismo catálogo de la DIAN de facturación.

nit * string

Número de identificación, sin dígito de verificación.

digchequeo No se envíastring

Dígito de verificación. No lo envíes: el servidor lo calcula a partir del nit cuando el documento es un NIT.

nombres · apellidos * string

Nombres y apellidos de quien firma, en campos separados.

cargo * string

Cargo con el que firma.

departamento * string

Área de la empresa a la que pertenece. No es una ubicación: es el departamento organizacional —contabilidad, tesorería—, y confundirlo con el departamento geográfico es un error frecuente.

  • 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

Emisión de un documento a la DIAN

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.

Emisión de un documento a la DIANLo 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.SÍNOSÍNONOSÍNOSÍEl documento llega en JSON¿Ya se reportó esanumeración?¿Llega igualque antes?¿Cumple las reglas?200Estado, UUID y documentoadjunto, sin volvera reportarlo409Regla 90 · entrega el XMLdel documentoConstruye el documentoy lo firma, lo reportay espera a la DIAN400Una entrada por reglaincumplida, con su códigoDIAN y su código InSoft¿La DIAN lo aceptó?400El rechazo de la DIAN, o«intente más tarde» sino hubo conexión200Estado del documento, su UUIDy el documento adjuntoLEYENDAInicio y finPasoDecisiónError

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"])
Dos límites que vas a encontrar al probar
  • 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.

Lo que el sandbox fuerza sobre el documento

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.

Lo que el sandbox fuerza sobre el documentoEl 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.Documento que envíael desarrolladorAmbiente: siempre habilitaciónIdentidad del emisor y delreceptor: la de la empresade pruebasSe conservan ubicación,responsabilidades fiscalesy datos de contactoResolución y numeración:las del sandbox, si estánregistradasTodo lo demás viaja comose envió: ítems, tributos,descuentos y totalesSe reporta a la DIANLEYENDAInicio y finPaso
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"])
El documento ya reportado y la regla 90

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.

El documento ya reportado y la regla 90La 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.NOSÍSÍNOSe envía un documentocon una numeración¿Esa numeraciónya se reportó?Sigue el procesonormal de emisión¿El documento siguesiendo el mismo?200Devuelve el que ya sereportó, sin duplicarlo409Regla 90 · rechazo, yentrega el XML del documentoLEYENDAInicio y finDecisiónError

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"])
Compuerta de autorización

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.

Compuerta de autorizaciónToda 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.NOSÍNOSÍNOSÍPetición del desarrolladorAuthorization: Bearer idToken¿Viene el token?400No se especificó el tokende autenticación¿El token es válido?401Token de autenticaciónno válido¿Perfil registradoy activo?401Perfil no registradoo suspendido, con el motivoen el mensaje200Autorizadocontinúa la operaciónLEYENDAInicio y finDecisiónError

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.

  1. 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.
  2. 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.
  3. Consultar los eventos de ese documento → Con el mismo CUFE, comprueba que la DIAN registró lo que reportaste y en qué orden.