Skip to content
elmer-garduno edited this page Dec 8, 2012 · 6 revisions

La librería presenta una interfaz muy simple centrada en el Comprobante Fiscal Digital (CFD), las clases principales son CFDv32 y CFDv22 que tienen la lógica correspondiente a las versiones 3.2 y 2.2 del CFD respectivamente.

Breve introducción

A continuación se presentan a manera de introducción algunos ejemplos de como utilizar la librería. Más adelante se explican a detalle los pasos necesarios para descargar e instalar la librería.

Creación de un CFDv32

Se puede crear un CFDv32 de tres formas:

  1. A partir de un InputStream, que puede ser un archivo previamente generado o el contenido de un request HTTP, etc.:
    CFDv32 cfd = new CFDv32(new FileInputStream(file));
  1. A partir de un Comprobante nuevo:
    ObjectFactory of = new ObjectFactory();
    Comprobante comp = of.createComprobante();
    comp.setVersion("3.2");
    comp.setFecha(new Date());
    ...
    CFDv32 cfd = new CFDv32(comp);
  1. Cargar un Comprobante a partir de un archivo y posteriormente utilizarlo para crear un CFDv3:
    Comprobante comp = CFDv322.newComprobante(new FileInputStream(file));
    ...
    CFDv32 cfd = new CFDv32(comp);

Creación de un CFDv22

De igual forma se puede crear un CFDv22:

  1. A partir de un InputStream, que puede ser un archivo previamente generado o el contenido de un request HTTP, etc.:
    CFDv22 cfd = new CFDv22(new FileInputStream(file));
  1. A partir de un Comprobante, que es el modelo que representa al XSD en la aplicación:
    ObjectFactory of = new ObjectFactory();
    Comprobante comp = of.createComprobante();
    comp.setVersion("2.2");
    comp.setFecha(new Date());
    ...
    CFDv22 cfd = new CFDv22(comp);
  1. Cargar un Comprobante a partir de un archivo y posteriormente utilizarlo para crear un CFDv22:
    Comprobante comp = CFDv22.newComprobante(new FileInputStream(file));
    ...
    CFDv22 cfd = new CFDv22(comp);

Principales operaciones

Las clases CFDv3 y el CFDv2, tienen cuatro métodos principales sellar(), validar(), verificar() y guardar().

Para firmar un CFDI versión 3.0:

    CFDv32 cfd = new CFDv32(new FileInputStream(file)); // Crea el CFD a partir de un archivo
    Key key = KeyLoader.loadPKCS8PrivateKey(new FileInputStream(keyfile),  password); // Carga la llave privada
    Certificate cert = KeyLoader.loadX509Certificate(new FileInputStream(certFile)); // Carga el certificado
    Comprobante sellado = cfd.sellarComprobante(key, cert); // Sellar CFD y obtener un Comprobante sellado
    cfd.guardar(new FileOutputStream(outFile)); // Guardar el CFD ya firmado

    String cadena = cfd.getCadenaOriginal(); // Obtener cadena original
    String sello = sellado.getSello(); // Obtener sello

Para agregar el timbre fiscal del PAC al CFDI versión 3.0:

    // Guardar el comprobante sellado como en el ejemplo anterior.
    // Enviar al PAC, cuando este regresa el timbre:
    // 1) Se agrega el timbre a la lista de complementos
    // 2) A partir de este comprobante se crea un nuevo CFDv32

    TimbreFiscalDigital timbre = of.createTimbreFiscalDigital();
    timbre.setFechaTimbrado("...");
    timbre.setNoCertificadoSAT("...");

    Complemento complemento = of.createComprobanteComplemento();
    complemento.getAny().add(timbre);
    comprobanteSellado.setComplemento(complemento);
    CFDv32 cfdTimbrado = new CFDv32(comprobanteSellado);
    cfdTimbrado .validar();
    cfdTimbrado .verificar();
    cfdTimbrado .guardar(new FileOutputStream("factura.xml"));

Para verificar un CFDI versión 3.0:

    CFDv32 cfd = new CFDv32(new FileInputStream(file)); // Crea el CFD a partir de un archivo
    cfd.validar(); // Valida el XML, que todos los elementos estén presentes
    cfd.verificar(); // Verifica un CFD ya firmado

Además de estas operaciones el CFDv2 permite verificar el CFD utilizando un certificado externo:

    CFDv22 cfd = new CFDv22(new FileInputStream(file)); // Crea el CFD a partir de un archivo
    Certificate cert = KeyLoader.loadX509Certificate(new FileInputStream(certFile)); // Carga el certificado
    cfd.validar(); // Valida el XML, que todos los elementos estén presentes
    cfd.verificar(cert); // Verifica un CFD ya firmado

Nota: Puedes encontrar un ejemplo del uso de las librerías en las clases: mx.bigdata.sat.cfdi.examples.Main y mx.bigdata.sat.cfd.examples.Main.

Creación de un Comprobante utilizando las librerías

Para crear un Comprobante de forma procedural es necesario utilizar los métodos de la clase mx.bigdata.sat.cfdi.schema.ObjectFactory para la versión 3.0 y mx.bigdata.sat.cfd.schema.ObjectFactory para la versión 2.0.

    // CFDI versión 3.0
    ObjectFactory of = new ObjectFactory();
    Comprobante comp = of.createComprobante();
    comp.setVersion("3.2");
    comp.setFecha(new Date());
    comp.setFormaDePago("PAGO EN UNA SOLA EXHIBICION");
    comp.setSubTotal(new BigDecimal("488.50"));
    comp.setTotal(new BigDecimal("488.50"));
    comp.setTipoDeComprobante("ingreso");
    comp.setEmisor(createEmisor(of));
    comp.setReceptor(createReceptor(of));
    comp.setConceptos(createConceptos(of));
    comp.setImpuestos(createImpuestos(of));
    CFDv32 cfd = new CFDv32(comp); 
    ...
    // CFD versión 2.2
    ObjectFactory of = new ObjectFactory();
    Comprobante comp = of.createComprobante();
    comp.setVersion("2.2");
    comp.setFecha(new Date());
    comp.setSerie("ABCD");
    comp.setFolio("2");
    comp.setNoAprobacion(new BigInteger("49"));
    comp.setAnoAprobacion(new BigInteger("2008"));
    comp.setFormaDePago("UNA SOLA EXHIBICI\u00D3N");
    comp.setSubTotal(new BigDecimal("2000.00"));
    comp.setTotal(new BigDecimal("2320.00"));
    comp.setDescuento(new BigDecimal("0.00"));
    comp.setTipoDeComprobante("ingreso");
    comp.setEmisor(createEmisor(of));
    comp.setReceptor(createReceptor(of));
    comp.setConceptos(createConceptos(of));
    comp.setImpuestos(createImpuestos(of));
    CFDv22 cfd = new CFDv22(comp); 
    ...

Nota: Puedes encontrar un ejemplo de este código en las clases: mx.bigdata.sat.cfdi.examples.ExampleCFDv32Factory y mx.bigdata.sat.cfd.examples.ExampleCFDv22Factory.