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 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...
- nomarlegnar's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
je.. se me fueron algunos
je.. se me fueron algunos comentarios repetidos pero queda claro el contexto...
Muy bien
Gracias!
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.
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.
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..
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?
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