Libreria para crear el xml de un cfdi en java
Esta libreria puede crear el xml cfdi de:
- facturas
- complementos de pago
- nominas
- carta porte
- y mas.. solo hay que crear la clase modelo del complemento cfdi que se quiere crear
-La libreria valida antes o despues el xml cfdi creado , para que lo envies a tu PAC de preferencia
-La libreria te genera el xml cfdi en 3 formatos para que lo envies a tu PAC
- - Crea el archivo xml cfdi
- - Crea el string del xml cfdi (Algunos pac te lo piden asi, o para que lo almacenes en tu BD)
- - Crea el Base64 del xml cfdi (Algunos pac te lo piden el xml en Base 64, o para que lo almacenes en tu BD)
La estructura de la libreria esta en varias capas y módulos para una mayor organización, mantenibilidad y reutilización del código.
CREAR UN XML CFDI4 EN JAVA
com.factura.cfdi.generador : Se almacenan las clases que generan el xml del cfdi de una factura
com.factura.cfdi.model: se almacenan todos los modelos o paquetes de las diferentes tipos de xml cfdi que puede crear (SE PUEDEN CREAR TODOS LOS MODELOS QUE SE NECESITEN)
com.factura.cfdi.sello: Aqui se almacena la clase que sella el xml cfdi
com.factura.cfdi.util : Aqui se pueden almacenar todas las utilerias que necesites, como validar el xml, etc.
EJEMPLO CREAR UN XML CFDI DE UNA FACTURA
publicclass EjemploFacturaCfdi40 {
public EjemploFacturaCfdi40() {}
publicvoid ejecutar(){
//CONFIGURACION DE EJECUCION
//CONFIGURA EL TIPO DE FACTURA (FACTURA, NOMINA, CARTA PORTA, COMPLEMENTO DE PAGO, ETC)
//CONFIGURA LA LICENCIA
//CONFIGURA SI MUESTRA LA INFORMACION DE EJUCUCION, EN DESARROLLO SE RECOMIENDA EN "SI", EN PRODUCCION SE RECOMIENDA EN "NO"
Configuracion configuracion = new Configuracion();
//configuracion.setLicencia("316ac9e0543522b89b0e32707fb42bb4");
configuracion.setInfoSistema("si");
configuracion.setComprobanteTipo("FACTURA");
//CONFIGURAR LA RUTA DONDE SE ALMACENARA EL XML CFDI QUE SE VA A CREAR
String so=System.getProperty("os.name");
if(so.contains("Linux"))
{
//rutadondesegenera el xmlselladoparaenviarloalpac (LINUX)
configuracion.setRutaXML("/home/carlos/Documentos/xml/");
}
if(so.contains("Windows"))
{
//rutadondesegenera el xmlselladoparaenviarloalpac (WINDOWS)
//configXML.setRutaXML("C:/proyectos_java/xml/");
configuracion.setRutaXML(System.getProperty("user.dir")+"\\src\\main\\resources\\timbrados\\");
}
//CONFIGURAR EL NOMBRE DEL ARCHIVO XML (Conlaextencionincluida)
configuracion.setArchivoXML("ejemplo_factura_cfdi40.xml");
//CONFIGURAR LA RUTA DONDE SE ALMACENAN LOS CERTIFICADOS CSD DE RFC EMISOR (AQUI SE USAN DE PRUEBAS PROPORCIONADOS POR EL SAT)
String KEY=System.getProperty("user.dir")+"\\src\\main\\resources\\certificados\\EKU9003173C9.key";
String CER=System.getProperty("user.dir")+"\\src\\main\\resources\\certificados\\EKU9003173C9.cer";
String CONTRASENA="12345678a";
configuracion.setCer(CER);
configuracion.setKey(KEY);
configuracion.setContresena(CONTRASENA);
//CONFIGURAR SI SE VALIDARA EL XML CREADO , ANTES O DESPUES DE CREARLO
configuracion.setValidar_pre("NO"); // VALIDAR LA INFORMACION INGRESADA ANTES DE CREAR EL ARCHIVO XML - TIEMPO DE EJECUCION 5 A 8 SEGUNDOS
configuracion.setValidar_pos("NO"); // VALIDAR LA INFORMACION INGRESADA DESPUES DE CREAR EL ARCHIVO XML - TIEMPO DE EJECUCION 5 A 8 SEGUNDOS
/*LLENAR EL XML COMPROBANTE CON LA INFORMACION DE LA VENTA DE TU BASE DE DATOS*/
Comprobante comprobante = new Comprobante();
comprobante.setSerie("A");
comprobante.setFolio("1");
/*FORMATO DE FECHA*/
String FORMATER = "yyyy-MM-dd'T'HH:mm:ss";
Date date = new Date();
XMLGregorianCalendar fechaComprobante = Utilerias.getFechaXMLGregorian(date, FORMATER);
comprobante.setFecha(fechaComprobante);
comprobante.setSubTotal(new BigDecimal(298.00).setScale(2, RoundingMode.HALF_UP));
comprobante.setTotal(new BigDecimal(345.68).setScale(2, RoundingMode.HALF_UP));
String moneda="MXN";
comprobante.setMoneda(Utilerias.getMonedaComprobante(moneda));
String tipocomprobante="I";
comprobante.setTipoDeComprobante(Utilerias.getTipoDeComprobante(tipocomprobante));
comprobante.setFormaPago("01");
String metododepago="PUE";
comprobante.setMetodoPago(Utilerias.getMetodoDePagoComprobante(metododepago));
//comprobante.setCondicionesDePago("CONDIDCIONES");
//comprobante.setDescuento(new BigDecimal(100.00));
comprobante.setTipoCambio(new BigDecimal(1.0).setScale(0, RoundingMode.HALF_UP));
comprobante.setLugarExpedicion("EEEEE");
comprobante.setExportacion("01");
/*CFDI RELACIONADO*/
//CfdiRelacionado cfdiRelacionado = new CfdiRelacionado();
//cfdiRelacionado.setUUID("A39DA66B-52CA-49E3-879B-5C05185B0EF7");
/*CFDI RELACIONADOS*/
//CfdiRelacionados cfdiRelacionados = new CfdiRelacionados();
//cfdiRelacionados.setTipoRelacion("01");
//cfdiRelacionados.getCfdiRelacionado().add(cfdiRelacionado);
//comprobante.setCfdiRelacionados(cfdiRelacionados);
/*EMISOR*/
Emisor emisor = new Emisor();
emisor.setRfc("EKU9003173C9");
emisor.setRegimenFiscal("601");
emisor.setNombre("ESCUELA KEMPER URGATE");
comprobante.setEmisor(emisor);
/*RECEPTOR*/
Receptor receptor = new Receptor();
receptor.setNombre("UNIVERSIDAD ROBOTICA ESPAÑOLA");
receptor.setRfc("URE180429TM6");
receptor.setDomicilioFiscalReceptor("86991");
receptor.setRegimenFiscalReceptor("601");
//receptor.setNumRegIdTrib("0000000000000");
//String pais="MEX";
//CPais paisComprobante = Utilerias.getPaisComprobante(pais);
//receptor.setResidenciaFiscal(paisComprobante);
String usoCFDI="G01";
receptor.setUsoCFDI(Utilerias.getUsoCFDiComprobante(usoCFDI));
comprobante.setReceptor(receptor);
/*CONCEPTOS*/
Conceptos conceptos = new Conceptos();
/*CONCEPTO*/
Concepto concepto1 = new Concepto();
concepto1.setClaveProdServ("01010101");
concepto1.setClaveUnidad("ACT");
concepto1.setNoIdentificacion("0001");
concepto1.setCantidad(new BigDecimal(1));
concepto1.setUnidad("NA");
concepto1.setDescripcion("Concepto 1");
concepto1.setValorUnitario(new BigDecimal(99.00).setScale(2, RoundingMode.HALF_UP));
concepto1.setImporte(new BigDecimal(99.00).setScale(2, RoundingMode.HALF_UP));
concepto1.setObjetoImp("02");
/*IMPUESTOS CONCEPTO*/
Impuestos impuestosConcepto1 = new Impuestos();
/*IMPUESTOS TRASLADOS*/
Traslados trasladosConcepto1 = new Traslados();
/*IMPUESTO TRASLADO*/
Traslado trasladoConcepto1 = new Traslado();
trasladoConcepto1.setBase(new BigDecimal(99.00).setScale(2, RoundingMode.HALF_UP));
trasladoConcepto1.setImporte(new BigDecimal(15.84).setScale(2, RoundingMode.HALF_UP));
trasladoConcepto1.setImpuesto("002");
trasladoConcepto1.setTasaOCuota(new BigDecimal(0.160000).setScale(6, RoundingMode.HALF_UP));
String tipoFactorTraslado1="Tasa";
trasladoConcepto1.setTipoFactor(Utilerias.getTipoFactorImpuestoConceptoComprobante(tipoFactorTraslado1));
trasladosConcepto1.getTraslado().add(trasladoConcepto1);
impuestosConcepto1.setTraslados(trasladosConcepto1);
/*PREDAIL*/
//CuentaPredial predial = new CuentaPredial();
//predial.setNumero("23438222");
//concepto1.setCuentaPredial(predial);
concepto1.setImpuestos(impuestosConcepto1);
conceptos.getConcepto().add(concepto1);
//CONCEPTO 2
Concepto concepto2 = new Concepto();
concepto2.setClaveProdServ("01010101");
concepto2.setClaveUnidad("ACT");
concepto2.setNoIdentificacion("0001");
concepto2.setCantidad(new BigDecimal(1));
concepto2.setUnidad("NA");
concepto2.setDescripcion("Concepto 1");
concepto2.setValorUnitario(new BigDecimal(199.00).setScale(2, RoundingMode.HALF_UP));
concepto2.setImporte(new BigDecimal(199.00).setScale(2, RoundingMode.HALF_UP));
concepto2.setObjetoImp("02");
/*IMPUESTOS CONCEPTO*/
Impuestos impuestosConcepto2 = new Impuestos();
/*IMPUESTOS TRASLADOS*/
Traslados trasladosConcepto2 = new Traslados();
/*IMPUESTO TRASLADO*/
Traslado trasladoConcepto2 = new Traslado();
trasladoConcepto2.setBase(new BigDecimal(199.00).setScale(2, RoundingMode.HALF_UP));
trasladoConcepto2.setImporte(new BigDecimal(31.84).setScale(2, RoundingMode.HALF_UP));
trasladoConcepto2.setImpuesto("002");
trasladoConcepto2.setTasaOCuota(new BigDecimal(0.160000).setScale(6, RoundingMode.HALF_UP));
String tipoFactorTraslado2="Tasa";
trasladoConcepto2.setTipoFactor(Utilerias.getTipoFactorImpuestoConceptoComprobante(tipoFactorTraslado2));
trasladosConcepto2.getTraslado().add(trasladoConcepto2);
impuestosConcepto2.setTraslados(trasladosConcepto2);
concepto2.setImpuestos(impuestosConcepto2);
conceptos.getConcepto().add(concepto2);
comprobante.setConceptos(conceptos);
/*IMPUESTOS COMPROBANTE*/
Comprobante.Impuestos impuestosComprobante = new Comprobante.Impuestos();
/*
//RETENCIONES COMPROBANTE
Comprobante.Impuestos.Retenciones retencionesComprobante = new Comprobante.Impuestos.Retenciones();
//RETENCION COMPROBANTE
Comprobante.Impuestos.Retenciones.Retencion retencionComprobante = new Comprobante.Impuestos.Retenciones.Retencion();
retencionComprobante.setImporte(new BigDecimal(100.00));
retencionComprobante.setImpuesto("002");
retencionesComprobante.getRetencion().add(retencionComprobante);
impuestosComprobante.setRetenciones(retencionesComprobante);
*/
/*TRASLADOS COMPROBANTE*/
Comprobante.Impuestos.Traslados trasladosComprobante = new Comprobante.Impuestos.Traslados();
/*TRASLADO COMPROBANTE*/
Comprobante.Impuestos.Traslados.Traslado trasladoComprobante = new Comprobante.Impuestos.Traslados.Traslado();
trasladoComprobante.setImpuesto("002");
String tipoFactorComprobante="Tasa";
trasladoComprobante.setBase(new BigDecimal(298).setScale(2, RoundingMode.HALF_UP));
trasladoComprobante.setTipoFactor(Utilerias.getTipoFactorImpuestoConceptoComprobante(tipoFactorComprobante));
trasladoComprobante.setTasaOCuota(new BigDecimal(0.160000).setScale(6, RoundingMode.HALF_UP));
trasladoComprobante.setImporte(new BigDecimal(47.68).setScale(2, RoundingMode.HALF_UP));
trasladosComprobante.getTraslado().add(trasladoComprobante);
impuestosComprobante.setTraslados(trasladosComprobante);
//impuestosComprobante.setTotalImpuestosRetenidos(new BigDecimal(100));
impuestosComprobante.setTotalImpuestosTrasladados(new BigDecimal(47.68).setScale(2, RoundingMode.HALF_UP));
comprobante.setImpuestos(impuestosComprobante);
/*GENERAR XML*/
GeneraCFDi xml = new GeneraCFDi(comprobante, configuracion);
RespuestaGenerarXML res = xml.generarXMLCFDi();
System.out.println("Ruta xml generado: "+res.getRutaArchivoXML());
System.out.println("Archivo XML en string: "+res.getArchivoXMLtexto());
System.out.println("Archivo XML en Base64: "+res.getArchivoXMLBase64());
}
}
RESPUESTA EJEMPLO CREAR XML CFDI EN JAVA
Si deseas adquirir la libreria para tus proyectos , Contactanos al 871-2342344
Precio: $6000 mxn Incluye IVA
Incluye:
- Todo el codigo fuente
- Soporte y actualizaciones del SAT por un año
- al siguiente año el precio del soporte y actualizaciones del SAT seria $3000 , si tu lo deseas
En el siguiente video puedes ver un ejemplo donde se genera un xml cfdi con java