UNPKG

facturacionelectronicapy-xmlgen

Version:

API Node JS para generar el archivo XML del Documento electrónico exigido por SIFEN en base a JSON

564 lines (513 loc) 19 kB
# Facturación Electrónica - Generación de XML para SIFEN (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 SIFEN ## Instalación Para instalar el módulo en su proyecto node, ejecute el siguiente comando: ``` sh 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: ``` js 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: ``` ts 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 ``` json { "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 ``` json { "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, "ivaProporcion" : 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" } } ``` ## Actualización importante Diciembre 2025 El campo item.ivaBase pasa a llamarse item.ivaProporcion, no obstante el campo item.ivaBase se mantiene por compatibilidad de integraciones previas. 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 SIFEN 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 ``` json { "cdc": "01800695631001001000000612021112917595714694", "motivo": "Se cancela este CDC" } ``` ## Evento de Inutilización ``` json { "tipoDocumento": 1, "establecimiento": "001", "punto": "001", "desde": 10, "hasta": 12, "motivo": "Se inutiliza la numeración" } ``` ## Evento de Conformidad ``` json { "cdc": "01800695631001001000000812021112910953738413", "tipoConformidad": 1, "fechaRecepcion": "2022-01-31T00:01:01" } ``` ## Evento de Disconformidad ``` json { "cdc": "01800695631001001000000812021112910953738413", "motivo": "Se informa de una disconformidad" } ``` ## Evento de Desconocimiento ``` json { "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 ``` json { "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: ``` js 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: ``` ts 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](https://www.npmjs.com/package/facturacionelectronicapy-xmlgen)<br/> [Firma de XML](https://www.npmjs.com/package/facturacionelectronicapy-xmlsign)<br/> [Generación de QR](https://www.npmjs.com/package/facturacionelectronicapy-qrgen)<br/> [API de SIFEN](https://www.npmjs.com/package/facturacionelectronicapy-setapi)<br/> [Generación KUDE](https://www.npmjs.com/package/facturacionelectronicapy-kude)<br/> ## Empresas que utilizan éstos proyectos [FacturaSend](https://www.facturasend.com.py/)<br/> [JHF Ingeniería Informática](https://jhf.com.py/)<br/> [JR Ingeniería y Servicios](https://jringenieriayservicios.com/)<br/> [Datamex](https://www.datamex.com.py/)<br/> [Factupar](https://factupar.com.py/)<br/> [Globe Informatica](https://globeinformatica.com.py/)<br/> [FZ Sistemas de Gestion](https://fz-gestion.com.py/)<br/> * * * * Todos los derechos reservados - 2021