Guía en JAVA para Implementación de SFE


Consideraciones Generales

Para la implementación de un Sistema de Facturación Electrónica (SFE) existen dos aspectos importantes que se deben considerar:

  • La generación del archivo XML de la factura a enviar
  • La generación del archivo XML para el envío de la factura a los servicios SOAP del SIN.

En el caso particular del lenguaje de programación Java estas operaciones pueden ser implementadas utilizando las librerías propias de Java u otras.  En esta guía se describirán la implementación personalizada y la estandarizada.

Generación de facturas XML Implementación personalizada

Para la implementación personalizada puede utilizar librerías adicionales con XStream, JDOM u otros, cualquiera sea el caso este proceso deberá permitir crear la factura en formato XML. Lo recomendable en este punto es la utilización de javax.xml que es una colección de APIs propias de Java para el parseo y tratamiento de documentos XML.

Principales anotaciones javax.xml

  • @XmlRootElement especifica la clase raíz que vamos a convertir a XML.
  • @XmlElement permite cambiar el nombre de los elementos cuando el fichero XML se construya. Es momento de generar el fichero XML .
  • @XmlType se la define en una clase y la anotación propOrder permite especificar el orden de las propiedades.
Ejemplo de implementación personalizada

Para la implementación de los archivos java tendremos que realizarlo de forma “manual “, con el debido cuidado que coincida cada campo o atributo.

FacturaComputarizadaEstandarDto.java

 

CabeceraFacturaEstandarDto.java


 

DetalleFacturaEstandarDto.java

Implementación basada en XSD

Debido a que XSD (XML Schema Definition) es un lenguaje que sirve para definir la estructura de un documento XML y este a su vez permite su correspondiente validación, resulta conveniente hacer una implementación basada en esta definición. Para este propósito, jaxb2-maven-plugin es el complemento Java que permite la generación de clases con anotaciones javax.xml acordes a las definiciones XSD.


Configuración del plugin

Generación de Clases

Para la generación de clases se debe aplicar el comando: mvn package. En el siguiente ejemplo la clase generada es FacturaComputarizadaEstandar.java a partir de facturaComputarizada.xsd


 

Marshalling

Marshalling proporciona a una aplicación cliente la capacidad de convertir un árbol de objetos Java derivado de JAXB en datos XML. A continuación, generaremos archivos XML a partir de objetos Java.

 

La clase javax.xml.bind.JAXBContext proporciona un punto de entrada del cliente a la API de JAXB. Por defecto.

Para tener formato JAXB en la salida, simplemente establecemos la propiedad Marshaller.JAXB_FORMATTED_OUTPUT en true en el Marshaller.

Cuando ejecutamos el código anterior, podemos verificar el resultado en nuestra consola.  

Envío de facturas XML

Para el envío de facturas XML es necesario crear un archivo xml (envelope) que contenga las especificaciones definidas en el archivo WSDL que expone el servicio SOAP para la recepción, la respuesta (response) emitida por el servicio también estará en formato XML por lo que es necesario convertirlo a objeto de alguna clase para su procesamiento. Ahora bien, las implementaciones pueden hacerse otra vez con las librerías propias de java u otras.

Implementación personalizada

Para hacer una implementación personalizada debemos generar el XML (envelope)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"                   xmlns:con="http://controller.fest.fac.sre.sin.gob.bo/">

   <soapenv:Header/>

   <soapenv:Body>

      <con:recepcionFacturaComputarizadaEstandar>

         <codigoSistema>?</codigoSistema>

         <codigoAmbiente>?</codigoAmbiente>

         <codigoEmision>?</codigoEmision>

         <codigoModalidad>?</codigoModalidad>

         <nit>?</nit>

         <cuis>?</cuis>

         <cufd>?</cufd>

         <codigoDocumentoFiscal>?</codigoDocumentoFiscal>

         <codigoDocumentoSector>?</codigoDocumentoSector>

         <codigoSucursal>?</codigoSucursal>

         <!--Optional:-->

         <codigoPuntoVenta>?</codigoPuntoVenta>

         <fechaEnvio>?</fechaEnvio>

         <archivo>?</archivo>

      </con:recepcionFacturaComputarizadaEstandar>

   </soapenv:Body>

</soapenv:Envelope>

Y utilizar un cliente HTTP soap como AsyncHttpClient u otros.

Implementación basada en WSDL

Debido a la complejidad de generar XMLs lo recomendable es usar herramientas como jaxws-maven-plugin que permite generar las clases necesarias para el consumo de servicios SOAP.

Para utilizar el servicio web SOAP existente debemos tener una copia del archivo WSDL y XSD que definen el contrato de comunicación entre el servicio web y sus clientes: los métodos proporcionados por el servicio web, los argumentos de cada método y sus tipos, la especificación de excepción para métodos y definiciones de tipos XSD adicionales.

Nota. - En la imagen anterior ya tenemos los archivos wsdl y xsd descargados en nuestro resources, una modificación importante dentro del archivo wsdl es apuntar a nuestro xsd descargado modificando schemaLocation.

 

Para importar el archivo WSDL tenemos que poner la siguiente definición de complemento en el archivo pom.xml

Generación de clases con package de maven

Cuando ejecuta la compilación en Maven (por ejemplo, mvn package ), debería observar la siguiente clase generadas:

Instancia de los servicios.