Addons estándar / Conector eCommerce
Arquitectura técnica
Componentes del sistema#
El sistema se compone de dos piezas desplegables independientes:
| Componente | Descripción |
|---|---|
| Servicio de sincronización | Proceso principal (.exe) que se instala como servicio de Windows. Ejecuta los ciclos de importación y exportación. |
| Extensión a3ERP | DLL listener y diccionario de datos que extiende a3ERP con las tablas y eventos necesarios para la integración. |
Tecnología#
| Elemento | Valor |
|---|---|
| Framework | .NET Framework 4.8 |
| Tipo de proceso | Aplicación de consola registrada como servicio de Windows |
| Arquitectura objetivo | x86 (principal), x64 (secundario) |
| Sistema operativo | Windows Server / Windows 10 o posterior |
Flujo de ejecución#
En cada ciclo el servicio:
- Valida la licencia (incluye verificación de hora vía NTP).
- Conecta al ERP a3ERP vía la API NAX.
- Obtiene la lista de tiendas activas de la configuración.
- Para cada tienda, carga los plugins configurados y ejecuta:
- Importación de documentos de venta (tienda → ERP).
- Exportación de artículos y stock (ERP → tienda).
- Transmisión del estado de preparaciones (solo Shopify).
- Desconecta la tienda y pasa a la siguiente.
- Si hay errores, envía notificación por correo.
Conectores por plataforma#
Cada plataforma de tienda tiene un conector propio que implementa la misma interfaz genérica. Esto permite que el motor de importación/exportación sea independiente de la plataforma.
| Plataforma | Protocolo | Autenticación | Dirección | Librería | Particularidades |
|---|---|---|---|---|---|
| WooCommerce | REST API v3 | Consumer Key + Consumer Secret | Bidireccional | WooCommerceNET (fork) | Timeout 90s; paginación 25 items; soporte IDs long y BOM UTF-8 |
| Shopify | REST API + GraphQL | Bearer (Access Token) | Bidireccional | ShopifySharp (fork) | Rate limiting 510ms; API 2023-07; fulfillments completos |
| Prestashop | REST API XML | API Key (Basic HTTP) | Solo importación | RestSharp 110.2.0 | Exportación no implementada; compatible PS7/PS8/PS9 |
| LabelGrup + Prestashop | REST API propietaria | Credenciales LabelGrup | Solo importación | RestSharp 110.2.0 | Servidor intermediario; packs y tallas complejas |
Sistema de plugins#
El servicio carga plugins dinámicamente en tiempo de ejecución mediante MEF (Managed Extensibility Framework). Los plugins permiten adaptar el comportamiento de la sincronización sin modificar el núcleo del producto.
Los plugins se colocan en la carpeta Plugins/ del directorio de instalación y se activan automáticamente al arrancar el servicio.
Plugins disponibles#
| Plugin | Plataforma | Propósito |
|---|---|---|
Sit.ECPluginFactNF01 |
WooCommerce, Shopify, Prestashop | Establece el número de factura del ERP a partir del número de orden de la tienda |
Sit.ECPluginMapAlm |
Shopify | Mapeo de almacenes entre Shopify y el ERP; distribuye stock en múltiples ubicaciones |
Sit.ECPluginWooAdvancedCoupons |
WooCommerce | Procesa descuentos del plugin «Advanced Coupons» prorrateando por tipo de IVA |
Sit.ECPluginWooElexRBP |
WooCommerce | Sincroniza tarifas del ERP con el sistema de precios por rol de «Elex Role Based Pricing» |
Sit.ECPluginWooWCpdfInvoices |
WooCommerce | Establece el número de factura a partir del plugin «Invoices for WooCommerce» (WCpdf) |
Integraciones externas#
| Sistema | Protocolo | Dirección |
|---|---|---|
| a3ERP (Wolters Kluwer) | API NAX (COM/SQL) | Bidireccional |
| WooCommerce | REST API v3 | Bidireccional |
| Shopify | REST API + GraphQL | Bidireccional |
| Prestashop | REST API XML | Entrada (importación) |
| LabelGrup (módulo Prestashop) | API REST propietaria | Entrada (importación) |
| Servicio de licencias Esofitec | HTTPS | Validación periódica |
| Servidor NTP | UDP/123 | Verificación de hora (licenciador) |
| Servidor de correo | SMTP / Microsoft Graph | Salida (notificaciones de error) |
Hooks de plugins#
Los plugins reciben notificaciones en momentos clave del proceso de sincronización mediante métodos hook. Cada plugin hereda de PluginBase e implementa solo los hooks que necesita. Cada hook tiene acceso al contexto de ejecución (ICommonObject), que expone los datos de la tienda activa y la lista de errores acumulados.
| Método hook | Momento de invocación | Plataforma |
|---|---|---|
ExpOnDeterminarAlmacenesStockERP() |
Al calcular el stock a exportar desde el ERP | Todas |
WooAntesDeActualizarProduct() |
Antes de enviar un producto a WooCommerce | WooCommerce |
WooOnCargarFacturaDesdeTienda() |
Tras deserializar una factura de WooCommerce | WooCommerce |
WooOnCargarPedidoDesdeTienda() |
Tras deserializar un pedido de WooCommerce | WooCommerce |
SpfOnCargarPedidoDesdeTienda() |
Tras deserializar un pedido de Shopify | Shopify |
SpfOnCargarFacturaDesdeTienda() |
Tras deserializar una factura de Shopify | Shopify |
SpfOnEstablecerStocksVarianteProducto() |
Al establecer stock de una variante en Shopify | Shopify |
PshOnCargarFacturaDesdeTienda() |
Tras deserializar una factura de Prestashop | Prestashop |
PshOnCargarFacturaRectificativaDesdeTienda() |
Tras deserializar una nota de crédito de Prestashop | Prestashop |
Seguridad#
- Las credenciales de conexión a las tiendas se cifran con RSA en
Configuracion.xml. - Todos los ensamblados están firmados con clave fuerte (
key.snk). - Los binarios de Release se distribuyen ofuscados (ConfuserEx). No distribuir los binarios sin ofuscar del directorio
Release; utilizar siempre los deReleaseConfused.