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

Múltiples esquemas en "xsi:schemaLocation" #101

Open LBrito opened 10 years ago

LBrito commented 10 years ago

En la línea 194 de la clase CFDv32, en el método utilizado para guardar el documento, puedo notar que se agrega sólo el esquema general del CDFI.

m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, 
                  "http://www.sat.gob.mx/cfd/3  "
                  + "http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");

Aquí: https://github.com/bigdata-mx/factura-electronica/blob/d69d4d1f1144faae4beadce559cde2812679d6e7/src/main/java/mx/bigdata/sat/cfdi/CFDv32.java#L194

Sin embargo, creo que sería bueno que se pudiera agregar el de todos los complementos utilizados. Ej. "http://www.sat.gob.mx/cfd/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina.xsd"

¿Habrá alguna solución para esta cuestión en un futuro cercano?

eaavendanop commented 10 years ago

Amigo, eso lo puedes hacer tú desde el código, haciendo lo siguiente:

cfdi.addNamespace("http://www.sat.gob.mx/nomina", "nomina");

eaavendanop commented 10 years ago

Lo interesante sería, poder agregar un namespace en las addendas

LBrito commented 10 years ago

Hola! Precisamente eso intenté, agrego namespaces de forma dinámica y si funciona pero no agrega las referencias a los xsd:

namespaces.each{ name, uri ->
    cfdi.addNamespace(uri, name)
}

Me di cuenta que siempre se sobreescribe "schemaLocation" en la línea que comenté anteriormente entregándome siempre:

xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd"

Y no (en el caso del complemento de nómina):

xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd http://www.sat.gob.mx/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina11.xsd"
mega82es commented 10 years ago

Buen dia LBrito, tengo un problema similar, requiero poner el atributo xmlns en el nodo de la Addenda, te fue posible solucionarlo?

Addenda Nodo xmlns="http://addenda.example.com" .... /Nodo /Addenda

eaavendanop commented 10 years ago

Me imagino que sólo abriendo el archivo y agregándolo "manualmente", habrá que meterle mano a la librería para que se puedan setear estos valores, por el momento yo no puedo debido a que tengo mucho trabajo, pero en cuánto me desocupe lo revisaré o esperemos que alguien más lo resuelva.

Saludos!!!

diegokuh commented 10 years ago

Para una solución rápida yo sobrecargué el método guardar de la clase CFDv32.java:

public void guardar(OutputStream out, String... otherSchemas) throws Exception {
    Marshaller m = context.createMarshaller();
    m.setProperty("com.sun.xml.bind.namespacePrefixMapper",
                  new NamespacePrefixMapperImpl(localPrefixes));
    m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, 
                  "http://www.sat.gob.mx/cfd/3  "
                  + "http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
      for (String schema : otherSchemas) {
          m.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, m.getProperty(Marshaller.JAXB_SCHEMA_LOCATION) + " " + schema);
      }
    byte[] xmlHeaderBytes = XML_HEADER.getBytes("UTF8");
    out.write(xmlHeaderBytes); 
    m.marshal(document, out);
  }

y por ejemplo yo lo usé para agregar el schemaLocation de nómina, de esta manera:

cfd.guardar((new FileOutputStream("nomina.xml")),"http://www.sat.gob.mx/nomina http://www.sat.gob.mx/sitio_internet/cfd/nomina/nomina11.xsd");

Pero si se requieren agreagar más schemaLocation pues basta con separarlos con comas.

Espero que les sirva. Saludos!

aperezc48 commented 7 years ago

Hola @diegokuh una duda solo agregaste el método en la clase, ya que yo hice lo mismo pero al momento de querer hacer uso de este en mi proyecto me marca el siguiente error:

java.lang.NoSuchMethodError

No se si tenga que agregarlo en algún otro lado además de la interface CFD.

De ante mano gracias por la ayuda.

diegokuh commented 7 years ago

@aperezc48 ya tiene rato que no veo el proyecto, pero quizá en recientes versiones ya arreglaron ese detalle. Si no checa que la firma del método sobrecargado esté también en la interfaz de la referencia del objeto que estas usando para llamarlo.

SAAVER commented 7 years ago

buenas tardes, una duda, el xsi:schemaLocation se puede modificar despues de que se sello y timbró el comprobante, mi duda es por que, en mi caso particular, sello el comprobante y lo mando a timbrar, posterior a eso, guardo el xml y modifico el xsi:schemaLocation, eso es valido?