Facturación Electrónica Nativa mediante plugin LYEI
Facturación Electrónica Nativa mediante plugin LYEI
Originalmente, Libertya se apoyaba en PYAFIPWS para la facturación electrónica. Esto acarreaba un conjunto de problemas debido a la necesidad de contar con Python y librerías adicionales de encriptación que debían respetar ciertas dependencias y su mantenimiento a lo largo del tiempo hacía engorroso la actividad.
Adicionalmente, la interacción entre Libertya y PYAFIPWS era algo rudimentaria apoyándose en archivos de entrada y salida, lo cual además podría presentar potenciales problemas de inconsistencias.
Por consiguiente, se determinó implementar un módulo nativo, denominado LYEI cuyo package es org.libertya.locale.ar.electronicInvoice. Este módulo ya cuenta con su pertinente documentación de configuración y uso. Sin embargo, en este documento se detalla la manera en que dicho módulo se integra a la lógica Libertya CORE, teniendo en cuenta en LYCORE no tiene conocimiento alguno sobre módulos externos, dado que las referencias siempre se dan desde los componentes hacia LYCORE y no viceversa.
Se definió por consiguiente una solución basada en un Factory, tal como se detalla acontinuación.
En primera instancia se cuenta con una interfaz con todos los métodos que las potenciales implementaciones de facturación electrónica deben respetar:
public interface ElectronicInvoiceInterface {
/** Registra una factura electronica en el site de AFIP mediante WSFEV1 */
public String generateCAE();
public String getCAE();
…
}
Adicionalmente se cuenta con el provider encargado de generar la instancia que corresponda en tiempo de ejecución según la configuración de ciertas preferencias como WSFE_PROVIDER_CLASS.
public class ElectronicInvoiceProvider {
public static String PREFERENCE\_WSFE\_PROVIDER \= "WSFE\_PROVIDER\_CLASS";
/\*\* Preferencia sobre proveedor del servicio de FE de Exportacion \*/
public static String PREFERENCE\_WSFEX\_PROVIDER \= "WSFEX\_PROVIDER\_CLASS";
/\*\* Retorna el provider si es que existe, ya sea de exportacion o no \*/
protected static ElectronicInvoiceInterface **getProvider**(...) {
…
}
}
Luego en la clase MInvoice, al intentar completar una factura se invocará a doCAEGeneration() quien delegará a ElectronicInvoiceProvider la tarea de determinar la implementación de facturación electrónica a recuperar en función de la configuración en las preferencias.
public CallResult doCAEGeneration(boolean saveInvoice) {
…
// Se intenta obtener un proveedor de WSFE
// En caso de no encontrarlo se utiliza la vieja version (via pyafipws)
ElectronicInvoiceInterface processor =
ElectronicInvoiceProvider.getImplementation(this);
if (processor==null) {
processor = new ProcessorWSFE(this);
}
…
String errorMsg = processor.generateCAE();
…
}
Esta lógica se encuentra en Libertya CORE. Al realizar la instalación del componente LYEI, automáticamente se configura la preferencia WSFE_PROVIDER_CLASS de manera acorde:
select value from ad_preference where attribute = ‘WSFE_PROVIDER_CLASS’
“org.libertya.locale.ar.electronicInvoice.utils.LYEIWSFE”
La clase LYEIWSFE lógicamente implementa los métodos de la interfaz:
public class LYEIWSFE implements ElectronicInvoiceInterface {
…
public synchronized String generateCAE() {
…
}
}
De esta manera, es posible contar con una solución en donde podrían existir incluso más providers de ElectronicInvoiceInterface, sin necesidad de que LYCORE conozca a ninguno de éstos.
En caso de que no exista ningún provider (o sea que no esté instalado LYEI), entonces se tomará por defecto la vieja lógica que radica en la clase de core ProcessorWSFE, la cual está pensada para interactuar con el módulo PYAFIPWS.
Para facturas de exportación se aplica exactamente el mismo patrón, con la diferencia que la preferencia en esos casos se llama WSFEX_PROVIDER_CLASS.