Estructura
En esta sección se detalla la estructura de datos requerida para la integración con DTEpy. Es importante que el personal técnico o el informático del emisor realice las adaptaciones necesarias en la estructura de su sistema (ERP) para cumplir con los requisitos exigidos por el SIFEN.
La columna JSON especifica los nombres de los atributos que se utilizan para estructurar el archivo JSON en una petición POST hacia la API local, responsable de generar el KuDE para su impresión. Es importante destacar que, para una mejor comprensión de la estructura del JSON, si el atributo de la columna es "fecha", en el JSON deberá interpretarse como json.fecha. De manera similar, si el atributo es "facturas.fechaEnvio", se entenderá como json.facturas.fechaEnvio, siendo la columna JSON el nodo principal que organiza la estructura.
La columna INTEGRADOR se refiere a los nombres de los campos necesarios en una vista, procedimiento almacenado, consulta API REST o consulta de una tabla DBF (VFP). Estos campos son requeridos por la aplicación (Integrador) para generar el archivo JSON y realizar el envío de documentos al SIFEN.
Todos los campos incluidos en la tabla son obligatorios para la aplicación (integrador) y, por lo tanto, deben ser incorporados en las vistas y consultas. Sin embargo, la columna que indica "obligación" se refiere específicamente a si dichos campos deben enviarse con valores asignados.
DATOS GENERALES | ||||||
---|---|---|---|---|---|---|
Json | Integrador | Tipo | Docum | Oblig | Observación | |
fecha | fecha | datetime | todos | json: ej. 2025-01-01T10:11:00 integrador: ej. 01/01/2025 07:00:00 | ||
cliente | string | todos | ej. GLOBE INFORMATICA Obs. la columa clientes en el integrador pasa a nombrarse comprador cuando el tipo de documento es autofactura. | |||
documento | string | todos | ej. 001-001-0000001 | |||
vendedor | string | AF | nombre del prestador de servicio | |||
estado_doc | string | todos | PENDIENTE RECHAZADO APROBADO OBSERVACION CANCELADO INUTILIZADO ANULADO | |||
condicion.tipo | condicion | FE, AF | integrador: string CONTADO, CREDITO json: int 1 = CONTADO, 2 = CREDITO | |||
moneda | moneda | string | FE, AF, NC, ND | PYG, USD, EUR, BRL, ARS | ||
cambio | cambio | numeric | FE, AF, NC, ND | tasa de cambio cuando moneda es diferente a PYG | ||
condicionTipoCambio | condiciontipocambio | int | FE, AF, NC, ND | cuando moneda es diferente a PYG 1 = Global 2 = Por ítem | ||
importe | numeric | AF | importe de la operación de la autofactura | |||
exentas | numeric | FE, NC, ND | ||||
gravadas | numeric | FE, NC, ND | ||||
descuento | numeric | FE, AF, NC, ND | ||||
total | numeric | FE, AF, NC, ND | ||||
timbrado | string | todos | ||||
cdc | cdc | string | todos | Una vez que el CDC ha sido generado y transmitido al SIFEN, cualquier rechazo que requiera modificar la estructura del CDC hará que el documento no pueda ser reenviado. En este caso, será necesario proceder con la inutilización del documento. (si el cdc es null la API lo genera) | ||
envio_pend | envio_pend | int | todos | valor 1 establece que el kuDE sera enviado por mail al aprobarse el documento desde la API de DTEpy | ||
booleano | todos | indica que el mail fue enviado al cliente | ||||
tipoDocumento | tipodocumento | int | todos | 1 = FACTURA 4 = AUTOFACTURA 5 = NOTA CREDITO 6 = NOTA DEBITO 7 = NOTA REMISION | ||
codigoSeguridadAleatorio | codigoseguridadaleatorio | int | todos | Debe ser un número positivo de 9 dígitos aleatorio | ||
pin | pin | string | todos | código aleatorio ej. GHW872 único por cliente | ||
token | token | string | todos | para autenticar los documentos de varias empresas | ||
tipoTransaccion | tipotransaccion | int | FE, AF, NC, ND | 1 = Venta de mercadería 2 = Prestación de servicios 3 = Mixto 4 = Venta de activo fijo 5 = Venta de divisas 6 = Compra de divisas 7 = Promoción o entrega de muestras 8 = Donación 9 = Anticipo 10 = Compra de productos 11 = Compra de servicios 12 = Venta de crédito fiscal 13 = Muestras médicas | ||
tipoEmision | tipoemision | int | todos | 1 = Normal 2 = Contingencia | ||
tipoImpuesto | tipoimpuesto | int | FE, AF, NC, ND | 1 = IVA 2 = ISC 3 = Renta 4 = Ninguno 5 = IVA - Renta | ||
id | identificador | int | todos | número secuencial autoincremental único que identifica al documento (generado por el emisor) | ||
idlote | int | todos | número secuencial autoincremental único que identifica a cada lote de documento/s enviado/s (generado por el emisor) | |||
establecimiento | establecimiento | string | todos | corresponde a la sucursal ej. 001 | ||
punto | punto | string | todos | punto de expedición ej. 002 | ||
numero | numero | string | todos | ej. 0001234 | ||
serie | serie | string | todos | ej. AA si supera el limite de 9999999 | ||
condicion.credito.tipo | tipocredito | int | FE | 1 = Plazo 2 = Cuota | ||
condicion.credito.plazo | diasvenci | int | FE | si tipo de credito es plazo ej. 45 | ||
condicion.credito.cuotas | cantcuota | int | FE | si tipo de credito es cuota ej. 12 | ||
mensaje_resp | string | todos | mensaje de un documento mostrado en el integrador que corresponde a la respuesta de SIFEN | |||
mensaje_400 | string | todos | mensaje de un documento mostrado en el integrador que corresponde a la respuesta de la API DTEpy | |||
rucemisor | string | todos | dato para que la API genere el CDC en caso de null | |||
tipocontribuyenteemisor | int | todos | dato para que la API genere el CDC en caso de null 1 = Persona Física 2 = Persona Jurídica | |||
descuentoGlobal | descuentoglobal | numeric | FE, AF | un valor en descuento global realizara la proporcion de descuento por ítem. | ||
condicionAnticipo | condicionanticipo | int | FE, AF | |||
anticipoGlobal | anticipoglobal | numeric | FE, AF | si condicionAnticipo es 1, se realizara la proporción en los ítems | ||
factura.presencia | presencia | int | FE | 1 = Operación presencial 2 = Operación electrónica 3 = Operación telemarketing 4 = Venta a domicilio 5 = Operación bancaria 6 = Operación cíclica 9 = Otro | ||
factura.fechaEnvio | fechaenvio | date | FE | Fecha estimada para el traslado de la mercadería y emisión de la nota de remisión electrónica cuando corresponda. | ||
notaCreditoDebito.motivo remision.motivo | motivo | int | NC,ND,NR | Valores para los tipos NC Y ND 1 = Devolución y Ajuste de precios 2 = Devolución 3 = Descuento 4 = Bonificación 5 = Crédito incobrable 6 = Recupero de costo 7 = Recupero de gasto 8 = Ajuste de precio Valores para el tipo NR 1 = Traslado por venta 2 = Traslado por consignación 3 = Exportación 4 = Traslado por compra 5 = Importación 6 = Traslado por devolución 7 = Traslado entre locales de la empresa 8 = Traslado de bienes por transformación 9 = Traslado de bienes por reparación 10 = Traslado por emisor móvil 11 = Exhibición o demostración 12 = Participación en ferias 13 = Traslado de encomienda 14 = Decomiso | ||
idcliente | string | todos | campo para relacionar con datos de clientes | |||
idvendedor | string | AF | campo para relacionar con datos de vendedor. (prestador de servicio) | |||
idusuario | string | todos | campo para relacionar con datos de usuario | |||
idmovimiento | string | todos | campo para relacionar con datos de items, doc. asociado, forma de cobro | |||
Nota: Si utiliza el método de conexión VFP el nombre del cursor de retorno debe llamarse CABECERA. |
DATOS DEL CLIENTE | ||||||
---|---|---|---|---|---|---|
Json.cliente | Integrador | Tipo | Docum | Oblig | Observación | |
contribuyente | contribyuente | booleano | todos | true, false | ||
ruc | ruc | string | todos | agregar valor si contribuyente es true | ||
tipoContribuyente | tipocontribyuente | int | todos | 1 = Fisica 2 = Juridica | ||
razonSocial | razonsocial | string | todos | |||
string | todos | |||||
nombreFantasia | nombrefantasia | string | todos | |||
tipoOperacion | tipooperacion | int | todos | 1 = B2B 2 = B2C 3 = B2G 4 = B2F | ||
documentoTipo | documentotipo | int | todos | agregar valor si contribuyente es false 1 = Cédula paraguaya 2 = Pasaporte 3 = Cédula extranjera 4 = Carnet de residenca 5 = Innominado 6 = Tarjeta diplomática de exoneración fiscal 9 = Otro | ||
documentoNumero | documentonumero | string | todos | agregar valor si contribuyente es false | ||
direccion | direccion | string | todos | agregar valor cuando tipoDocumento es nota remisión o tipoOperacion es B2F | ||
numeroCasa | numerocasa | string | todos | agregar si se informa la dirección, de lo contrario puede tener valor 0 | ||
pais | pais | string | todos | |||
departamento | departamento | int | todos | agregar valor si se informa la dirección y tipoOperacion es diferente a B2F | ||
distrito | distrito | int | todos | agregar valor si se informa la dirección y tipoOperacion es diferente a B2F | ||
ciudad | ciudad | int | todos | agregar valor si se informa la dirección y tipoOperacion es diferente a B2F | ||
Nota: Nombre de cursor retorno de vfp: SQCLIENTE. |
DATOS DEL USUARIO | ||||||
---|---|---|---|---|---|---|
Json.usuario | Integrador | Tipo | Docum | Oblig | Observación | |
documentoTipo | documentotipo | int | todos | 1 = Cédula paraguaya 2 = Pasaporte 3 = Cédula extranjera 4 = Carnet de residenca 9 = Otro | ||
documentoNumero | documentonumero | string | todos | |||
nombre | nombre | string | todos | |||
cargo | cargo | string | todos | |||
Nota: Nombre de cursor retorno de vfp: SQUSUARIO. |
DATOS DE LA FACTURA DNCP | ||||||
---|---|---|---|---|---|---|
Json.dncp | Integrador | Tipo | Docum | Oblig | Observación | |
modalidad | modalidad | string | FE, NC, ND | |||
entidad | endidad | int | FE, NC, ND | |||
año | anho | int | FE, NC, ND | |||
secuencia | secuencia | int | FE, NC, ND | |||
fecha | fecha | date | FE, NC, ND | json: ej. 2025-01-01 integrador: ej. 01/01/2025 | ||
Nota: Nombre de cursor retorno de vfp: SQDNCP. |
DATOS DE LA OBLIGACIÓN | ||||||
---|---|---|---|---|---|---|
Json.obligaciones[] | Integrador | Tipo | Docum | Oblig | Observación | |
codigo | codigo | int | FE, NC, ND | ej. 211 | ||
descripcion | descripcion | string | FE, NC, ND | ej. Impuesto al Valor Agregado | ||
Nota: Nombre de cursor retorno de vfp: SQOBLIGACIONES. |
ÍTEMS DE LA OPERACIÓN | ||||||
---|---|---|---|---|---|---|
Json.items[] | Integrador | Tipo | Docum | Oblig | Observación | |
codigo | codigo | string | todos | |||
descripcion | descripcion | string | todos | |||
desunidadmedida | string | todos | ||||
iva | iva | int | FE, AF, ND,NC | ej. 0, 5, 10 | ||
cantidad | cantidad | numeric | todos | |||
precioUnitario | preciounitario | numeric | FE, AF, ND,NC | |||
descuento | descuento | numeric | FE, AF, ND,NC | |||
anticipo | anticipo | numeric | FE | |||
total | numeric | FE, AF, ND,NC | ||||
unidadMedida | unidadmedida | int | todos | según XSD de unidades de medidas | ||
ivaTipo | ivatipo | int | FE, AF, ND,NC | 1 = Gravado IVA 2 = Exonerado 3 = Exento 4 = Gravado parcial (Grav-Exento) | ||
ivaBase | ivabase | int | FE, AF, ND,NC | proporción del iva que afecta a un ítem gravado ej. 100, 50, 30, 0 | ||
observacion | observacion | string | todos | |||
Nota: Nombre de cursor retorno de vfp: SQITEMS. |
FORMAS DE COBRO (contado) | ||||||
---|---|---|---|---|---|---|
Json.condicion | Integrador | Tipo | Docum | Oblig | Observación | |
entregas[].tipo | tipo | int | FE, AF | 1 = Efectivo 2 = Cheque 3 = Tarjeta de crédito 4 = Tarjeta de débito 5 = Transferencia 6 = Giro 7 = Billetera electrónica 8 = Tarjeta empresarial 9 = Vale 10 = Retención 11 = Pago por anticipo 12 = Valor fiscal 13 = Valor comercial 14 = Compensación 15 = Permuta 16 = Pago bancario 17= Pago Móvil 18 = Donación 19 = Promoción 20 = Consumo Interno 21 = Pago Electrónico 99 = Otro | ||
entregas[].tipo.descripcion | descripcion | string | FE, AF | informar si entregas[].tipo = 99 | ||
entregas[].moneda | moneda | string | FE, AF | PYG, ARS, USD, BRL, EUR | ||
entregas[].cambio | cambio | numeric | FE, AF | informar si moneda es diferente a PYG | ||
entregas[].monto | monto | numeric | FE, AF | |||
entregas[].infoCheque.banco | banco | string | FE, AF | informar si entregas[].tipo = 2 | ||
entregas[].infoCheque.numeroCheque | numerocheque | string | FE, AF | informar si entregas[].tipo = 2 | ||
entregas[].infoTarjeta.tipo | tipotarjeta | int | FE, AF | informar si entregas[].tipo = 3 o 4 1 = Visa 2 = Mastercard 3 = American Express 4 = Maestro 5 = Panal 6 = Cabal 99 = Otro | ||
entregas[].infoTarjeta.tipodescripcion | tipodescripcion | string | FE, AF | informar si entregas[].infoTarjeta.tipo = 99 | ||
entregas[].infoTarjeta.numero | numero | string | FE, AF | informar si entregas[].tipo = 3 o 4 | ||
entregas[].infoTarjeta.medioPago | mediopago | int | FE, AF | informar si entregas[].tipo = 3 o 4 1 = POS 2 = Pago Electrónico 9 = Otro | ||
Nota: Nombre de cursor retorno de vfp: SQFORMACOBRO. |
DATOS DE CUOTAS (cuando es crédito) | ||||||
---|---|---|---|---|---|---|
Json.condicion.credito | Integrador | Tipo | Docum | Oblig | Observación | |
infoCuotas[].moneda | moneda | string | FE, AF | |||
infoCuotas[].monto | monto | numeric | FE, AF | |||
infoCuotas[].vencimiento | vencimiento | date | FE, AF | |||
Nota: Nombre de cursor retorno de vfp: SQCUOTAS. |
DATOS DEL DOCUMENTO ASOCIADO | ||||||
---|---|---|---|---|---|---|
Json.documentoAsociado[] | Integrador | Tipo | Docum | Oblig | Observación | |
formato | formato | int | todos | 1 = Electrónico 2 = Impreso 3 = Constancia Electrónica | ||
cdc | cdc | string | todos | agregar valor si formato = 1 | ||
constanciaTipo | constanciatipo | int | AF | agregar valor si formato = 3 1 = Constancia de no ser contribuyente 2 = Constancia de microproductores | ||
constanciaNumero | constancianumero | int | AF | agregar valor si formato = 3 y constanciaTipo = 2 | ||
constanciaControl | constanciacontrol | string | AF | agregar valor si formato = 3 y constanciaTipo = 2 | ||
tipoDocumentoImpreso | tipodocumentoimpreso | int | todos | agregar valor si formato = 2 1 = Factura 2 = Nota de crédito 3 = Nota de débito 4 = Nota de remisión 5 = Comprobante de retención | ||
timbrado | timbrado | int | todos | agregar valor si formato = 2 | ||
establecimiento | establecimiento | string | todos | agregar valor si formato = 2 | ||
punto | punto | string | todos | agregar valor si formato = 2 | ||
numero | numero | string | todos | agregar valor si formato = 2 | ||
fecha | fecha | date | todos | agregar valor si formato = 2 | ||
idmovimiento | string | todos | ||||
Nota: Nombre de cursor retorno de vfp: SQDOCASO. |
DATOS DE LA AUTOFACTURA | ||||||
---|---|---|---|---|---|---|
Json.autoFactura | Integrador | Tipo | Docum | Oblig | Observación | |
tipoVendedor | tipovendedor | int | AF | 1 = No contribuyente 2 = Extranjero | ||
nombre | nombre | string | AF | nombre del prestador de servicio | ||
direccion | direccion | string | AF | |||
numeroCasa | numerocasa | int | AF | |||
departamento | departamento | int | AF | |||
distrito | distrito | int | AF | |||
ciudad | ciudad | int | AF | |||
documentoTipo | documentotipo | int | AF | 1 = Cédula paraguaya 2 = Pasaporte 3 = Cédula extranjera 4 = Carnet de residencia | ||
documentoNumero | documentonumero | string | AF | |||
ubicacion.lugar | ubicacion_lugar | string | AF | dirección del propio emisor que actúa como cliente en la autofactura | ||
ubicacion.departamento | ubicacion_departamento | int | AF | |||
ubicacion.distrito | ubicacion_distrito | int | AF | |||
ubicacion.ciudad | ubicacion_ciudad | int | AF | |||
Nota: Nombre de cursor retorno de vfp: SQAUTOFACTURA. |
DATOS DE LA NOTA DE REMISIÓN | ||||||
---|---|---|---|---|---|---|
Json | Integrador | Tipo | Docum | Oblig | Observación | |
remision. tipoResponsable | remision_tiporesp | int | NR | 1 = Emisor de la factura 2 = Poseedor de la factura y bienes 3 = Empresa transportista 4 = Despachante de Aduanas 5 = Agente de transporte o intermediario | ||
remision.kms | remision_kms | numeric | NR | |||
transporte. tipo | transporte_tipo | int | NR | 1 = Propio 2 = Tercero | ||
transporte. modalidad | transporte_modalidad | int | NR | 1 = Terrestre 2 = Fluvial 3 = Aéreo 4 = Multimodal | ||
transporte. tipoResponsable | transporte_tiporesp | int | NR | 1 = Emisor de la Factura Electrónica 2 = Receptor de la Factura Electrónica 3 = Tercero 4 = Agente intermediario del transporte 5 = Transporte propio | ||
transporte. condicionNegociacion | transporte_condneg | string | NR | CFR = Costo y flete CIF = Costo, seguro y flete CIP = Transporte y seguro pagados hasta CPT = Transporte pagado hasta DAP = Entregada en lugar convenido DAT = Entregada en terminal DDP = Entregada derechos pagados EXW = En fabrica FAS = Franco al costado del buque FCA = Franco transportista FOB = Franco a bordo | ||
transporte. numeroManifiesto | transporte_nummani | string | NR | |||
transporte. numeroDespachoImportacion | transporte_numdespimp | string | NR | |||
transporte. inicioEstimadoTranslado | transporte_initrans | date | NR | |||
transporte. finEstimadoTranslado | transporte_fintrans | date | NR | |||
transporte. paisDestino | transporte_paisdestino | string | NR | |||
transporte. salida.direccion | salida_direccion | string | NR | |||
transporte. salida.numeroCasa | salida_numerocasa | int | NR | si no tiene nro agregar 0 | ||
transporte. salida.pais | salida_pais | string | NR | |||
transporte. salida.departamento | salida_departamento | int | NR | |||
transporte. salida.distrito | salida_distrito | int | NR | |||
transporte. salida.ciudad | salida_ciudad | int | NR | |||
transporte. entrega.direccion | entrega_direccion | string | NR | |||
transporte. entrega.numeroCasa | entrega_numerocasa | int | NR | si no tiene nro agregar 0 | ||
transporte. entrega. complementoDireccion1 | entrega_comple1 | string | NR | |||
transporte. entrega. complementoDireccion2 | entrega_comple2 | string | NR | |||
transporte. entrega.pais | entrega_pais | string | NR | |||
transporte. entrega.departamento | entrega_departamento | int | NR | |||
transporte. entrega.distrito | entrega_distrito | int | NR | |||
transporte. entrega.ciudad | entrega_ciudad | int | NR | |||
transporte. entrega.telefonoContacto | entrega_telcontacto | string | NR | |||
transporte. vehiculo.tipo | vehiculo_tipo | string | NR | CAMIONETA AUTOMOVIL MOTOCICLETA BARCAZA TREN AUTOBUS HELICOPTERO CAMION | ||
transporte. vehiculo.marca | vehiculo_marca | string | NR | |||
transporte. vehiculo.documentoTipo | vehiculo_documentotipo | int | NR | 1 = Número de identificación del vehículo 2 = Número de matrícula del vehículo | ||
transporte. vehiculo. documentoNumero | vehiculo_documentonumero | string | NR | informar si vehiculo_ documentotipo = 1 | ||
transporte. vehiculo.numeroMatricula | vehiculo_numeromatricula | string | NR | informar si vehiculo_ documentotipo = 2 | ||
transporte. vehiculo.numeroVuelo | vehiculo_numerovuelo | string | NR | informar si modalidad = 3 | ||
transporte. transportista.contribuyente | transportista_contribuyente | int | NR | true, false | ||
transporte. transportista.nombre | transportista_nombre | string | NR | |||
transporte. transportista.ruc | transportista_ruc | string | NR | informar si transportista_ contribuyente = true | ||
transporte. transportista. documentoTipo | transportista_documentotipo | int | NR | 1 = Cédula paraguaya 2 = Pasaporte 3 = Cédula extranjera 4 = Carnet de residencia | ||
transporte. transportista. documentoNumero | transportista_documentonumero | string | NR | informar si transportista es no contribuyente | ||
transporte. transportista.direccion | transportista_direccion | string | NR | |||
transporte. transportista.pais | transportista_pais | string | NR | |||
transporte. chofer.documentoNumero | chofer_documentonumero | string | NR | |||
transporte. chofer.nombre | chofer_nombre | string | NR | |||
transporte. chofer.direccion | chofer_direccion | string | NR | |||
cod_mov_aso | string | NR | seria el idmovimiento del documento asociado a la remision ej (una factura) | |||
Nota: Nombre de cursor retorno de vfp: SQREMISION. |
CONSULTA DE ID | ||||||
---|---|---|---|---|---|---|
Json | Integrador | Tipo | Docum | Oblig | Observación | |
identificador | int | todos | ||||
idlote | int | todos | ||||
idcancelacion | int | todos | ||||
idinutilizacion | int | todos | ||||
idnominacion | int | todos | ||||
id_datostrans | int | todos | ||||
Nota: Nombre de cursor retorno de vfp: SQIDCONSULTA. |
El informático tiene la opción de no generar el archivo JSON directamente. En su lugar, puede optar por exportar un archivo TXT que será procesado por el integrador para generar automáticamente el KuDE. En este caso, la aplicación del emisor solo necesita monitorear el directorio donde se genera el KuDE, permitiendo lanzar la impresión de manera automática tras la grabación de una operación.