Giter VIP home page Giter VIP logo

facturajs's Introduction

facturajs

facturajs

Afip Web Services desde nodejs.

~$ yarn add facturajs
# OR
~$ npm i facturajs

WebServices de la AFIP con node

El objetivo de esta lib es facilitar la comunicación con la AFIP utilizando node.js. En mi caso particular, necesitaba generar facturas electrónicas como monotributista de manera automática.

No tiene muchas pretenciones, pero el código puede ser ilustrativo para armar otras integraciones más complejas.

Obtener certificados en la AFIP

Los servicios de AFIP están disponibles mediante SOAP y su página principal es AFIP WS.

Los servicios poseen dos entornos conocidos como homologación (para testing), y producción.

Para utilizar ambos entornos hay que obtener certificados digitales de la AFIP.

De nuestro lado lo primero es generar certificados relacionados a nuestro CUIT:

# Crear clave privada
~ $ openssl genrsa -out private/private_key.key 2048 
# Crear certificado
~ $ openssl req -new -key private/private_key.key -subj "/C=AR/O=TU_EMPRESA/CN=TU_SISTEMA/serialNumber=CUIT TU_CUIT" -out private/afip.csr

(*) Dónde dice CUIT TU_CUIT es importante el espacio y conservar la palabra "CUIT".

Adherirse a homologación (testing)

En este pdf (WSASS como adherirse) pueden ver el proceso de adhesión al servicio de homologación. Básicamente das de alta el servicio y le cargas el CSR generado en el paso anterior, la página web te va a entregar otro cert que lo tenes que copiar y lo guardas en un archivo de texto: private/cert.pem. El último paso, en esa misma página, sería autorizar tu cert al servicio que quieras usar. En mi caso quería el de facturas digitales llamado: wsfe.

Ejemplo de uso

Crear una factura electrónica

En este ejemplo pueden ver como crear una factura electrónica con el último número de comprobante válido.

Para poder ver más en detalle que está sucediendo se puede configurar el LOG_LEVEL y namespace de DEBUG:

~$ LOG_LEVEL=3 DEBUG=facturajs node dist/examples/create-bill-monotributo.js
# Salida:
# Last bill number:  43
# Next bill number to create:  44
# Created bill {
#     "FeCabResp": {
#         "Cuit": "XXXXXXXXXX",
#         "PtoVta": 2,
#         "CbteTipo": 11,
#         "FchProceso": "20180423081028",
#         "CantReg": 1,
#         "Resultado": "A",
#         "Reproceso": "N"
#     },
#     "FeDetResp": {
#         "FECAEDetResponse": [
#             {
#                 "Concepto": 1,
#                 "DocTipo": 99,
#                 "DocNro": "0",
#                 "CbteDesde": "44",
#                 "CbteHasta": "44",
#                 "CbteFch": "20180423",
#                 "Resultado": "A",
#                 "CAE": "68174646182386",
#                 "CAEFchVto": "20180503"
#             }
#         ]
#     }
# }

Ejecutar cualquier método del WebService

De manera general cualquier método del WebService se puede llamar con execRemote(servicio, método, parámetros), por ejemplo:

const afip = new AfipServices(config);
afip.execRemote('wsfev1', 'FECAESolicitar', {
    Auth: {Cuit: 27000000000},
    params: {
        CbteTipo: 11,
        PtoVta: 2
    }    
}).then(res => console.log(res))

Config

El constructor AfipServices acepta un objeto que cumpla con la interfaz de IConfigService. La descripción de sus propiedades:

  • homo Un booleano que determina el uso del entorno de homologación.
  • cacheTokensPath Path a un file dónde se cachearan los tokens obtenidos para no solicitarlos cada vez.
  • tokensExpireInHours La cantidad de horas en la que expirará el archivo de tokens cacheados.
  • privateKeyContents El contenido de la private key (no hace falta path en este caso)
  • privateKeyPath Path a la private key (al igual que antes podemos omitir el contenido)
  • certContents El contenido del certificado (no hace falta path en este caso)
  • certPath Path al certificado (al igual que antes podemos omitir el contenido)

Nota acerca de métodos de cifrado openssl

En algunos sistemas operativos con una versión de la configuración de openssl mas nueva se reportó un error porque openssl rechaza los métodos de cifrado de AFIP. Algunos usuarios reportaron que en un sistema Debian la solución fue editar /etc/ssl/openssl.cnf. Y comentar la siguiente línea:

# CipherString = DEFAULT@SECLEVEL=2

Proyectos relacionados

  • SOAP de la AFIP a REST enciende un server expressjs y sirve de wrapper alrededor del SOAP para poder consumir los servicios con una interfaz REST. A partir de ese repo se armó esta lib.

Colaboradores

  • mbenedettini

facturajs's People

Contributors

dependabot[bot] avatar emilioastarita avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

facturajs's Issues

Forma de pago? Items?

Hola, por lo que veia en el ejemplo del repo para generar un comprobante, no es necesario especificar forma de pago, ni los items que componen la factura.

Screenshot 2023-08-01 at 10 28 53

Esto es requerido en la web oficial, pero no parece fallar sin mandarlos por API. No hay problema en no mandarlos?
En caso de querer agregarlo tampoco encontré en la documentación como hacerlo

Screenshot 2023-08-01 at 10 28 28

la AFIP usa TLS de 1974

Buenas, arranqué con esto para hacer unas pruebas y resulta que nuestra amada AFIP usa TLS del año del choto con tamaño de claves de 4 bits, entonces falla con:

(node:14790) UnhandledPromiseRejectionWarning: Error: write EPROTO 139949712528768:error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small:../ssl/statem/statem_clnt.c:2156

Busqué y se puede obligar a openssl a aceptar cifrados arcaicos, inseguros y pedorros (porque imaginate pedirle a la AFIP que actualicen sus servicios, ¡ja!), entonces lo corro así:
node --tls-cipher-list="TLS_RSA_WITH_AES_256_GCM_SHA384" dist/examples/last-bill.js

y falla con:

(node:14406) UnhandledPromiseRejectionWarning: Error [ERR_SOCKET_CLOSED]: Socket is closed

Y hasta ahí llegué... ¿ideas?

Certificado no emitido por AC de confianza, issues with open ssl

  1. tenia problema con openssl x generar los pem. me confude no se si es correcta,
    (el command en el readman no hace un pem, y mi dio error

// openssl req -x509 -newkey rsa:4096 -nodes
// -out ./nginx/cert.pem
// -keyout ./nginx/key.pem -days 365 -subj "/C=AR/O=TU_EMPRESA/CN=TU_SISTEMA/serialNumber=CUIT MI_CUIT"

  1. esa me da: ' Certificado no emitido por AC de confianza' response de afip. gracias.

Facturas A

Hola, facturajs permite generar comprobantes tipo 1, es decir A? Porque no encuentro la forma de pasar los datos que necesito mandar para generar comprobantes tipo A, por ejemplo Ivas y tributos.

Obtener PDF

Tienen idea si hay algun endpoint que permita generar el PDF de la factura?

Saludos!

Cannot find type definition file for 'bluebird'

al correr tsc, me dá el error:

node_modules/facturajs/dist/AfipServices.d.ts(1,23): error TS2688: Cannot find type definition file for 'bluebird'.
node_modules/facturajs/dist/AfipServices.d.ts(3,26): error TS7016: Could not find a declaration file for module 'bluebird'. '/fe_AFIP_test/node_modules/bluebird/js/release/bluebird.js' implicitly has an 'any' type.
Try npm install @types/bluebird if it exists or add a new declaration (.d.ts) file containing declare module 'bluebird';

Documentación / Ejemplos

Buenas
¿sería posible expandir un poco más la documentación? O tal vez más ejemplos de uso.

Saludos

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.