Leer XML de un CFDI para darle el tratamiento que quieras usando XMLBeans...

Recientemente se han timbrado los CFDI de nomina que generamos en la empresa...
en una entrada anterior a mi Blog expongo la solución para eso.... ahora para llevar un control interno de los mismos ocupamos meterlos a una BD, para lo cual la solución a la que YO llegué fue leer el contenido y depositarlo en la BD..

Expongo aquí lo siguiente.

public class AlmacenaCFDINomina {
   
   
    public AlmacenaCFDINomina() throws Exception{
       
    }
   
    public static void main(String args[]) throws XmlException, IOException, Exception{
    //public static void almacenarCFDI()throws XmlException, IOException, Exception{
        try{
       
        //Archivo XML a leer.
        String filePath="web/Humanos/Nomina/Talones/CFDI/XMLS/my-file.xml";
        File inputXmlFile=new File(filePath);
        Connection connection= ConnectionManager.getConnection();
        SQL query=new SQL(connection);
       
        //Datos exraidos del comprobante XML
        ComprobanteDocument comprobanteDocument=ComprobanteDocument.Factory.parse(inputXmlFile);
        Comprobante comprobante=comprobanteDocument.getComprobante();
        Emisor emisor=comprobante.getEmisor();
        Emisor.RegimenFiscal rf=emisor.getRegimenFiscalArray(0);//pocision del arreglo
        Receptor receptor=comprobante.getReceptor();
        TUbicacionFiscal domicilioFiscal=emisor.getDomicilioFiscal();
        TUbicacion domicilioFiscalR=receptor.getDomicilio();
        TUbicacion expedidoEn=emisor.getExpedidoEn();
        Complemento complemento=comprobante.getComplemento();
        NominaDocument nominaDocument=NominaDocument.Factory.parse(complemento.toString());
        Nomina nomina=nominaDocument.getNomina();
        Deducciones deducciones=nomina.getDeducciones();
        Deduccion deduccion[]=deducciones.getDeduccionArray();
        Percepciones percepciones=nomina.getPercepciones();
        Percepcion percepcion[]=percepciones.getPercepcionArray();
        Conceptos conceptos=comprobante.getConceptos();
        Concepto concepto[]=conceptos.getConceptoArray();
        Impuestos impuestos=comprobante.getImpuestos();
        Retenciones retenciones=impuestos.getRetenciones();
        Retencion retencion[]=retenciones.getRetencionArray();
        HorasExtras horasExtras=nomina.getHorasExtras();
        HorasExtra horasExtra[]=horasExtras.getHorasExtraArray();
        Incapacidades incapacidades=nomina.getIncapacidades();
        Incapacidad incapacidad[]=incapacidades.getIncapacidadArray();
               
       
        //Contenedores de las secciones del XML
        List<AlmDeducciones> listAlmDeducciones=new ArrayList<AlmDeducciones>();
        List<AlmPercepciones> listAlmPercepciones=new ArrayList<AlmPercepciones>();
        List<AlmConceptos> listAlmConceptos=new ArrayList<AlmConceptos>();
        List<AlmRetenciones> listAlmRetenciones=new ArrayList<AlmRetenciones>();
        List<AlmHorasExtra> listAlmHorasExtra=new ArrayList<AlmHorasExtra>();
        List<AlmIncapacidades> listAlmIncapacidades=new ArrayList<AlmIncapacidades>();
       
        //Documento a Almacenar
        AlmDocNomina docNominaAlmacenar=new AlmDocNomina();//Todos los items del Comprobante

        //Datos Encabezado
        docNominaAlmacenar.setVersion(comprobante.getVersion());
        docNominaAlmacenar.setSerie(comprobante.getSerie());
        docNominaAlmacenar.setFolio(comprobante.getFolio());
        docNominaAlmacenar.setFecha(comprobante.getFecha().toString());
        docNominaAlmacenar.setTipoDeComprobante(comprobante.getTipoDeComprobante().toString());
        docNominaAlmacenar.setFormaDePago(comprobante.getFormaDePago());
        docNominaAlmacenar.setCondicionesDePago(comprobante.getCondicionesDePago());
        docNominaAlmacenar.setMetodoDePago(comprobante.getMetodoDePago());
        docNominaAlmacenar.setNoCertificado(comprobante.getNoCertificado());
        docNominaAlmacenar.setSubtotal(comprobante.getSubTotal().toString());
        docNominaAlmacenar.setDescuento(comprobante.getDescuento().toString());
        docNominaAlmacenar.setMotivoDescuento(comprobante.getMotivoDescuento());
        docNominaAlmacenar.setTipoCambio(comprobante.getTipoCambio());
        docNominaAlmacenar.setMoneda(comprobante.getMoneda());
        docNominaAlmacenar.setTotal(comprobante.getTotal().toString());
        docNominaAlmacenar.setLugarExpedicion(comprobante.getLugarExpedicion());
        docNominaAlmacenar.setSello(comprobante.getSello());
        docNominaAlmacenar.setCertificado(comprobante.getCertificado());
        //Datos Emisor
        docNominaAlmacenar.setRfcEmisor(emisor.getRfc());
        docNominaAlmacenar.setNombreEmisor(emisor.getNombre());
        docNominaAlmacenar.setCalleEmisor(domicilioFiscal.getCalle());
        docNominaAlmacenar.setNoExteriorEmisor(domicilioFiscal.getNoExterior());
        docNominaAlmacenar.setNoInteriorEmisor(domicilioFiscal.getNoInterior());
        docNominaAlmacenar.setColoniaEmisor(domicilioFiscal.getColonia());
        docNominaAlmacenar.setLocalidadEmisor(domicilioFiscal.getLocalidad());
        docNominaAlmacenar.setMunicipioEmisor(domicilioFiscal.getMunicipio());
        docNominaAlmacenar.setEstadoEmisor(domicilioFiscal.getEstado());
        docNominaAlmacenar.setPaisEmisor(domicilioFiscal.getPais());
        docNominaAlmacenar.setCodigoPostalEmisor(domicilioFiscal.getCodigoPostal());
        docNominaAlmacenar.setRegimenEmisor(rf.getRegimen());
        //Datos Expedición
        docNominaAlmacenar.setCalleExpedidoEn(expedidoEn.getCalle());
        docNominaAlmacenar.setNoExteriorExpedidoEn(expedidoEn.getNoExterior());
        docNominaAlmacenar.setNoInteriorExpedidoEn(expedidoEn.getNoInterior());
        docNominaAlmacenar.setColoniaExpedidoEn(expedidoEn.getColonia());
        docNominaAlmacenar.setLocalidadExpedidoEn(expedidoEn.getLocalidad());
        docNominaAlmacenar.setMunicipioExpedidoEn(expedidoEn.getMunicipio());
        docNominaAlmacenar.setEstadoExpedidoEn(expedidoEn.getEstado());
        docNominaAlmacenar.setPaisExpedidoEn(expedidoEn.getPais());
        docNominaAlmacenar.setCodigoPostalExpedidoEn(expedidoEn.getCodigoPostal());
        //Datos Receptor
        docNominaAlmacenar.setRfcReceptor(receptor.getRfc());
        docNominaAlmacenar.setNombreReceptor(receptor.getNombre());
        docNominaAlmacenar.setCalleReceptor(domicilioFiscalR.getCalle());
        docNominaAlmacenar.setNoExteriorReceptor(domicilioFiscalR.getNoExterior());
        docNominaAlmacenar.setNoInteriorReceptor(domicilioFiscalR.getNoInterior());      
        docNominaAlmacenar.setColoniaReceptor(domicilioFiscalR.getColonia());
        docNominaAlmacenar.setLocalidadReceptor(domicilioFiscalR.getLocalidad());
        docNominaAlmacenar.setMunicipioReceptor(domicilioFiscalR.getMunicipio());
        docNominaAlmacenar.setEstadoReceptor(domicilioFiscalR.getEstado());
        docNominaAlmacenar.setPaisReceptor(domicilioFiscalR.getPais());
        docNominaAlmacenar.setCodigoPostalReceptor(domicilioFiscalR.getCodigoPostal());
        //Datos Complemento Nomina
        docNominaAlmacenar.setVersionNomina(nomina.getVersion());
        docNominaAlmacenar.setRegistroPatronal(nomina.getRegistroPatronal());
        docNominaAlmacenar.setNumEmpleado(nomina.getNumEmpleado());
        docNominaAlmacenar.setCurp(nomina.getCURP());
        docNominaAlmacenar.setTipoRegimen(Integer.toString(nomina.getTipoRegimen()));
        docNominaAlmacenar.setNumSeguridadSocial(nomina.getNumSeguridadSocial());
        docNominaAlmacenar.setFechaPago(new Fecha(nomina.getFechaPago().toString()));
        docNominaAlmacenar.setFechaInicialPago(new Fecha(nomina.getFechaInicialPago().toString()));
        docNominaAlmacenar.setFechaFinalPago(new Fecha(nomina.getFechaFinalPago().toString()));
        docNominaAlmacenar.setNumDiasPagados(nomina.getNumDiasPagados().toString());
        docNominaAlmacenar.setDepartamento(nomina.getDepartamento());
        docNominaAlmacenar.setClabe(nomina.getCLABE().toString());
        docNominaAlmacenar.setBanco(Integer.toString(nomina.getBanco()));
        docNominaAlmacenar.setFechaInicioRelLaboral(nomina.getFechaInicioRelLaboral().toString());
        docNominaAlmacenar.setAntiguedad(Integer.toString(nomina.getAntiguedad()));
        docNominaAlmacenar.setPuesto(nomina.getPuesto());
        docNominaAlmacenar.setTipoContrato(nomina.getTipoContrato());
        docNominaAlmacenar.setTipoJornada(nomina.getTipoJornada());
        docNominaAlmacenar.setPeriodicidadPago(nomina.getPeriodicidadPago());
        docNominaAlmacenar.setSalarioBaseCotApor(nomina.getSalarioBaseCotApor().toString());
        docNominaAlmacenar.setRiesgoPuesto(Integer.toString(nomina.getRiesgoPuesto()));
        docNominaAlmacenar.setSalariodiarioIntegrado(nomina.getSalarioDiarioIntegrado().toString());
        //Datos Deducciones
        docNominaAlmacenar.setTotalExentoD(deducciones.getTotalExento().toString());
        docNominaAlmacenar.setTotalGravadoD(deducciones.getTotalGravado().toString());
        for(int i=0;i<deduccion.length;i++){
            AlmDeducciones docDeduccionesAlmacenar=new AlmDeducciones(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    Integer.toString(deduccion[i].getTipoDeduccion()),
                    deduccion[i].getClave(),
                    deduccion[i].getConcepto(),
                    deduccion[i].getImporteGravado().toString(),
                    deduccion[i].getImporteExento().toString());//Todas las deducciones del comprobante
            listAlmDeducciones.add(docDeduccionesAlmacenar);
        }
        //Datos Percepciones
        docNominaAlmacenar.setTotalExentoP(percepciones.getTotalExento().toString());
        docNominaAlmacenar.setTotalGravadoP(percepciones.getTotalGravado().toString());
        for(int i=0;i<percepcion.length;i++){
            AlmPercepciones docPercepcionesAlmacenar=new AlmPercepciones(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    Integer.toString(percepcion[i].getTipoPercepcion()),
                    percepcion[i].getClave(),
                    percepcion[i].getConcepto(),
                    percepcion[i].getImporteGravado().toString(),
                    percepcion[i].getImporteExento().toString());//Todas las deducciones del comprobante
            listAlmPercepciones.add(docPercepcionesAlmacenar);
        }
        //Datos Conceptos
        for(int i=0;i<concepto.length;i++){
            AlmConceptos docConceptosAlmacenar=new AlmConceptos(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    concepto[i].getCantidad().toString(),
                    concepto[i].getUnidad(),
                    concepto[i].getNoIdentificacion(),
                    concepto[i].getDescripcion(),
                    concepto[i].getValorUnitario().toString(),
                    concepto[i].getImporte().toString());//Todas las deducciones del comprobante
            listAlmConceptos.add(docConceptosAlmacenar);
        }
        //Datos Retenciones
        for(int i=0;i<retencion.length;i++){
            AlmRetenciones docRetencionesAlmacenar=new AlmRetenciones(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    retencion[i].getImpuesto().toString(),
                    retencion[i].getImporte().toString());//Todas las deducciones del comprobante
            listAlmRetenciones.add(docRetencionesAlmacenar);
        }
        //Datos HorasExtra
        for(int i=0;i<horasExtra.length;i++){
            AlmHorasExtra docHorasExtraAlmacenar=new AlmHorasExtra(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    Integer.toString(horasExtra[i].getDias()),
                    horasExtra[i].getTipoHoras().toString(),
                    new BigDecimal(Integer.toString(horasExtra[i].getHorasExtra())),
                    new BigDecimal(horasExtra[i].getImportePagado().toString()));//Todas las horasextra del comprobante
            listAlmHorasExtra.add(docHorasExtraAlmacenar);
        }
        //Datos Incapacidades
        for(int i=0;i<incapacidad.length;i++){
            AlmIncapacidades docIncapacidadesAlmacenar=new AlmIncapacidades(
                    comprobante.getFolio(),
                    comprobante.getSerie(),
                    incapacidad[i].getDiasIncapacidad().toString(),
                    Integer.toString(incapacidad[i].getTipoIncapacidad()),
                    incapacidad[i].getDescuento().toString());//Todas las deducciones del comprobante
            listAlmIncapacidades.add(docIncapacidadesAlmacenar);
        }
         //Agregar a la BD
            query.agregarEncabezado(docNominaAlmacenar);
            query.agregarConceptos(listAlmConceptos);
            query.agregarDeducciones(listAlmDeducciones);
            query.agregarHorasExtra(listAlmHorasExtra);
            query.agregarIncapacidades(listAlmIncapacidades);
            query.agregarPercepciones(listAlmPercepciones);
            query.agregarRetenciones(listAlmRetenciones);
        }catch(IOException e){
            System.out.println("[CFDI.AlmacenaCFDINomina Error File]: "+e);
        }catch(XmlException exml){
            System.out.println("[CFDI.AlmacenaCFDINomina Error XML]: "+exml);
        }catch(Exception ex){
            System.out.println("[CFDI.AlmacenaCFDINomina Error al agregar]: "+ex);
        }
         
    }
   
}

Espero les sirva...

Comentarios

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.
Imagen de nomarlegnar

je.. se me fueron algunos

je.. se me fueron algunos comentarios repetidos pero queda claro el contexto...

Muy bien

Gracias!

Imagen de jasistemas

Jejeje, que lata, pero buen

Jejeje, que lata, pero buen trabajo, yo preferi crear un campo de longitud variable de 8,000 caracteres y meter todo el string del XML, con mas de un registro linea si se extiende.

Imagen de nomarlegnar

Jaja ya sé...

La situación aquí es que necesitamos llevar un control interno de todos los comprobantes de nomina ya que son miles a la quincena y se requiere verificar los montos que el comprobante contiene con lo que se supone contabilidad tiene pagado... por eso tan engorroso el proceso...

Además me topo con la problemática de que el XSD incial del SAT, en la definición del complemento no contiene el timbreFiscalDigital y crea problemas al setear esa sección del complemento en la clase...

A lo que mi solución fue meter todo el XML en un StringBuffer y manipular su contenido de tal forma que "elimino" la parte del timbre, cortándola y procesandola aparte y lo que queda del StringBuffer sin esa cadena lo creo como archivo XML nuevamente y ahora si ejecuto el procedimiento expuesto para setear el comprobante para tener los campos o nodos del XML en la BD...

Inicialmente esto se pensaba realizar para reimprimir el comprobante desde la intranet de la organización, pero yo eh estado luchando contra eso ya que en el SAT no me supieron asegurar que el comprobante reimpreso con todos sus campos fuera un CFDI válido en una auditoría, además que el espacio que ocupan tanto el pdf como el xml almacenados no es tanto, comparado con el cumulo de información inecesaria que existe de repente en algunos equipos...
Aun sigo batallando eso para no eliminar los originales, sería algo así como un sucidio, pero a nivel fiscal.. creo.. ja,
Espero les sirva por que a un novato como yo le ha costado llorar lagrimas de café...
Suerte.

Imagen de jasistemas

En efecto, el PDF no es

En efecto, el PDF no es valido como comprobante fiscal, en una auditoria van a solicitar los XML's, al menos uno de mis clientes solicito los XML's de hace 2 años x que estaba en auditoria.

Tendras los fuentes completos..

Saludos.. Tendrás las clases completas para poder realizar pruebas..
O de donde se pudiera descargar???

Muchas gracias y que tengas un excelente día..

Imagen de nomarlegnar

CFDI JAVA y XMLBeans

Te invito a revisar la entrada del blog donde genero el comprobante.
http://www.javamexico.org/blogs/nomarlegnar/cfdi_con_java_y_xmlbeans

En los comentarios viene una liga de referencia de donde puedes descargar tanto el CFDV32.jar y el NOMINA11.jar generados con XMLBeans en base a los archivos XSD del SAT.
https://drive.google.com/folderview?id=0B-xgtR5CbWoRTXhZNGpfR19jbmc&usp=...

Saludos!

Apoyo con código

Buenas tardes, tendrás el código de todas las clases involucradas para realizar pruebas?

Imagen de nomarlegnar

AQUI DESCARGAS LOS JAR CFDI32 y NOMINA11

Si lees los comments anteriores y la entrada de como generarlo podrás darte cuenta de donde descargarlas