Concepto del grupo

Nómina electrónica

Emisión del documento soporte de pago de nómina y sus notas de ajuste y de eliminació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 · Qué es el documento soporte de pago de nómina

No es una factura. Es el documento con el que un empleador le reporta a la DIAN lo que le pagó a un trabajador en un periodo, para poder deducir ese pago como costo o gasto. Se emite por trabajador y por periodo, no uno por empresa.

Su código es 102 y su identificador único se llama CUNE, el equivalente del CUFE de una factura. Como el CUFE, se calcula desde los valores del documento: la DIAN recalcula el total devengado y el total deducido a partir de los conceptos, de modo que un concepto cuyo valor no cuadre con su cantidad y su porcentaje cambia el CUNE y produce un rechazo.

2 · Cómo se corrige: dos notas, no una

Un documento de nómina ya reportado no se modifica. Se corrige con una nota de ajuste —103— y lo que distingue las dos clases es el campo tdnota:

  • tdnota = 1 · Reemplazar — sustituye el documento por completo. Se envía con la liquidación completa y corregida, no con la diferencia: todo lo que trajera el original y no venga en la nota se pierde. Es el error más frecuente al integrar el ajuste por primera vez.
  • tdnota = 2 · Eliminar — anula el documento sin poner otro en su lugar. No lleva devengos ni deducciones, porque no hay liquidación que reemplazar: solo identifica el documento que se anula.

En los dos casos el documento afectado va en docreferencia, identificado por su CUNE, y la nota genera su propio CUNE.

3 · Los códigos td… del nivel raíz

Igual que en facturación, todo campo que empieza por td es un código del anexo técnico de la DIAN, no un texto libre, y el módulo los modela como listas cerradas: un valor fuera de la lista no produce un error de formato, se descarta al asignarlo y llega vacío al XML, que cuesta más de diagnosticar.

Estos son los del nivel raíz, los que se resuelven antes de armar cualquier bloque. Los que viven dentro de un objeto —la clase de trabajador, su subclase y el tipo de contrato en TTrabajador, la forma y el medio de pago en TPago, el origen de una incapacidad en las formas de un concepto— están en la tabla de su objeto, en la sección siguiente.

CampoDónde vaQué decide
tddocumentoelectronico Nivel raíz

Qué documento es. Nómina tiene dos, y el segundo es el que corrige al primero.

Ver los 2 valores admitidos
  • 102 · Documento soporte de pago de nómina electrónica
  • 103 · Nota de ajuste de nómina electrónica
tdnota Nivel raíz, y solo en la nota de ajuste

Qué le hace la nota al documento que referencia. Es lo que distingue las dos clases de ajuste, y Reemplazar se envía con la liquidación completa y corregida, no con la diferencia.

Ver los 2 valores admitidos
  • 1 · Reemplazar — corrige el documento con la liquidación completa
  • 2 · Eliminar — anula el documento sin reemplazarlo
tdperiodo Nivel raíz

Periodicidad con la que se le paga al trabajador. No es el rango de fechas —ese va en el periodo a liquidar—: es cada cuánto se paga.

Ver los 6 valores admitidos
  • 1 · Semanal
  • 2 · Decenal
  • 3 · Catorcenal
  • 4 · Quincenal
  • 5 · Mensual
  • 6 · Otro
tdambiente En la ruta de las consultas, no en el cuerpo

Contra qué ambiente de la DIAN se resuelve. El sandbox lo fuerza a pruebas, igual que en facturación.

Ver los 2 valores admitidos
  • 1 · Producción
  • 2 · Pruebas — habilitación

4 · Anatomía del JSON de nómina

El documento responde tres preguntas: quién paga, a quién y cuánto. El «cuánto» es lo que ocupa más espacio, porque son dos árboles de conceptos.

  • empleador

    Quien paga. En el sandbox su identidad se reemplaza por la de la empresa de pruebas, porque es el único NIT habilitado ante la DIAN.

  • trabajador

    A quien se le paga, con su tipo de documento, su tipo de trabajador, su tipo de contrato, si es de alto riesgo y si devenga salario integral. El sandbox NO lo reemplaza: es tuyo por completo.

  • periodoliquidar · periodocontrato · qdiaslaborados · tdperiodo

    Qué periodo se liquida, desde cuándo está vigente el contrato, cuántos días se laboraron y con qué periodicidad se paga. La DIAN cuenta el mes comercial de 30 días.

  • pago

    Forma y medio de pago, la cuenta destino y las fechas en que efectivamente se paga.

  • devengos

    Todo lo que suma: básico, auxilio de transporte, horas extra y recargos, vacaciones, prestaciones, incapacidades, licencias, bonificaciones y conceptos libres. Cada concepto es un arreglo, porque puede ocurrir varias veces en el mismo periodo — tres incapacidades, dos primas. Solo básico es obligatorio.

  • deducciones

    Todo lo que se descuenta: salud, pensión, fondo de solidaridad, retención en la fuente, libranzas, anticipos y aportes voluntarios. Misma estructura de arreglos por concepto.

La tabla de datos de cada ficha nombra el tipo de cada campo —TTrabajador, TDevengos— y desde ahí enlaza a estos títulos, que son los que dicen qué va dentro. Los objetos que nómina comparte con facturación —el empleador como TTercero, la ubicación, la resolución y la referencia al documento que se ajusta— están documentados en el concepto de facturación, y las fichas enlazan allá: es el mismo objeto.

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.

TTrabajador

Dónde llega: trabajador del documento

La persona a la que se le paga. Tiene clase propia y no es un TTercero: al trabajador no le corresponden responsabilidades fiscales, tributo responsable ni ubicación fiscal, y en cambio necesita su clase de trabajador, su tipo de contrato y su sueldo.

AtributoTipoQué es
tddocumento * string

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

numerodocumento * string

Número de identificación del empleado, sin dígito de chequeo. En nómina no hay receptor: el documento lo emite el empleador y quien lo recibe es la persona a la que se le paga. Todos los ejemplos del portal lo publican como 1000000000 — es una identificación de prueba, no la de nadie.

nombres · apellidos * string

Nombres y apellidos, en campos separados.

tdtrabajador * string

Clase de trabajador: su vínculo con el empleador.

Ver los 7 valores admitidos
  • 01 · Dependiente
  • 02 · Servicio doméstico
  • 04 · Madre comunitaria
  • 12 · Aprendiz del SENA en etapa lectiva
  • 18 · Funcionario público sin tope de IBC
  • 19 · Aprendiz del SENA en etapa productiva
  • 31 · Cooperado de cooperativa de trabajo asociado
tdsubtrabajador * string

Subclase que matiza la anterior.

Ver los 2 valores admitidos
  • 00 · No aplica
  • 01 · Dependiente pensionado por vejez activo
tdcontrato * string

Vínculo laboral.

Ver los 5 valores admitidos
  • 1 · Término fijo
  • 2 · Término indefinido
  • 3 · Obra o labor
  • 4 · Aprendizaje
  • 5 · Prácticas o pasantías
baltoriesgo * boolean

Si el trabajador está en actividad de alto riesgo de pensión.

bsalariointegral * boolean

Si tiene salario integral. Cambia la base sobre la que se calculan los aportes.

sueldo * number

Sueldo del trabajador. No es lo mismo que el devengo del periodo: es el pactado.

ubicacion * TUbicacion

Dónde presta el servicio. Es el mismo objeto de facturación, sin ubicación fiscal.

TPeriodo

Dónde llega: El periodo que se liquida y el periodo del contrato

Un rango de fechas, y el mismo objeto se usa dos veces: el periodo de nómina que el documento reporta y el del contrato del trabajador.

AtributoTipoQué es
fechainicial * date-time

Inicio del rango. En el contrato es la fecha de ingreso.

fechafinal date-time

Fin del rango. En el contrato vacío significa que sigue vigente, y el portal lo publica con la fecha con la que el servicio representa «sin fin».

TPago

Dónde llega: pago del documento

Cómo se le paga al trabajador. Es el equivalente del medio de pago de facturación, con otro contrato: la cuenta va en el propio objeto y las fechas son varias.

AtributoTipoQué es
tdformapago * string

Contado o crédito, con el mismo catálogo de facturación.

Ver los 2 valores admitidos
  • 1 · Contado
  • 2 · Crédito
tdmediopago * string

Con qué se paga; el mismo catálogo de medios de pago de la DIAN —los 76 códigos están en el medio de pago de facturación—. En nómina sí es obligatorio: el valor por defecto de facturación no aplica aquí.

numerocuenta string

Cuenta del trabajador donde se abona.

tdcuenta string

Tipo de cuenta. Se emite como atributo del medio de pago y no tiene catálogo cerrado.

banco string

Entidad financiera de la cuenta.

fechaspago * Array<date-time>

Fechas en que se pagó el periodo. Es un arreglo: un periodo puede pagarse en varias fechas.

TDevengos

Dónde llega: devengos del documento

Todo lo que suma en el periodo. No tiene un campo por concepto: tiene una colección por concepto, porque un mismo periodo puede traer tres incapacidades, cinco tandas de horas extra o dos primas, y el integrador no tiene que sumarlas por su cuenta.

AtributoTipoQué es
basico * Array<TValorCantidad>

Salario del periodo, con los días trabajados.

auxiliotransporte Array<TValor>

Auxilio de transporte.

hed · hen · hrn Array<THoraExtra>

Horas extra diurnas y nocturnas, y recargo nocturno.

heddf · hrddf · hendf · hrndf Array<THoraExtra>

Las mismas, en dominical o festivo: extra y recargo, diurnas y nocturnas.

vacacionescomunes Array<TPeriodoRemunerado>

Vacaciones disfrutadas, con su rango de fechas.

vacacionescompensadas Array<TValorCantidad>

Vacaciones pagadas en dinero, con los días.

primas · primans Array<TValorCantidad>

Prima de servicios: la salarial y la no salarial.

cesantias Array<TValor>

Cesantías pagadas en el periodo.

interesescesantias Array<TValorPorcentaje>

Intereses de cesantías, con su tarifa.

incapacidades Array<TIncapacidad>

Incapacidades, con su rango de fechas y su origen.

licenciamp · licenciar · licencianr Array<TPeriodoRemunerado>

Licencias de maternidad o paternidad, remuneradas y no remuneradas —esta última sin valor—.

bonificacions · bonificacionns Array<TValor>

Bonificaciones salariales y no salariales.

auxilios · auxilions Array<TValor>

Auxilios salariales y no salariales.

huelgalegal Array<TPeriodoNoRemunerado>

Días de huelga legal, sin valor.

conceptos · conceptons Array<TValorDescripcion>

Otros conceptos, salariales y no salariales, cada uno con su descripción.

compensaciono · compensacione Array<TValor>

Compensaciones ordinarias y extraordinarias del cooperado.

bonosepctvsalarial · bonosepctvnosalarial Array<TValor>

Bonos electrónicos o de papel de servicio, alimentación, turismo y capacitación.

pagoalimentacions · pagoalimentacionns Array<TValor>

Pagos de alimentación, salariales y no salariales.

comision · pagotercero · anticipo Array<TValor>

Comisiones, pagos a terceros y anticipos.

dotacion · apoyosost · teletrabajo Array<TValor>

Dotación, apoyo de sostenimiento del aprendiz y auxilio de teletrabajo.

bonifretiro · indemnizacion · reintegro Array<TValor>

Los tres conceptos del retiro: bonificación, indemnización y reintegro.

total No se envíanumber

Lo calcula el objeto recorriendo sus colecciones. Recibido del integrador no habría forma de saber si corresponde a los conceptos que llegaron.

  • Un concepto no siempre tiene la misma forma, y escoger la equivocada es el error de integración típico: valor solo, valor con cantidad, valor con porcentaje o periodo remunerado. Las cuatro formas están abajo.
  • Todas las colecciones son opcionales salvo el básico: lo que no se pagó en el periodo no se envía vacío, se omite.

TDeducciones

Dónde llega: deducciones del documento

Todo lo que resta en el periodo, con la misma forma de colecciones que los devengos. Salud y pensión son las dos obligatorias del trabajador dependiente.

AtributoTipoQué es
salud * Array<TValorPorcentaje>

Aporte a salud, con su tarifa.

fondopension * Array<TValorPorcentaje>

Aporte a pensión, con su tarifa.

fondossolidaridad · fondossubsistencia Array<TValorPorcentaje>

Los dos componentes del fondo de solidaridad pensional.

sindicatos Array<TValorPorcentaje>

Cuota sindical, con su tarifa.

sancionpublic · sancionpriv Array<TValor>

Sanciones públicas y privadas.

libranzas Array<TValorDescripcion>

Libranzas, cada una con su descripción.

pagosterceros · anticipos · otrasdeducciones Array<TValor>

Pagos a terceros, anticipos y las deducciones que no tienen concepto propio.

pensionvoluntaria · afc Array<TValor>

Aportes voluntarios a pensión y a cuentas AFC.

retencionfuente Array<TValor>

Retención en la fuente del periodo.

cooperativa · embargofiscal · plancomplementarios Array<TValor>

Aporte a cooperativa, embargo fiscal y plan complementario de salud.

educacion · reintegro · deuda Array<TValor>

Educación, reintegros y deudas.

total No se envíanumber

Igual que en los devengos: lo calcula el objeto.

TValor

Dónde llega: Dentro de cada colección de devengos y de deducciones

Las formas que puede tomar un concepto. Todas parten de TValor y le agregan lo que ese concepto necesita; escoger la equivocada es el error de integración más común del módulo.

AtributoTipoQué es
valor * number

El monto. Es lo único que lleva TValor, y la base de todas las demás formas: salario básico, auxilio de transporte, cesantías.

cantidad * number

TValorCantidad — el monto y las unidades: días del básico, días de vacaciones compensadas.

porcentaje * number

TValorPorcentaje — el monto y la tarifa: aportes de salud y de pensión, intereses de cesantías.

descripcion * string

TValorDescripcion — el monto y el texto que lo explica: otros conceptos, libranzas.

fechainicial · fechafinal * date-time

TPeriodoRemunerado — monto, cantidad y rango de fechas: vacaciones, licencias, incapacidades, horas extra. TPeriodoNoRemunerado es el mismo sin monto, para lo que no se paga: licencia no remunerada y huelga legal.

tdincapacidad * string

TIncapacidad — un periodo remunerado con el origen de la incapacidad.

Ver los 3 valores admitidos
  • 1 · Común
  • 2 · Profesional
  • 3 · Laboral
porcentaje (hora extra) * number

THoraExtra — un periodo remunerado con el porcentaje de recargo de esa tanda de horas.

  • La tabla junta las siete formas en una sola lista para poder compararlas: cada fila es el atributo que una forma le agrega a TValor, no un campo que se envíe todo junto.

5 · En qué se diferencia de facturación

  • El trabajador no se reemplaza. En facturación el sandbox sustituye la identidad de las dos partes; aquí solo la del empleador. El trabajador es una persona natural que defines tu, y la DIAN no lo valida contra la empresa habilitada.
  • La resolución no se exige. La DIAN no pide resolución de nómina en el ambiente de habilitación. El sandbox solo completa el prefijo o el consecutivo que falte, en lugar de imponer una resolución propia.
  • La numeración se completa sola. Si dejas numerodocumento vacío, el sandbox lo numera con su consecutivo. No hace falta el marcador <auto> de facturación.
  • No hay notas crédito ni débito. El ajuste es total —reemplazo o eliminación—, no parcial.

6 · 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"])

Los tres procesos que siguen son iguales para todas las funciones del portal. El primero contesta por que el documento que recibes de vuelta no es idéntico al que enviaste —en nómina, con una diferencia que vale la pena retener: el trabajador se conserva, porque la DIAN no lo valida contra la empresa habilitada—. El segundo, por qué un reenvío puede responder 409 con la regla 90; en nómina conviene leerlo con atención, porque la nota de ajuste responde 409 en todo reenvío. 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"])

7 · Ahora si, a probar

El orden es el mismo de facturación: primero el XML, que no gasta consecutivos, y después los envíos. Los ajustes van al final porque necesitan el CUNE de un documento que ya exista en habilitación, y la única forma de tenerlo es emitirlo antes desde aquí.

  1. Primero: generar el XML sin reportarlo → Recorre la verificación completa y devuelve el XML firmado sin llegar a la DIAN. Es donde conviene cuadrar los devengos y las deducciones, porque se puede repetir sin costo hasta que el documento pase.
  2. Después: enviar una nómina electrónica → El ejemplo trae un periodo mensual completo con básico y auxilio de transporte. Guarda el CUNE que devuelva: es lo que van a referenciar las dos notas.
  3. Y al final: ajustar esa nómina → Reemplaza el CUNE del ejemplo por el que acabas de recibir y comprueba que la liquidación completa —no la diferencia— es lo que viaja.