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.
Desliza la tabla para verla completa.
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.
empleadorQuien paga. En el sandbox su identidad se reemplaza por la de la empresa de pruebas, porque es el único NIT habilitado ante la DIAN.
trabajadorA 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 · tdperiodoQué 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.
pagoForma y medio de pago, la cuenta destino y las fechas en que efectivamente se paga.
devengosTodo 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.
deduccionesTodo 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.
Desliza la tabla para verla completa.
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.
Desliza la tabla para verla completa.
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.
Desliza la tabla para verla completa.
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.
Desliza la tabla para verla completa.
- 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.
Desliza la tabla para verla completa.
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.
Desliza la tabla para verla completa.
- 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
numerodocumentovací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
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"])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.
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"])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í.
- 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.
- 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.
- 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.