Integrando Facturación Electrónica con SAP B1
Integrando Facturación Electrónica con SAP Business One (SAP B1)
Deseo compartir mi experiencia con la integración para facturación electrónica, en mi caso ha sido con SAP Business One (SAP B1) y el stack para desarrollo:
- .NET 8.0
- ASP.NET Core
- Angular
Esta publicación lo que busca es proporcionar una guía breve de la hoja de ruta para integrar la facturación electrónica, obviamente no solo existe SAP Business One (SAP B1), hay otras alternativas como Microsoft Dynamics o soluciones In-House cualquiera sea el caso aplican los mismos conceptos.
Al momento de redactar esta publicación no encontré los enlaces para los recursos como servicios de firma y esquemas JSON, así que les comparto los recursos que usé por medio de OneDrive.
Esta guía aplica para quiénes desean emitir facturas electrónicas sin la intervención de terceros, deben darse de alta como emisores de DTE para así obtener el certificado que es la autorización del Ministerio de Hacienda para emitir facturas electrónicas.
Se puede iniciar con la lectura del Documento Técnico de Lineamientos de Integración para tener una idea de lo que implica emitir facturas electrónicas.
Glosario de Términos
- API: Interfaz de Programación de Aplicaciones
- DTE: Documento Tributario Electrónico
- JSON: Java Script Object Notation
- JWT: JSON Web Token
- GUID: Identificador Global Único
- Microservices: Microservicios
- MH: Ministerio de Hacienda
- NoSQL: No SQL, Bases de Datos no Relacionales
- RESTful: Transferencia Representacional de Estado
- SQL: Bases de Datos Relacionales
Integración
Proceso
El proceso funciona de la siguiente manera: día con día servicios en segundo plano revisan las tablas de facturas y al encontrar una nueva la agregan en la base de datos de facturación electrónica para que sean sincronizadas con el MH, las facturas al estar en la base de datos de sincronización pasan por diversos estados, en el apartado de base de datos hay información complementaria.
El código de generación, se asigna al momento de crear el registro y no se debe cambiar por ningún motivo, dependiendo de la tecnología hay maneras para generar dicho valor:
Tecnología | Sintaxis | Salida |
---|---|---|
C# | Guid.NewGuid().ToString().ToUpper() |
83AF6A36-B8AA-45C3-BC99-985128876F53 |
SQL | NEWID() |
D0CB8676-495D-43CD-B8AB-EA805D5FA0F7 |
Importante siempre generarlo con mayúsculas y almacenarlo con guiones, en algunos casos se necesitará el valor sin guiones, hacer uso de Replace
cuando sea necesario.
Dependiendo el volumen de facturación así se debe establecer el intervalo para los servicios en segundo plano.
Base de Datos
Esta base de datos es solo un reporsitorio intermedio para las facturas que se sincronizan con el MH, no se debe por ningún motivo intentar replicar la lógica para facturación de SAP Business One (SAP B1), la tabla Invoice guarda la información de la factura que se va a sincronizar; InvoiceProcesingLog guarda la bitácora de procesamiento para la factura electrónica; InvoiceFile guarda los binarios de los archivos relacionados con una factura electrónica tales como JSON y PDF.
Insumos del Ministerio de Hacienda
Ahora sí podemos continuar con el tema, hay una lista de requerimientos para iniciar con esta integración:
Servicio de Firma Electrónica
Este servicio se despliega en local y hace uso del certificado proporcionado por el MH para firmar los DTE.
Servicios Factura Electrónica
- Servicio de Autenticación
- Servicio de Recepción
- Servicio de Consulta
- Servicio de Contingencia
- Servicio de Anulación
Servicio de Autenticación
Este servicio obtiene un JWT haciendo uso de las credenciales del emisor, se usa en toda comunicación con los servicios del MH; las credenciales son proporcionadas por el MH, hay un proceso que debe seguir el emisor para obtenerlas.
Servicio de Recepción
Este servicio recibe las facturas del emisor, ya sean individuales o lotes; dependiendo del volumen de facturación se debe escoger el método para procesamiento.
Al procesar por lote se debe tener en cuenta que si una factura electrónica es rechazada todo el lote será rechazado.
Servicio de Consulta
Este servicio proporciona información de la factura haciendo uso del código de generación (GUID).
Servicio de Contingencia
Este servicio permite transmitir facturas que no fueron procesadas por el canal regular.
La contingencia a rasgos generales funciona de la siguiente manera: al experimentar fallas en la comunicación con los servicios de MH, la facturación electrónica habilita el modo de contingencia: se asigna el código de generación y el número de control pero no se espera la respuesta del MH, se envía por correo electrónico el PDF de las facturas electrónicas a los clientes, el formato del PDF debe indicar que hay contingencia. Una vez se haya solucionado la comunicación con los servicios del MH se debe generar un evento de contingencia haciendo uso del esquema JSON, en este evento (manifiesto) se deben listar todas las facturas electrónicas a transmitir, asumiendo que la recepción del evento fue satisfactoria procedemos a transmitir las facturas electrónicas (individual o lote) asignando el modelo de facturación y tipo de transmisión en Contingencia, con eso basta para que los servicios del MH procesen las facturas electrónicas.
Servicio de Anulación
Este servicio permite anular facturas que ya han sido procesadas por el MH.
Esquemas JSON
Instalé la extensión Json Schema Generator para Visual Studio.
El servicio para firma electrónica, se puede desplegar como Windows Service o Micro Services, eso va depender de la infraestructura de la empresa, en mi caso se usó el despliegue como Windows Service.
Adicional se optó por crear servicios en segundo plano para sincronizar las facturas del día a día, es decir, hay servicios que chequean la base de datos cada cierto tiempo y al encontrar una factura la buscan en la bandeja para sincronización, al no existir la agregan y queda en cola esperando a ser procesada.
Insumos Internos
- Matriz de DTEs a procesar
- Base de Datos SQL
- Base de Datos NoSQL
- Generación de QR
- Generación de PDF
- Generación de JSON
- Bitácoras
Matriz de DTEs a procesar
Según el giro del emisor el MH provee autorización para emitir DTEs, de los cuales pueden ser:
Tipo | Abreviatura |
---|---|
Comprobante de Crédito Fiscal | CCFE |
Comprobante de Donación | CDE |
Comprobante de Liquidación | CLE |
Comprobante de Retención | CRE |
Documento Contable de Liquidación | DCLE |
Factura | FE |
Factura de Exportación | FEXE |
Factura Sujeto Excluido | FSEE |
Nota de Crédito | NCE |
Nota de Débito | NDE |
Nota de Remisión | NRE |
Considero que el tiempo prudente para integrar cada tipo de DTE es dos semanas, debido a que se necesita hacer pruebas del programador y de usuario, es recomendable hacer una matriz para el control de calidad y revisar al azar un grupo de facturas electrónicas en el portal del MH para revisar que los totales hayan están debidamente distribuidos, ya que no solo basta con que el MH procese la factura electrónica.
El evento de invalidación no genera un nuevo DTE, por eso no es requerido enviar un correo electrónico con adjuntos (PDF y JSON), sin embargo alguien me recomendó hace un tiempo agregarle una marca de agua al PDF para dejar evidencia que la factura electrónica es inválida.
Recomiendo un tiempo de 2 semanas para integrar cada tipo de DTE que se va a sincronizar, por todos los aspectos involucrados así como el control de calidad que conlleva el validar una factura.
El MH requiere para todo emisor de DTEs un lote por cada tipo de DTE según su giro, es decir, se debe cumplir con un mínimo de pruebas por cada tipo, eso sí estas pruebas solo son para cumplir con el requerimiento del MH, nada asegura que las facturas cumplan realmente con las especificaciones de la empresa.
Base de Datos SQL
- Información de sucursales
- Contingencias
Guardar información de cliente para cada factura, ya que puede cambiar en la línea del tiempo.
Para este escenario se deben definir estados de sincronización para hacer un seguimiento del procesamiento de cada factura en la línea de tiempo, por ejemplo:
- Creado: factura electrónica recién ingresada a la bandeja
- Solicitado: factura electrónica en cola para ser sincronizada
- Rechazado: factura electrónica rechazada por el Ministerio de Hacienda
- Procesado: factura electrónica procesada por el Ministerio de Hacienda
- Notificado: envío de archivos PDF y JSON a los clientes
- Invalidado: factura electrónica que ha sido procesada por el Ministerio de Hacienda pero ha sido invalidada
Los estados previos permitirán un control por cada documento, para las facturas rechazadas se podrá revisar el mensaje de error que proporciona el MH.
Recomiendo que en la base de datos SQL se guarde toda la información de la factura electrónica, desde el momento que es agregada a la bandeja de sincronización hasta que el cliente recibe la notificación con los adjuntos.
Incluso la bitácora de procesamiento debe estar en la base de datos, ya que pueden haber varios intentos de sincronización antes que sea procesada por el MH.
Adicional, es recomendable guardar en la base de datos SQL la fecha y hora y los correos electrónicos a los cuales ha sido notificada la factura con sus adjuntos (PDF y JSON)
Base de Datos NoSQL
En caso se opte por usar una base de datos no relacional, es conveniente guardar los binarios de los adjuntos, así es fácil en un futuro hacer un reenvío por correo electrónico o por alguna consulta.
Generación de QR
Hay varias opciones para este fin, en mi case se hizo uso de la librería QRCoder, recordar que el QR es para la URL de consulta pública del DTE.
Generación de PDF
Hay varias opciones para generar el PDF, para mi caso usé la librería Dink To PDF, recordar que no hay regla para el formato del PDF pero sí para la información que proporciona:
- QR
- Código de generación y Número de control
- Información de transmisión
- Sello de recepción
- Información de Emisor
- Información de Receptor
- Detalle de factura electrónica
Generación de JSON
Lo más práctico para este punto es usar la respuesta JSON generada por el MH, solo recordar que se debe agregar el sello de recepción y la firma electrónica ya que ambos son la garantía que la factura electrónica ha sido procesada por el MH.
Bitácoras
Recomiendo guardar todo en logs, cada petición y respuesta ya que así es fácil revisar el rechazo de las facturas electrónicas. Adicional recordemos que en la base de datos está la tabla InvoiceProcessingLog
, es para guardar los request/response de cada factura electrónica ya que puede ser rechazada por diversos motivos.
Hoja de Ruta
Como resultado de considerar los puntos anteriores elaboramos la hoja de ruta, la cual nos servirá para saber el camino a seguir y medir la ejecución del proyecto; asumimos que la integración de los DTEs llevará 6 semanas pero esto dependerá de la matriz, tomando como referencia que son 2 semanas para integrar un DTE y vamos a integrar 3 son 6 semanas, depende en cada escenario.
Así debe estar definida la hoja de ruta para la implementación:
Actividad | Semana | Responsable | Comentarios |
---|---|---|---|
Definir Matriz DTEs | 1 | Staff, Dev | |
Autenticación de Servicios | 2 | Dev | |
Integración de DTEs | 3 - 8 | Dev | |
Pruebas para DTEs | 9 - 10 | Staff, Dev | |
Pruebas con Usuarios finales | 11 - 12 | Usuarios finales |
Pasos posteriores
Una vez completada la sincronización de las facturas electrónicas, hay dos features a la vuelta de la esquina:
- Interfaz Web para consultar DTEs
- Libros de IVA
Comments
Post a Comment