La versión de su navegador no está debidamente actualizada. Le recomendamos actualizarla a la versión más reciente.

Libreria java para crear un xml cfdi 4 SAT

Publicado 14/06/2024

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

  1. - Crea el archivo xml cfdi
  2. - Crea el string del xml cfdi (Algunos pac te lo piden asi, o para que lo almacenes en tu BD)
  3. - 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 JAVACREAR 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