bigdata-mx / factura-electronica

Librería de componentes Java para el desarrollo de aplicaciones de Factura Electrónica (CFDI)
Apache License 2.0
94 stars 107 forks source link

Validar versión de factura #82

Closed jesuslerma closed 10 years ago

jesuslerma commented 10 years ago

Que tal, me gustaría saber si existe una función para validad que versión de factura es la que contiene el inputstream.

Tengo el siguiente código:

InputStream reader = null; Comprobante comprobanteTest = null; //Comprobante es de //mx.bigdata.sat.cfdi.v32.schema.Comprobante; comprobanteTest = CFDv32.newComprobante(reader);

Y esto me marca el error: unexpected element (uri:"http://www.sat.gob.mx/cfd/2", local:"Comprobante"). Expected elements are <{http://www.sat.gob.mx/cfd/3}Comprobante>,<{http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital>

Esto es por que el xml que leo en reader es cfd2. Entonces si leo con CFDv2 ya no marca error.

¿Cómo puedo validar que un xml sea versión 2 o versión 3.2?

Muchas gracias de antemano y felicidades por su estupenda librería.

Saludos!

elmer-garduno commented 10 years ago

Hola, una opción es que utilices xpath para leer el elemento que contiene la versión y en base a eso decidas cual objeto utilizar.

Saludos

2013/10/9 jesuslerma notifications@github.com

Que tal, me gustaría saber si existe una función para validad que versión de factura es la que contiene el inputstream.

Tengo el siguiente código:

InputStream reader = null; Comprobante comprobanteTest = null; //Comprobante es de //mx.bigdata.sat.cfdi.v32.schema.Comprobante; comprobanteTest = CFDv32.newComprobante(reader);

Y esto me marca el error: unexpected element (uri:"http://www.sat.gob.mx/cfd/2", local:"Comprobante"). Expected elements are <{ http://www.sat.gob.mx/cfd/3}Comprobante>,<{ http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital>

Esto es por que el xml que leo en reader es cfd2. Entonces si leo con CFDv2 ya no marca error.

¿Cómo puedo validar que un xml sea versión 2 o versión 3.2?

Muchas gracias de antemano y felicidades por su estupenda librería.

Saludos!

— Reply to this email directly or view it on GitHubhttps://github.com/bigdata-mx/factura-electronica/issues/82 .

jesuslerma commented 10 years ago

Excelente comentario, de hecho estoy utilizando un código basado en el método getVersion CFDFactory. Ahora el problema que tengo es que después de valdiar el InputStream me marca error, pero no sé a que se deba, quizá no se este cerrando bien el reader. Este es el código que estoy utilizando:

//Esté es el Método basado en CFDFACTORY public String getVersion(byte[] data) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(data)); XPathFactory xfactory = XPathFactory.newInstance(); XPath xpath = xfactory.newXPath(); return (String) xpath.evaluate("/Comprobante/@version", doc); }

//Así lo mando a llamar desde main String version = ""; try { byte[] bytes = ByteStreams.toByteArray(reader); version = this.getVersion(bytes); } catch (Exception e1) { e1.printStackTrace(); System.out.println(e1.getMessage()); } try{ System.out.println(version);//Me muestra 3.2 Comprobante32 = CFDv32.newComprobante(reader); } catch (Exception e) { this.mensajeError = "Error al crear un comprobante a partir del archivo // " + archivoFactura.getKey() + " " + *// Mensaje de error // " + e.getMessage(); System.out.println( this.mensajeError ); }

Este código me lanza el siguiente error : Error al crear un comprobante a partir del archivo // BMI9704113PA/179/inbox/CFD_3724.xml // Mensaje de error // null

Si quito la parte donde ejecuto this.getVersion no me marca error, y me lee bien el Comprobante.

elmer-garduno commented 10 years ago

El problema es que

byte[] bytes = ByteStreams.toByteArray(reader);

Consume todos los bytes del reader y cuando haces

Comprobante32 = CFDv32.newComprobante(reader);

ya no quedan datos que leer del reader, puedes hacer lo siguiente:

Comprobante32 = CFDv32.newComprobante(new ByteArrayInputStream(bytes));

Saludos

2013/10/10 jesuslerma notifications@github.com

Excelente comentario, de hecho estoy utilizando un código basado en el método getVersion CFDFactory. Ahora el problema que tengo es que después de valdiar el InputStream me marca error, pero no sé a que se deba, quizá no se este cerrando bien el reader. Este es el código que estoy utilizando:

//Esté es el Método basado en CFDFACTORY public String getVersion(byte[] data) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new ByteArrayInputStream(data)); XPathFactory xfactory = XPathFactory.newInstance(); XPath xpath = xfactory.newXPath(); return (String) xpath.evaluate("/Comprobante/@versionhttps://github.com/version", doc); }

//Así lo mando a llamar desde main String version = ""; try { byte[] bytes = ByteStreams.toByteArray(reader); version = this.getVersion(bytes); } catch (Exception e1) { e1.printStackTrace(); System.out.println(e1.getMessage()); } try{ System.out.println(version);//Me muestra 3.2 Comprobante32 = CFDv32.newComprobante(reader); } catch (Exception e) { this.mensajeError = "Error al crear un comprobante a partir del archivo // " + archivoFactura.getKey() + " " + *// Mensaje de error // " + e.getMessage(); System.out.println( this.mensajeError ); }

Este código me lanza el siguiente error : Error al crear un comprobante a partir del archivo // BMI9704113PA/179/inbox/CFD_3724.xml // Mensaje de error // null

Si quito la parte donde ejecuto this.getVersion no me marca error, y me lee bien el Comprobante.

— Reply to this email directly or view it on GitHubhttps://github.com/bigdata-mx/factura-electronica/issues/82#issuecomment-26073003 .

jesuslerma commented 10 years ago

Muchas gracias, eso solucionó el problema.

Saludos!