Last modified by admin on 2026/07/18 17:35

Show last authors
1 = Facturación Electrónica Nativa mediante plugin LYEI {{id name="facturación-electrónica-nativa-mediante-plugin-lyei" /}}=
2
3 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.
4
5 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.
6
7 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.
8
9 Se definió por consiguiente una solución basada en un Factory, tal como se detalla acontinuación.
10
11 En primera instancia se cuenta con una interfaz con todos los métodos que las potenciales implementaciones de facturación electrónica deben respetar:
12
13 public interface **ElectronicInvoiceInterface** {\\/~*~* Registra una factura electronica en el site de AFIP mediante WSFEV1 */\\public String generateCAE();
14
15
16 {{code}}
17 /\*\* Retorna el CAE obtenido \*/
18 public String getCAE();
19
20
21 {{/code}}
22
23 }
24
25 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**.
26
27 public class **ElectronicInvoiceProvider** {
28
29
30 {{code}}
31 /\*\* Preferencia sobre proveedor del servicio de FE \*/
32 public static String PREFERENCE\_WSFE\_PROVIDER \= "WSFE\_PROVIDER\_CLASS";
33
34 /\*\* Preferencia sobre proveedor del servicio de FE de Exportacion \*/
35 public static String PREFERENCE\_WSFEX\_PROVIDER \= "WSFEX\_PROVIDER\_CLASS";
36
37 /\*\* Retorna el provider si es que existe, ya sea de exportacion o no \*/
38 protected static ElectronicInvoiceInterface **getProvider**(...) {
39
40 }
41 {{/code}}
42
43 }
44
45 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.
46
47 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();\\…\\}
48
49 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:
50
51 select value from ad_preference where attribute = ‘WSFE_PROVIDER_CLASS’
52
53 >> “org.libertya.locale.ar.electronicInvoice.utils.LYEIWSFE”
54
55 La clase **LYEIWSFE** lógicamente implementa los métodos de la interfaz:
56
57 public class **LYEIWSFE** implements ElectronicInvoiceInterface {\\…\\public synchronized String **generateCAE**() {\\…\\}
58
59 }
60
61 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.
62
63 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.
64
65 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.**