facturacionelectronicapy-xmlgen
TypeScript icon, indicating that this package has built-in type declarations

1.0.239 • Public • Published

Facturación Electrónica - Generación de XML para la SET (Paraguay)

Módulo NodeJS que genera el archivo XML para enviar a la SET (Subsecretaria de Estado de Tributación del Ministerio de Hacienda) para el proceso y generación del documento electrónico, a partir de una estructura de datos en formato JSON.

Versión del Manual Técnico: 150

Este paquete pretende servir de modelo de transferencia estandarizado para la comunicación con la SET contemplando la totalidad de los campos exigidos para cada bloque y tipos de documentos electrónicos.

El mismo es utilizado y mantenido por el autor y otorgado a la comunidad de desarrolladores de forma gratuita bajo licencia MIT

El módulo está preparado de forma a proveer una fácil integración dentro de su entorno NodeJS y para con cualquier otro lenguaje, sistema o librería que requiera, por ejemplo publicando el médoto desde un REST.

Características

  • Genera el CDC automáticamente de acuerdo a los datos del documento electrónico
  • Implementa el Algoritmo del dígito verificador del CDC
  • Permite sobreescribir el valor del código de seguridad, de acuerdo a las necesidades del implementador
  • Realiza la validación de los datos de entrada conforme el menual técnico de la SET

Instalación

Para instalar el módulo en su proyecto node, ejecute el siguiente comando:

  npm install facturacionelectronicapy-xmlgen

El método requiere 2 argumentos tipo JSON para general el XML. El primero es un argumento params con las informaciones estáticas del Contribuyente emisor, y el segundo es un data con los datos variables para cada documento electrónico a generar.

La promesa devuelve el documento XML con los datos generados.

Ejemplos de Uso:

Javascript:

  const xmlgen = require('facturacionelectronicapy-xmlgen');
  //O const xmlgen = require('facturacionelectronicapy-xmlgen').default;
  
  xmlgen.generateXMLDE(params, data, options).then(xml => {
      console.log(xml);
  }).catch(error => {
      console.log(error);
  });     

TypeScript:

  import xmlgen from 'facturacionelectronicapy-xmlgen';

  xmlgen.generateXMLDE(params, data, options).then(xml => {
      console.log(xml);
  }).catch(error => {
      console.log(error);
  }); 

Ambos parámetros params y data pueden ser proveidos a partir de una vista de base de datos, leyendo datos de un CSV o proceso generado por otro sistema, para lograr una fácil integración

Al final podrá encontrar la estructura completa para el PARAMS y el JSON

Estructura completa del params JSON de Ejemplo

{
  "version" : 150,
  "ruc" : "80069563-1",
  "razonSocial" : "DE generado en ambiente de prueba - sin valor comercial ni fiscal",
  "nombreFantasia" : "TIPS S.A. TECNOLOGIA Y SERVICIOS",
  "actividadesEconomicas" : [{
    "codigo": "1254",
    "descripcion": "Desarrollo de Software",
  }],   
  "timbradoNumero" : "12558946",
  "timbradoFecha" : "2022-08-25",
  "tipoContribuyente" : 2, 
  "tipoRegimen" : 8, 
  "establecimientos" : [{
    "codigo" : "001",
    "direccion" : "Barrio Carolina", 
    "numeroCasa" : "0", 
    "complementoDireccion1" : "Entre calle 2", 
    "complementoDireccion2" : "y Calle 7",
    "departamento" : 11,
    "departamentoDescripcion" : "ALTO PARANA",
    "distrito" : 145,
    "distritoDescripcion" : "CIUDAD DEL ESTE",
    "ciudad" : 3432,
    "ciudadDescripcion" : "PUERTO PTE.STROESSNER (MUNIC)",
    "telefono" : "0973-527155",
    "email" : "tips@tips.com.py, tips@gmail.com",
    "denominacion" : "Sucursal 1",
  }]
}

El campo Email, si bien puede informarse mas de 1 (uno), en el Sifen solamente será enviado el primero

Estructura completa del data JSON de Ejemplo

{
    "tipoDocumento" : 1,
    "establecimiento" : "001",
    "codigoSeguridadAleatorio" : "298398",
    "punto" : "001",
    "numero" : "0000001", 
    "descripcion" : "Aparece en el documento",
    "observacion" : "Cualquier informacion de marketing, publicidad, sorteos, promociones para el Receptor",
    "fecha" : "2022-08-14T10:11:00",
    "tipoEmision" : 1,
    "tipoTransaccion" : 1,
    "tipoImpuesto" : 1,
    "moneda" : "PYG",
    "condicionAnticipo" : 1,
    "condicionTipoCambio": 1,
    "descuentoGlobal": 0,
    "anticipoGlobal": 0,
    "cambio": 6700,
    "cliente" : {
        "contribuyente" : true,
        "ruc" : "2005001-1",
        "razonSocial" : "Marcos Adrian Jara Rodriguez",
        "nombreFantasia" : "Marcos Adrian Jara Rodriguez",
        "tipoOperacion" : 1,
        "direccion" : "Avda Calle Segunda y Proyectada",
        "numeroCasa" : "1515",
        "departamento" : 11,
        "departamentoDescripcion" : "ALTO PARANA",
        "distrito" : 143,
        "distritoDescripcion" : "DOMINGO MARTINEZ DE IRALA",
        "ciudad" : 3344,
        "ciudadDescripcion" : "PASO ITA (INDIGENA)",
        "pais" : "PRY",
        "paisDescripcion" : "Paraguay",
        "tipoContribuyente" : 1,
        "documentoTipo" : 1,
        "documentoNumero" : "2324234",
        "telefono" : "061-575903",
        "celular" : "0973-809103",
        "email" : "cliente@empresa.com, cliente@personal.com",
        "codigo" : "1548"
    },
    "usuario" : {
        "documentoTipo" : 1,
        "documentoNumero" : "157264",
        "nombre" : "Marcos Jara",
        "cargo" : "Vendedor"
    },
    "factura" : {
        "presencia" : 1,
        "fechaEnvio" : "2023-10-21",
        "dncp" : {
            "modalidad" : "ABC",
            "entidad" : 1,
            "año" : 2021,
            "secuencia" : 3377,
            "fecha" : "2022-09-14T10:11:00"
        }
    },
    "autoFactura" : {
        "tipoVendedor" : 1,
        "documentoTipo" : 1,
        "documentoNumero" : 1,
        "nombre" : "Vendedor autofactura",
        "direccion" : "Vendedor autofactura",
        "numeroCasa" : "Vendedor autofactura",
        "departamento" : 11,
        "departamentoDescripcion" : "ALTO PARANA",
        "distrito" : 143,
        "distritoDescripcion" : "DOMINGO MARTINEZ DE IRALA",
        "ciudad" : 3344,
        "ciudadDescripcion" : "PASO ITA (INDIGENA)",
        "transaccion" : {
            "lugar" : "Donde se realiza la transaccion",
            "departamento" : 11,
            "departamentoDescripcion" : "ALTO PARANA",
            "distrito" : 143,
            "distritoDescripcion" : "DOMINGO MARTINEZ DE IRALA",
            "ciudad" : 3344,
            "ciudadDescripcion" : "PASO ITA (INDIGENA)"
        }
    },
    "notaCreditoDebito" : {
        "motivo" : 1
    },
    "remision" : {
        "motivo" : 1,
        "tipoResponsable" : 1, 
        "kms" : 150,
        "fechaFactura" : "2022-08-21"
    },
    "condicion" : {
        "tipo" : 1,
        "entregas" : [{ 
            "tipo" : 1,
            "monto" : "150000",
            "moneda" : "PYG",
            "cambio" : 0
        }, { 
            "tipo" : 3,
            "monto" : "150000",
            "moneda" : "PYG",
            "cambio" : 0,
            "infoTarjeta" : {
                "tipo" : 1,
                "tipoDescripcion" : "Dinelco",
                "titular" : "Marcos Jara",
                "ruc" : "6969549654-1",
                "razonSocial" : "Bancard",
                "medioPago" : 1,
                "codigoAutorizacion" : 232524234
            }
        }, { 
            "tipo" : 2,
            "monto" : "150000",
            "moneda" : "PYG",
            "cambio" : 0,
            "infoCheque" : {
                "numeroCheque": "32323232",
                "banco" : "Sudameris"
            }
        }],
        "credito" : {
            "tipo" : 1,
            "plazo" : "30 días",
            "cuotas" : 2,
            "montoEntrega" : 1500000.00,
            "infoCuotas" : [{
                "moneda" : "PYG",
                "monto" : 800000.00,
                "vencimiento" : "2021-10-30"
            }, {
                "moneda" : "PYG",
                "monto" : 800000.00,
                "vencimiento" : "2021-11-30"
            }]
        }
    },
    "items" : [{
        "codigo" : "A-001",
        "descripcion": "Producto o Servicio", 
        "observacion": "Información adicional o complementaria sobre el producto", 
        "partidaArancelaria" : 4444,
        "ncm": "ABCD1234",
        "unidadMedida": 77,
        "cantidad": 10.5,
        "precioUnitario": 10800,
        "cambio": 0,
        "descuento": 0,
        "anticipo": 0,
        "pais" : "PRY",
        "paisDescripcion" : "Paraguay",
        "tolerancia" : 1,
        "toleranciaCantidad" : 1,
        "toleranciaPorcentaje" : 1,
        "cdcAnticipo" : "44digitos",
        "dncp" : {
            "codigoNivelGeneral" : "12345678",
            "codigoNivelEspecifico" : "1234",
            "codigoGtinProducto" : "12345678",
            "codigoNivelPaquete" : "12345678"
        },
        "ivaTipo" : 1,
        "ivaBase" : 100,
        "iva" : 5,
        "lote" : "A-001",
        "vencimiento" : "2022-10-30",
        "numeroSerie" : "",
        "numeroPedido" : "",
        "numeroSeguimiento" : "",
        "importador" : {
            "nombre" : "Importadora Parana S.A.",
            "direccion" : "Importadora Parana S.A.",
            "registroImportador" : "Importadora Parana S.A."
        },
        "registroSenave" : "323223",
        "registroEntidadComercial" : "RI-32/22",
        "sectorAutomotor" : {
            "tipo" : 1,
            "chasis" : "45252345235423532",
            "color" : "Rojo",
            "potencia" : 1500,
            "capacidadMotor" : 5,
            "capacidadPasajeros" : 5,
            "pesoBruto" : 10000,
            "pesoNeto" : 8000,
            "tipoCombustible" : 9,
            "tipoCombustibleDescripcion" : "Vapor",
            "numeroMotor" : "323234234234234234",
            "capacidadTraccion" : 151.01,
            "año" : 2009,
            "tipoVehiculo" : "Camioneta",
            "cilindradas" : "3500"
        }
    }],
    "sectorEnergiaElectrica" : {
        "numeroMedidor" : "132423424235425",
        "codigoActividad" : 125,
        "codigoCategoria" : "001",
        "lecturaAnterior" : 4,
        "lecturaActual" : 5
    },
    "sectorSeguros" : {
        "codigoAseguradora" : "",
        "codigoPoliza" : "AAAA",
        "numeroPoliza" : "BBBB",
        "vigencia" : 1,
        "vigenciaUnidad" : "año",
        "inicioVigencia" : "2021-10-01",
        "finVigencia" : "2022-10-01",
        "codigoInternoItem" : "A-001"
    },
    "sectorSupermercados" : {
        "nombreCajero" : "Juan Antonio Caceres",
        "efectivo" : 150000,
        "vuelto" : 30000,
        "donacion" : 1000,
        "donacionDescripcion" : "Donado para la caridad"
    },
    "sectorAdicional" : {
        "ciclo" : "Mensualidad",
        "inicioCiclo" : "2021-09-01",
        "finCiclo" : "2021-10-01",
        "vencimientoPago" : "2021-11-01",
        "numeroContrato" : "AF-2541",
        "saldoAnterior" : 1550000
    },
    "detalleTransporte" : {
        "tipo" : 1,
        "modalidad" : 1,
        "tipoResponsable" : 1,
        "condicionNegociacion" : "CFR",
        "numeroManifiesto" : "AF-2541",
        "numeroDespachoImportacion" : "153223232332",
        "inicioEstimadoTranslado" : "2021-11-01",
        "finEstimadoTranslado" : "2021-11-01",
        "paisDestino" : "PRY", 
        "paisDestinoNombre" : "Paraguay",
        "salida" : {
            "direccion" : "Paraguay",
            "numeroCasa" : "Paraguay",
            "complementoDireccion1" : "Entre calle 2", 
            "complementoDireccion2" : "y Calle 7",
            "departamento" : 11,
            "departamentoDescripcion" : "ALTO PARANA",
            "distrito" : 143,
            "distritoDescripcion" : "DOMINGO MARTINEZ DE IRALA",
            "ciudad" : 3344,
            "ciudadDescripcion" : "PASO ITA (INDIGENA)",
            "pais" : "PRY",
            "paisDescripcion" : "Paraguay",
            "telefonoContacto" : "097x"
        },
        "entrega" : {
            "direccion" : "Paraguay",
            "numeroCasa" : "Paraguay",
            "complementoDireccion1" : "Entre calle 2", 
            "complementoDireccion2" : "y Calle 7",
            "departamento" : 11,
            "departamentoDescripcion" : "ALTO PARANA",
            "distrito" : 143,
            "distritoDescripcion" : "DOMINGO MARTINEZ DE IRALA",
            "ciudad" : 3344,
            "ciudadDescripcion" : "PASO ITA (INDIGENA)",
            "pais" : "PRY",
            "paisDescripcion" : "Paraguay",
            "telefonoContacto" : "097x"
        },
        "vehiculo" : {
            "tipo" : 1,
            "marca" : "Nissan",
            "documentoTipo" : 1, 
            "documentoNumero" : "232323-1",
            "obs" : "",
            "numeroMatricula" : "ALTO PARANA",
            "numeroVuelo" : 143
        },
        "transportista" : {
            "contribuyente" : true,
            "nombre" : "Paraguay",
            "ruc" : "80068684-1", 
            "documentoTipo" : 1,
            "documentoNumero" : "99714584",
            "direccion" : "y Calle 7",
            "obs" : 11,
            "pais" : "PRY",
            "paisDescripcion" : "Paraguay",
            "chofer" : {
                "documentoNumero" : "",
                "nombre" : "Jose Benitez",
                "direccion" : "Jose Benitez"
            },
            "agente" : {
                "nombre" : "Jose Benitez",
                "ruc" : "515415-1",
                "direccion" : "Jose Benitez"
            }
        }
    },
    "complementarios" : {
        "ordenCompra" : "",
        "ordenVenta" : "",
        "numeroAsiento" : "",
        "carga" : {
            "ordenCompra" : "",
            "ordenVenta" : "",
            "numeroAsiento" : ""
        }
    },
    "documentoAsociado" : {
        "formato" : 1,
        "cdc" : "01800695631001001000000612021112917595714694",
        "tipo" : 1,
        "timbrado" : "32323",
        "establecimiento" : "001",
        "punto" : "001",
        "numero" : "00278211",
        "fecha" : "2022-09-14",
        "numeroRetencion" : "32323232",
        "resolucionCreditoFiscal" : "32323",
        "constanciaTipo" : 1,
        "constanciaNumero" : 32323,
        "constanciaControl" : "33232323"

    }
}

El email del Cliente, si bien puede enviarse mas de 1 (uno), en SIFEN solamente será enviado el primero.

Eventos

Para la invocación de Eventos de la SET se debe utilizar como primer parámetro, el mismo params utilizado en la Generación de XML.

El segundo parámetro data debe ser pasado en el siguiente formato, dependiendo del evento a ser invocado. A continuación los ejemplos para cada evento.

Evento de Cancelación

{
    "cdc": "01800695631001001000000612021112917595714694",
    "motivo": "Se cancela este CDC"
}

Evento de Inutilización

{
    "tipoDocumento": 1,
    "establecimiento": "001",
    "punto": "001",
    "desde": 10,
    "hasta": 12,
    "motivo": "Se inutiliza la numeración"
}

Evento de Conformidad

{
    "cdc": "01800695631001001000000812021112910953738413",
    "tipoConformidad": 1,
    "fechaRecepcion": "2022-01-31T00:01:01"
}

Evento de Disconformidad

{
    "cdc": "01800695631001001000000812021112910953738413",
    "motivo": "Se informa de una disconformidad"
}

Evento de Desconocimiento

{
    "cdc": "01800695631001003000013712022010619364760029",
    "fechaEmision" : "2022-01-31T00:01:01",
    "fechaRecepcion" : "2022-01-31T00:01:01",
    "tipoReceptor" : 1,
    "nombre": "BRASIL CRESCENCIO",
    "ruc": "50062360-0",
    "documentoTipo": 1,
    "documentoNumero" : "",
    "motivo": "teste"
}

Evento de Notificación

{
    "cdc": "01800695631001003000013712022010619364760029",  
    "fechaEmision" : "2022-01-31T00:01:01",
    "fechaRecepcion" : "2022-01-31T00:01:01",
    "tipoReceptor" : 1,
    "nombre": "BRASIL CRESCENCIO",
    "ruc": "50062360-0",
    "documentoTipo": 1,
    "documentoNumero" : "",
    "totalPYG": 1550000
}

Ejemplos de Uso de invocación de evento de Cancelación:

Javascript:

  const xmlgen = require('facturacionelectronicapy-xmlgen');
  // O const xmlgen = require('facturacionelectronicapy-xmlgen').default;
  
  xmlgen.generateXMLEventoCancelacion(id, params, data).then(xml => {
      console.log(xml);
  }).catch(error => {
      console.log(error);
  });

TypeScript:

  import xmlgen from 'facturacionelectronicapy-xmlgen';

  xmlgen.generateXMLEventoCancelacion(id, params, data).then(xml => {
      console.log(xml);
  }).catch(error => {
      console.log(error);
  }); 

Siendo, los demás eventos disponibles:

generateXMLEventoInutilizacion(id, params, data);

generateXMLEventoConformidad(id, params, data);

generateXMLEventoDisconformidad(id, params, data);

generateXMLEventoDesconocimiento(id, params, data);

generateXMLEventoNotificacion(id, params, data);

Serie Técnica sobre Facturación Electrónica - YouTube

Para más información sobre el proceso que llevó a la generación de éste módulo visite la lista de reproducción "Serie técnica sobre Facturación Electrónica" en el canal de youtube del autor https://www.youtube.com/channel/UC05xmdC5i3Ob7XnYbQDiBTQ

Todos los proyectos

Generación de XML
Firma de XML
Generación de QR
API de la SET
Generación KUDE

Empresas que utilizan éstos proyectos

FacturaSend
JHF Ingeniería Informática
JR Ingeniería y Servicios
Datamex
Factupar
Globe Informatica
FZ Sistemas de Gestion


Todos los derechos reservados - 2021

Package Sidebar

Install

npm i facturacionelectronicapy-xmlgen

Weekly Downloads

107

Version

1.0.239

License

MIT

Unpacked Size

3.38 MB

Total Files

39

Last publish

Collaborators

  • marcosjara