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

Error al Generar CFDI con complemento de Pagos v3.3 #186

Closed czarcj closed 5 years ago

czarcj commented 6 years ago

Hola a todos, Estoy utilizando las librerias para la version 3.3 (ultima versión). Al generar un CFDI "normal" todo va bien, pero cuando quiero generar un con el complemento de pagos me lanza el siguiente error:

javax.xml.bind.MarshalException with linked exception: [com.sun.istack.SAXException2: class mx.bigdata.sat.common.pagos.schema.Pagos nor any of its super class is known to this context. javax.xml.bind.JAXBException: class mx.bigdata.sat.common.pagos.schema.Pagos nor any of its super class is known to this context.] at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:318) at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:244) at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:130)

La forma en como lo estoy generando es de la siguiente forma:

CFDI = objectFactory.createComprobante(); CFDI.setEmisor(createEmisorCFDI()); CFDI.setReceptor(createReceptorCFDI()); CFDI.setConceptos(createConceptosCFDI()); CFDI.getComplemento().add(setComplementoPagosCFDI())

En el metodo setComplementoPagosCFDI() tengo algo asi:

complementoCFDI = new Complemento(); complementoCFDI = objectFactory.createComprobanteComplemento(); complementoCFDI.getAny().add(createPagos()); return complementoCFDI;

El metodo createPagos() tiene en resumen algo asi;

mx.bigdata.sat.common.pagos.schema.ObjectFactory factoryPagos = new ObjectFactory(); Pagos pagosCFDI = factoryPagos.createPagos(); //..... codigo para llenar la informacion de los pagos

Pagos.Pago pagoCFDI = factoryPagos.createPagosPago(); //..... codigo para llenar la informacion del pago

Pagos.Pago.DoctoRelacionado doctoCFDI = factoryPagos.createPagosPagoDoctoRelacionado() //..... codigo para llenar la informacion de los documentos relacionados del pago .....

pagoCFDI .getDoctoRelacionado().add(doctoCFDI); pagosCFDI.getPago().add(pagoCFDI ); return pagosCFDI();

Los atributos de cada uno de los objetos los estoy llenando conforme al documento tecnico del SAT y a la guia de llenado correspondiente para este complemento.

Apreciaré mucho la ayuda que me puedan proporcionar.

Saludos.

turbinux commented 6 years ago

Hola, a mi me sale el mismo error, lamento no poder ayudar, sigo viendo si puedo corregirlo. revise el codigo fuente y todo parece estar bien. no se que pueda estar fallando. Saludos.

turbinux commented 6 years ago

Ok, creo que encontre el problema, al generar el comprobante con pagos se necesita incluir el contexto de los pagos al mandar llamar al constructor:

CFDv33 cfd = new CFDv33(comp,"mx.bigdata.sat.common.pagos.schema");

despues de eso, ya no sale el error de JAXB, espero esto ayude.

Saludos

danielfigueroaj commented 6 years ago

@czarcj podrias compartirme el ejemplo completo de como armas el complemento?

danielfigueroaj commented 6 years ago

@turbinux Si uso la linea:

CFDv33 cfd = new CFDv33(comp,"mx.bigdata.sat.common.pagos.schema");

Obtengo este mensaje:

Provider com.sun.xml.bind.v2.ContextFactory could not be instantiated: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 3 counts of IllegalAnnotationExceptions Two classes have the same XML type name "{http://www.sat.gob.mx/sitio_internet/cfd/catalogos}c_TipoFactor". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at mx.bigdata.sat.cfdi.v33.schema.CTipoFactor at protected mx.bigdata.sat.cfdi.v33.schema.CTipoFactor mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos$Traslados$Traslado.tipoFactor at mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos$Traslados$Traslado at protected java.util.List mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos$Traslados.traslado at mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos$Traslados at protected mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos$Traslados mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos.traslados at mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos at protected mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto$Impuestos mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto.impuestos at mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos$Concepto at protected java.util.List mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos.concepto at mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos at public mx.bigdata.sat.cfdi.v33.schema.Comprobante$Conceptos mx.bigdata.sat.cfdi.v33.schema.ObjectFactory.createComprobanteConceptos() at mx.bigdata.sat.cfdi.v33.schema.ObjectFactory

alguna idea?

turbinux commented 6 years ago

Si, yo tuve el mismo error, me di cuenta que fue corregido en la ultima version de la libreria, intenta con este jar:

https://drive.google.com/file/d/1eJ1_Erb-OBLSI7MmxcaP_MjflW4owqn-/view

vas a tener que cambiar algunos de los objetos como... MonedaPago

danielfigueroaj commented 6 years ago

Gracias, voy a probar con tu jar. La version que tengo le hice checkout a mediados de julio y empece a timbrar a principios de agosto, pero hace 1 semana me pidieron implementar Pagos, a ver si no me mueve mucho lo que ya tengo jejeje

Saludos, gracias

czarcj commented 6 years ago

@turbinux Muchas gracias por la informacion para agregar la linea CFDv33 cfd = new CFDv33(comp,"mx.bigdata.sat.common.pagos.schema"); Al parecer ya funcionó la generación del comprobante, unicamente falta hacer pruebas con el pac para validar que me lo certifique correctamente.

Por cierto, el SAT dio prorroga hasta el 31 de Dic, por si tienen que hacer sus proyectos tengan un poco mas de tiempo.

Saludos

czarcj commented 6 years ago

@danielfigueroaj Te comparto el codigo como lo estoy generando:

public static Comprobante createComprobante() throws Exception { ObjectFactory of = new ObjectFactory(); Comprobante comp = of.createComprobante(); comp.setVersion("3.3"); comp.setSerie("P"); comp.setFolio("12345"); comp.setFecha(DatatypeFactory.newInstance().newXMLGregorianCalendar(2017, 11, 10, 0, 0, 0, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED)); comp.setTotal(new BigDecimal("0")); comp.setSubTotal(new BigDecimal("0")); comp.setMoneda(CMoneda.XXX); comp.setTipoDeComprobante(CTipoDeComprobante.P); comp.setLugarExpedicion("03240"); comp.setEmisor(createEmisor(of)); comp.setReceptor(createReceptor(of)); comp.setConceptos(createConceptos(of)); Complemento cm = of.createComprobanteComplemento(); cm.getAny().add(createPagos(of)); comp.getComplemento().add(cm); return comp; }

private static Pagos createPagos(ObjectFactory of) throws Exception{
Pagos pgs = of.createPagos(); Pagos.Pago pg = of.createPagosPago(); Pagos.Pago.DoctoRelacionado d = of.createPagosPagoDoctoRelacionado();
pgs.setVersion("1.0"); pg.setFechaPago(DatatypeFactory.newInstance().newXMLGregorianCalendar(2017, 11, 10, 0, 0, 0, DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED)); pg.setFormaDePagoP("03"); pg.setMonedaP(CMoneda.MXN); pg.setMonto(new BigDecimal("11600"));
d.setIdDocumento("5201CB31-9C12-49CC-BF94-3F05AF07DAB1"); d.setMonedaDR(CMoneda.MXN); d.setMetodoDePagoDR(CMetodoPago.PPD); d.setNumParcialidad(BigInteger.ONE); d.setImpSaldoAnt(new BigDecimal("11600.00")); d.setImpPagado(new BigDecimal("11600.00")); d.setImpSaldoInsoluto(BigDecimal.ZERO);
pg.getDoctoRelacionado().add(d); pgs.getPago().add(pg);
return pgs; }

Espero que este fragmento de codigo sea de tu ayuda

czarcj commented 6 years ago

@turbinux @danielfigueroaj Estoy haciendo pruebas modificando algunas cosas de la libreria, al parecer estoy viendo la forma de no hacer instanciacion de la clase Object Factory de la ruta mx.bigdata.sat.common.Pagos, para utilizar el mismo Object Factory que se encuentra en complementos, ademas para utilizar los mismos catalogos del Comprobante general dentro de los pagos, y no estar utilizando diferentes catalogos tal como CMoneda y CMonedaPago o CMetodoPago y CMetodoPagoPago.

Esto haria la vida mas sencilla para los implementadores, si mis pruebas son exitosas comparto el jar con un ejemplo para generar comprobante de pagos. Saludos

danielfigueroaj commented 6 years ago

@czarcj eso estaria genial, lo que ayuda un poco es que no hay muchos atributos en el nodo pagos y construirlo como esta ahorita no es tan tan complicado, pero si se puede optimizar eso, como dices, nos ayudaria muchisimo a todos.

Gracias por tu codigo, ya habia logrado armar tambien mis objetos para el complemento basandome en lo que pusiste en tu post inicial.

Estaria bien tambien incluir en Examples del proyecto, la forma de generar un comprobante con complemento

hortegag91 commented 6 years ago

@czarcj , ten cuidado con ese detalle, ya que JAXB no te permite usar el mismo catálogo en 2 lugares distintos, no se si por convicción de JAXB o si sea con cualquier librería. De hecho si te fijas en el error, dice: "Two classes have the same XML type", debido a esto se tuvieron que separar algunos catálogos (se modificó el XSD del SAT apra agregarle dichos catálogos y que no marcara este error) Si logras unificarlo sin que JAXB falle, el cambio es bienvenido.

dpacanins commented 6 years ago

Buenas tardes, estoy utilizando la version del jar que publicaron en la url que" turbinux commented on Nov 23" publico y me manda el siguiente error:

Exception in thread "Thread-6" java.lang.NoClassDefFoundError: mx/bigdata/sat/cfdi/v33/schema/ObjectFactory at virtualinvoice.model.provider.ProviderCFDv33.toComprobante(ProviderCFDv33.java:48) at virtualinvoice.model.factory.CFDProviderFactory.getCFDv33(CFDProviderFactory.java:119) at virtualinvoice.model.factory.CFDProviderFactory.getCFD(CFDProviderFactory.java:38) at virtualinvoice.model.InvoiceBO.generateCFD(InvoiceBO.java:223) at virtualinvoice.model.InvoiceBO.processInvoices(InvoiceBO.java:150) at virtualinvoice.model.ProcessDispatcher.process(ProcessDispatcher.java:92) at virtualinvoice.model.ProcessRunnable.run(ProcessRunnable.java:24) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: mx.bigdata.sat.cfdi.v33.schema.ObjectFactory at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167)

Agradeceria su apoyo

czarcj commented 6 years ago

Hola a todos, anteriormente comente que estaba trabajando en una version modificada del jar para utilizar un solo object factory para el complemento de pagos. Les comparto el link de descarga y dentro del zip viene el ejemplo de como utilizarlo. Ya hice pruebas con mi PAC y todo funciona correctamente.

https://www.dropbox.com/s/3zowwufksy67fiv/cfdi-base-0.3.0-bin.zip?dl=0

@dpacanins espero que sea de tu apoyo esta version de la libreria.

P.D como soy nuevo con Git no supe como hacer una copia de los archivos fuente para poder integrarlos a la pagina del proyecto.

dpacanins commented 6 years ago

Gracias czarcj

ya estoy urtilizando el jar que compartiste e instancie el "ObjectFactory" como lo indicas en tu ejemplo y me sigue enviando el mismo error

Exception in thread "Thread-6" java.lang.NoClassDefFoundError: mx/bigdata/sat/cfdi/v33/schema/ObjectFactory at virtualinvoice.model.provider.ProviderCFDv33.toComprobante(ProviderCFDv33.java:61)

agradezco tu apoyo y felices fiestas

czarcj commented 6 years ago

@dpacanins Revisa que tengas integrados todos los jars de las dependencias en tu proyecto, en las clases donde usas la libreria, tengas todos los imports (como en los ejemplos) y que estes utilizando una version de java 1.7+. Te recomiendo que hagas una prueba en seco de la libreria que te mande o de la de turbinux en un proyecto nuevo y pruebes que no sea algo de tu java.

Saludos y felices fiestas

dpacanins commented 6 years ago

Hola @czarcj ya realice la prueba en seco como sugieres y no fallo, en el proyecto que tengo de CFDI ya revise que tuviera todos los import de las clases que estoy utilizando y no me hace falta ninguno, y me sigue enviando el mismo error:

Exception in thread "Thread-6" java.lang.NoClassDefFoundError: mx/bigdata/sat/cfdi/v33/schema/ObjectFactory at virtualinvoice.model.provider.ProviderCFDv33.toComprobante(ProviderCFDv33.java:62) at virtualinvoice.model.factory.CFDProviderFactory.getCFDv33(CFDProviderFactory.java:119) at virtualinvoice.model.factory.CFDProviderFactory.getCFD(CFDProviderFactory.java:38) at virtualinvoice.model.InvoiceBO.generateCFD(InvoiceBO.java:223) at virtualinvoice.model.InvoiceBO.processInvoices(InvoiceBO.java:150) at virtualinvoice.model.ProcessDispatcher.process(ProcessDispatcher.java:92) at virtualinvoice.model.ProcessRunnable.run(ProcessRunnable.java:24) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: mx.bigdata.sat.cfdi.v33.schema.ObjectFactory at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1333) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1167) ... 8 more

tengo la version 1.7 de java y netbeans 8.0.2

dpacanins commented 6 years ago

buen dia @czarcj

estoy utilizando la libreria que pusiste a disposicion más arriba, pero al momento de trabajar con complementos detallista al momento de compilar me envia el mensaje de error

El complemento mx.bigdata.sat.common.detallista.schema.Detallista@3239745d aún no ha sido declarado.

que es un mensaje de error del metodo "private String getSchemaLocation() throws Exception " el CFDI en la clase"public final class CFDv33 implements CFDI33 "

es aqui:

if (c instanceof mx.bigdata.sat.cfdi.schema.TimbreFiscalDigital) { schema += " http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"; addNamespace("http://www.sat.gob.mx/TimbreFiscalDigital", "tfd"); } else if (c instanceof mx.bigdata.sat.common.nomina.v12.schema.Nomina) { schema += " http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd"; addNamespace("http://www.sat.gob.mx/nomina12", "nomina12"); } else if (c instanceof mx.bigdata.sat.common.implocal.schema.ImpuestosLocales) { schema += " http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd"; addNamespace("http://www.sat.gob.mx/implocal", "implocal"); } else if (c instanceof mx.bigdata.sat.common.pagos.schema.Pagos) { schema += " http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd"; addNamespace("http://www.sat.gob.mx/Pagos", "pago10"); } else { System.out.println("El complemento " + c + " aún no ha sido declarado."); }

La version que compartiste no trae este esquema integrado en la validación y es por eso que da ese error, ya revise la version que esta disponible en el Git en ambos branch´s y tampoco la integran, ademas la version que tu publicaste es la que me funciono, te queria pedir de favor si podrias integrar este esquema al metodo mencionado o pasarme el proyecto para integrar las lineas y compilarlo.

ahora si lo que tu decidas

saludos

dpacanins commented 6 years ago

Buen dia @turbinux

oye hace una hora postie esto:

buen dia @czarcj

estoy utilizando la libreria que pusiste a disposicion más arriba, pero al momento de trabajar con complementos detallista al momento de compilar me envia el mensaje de error

El complemento mx.bigdata.sat.common.detallista.schema.Detallista@3239745d aún no ha sido declarado.

que es un mensaje de error del metodo "private String getSchemaLocation() throws Exception " el CFDI en la clase"public final class CFDv33 implements CFDI33 "

es aqui:

if (c instanceof mx.bigdata.sat.cfdi.schema.TimbreFiscalDigital) { schema += " http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd"; addNamespace("http://www.sat.gob.mx/TimbreFiscalDigital", "tfd"); } else if (c instanceof mx.bigdata.sat.common.nomina.v12.schema.Nomina) { schema += " http://www.sat.gob.mx/nomina12 http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina12.xsd"; addNamespace("http://www.sat.gob.mx/nomina12", "nomina12"); } else if (c instanceof mx.bigdata.sat.common.implocal.schema.ImpuestosLocales) { schema += " http://www.sat.gob.mx/implocal http://www.sat.gob.mx/sitio_internet/cfd/implocal/implocal.xsd"; addNamespace("http://www.sat.gob.mx/implocal", "implocal"); } else if (c instanceof mx.bigdata.sat.common.pagos.schema.Pagos) { schema += " http://www.sat.gob.mx/Pagos http://www.sat.gob.mx/sitio_internet/cfd/Pagos/Pagos10.xsd"; addNamespace("http://www.sat.gob.mx/Pagos", "pago10"); } else { System.out.println("El complemento " + c + " aún no ha sido declarado."); }

La version que compartiste no trae este esquema integrado en la validación y es por eso que da ese error, ya revise la version que esta disponible en el Git en ambos branch´s y tampoco la integran, ademas la version que tu publicaste es la que me funciono, te queria pedir de favor si podrias integrar este esquema al metodo mencionado o pasarme el proyecto para integrar las lineas y compilarlo.

ahora si lo que tu decidas

no se si me puedas ayudar a agregar esta validacion en tu jar que compartiste de la API mas arriba y que pusiste a disposición

saludos

mario-mtz commented 5 years ago

Que tal chicos, @czarcj @dpacanins podría alguno compartir el jar o el proyecto para usarlo con java 1.8 por favor? El enlace de dropbox esta caído.

Saludos

jalgaba commented 5 years ago

@mario-mtz Este repositorio parece ya estar descontinuado, el nuevo es este: https://github.com/GrupoCorasa/factura-electronica Ahí busca la liga que dice: "Descarga la última versión de las librerías" o igual lo puedes encontrar en el repositorio central http://mvnrepository.com/artifact/mx.grupocorasa.cfdi/cfdi-base/3.3.2 Aun si hubiera estado funcionando esa liga de dropbox, yo no recomendaría instalar el jar nomás así, ya que tiene otras dependencias (p.e. jaxb), así que a menos que quieras que te arroje un fabuloso java.lang.NoClassDefFoundError recomendaría usar un administrador de dependencias como maven, Apache Ivy, Gradle, etc.

¿O acaso necesitas la versión específica de @czarcj ? en cuyo caso creo que sería mejor preguntarle a @hortegag91 si este problema ya está arreglado en el nuevo repositorio.

Saludos.

mario-mtz commented 5 years ago

Hola @jalgaba Efectivamente revise la versión 3.3 y ya tiene los cambios que menciona @dpacanins . Ya lo compile y lo tengo como dependencia en mi proyecto, funciona sin problema y mis pruebas para generación de complemento de pago me timbran bien. Te agradezco la respuesta.

Saludos

hortegag91 commented 5 years ago

Asi es, este repo ha dejado de tener mantenimiento, el nuevo es el que comenta @jalgaba , actualmente ese repo debería funcionar de manera completa y sin problemas, actualmente lo usamos en varios proyectos. Si tuvieran cualquier inconveniente les agradecería si pudieran levantar un issue en ese repo. Saludos.