Generación de CFDI: Factura desde tus apps

Publicado en

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 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.

Listado 2. Creación de un 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 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.

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 5. Función para generar la cadena original.

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.

301 Que cumpla con el estándar de XML conforme al W3C y con la estructura del XSD publicado en el Anexo20 y complementos aplicables.
302 Que el sello del emisor sea válido.
303 Que el CSD del emisor corresponda al RFC que viene como emisor en el comprobante.
304 Que el CSD del emisor no haya sido revocado, utilizando la LCO.
305 Que la fecha de emisión esté dentro de la vigencia del CSD del emisor.
306 Que la llave utilizada para firmar corresponda a un CSD y no a una FIEL.
307 Que no contenga un timbre previo.
308 Que el CSD del emisor haya sido firmado por uno de los certificados de autoridad del SAT.
401 Que el rango de la fecha de generación no sea mayor a 72 horas para la emisión del timbre.
402 Que exista el RFC del emisor conforme al régimen autorizado, utilizando la LCO.
403 Que la fecha de emisión sea posterior al 01 de Enero 2011.

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.

Referencias:

[1] SAT. “Comprobantes Fiscales”. http://bit.ly/sg31r6

 

Bio

Heber Lazcano actualmente se desempeña como Arquitecto de Software en Tralix México. @heberlazcano