Wiki source code of Facturación Electrónica Nativa mediante plugin LYEI
Last modified by admin on 2026/07/18 17:35
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 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.** |