Contáctanos ¿Qué tema te gustaría ver en la revista SG en el 2011? Advertisement SG31 (Marzo-Abril 2011) Generación de CFDI: Factura desde tus apps

AGREGA FACTURACIÓN ELECTRÓNICA A TUS APPS
A partir del 1 de enero del 2011 entro en vigor la versión 3.0 de facturación electrónica en México; en donde para los contribuyentes que estén obligados o decidan usar está versión tienen que realizar sus comprobantes vía Internet.

Los requisitos que debe cumplir el contribuyente para emitir CFDI son: 1. Contar con Firma Electrónica Avanzada vigente. (FIEL)
2. Tramitar al menos un Certificado de Sello Digital (CSD)
3. Contar con un sistema informático para la generación de las Facturas Electrónicas 2011.
4. Enviar a validar las facturas electrónicas al proveedor autorizado de certificación (PAC)

En la figura 1 se ilustra a grandes rasgos el proceso para generar un CFDI:
1. Generar un archivo XML
2. Enviar el XML a un PAC para que lo verifique y genere un Timbre Fiscal Digital.
3. Insertar el Timbre Fiscal Digital a nuestro XML dentro del nodo Complemento.
4. Enviar el CFDI al cliente.



Figura 1. Proceso para generar un CFDI.

Generación del archivo XML

El archivo XML que se tiene que generar deberá cumplir con las reglas definidas dentro del Anexo 20 de la Resolución Miscelánea Fiscal del 2010 publicado por el SAT, el cual especifica:
  • La estructura que deber tener el CFDI
  • La forma de generación del sello digital
  • El uso del complemento obligatorio: Timbre Fiscal Digital
Para realizar el XML siguiendo la estructura definida, descargamos el esquema XML disponible en http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv3.xsd.
Utilizando la tecnología Apache XMLBeans podemos generar clases de Java automáticamente a partir del archivo xsd. Una vez que descarguemos e instalemos XMLBeans (http://xmlbeans.apache.org) ejecutaríamos el siguiente comando:

~\xmlbeans\bin>scomp.cmd -compiler “[Ruta a jdk]\bin\javac. exe” cfdv3.xsd -out cfdv3.jar

Esto generará el archivo dfdv3.jar que contiene las clases que corresponden al esquema XML. Registra este jar así como las librerías de XMLBeans en tu proyecto del IDE que estés utilizando.
Una vez que tenemos registradas las librerías necesarias, podemos proceder a programar el comportamiento deseado. Empezaremos creando un objeto de tipo ComprobanteDocument y a partir de eso generaremos un objeto Comprobante, el cual nos permitirá construir toda la estructura del XML y asignar los valores deseados a nuestro comprobante. Este código se aprecia en el listado 1.


Listado 1. Creación de un objeto Comprobante.

Continuaremos generando la demás información del comprobante: emisor, receptor, conceptos, impuestos, entre otros. Dentro del listado 2 podemos apreciar cómo crear el emisor.
También necesitamos incluir dentro del objeto Comprobante el número de certificado del CSD, así como el mismo CSD pero codificado en base 64 (Ver listado 4). Para ello crearemos un objeto X509Certificate y usaremos las funciones que se aprecian en el listado 3.



Listado 2. Creación de un emisor.



Listado 3. Funciones para leer un CSD.



Listado 4. Asignación del número de certificado y CSD en base64.

Sello Digital

Una vez teniendo todos los valores asignados a nuestro objeto Comprobante, el siguiente paso es generar el sello digital con lo cual garantizaremos la integridad y autenticidad de este.
Para ello es necesario:
1. Generar la cadena original del comprobante
2. Aplicar el método de digestión SHA-1 a la cadena original.
3. Aplicar el algoritmo de encriptación RSA al resultado de la digestión.



Listado 5. Función para generar la cadena original.

Para el paso 1 el SAT público un XSLT que genera la cadena original de la forma que se encuentra especificada dentro del Anexo20, por lo cual lo único que debemos hacer es aplicar una transformación XSLT a nuestro XML que generamos anteriormente (Ver listado 5).
Para la digestión y encriptación Java puede realizar estos 2 pasos llamando a una sola clase (Ver listado 7), para ello primero tenemos que tener un objeto PrivateKey (ver listado 6) que es la representación de nuestra llave privada otorgada por el SAT para firmar los comprobantes que generemos.



Listado 6. Función para obtener la llave privada.



Listado 7. Función para generar el sello digital.

Ahora solo nos resta invocar a las 2 funciones anteriores para generar el sello digital y hacer la asignación del resultado al objeto Comprobante, esto lo apreciamos en el listado 8.



Listado 8. Generación del sello digital.

Timbrado del CFDI

Hasta este punto aunque ya tenemos un comprobante creado y firmado como se indica en el Anexo 20, todavía no es válido ya que no contiene un timbre fiscal digital. Debemos enviar nuestro XML generado a un PAC, para que este lo verifique y genere el timbre fiscal digital (TFD) que debemos incluir dentro de nuestro XML en el nodo de complemento.
En el sitio web del SAT se puede consultar la lista de PACs autorizados que nos pueden ofrecer el servicio de timbrado. Todos ellos implementan un servicio web estándar que definio el SAT y que realiza lo siguiente:
1. Recibe el comprobante firmado
2. Valida el comprobante
3. Genera el timbre fiscal digital
La tabla 1 muestra las validaciones que el PAC realiza a un comprobante, junto con el código de error correspondiente.
Para ejemplificar como podría hacerse el timbrado con un PAC, vamos a mostrar como utilizaría el cliente llamado StampyClient que es proporcionado por el PAC Tralix a sus clientes para realizar el timbrado. En el listado 9 se muestra como invocar este cliente. Cabe mencionar que Tralix también provee un cliente para .NET y se invoca de manera similar.
Si por alguna razón nuestro XML no pasará alguna de las validaciones de la tabla 1, el cliente arrojara una excepción de tipo StampyClientException que contiene el código y la descripción del error.



Listado 9. Invocación de timbrado.



Tabla 1. Validaciones de un comprobante

Conclusión

En este artículo hemos aprendido cómo generar desde nuestras aplicaciones un CFDI 100% válido que podemos entregar a nuestro cliente por medios electrónicos. Les recuerdo que por obligación fiscal, debemos almacenar los CFDIs que generemos por 5 años.

Visto en: http://www.sg.com.mx 

0 comentarios:

Publicar un comentario