CFDI con JAVA y XMLBeans.

Buen día, espero que esto le sea de utilidad a alguien de esta tan excelsa comunidad.

En días pasados se ha hablado mucho de las reformas que en México se han venido aplicando, una de ellas es la reforma fiscal que obliga a las empresas a expedir CFDI del recibo de nómina que "normalmente" se le da al trabajador, para lo cual en la empresa donde laboro se me encomendó la labor de investigar que es lo que se tenía que hacer para cumplir con esta obligación, así que sin mas preámbulos vamos a lo que requiere la tan temida Facturación Electronica de este comprobante...

Primero que nada existen unos PAC (Proveedores Autorizados de Certificación) que nos timbrarán los comprobantes fiscales, ¿A que me refiero?, si, si no mal recuerdo en épocas pasadas cuando tenias una empresa y requerías expedir facturas buscabas una imprenta autorizada para hacer blocks foliados, previamente autorizados por la instancia legal correspondiente, para el caso es lo mismo, solo que no es una imprenta ni te van a imprimir tus facturas electrónicas, los PAC están, si no estoy mal informado, obligados a proporcionarte el servicio de timbrado de tu comprobante, así como también de la gestión de los mismos por periodos que varían entre los 5 meses y 3 años e incluso mas, según leí en algunos sitios de estos proveedores. Están obligados a proporcionarte la información necesaria para que tu logres generar el famoso layout que ellos manejan para el procesamiento del comprobante, o en su defecto te proporcionarán la aplicación que genere el mismo, en muchos de los casos si no es que en la mayoría, el layout solicitado por el PAC o generado por esta aplicación es un XML que contiene toda la información que lleva el CFDI autorizado por el SAT.

Una vez que el PAC timbra el XML te lo regresa y si quieres te imprime el PDF, que bueno, también él está obligado a hacerlo,

Cuando esta en tu poder entregas ambos al cliente o trabajador según sea el caso, había quienes no entregaban el XML según que por que la factura no se la había pagado el cliente pero eso es absurdo por que leí que en algún lugar remoto de la pagina del SAT puedes descargarlo si lo necesitas.

Hasta aquí todo va claro, pero, ¿qué datos contiene el XML autorizado por el SAT?, bueno, pues existe en sitio del SAT una sección donde te explican los requisitos de las facturas electrónicas el cual pongo aquí a su disposición para mas información acerca de este comprobante, .

Navegando el sitio batallé para encontrar de que se trataba el XML y es en base a un XSD que también proporcionan en este sitio, las ligas fue difícil encontrarlas en el sitio del SAT debido a que la información que proporcionaban aquí y en otras paginas era muy poca o confusa. Aquí les pongo los archivos XSD para CFDI vigente desde 01/01/2017 y para el Complemento de Nomina vigente desde 01/01/2017, Los cuales necesitaremos para generar las clases de cada XSD y formar el XML final válido.

Agrego una ruta donde vienen todos los requisitos del CFDI de nómina según el SAT Vigentes desde el 01/01/2017

Además agrego el ANEXO 20 Vigente desde l 01/01/2017 el cual que es imprescindible su dominio.

Encontré una "Guía" para elaborar un recibo de nómina, la cual después complementé con lo que encontré en este sitio Solucion Factible en el cual me basé para el desarrollo de la herramienta que me permitiera cumplir con el objetivo final que era crear el XML del CFDI con Complemento de Nómina y ahí mismo en en la parte baja se encuentra una ws para validar el comprobante generado.

Bueno dicho esto pasemos a la parte técnica utilizando XMLBeans.

  • Descarga los XSD.
  • Descarga el XMLBeans, yo lo ubiqué en C:.
  • Dentro de la carpeta que pusiste en C: del xmlbeans existe una que se llama bin, ahi pega los XSD que descargaste anteriormente.
  • Ejecuta el siguiente comando.
    c:\xmlbeans\bin>scomp.cmd -compiler “[Ruta a jdk]\bin\javac.exe” cfdv33.xsd -out cfdv33.jar
  • Esto generará el archivo cfdv33.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. Para el caso tienes que hacerlo con los 2 XSD descargados.

Ahora describo a continuación la forma en la que se trabaja con XMLBeans.

  • Creas la clase GeneraCFDI y tu método main.
  • Dentro del main creas el documento

     

  • En la "Guia" para generar el CFDI vienen los diferentes items con los que esta compuesto tanto el comprobante como el complemento, revisalos y tienes que setear todo como a continuación muestro.
     
  • Cuando termines de setear los del comprobante haz lo mismo pero con los de nomina.
     
  • Una vez que concluyes de setear los datos para el comprobante y el complemento nomina agrega nomina a la sección complemento del comprobante.

     

    Genera codigo XML
     

  • Determina los prefijos que deban ser según el XSD proporcionado por el SAT
     
  • Imprime el XML
     

Si leiste toda la entrada de este blog y analisaste todas y cada una de sus ligas encontrarás un lugar donde puedes validar el XML que se imprime y es 100% valido.

Suerte y que la iluminación llegue a tu mente.

"La suerte solo favorece a quien la acompaña con su esfuerzo y no al que pretende quedarse quieto y que todo lo sea dado por que si"

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

como inserto complemento

Como inserto un complemento con las clases JAXB??
es decir, ya tengo marshalleados el comprobante y la nomina ylo tengo asi:

 

pero no me funciona, por favor necesito ayuda

CFID 3.3 con JAXB

Hola hopekey

Ya hice la prueba con JAXB pero si cambian mucho los metodos que genera para manipular el xml con respecto de XMLBeans logre compilar el xsd con XMLBeans solo que tuve que recortar el catalogo de codigos postales que es el que generaba el primer warning, me genero algunos mas pero me permitio compilarlo, mas adelante les contare como he avanzado o si tienen sugerencias son aceptadas.

Imagen de seba23571

muy buena exposición

yo estoy teniendo un problema con el tiembrado me anda perfecto pero
cuando intento establecer las cantidades con el parametro setCantidad c1.setCantidad(new BigDecimal("02.00"));
me devuelve un error tipo : -Hubo un error en la operación. CFDI33149

tal vez pueda darme una ayudita muchas gracias.