Tango Tiendas para WooCommerce
Documentación completa — versión 1.2.0
Guía Rápida (Quick Start en 5 minutos)
- Instale y active el plugin.
- Vaya a Tango Tiendas > Configuración.
- Pegue el Access Token y haga clic en "Probar conexión".
- Active la integración con el toggle.
- Configure el depósito y la lista de precios.
- Haga clic en "Guardar configuración".
- Copie la URL del webhook y configúrela en Tango Tiendas > API > Notificaciones.
- Vaya a Tango Tiendas > Productos y haga clic en "Importar productos de Tango".
- Una vez importados, los productos se sincronizarán automáticamente.
1. Introducción
Tango Tiendas para WooCommerce es un plugin de WordPress que integra de forma completa y bidireccional tu tienda WooCommerce con Tango Gestión / Tango Punto de Venta a través de la plataforma Tango Tiendas de Axoft.
El plugin permite:
- Sincronizar stock en tiempo real: Los cambios de stock en Tango se reflejan instantáneamente en WooCommerce vía webhooks, con sincronización periódica como respaldo.
- Sincronizar precios en tiempo real: Los cambios de precios en Tango se actualizan automáticamente en WooCommerce.
- Enviar pedidos automáticamente: Los pedidos de WooCommerce se envían a Tango al completar el pago.
- Sincronizar estados de pedidos: Los cambios de estado en Tango (procesado, facturado, rechazado, etc.) se reflejan en WooCommerce.
- Acceder a facturas electrónicas: PDF de factura disponible directamente desde el panel de WooCommerce.
- Importar productos masivamente: Descargar todos los artículos de Tango y crearlos como productos en WooCommerce.
- Detectar productos nuevos: Cada 15 minutos, el plugin verifica si hay artículos nuevos en Tango y los crea automáticamente.
- Mapear productos automáticamente: Vincular productos por código SKU de forma automática o manual.
- Capturar DNI/CUIT en checkout: Campo obligatorio para facturación argentina.
Arquitectura del Plugin
Tango Gestión / Tango Punto de Venta
|
v
Tango Tiendas (tiendas.axoft.com)
|
v API REST + Webhooks
|
Plugin WooCommerce (wc-tango-tiendas)
|
v
WooCommerce / WordPressEl plugin se comunica con la API REST de Tango Tiendas ubicada en https://tiendas.axoft.com/api/Aperture/ utilizando un Access Token para autenticación.
Compatibilidad
| Componente | Versión mínima | Versión probada |
|---|---|---|
| WordPress | 5.8+ | 6.x |
| WooCommerce | 5.0+ | 8.0 |
| PHP | 7.4+ | 8.x |
| HPOS (High-Performance Order Storage) | Soportado | Sí |
| Action Scheduler | Soportado (viene con WC) | Sí |
2. Requisitos del Sistema
Requisitos de Software
| Requisito | Detalle |
|---|---|
| WordPress | Versión 5.8 o superior |
| WooCommerce | Versión 5.0 o superior |
| PHP | Versión 7.4 o superior |
| Tango Gestión o Tango Punto de Venta | Versión vigente o inmediata anterior |
| Licencia Tango Tiendas | Licencia Full activada |
| Módulo de Tesorería | Requerido en Tango para procesar pagos |
Requisitos de Servidor
| Requisito | Detalle |
|---|---|
| TLS 1.2 | El servidor debe soportar TLS 1.2 o superior para comunicarse con la API de Tango |
| cURL | Extensión PHP cURL habilitada |
| JSON | Extensión PHP JSON habilitada |
| Conexión saliente | El servidor debe poder realizar conexiones HTTPS salientes a tiendas.axoft.com |
| Timeout | Se recomienda un max_execution_time de al menos 300 segundos para importaciones masivas |
| Memoria | Se recomienda al menos 256MB de memory_limit para catálogos grandes (10,000+ SKUs) |
Requisitos de Red
- Puerto 443 (HTTPS) saliente abierto hacia
tiendas.axoft.com - Si se usan webhooks: el servidor debe ser accesible desde Internet para recibir notificaciones POST de Tango
- Certificado SSL válido en tu sitio WordPress (para la URL del webhook)
3. Instalación
Método 1: Subir ZIP desde el panel de WordPress
- Descargue el archivo ZIP del plugin.
- En el panel de WordPress, vaya a Plugins > Añadir nuevo > Subir plugin.
- Seleccione el archivo ZIP y haga clic en Instalar ahora.
- Una vez instalado, haga clic en Activar plugin.
Método 2: Subir manualmente por FTP/SFTP
- Descomprima el archivo ZIP del plugin.
- Suba la carpeta
wc-tango-tiendasal directorio/wp-content/plugins/de su instalación de WordPress. - En el panel de WordPress, vaya a Plugins y active Tango Tiendas para WooCommerce.
Método 3: Clonar desde repositorio (desarrollo)
cd /ruta-a-wordpress/wp-content/plugins/ git clone <url-del-repositorio> wc-tango-tiendas
Luego active el plugin desde el panel de WordPress.
Qué sucede al activar el plugin
Al activar el plugin por primera vez, se ejecutan automáticamente las siguientes acciones:
- Creación de tablas de base de datos: Se crean 4 tablas personalizadas:
{prefix}_tango_sync_log— Registro de eventos de sincronización{prefix}_tango_product_map— Mapeo entre productos WC y artículos Tango{prefix}_tango_order_map— Mapeo entre pedidos WC y órdenes Tango{prefix}_tango_sync_history— Historial de cambios por producto
- Configuración de opciones por defecto (integración habilitada: No, sincronizar stock/precios/pedidos: Sí, lista de precios: 1, condición de venta: 1, intervalo cron: 5 minutos)
- Programación de tareas cron: Stock cada 5 min (configurable), estados de pedidos cada 5 min, limpieza de logs diaria, detección de productos nuevos cada 15 min
- Flush de rewrite rules para el endpoint del webhook.
Qué sucede al desactivar el plugin
- Se eliminan todas las tareas cron programadas.
- Se ejecuta flush de rewrite rules.
- Las tablas de base de datos y las opciones NO se eliminan, para preservar los datos si se reactiva el plugin.
4. Configuración en Tango Gestión (Lado Tango)
Antes de configurar el plugin en WooCommerce, debe configurar Tango Tiendas desde su sistema Tango Gestión.
Paso 1: Asociar empresa en Nexo
- Abra Tango Gestión.
- Acceda al wizard de Nexo > Tiendas.
- Asocie la empresa que desea vincular con WooCommerce.
- Siga los pasos del asistente para completar la asociación.
Paso 2: Obtener el Access Token
- Dentro de Tango Gestión, vaya a Tango Tiendas > API.
- En la sección de API, presione el botón "Obtener" para generar un Access Token.
- Copie el token generado. Lo necesitará para la configuración en WordPress.
Paso 3: Verificar licencia
- Tipo Full: La licencia Full es necesaria para todas las funcionalidades del plugin.
- Vigente: Verificar que la suscripción esté activa.
- Módulo de Tesorería: Debe estar habilitado para el procesamiento de pagos en pedidos.
Paso 4: Verificar artículos habilitados
- En Tango Gestión, verifique que los artículos que desea sincronizar estén habilitados (no deshabilitados/dados de baja).
- Cada artículo debe tener un código SKU asignado (campo
SKUCodeen la API). - Verifique que los artículos tengan precios asignados en la lista de precios que utilizará.
- Verifique que los artículos tengan stock registrado en el depósito que configurará.
5. Configuración en WooCommerce (Lado WordPress)
Acceder al panel del plugin
Una vez activado el plugin, aparecerá un nuevo ítem en el menú lateral de WordPress: Tango Tiendas. El menú contiene 4 secciones: Configuración, Productos, Pedidos y Registro.
Paso 1: Ingresar el Access Token
- Vaya a Tango Tiendas > Configuración.
- En la sección Conexión, pegue el Access Token obtenido de Tango Gestión en el campo correspondiente.
- El campo es de tipo password (oculto). Puede hacer clic en el icono de ojo para mostrar/ocultar el token.
Paso 2: Probar la conexión
- Haga clic en el botón "Probar conexión".
- El plugin enviará una solicitud al endpoint
POST /api/Aperture/dummyde Tango para validar el token. - Si la conexión es exitosa, verá un mensaje verde: "Conexión exitosa. Token válido."
Errores comunes al probar conexión
Token inválido: Verifique que copió correctamente el Access Token desde Tango.Error de conexión: El servidor no puede conectarse atiendas.axoft.com. Verifique firewall y TLS.HTTP 401/403: El token ha expirado o fue revocado. Genere uno nuevo desde Tango.
Paso 3: Activar la integración
- Active el toggle "Habilitar integración".
- Haga clic en "Guardar configuración" al final de la página.
Paso 4: Activar sincronizaciones
| Opción | Descripción | Por defecto |
|---|---|---|
| Sincronizar stock | Recibir actualizaciones de stock desde Tango | Activado |
| Sincronizar precios | Recibir actualizaciones de precios desde Tango | Activado |
| Sincronizar pedidos | Enviar pedidos de WooCommerce a Tango | Activado |
| Importar productos nuevos automáticamente | Detectar y crear productos nuevos de Tango cada 15 minutos | Activado |
| Intervalo de sincronización | Frecuencia del cron de sincronización periódica (en minutos) | 5 minutos |
Dashboard de estado
En la parte superior de la página de Configuración se muestra un dashboard con 4 tarjetas de estado: Estado de conexión, Productos vinculados, Pedidos sincronizados y Última sincronización.
6. Configuración del Webhook
Los webhooks permiten que Tango envíe notificaciones en tiempo real a tu WooCommerce cada vez que cambia un stock, un precio o el estado de un pedido. Sin webhooks, la sincronización solo ocurre por cron (cada N minutos).
Paso 1: Obtener la URL del Webhook
- En Tango Tiendas > Configuración, busque la sección "Webhook (Notificaciones en tiempo real)".
- Copie la URL que aparece ahi. El formato es:
https://tudominio.com/wp-json/wc-tango/v1/webhook?secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
La URL incluye automáticamente un parámetro secret que es un token único generado al activar el plugin.
Paso 2: Configurar en Tango Tiendas
- Acceda a la consola de Tango Tiendas (web).
- Vaya a API > Notificaciones.
- Marque el checkbox para habilitar las notificaciones.
- Pegue la URL del webhook copiada en el paso anterior.
- Guarde la configuración.
Tipos de notificaciones
| Evento (Topic) | Descripción | Acción del plugin |
|---|---|---|
| StockProductUpdate | Cambio de stock de un artículo | Actualiza el stock del producto en WC |
| PriceProductUpdate | Cambio de precio de un artículo | Actualiza el precio del producto en WC |
| OrderProcessed | Pedido procesado en Tango | Cambia estado WC a "Procesando" |
| OrderBilled | Pedido facturado en Tango | Cambia estado WC a "Completado", guarda factura |
| OrderObserved | Pedido con observacíones | Cambia estado WC a "En espera", agrega nota |
| OrderRejected | Pedido rechazado en Tango | Cambia estado WC a "Fallido", agrega nota |
| InvoiceFile | PDF de factura disponible | Guarda URL del PDF en el pedido |
Formato del payload del webhook
{
"Topic": "StockProductUpdate",
"Resource": "id-del-recurso",
"Message": "Mensaje descriptivo"
}Procesamiento asíncrono
El plugin procesa las notificaciones de forma asíncrona usando Action Scheduler (incluido con WooCommerce 3.5+): el webhook recibe la notificación y responde inmediatamente con HTTP 200 OK, luego se programa una tarea en segundo plano. Si Action Scheduler no está disponible, el procesamiento se realiza de forma síncrona.
Endpoint REST del webhook
- URL:
https://tudominio.com/wp-json/wc-tango/v1/webhook - Método:
POST - Content-Type:
application/json - Autenticación: Vía parámetro
secreto headerX-Tango-Webhook-Secret
7. Configuración de Parámetros de Tango
En la sección "Configuración de Tango" de la página de ajustes, debe configurar los parámetros que el plugin usará para comunicarse con Tango. Cada campo tiene un botón "Cargar desde Tango" que consulta la API y muestra las opciones disponibles.
7.1 Depósito (Warehouse)
El depósito determina de qué almacén se toma el stock para sincronizar con WooCommerce.
- Haga clic en "Cargar desde Tango" para ver la lista de depósitos disponibles.
- Múltiples depósitos: Puede ingresar varios códigos separados por coma (ej:
1,2,3). El stock se sumará de todos los depósitos indicados. - Dejar vacío: Si deja el campo vacío, se tomará el stock de TODOS los depósitos.
Endpoint API: GET /api/Aperture/Warehouse
7.2 Lista de Precios
La lista de precios determina qué precios se sincronizan con WooCommerce. Valor por defecto: 1.
Endpoint API: GET /api/Aperture/PriceList
7.3 Condición de Venta
La condición de venta se envía con cada pedido a Tango. Determina las condiciones de pago. Valor por defecto: 1.
Valores comunes: 1 = Contado, 2 = Cuenta Corriente 30 días, 3 = Cuenta Corriente 60 días.
Endpoint API: GET /api/Aperture/SaleCondition
7.4 Talonario (Counterfoil)
El talonario determina qué serie de comprobantes se usa al generar pedidos en Tango. Valor 0 = usar el talonario predeterminado configurado en Tango.
Endpoint API: GET /api/Aperture/Counterfoil?voucher=PED
8. Importación de Productos
El plugin ofrece dos mecanismos para traer productos de Tango a WooCommerce: importación masiva inicial y detección automática de productos nuevos.
8.1 Importación Masiva Inicial
- Vaya a Tango Tiendas > Productos.
- Haga clic en el botón "Importar productos de Tango".
- El proceso se ejecuta en dos fases:
- Fase 1 — Descarga de datos: El plugin consulta la API para obtener todos los artículos, precios y stock. Filtra los que ya existen en WooCommerce por SKU.
- Fase 2 — Creación por lotes: El navegador procesa lotes de 20 productos con una barra de progreso.
Datos importados de cada producto
| Dato en WooCommerce | Origen en Tango |
|---|---|
| Nombre del producto | Description del artículo |
| SKU | SKUCode del artículo |
| Precio regular | Precio de la lista de precios configurada |
| Stock | Stock del depósito configurado |
| Descripción larga | AdditionalDescription + Observations + ProductComments |
| Descripción corta | AdditionalDescription |
| Código de barras | BarCode del artículo |
| Estado | Publicado |
| Gestión de stock | Activada |
8.2 Detección Automática de Productos Nuevos
Si la opción "Importar productos nuevos automáticamente" está activada en Configuración, cada 15 minutos el cron consulta la API usando el parámetro updatedDate con la fecha del último chequeo (con 5 minutos de buffer) y crea automáticamente los productos nuevos.
8.3 Protección contra duplicados
- Antes de la importación, carga TODOS los SKUs existentes en WooCommerce en una sola consulta SQL.
- Antes de crear cada producto, verifica nuevamente con
wc_get_product_id_by_sku(). - Si encuentra un producto existente con el mismo SKU, solo crea el mapeo (no duplica el producto).
8.4 Protección contra importaciones concurrentes
Se usa un transient de WordPress como lock (wc_tango_product_import_lock) con expiración de 1 hora. Si intenta iniciar una importación mientras otra está en curso, se muestra un mensaje de error.
9. Mapeo de Productos
El mapeo es la vinculación entre un producto de WooCommerce y un artículo de Tango. Sin mapeo, el plugin no puede sincronizar stock ni precios para ese producto.
9.1 Mapeo Automático Masivo
- Vaya a Tango Tiendas > Configuración o Tango Tiendas > Productos.
- Haga clic en "Ejecutar mapeo automático".
- El plugin descarga todos los artículos de Tango y los compara con SKUs de WooCommerce buscando coincidencia por:
SKUCode,AlternativeCodeoBarCode. - Los nuevos mapeos se insertan en lotes de 200 (batch insert).
9.2 Mapeo Manual (desde el producto)
- En el meta box "Tango Tiendas - Sincronización", encuentre la sección "Mapeo manual".
- Ingrese el código SKU de Tango en el campo de texto.
- Haga clic en "Vincular".
9.3 Mapeo de Variaciones
Para productos variables, edite el producto variable. En cada variación encontrará los campos SKU Tango y Código Variante Tango. Complete los campos y guarde; el mapeo se crea automáticamente para cada variación.
9.4 Tabla de mapeo
El mapeo se almacena en la tabla {prefix}_tango_product_map:
| Campo | Descripción |
|---|---|
| wc_product_id | ID del producto en WooCommerce |
| tango_sku_code | Código SKU en Tango |
| tango_product_code | Código de producto/publicación en Tango |
| tango_variant_code | Código de variante (para variaciones) |
| last_stock_sync | Fecha/hora de la última sincronización de stock |
| last_price_sync | Fecha/hora de la última sincronización de precio |
10. Sincronización de Stock
La sincronización de stock fluye de Tango a WooCommerce (unidireccional). Hay dos mecanismos que trabajan en conjunto:
10.1 Sincronización en Tiempo Real (Webhook)
- Se modifica stock en Tango Gestión.
- Tango Tiendas detecta el cambio y envía una notificación
StockProductUpdateal webhook. - El plugin recibe la notificación y responde HTTP 200 inmediatamente.
- Se programa una tarea asíncrona (Action Scheduler).
- La tarea consulta
GET /api/Aperture/Stock?id={resource_id}para obtener el stock actualizado. - Se busca y actualiza el producto en WooCommerce por SKU.
10.2 Sincronización Periódica (Cron)
El cron wc_tango_sync_stock_cron se ejecuta cada N minutos (configurable, defecto: 5). Descarga TODO el stock con auto-paginación, filtra por depósito(s) configurado(s), agrega stock por SKU, y aplica las actualizaciones en lotes de 200 usando SQL directo.
10.3 Cálculo del Stock Disponible
Stock disponible = Cantidad física (Quantity) - Cantidad comprometida (EngagedQuantity)
El resultado siempre se redondea hacia abajo y nunca es negativo (mínimo 0).
10.4 Múltiples Depósitos
Si configura múltiples códigos de depósito separados por coma (ej: 1,2,3), el plugin suma el stock disponible de todos los depósitos para cada SKU. Si el campo de depósito está vacío, se usa el stock de TODOS los depósitos.
10.5 Optimizaciones de rendimiento
- Consultas batch: Todo se carga en consultas SQL únicas (no N+1).
- SQL directo: Las actualizaciones usan SQL directo en lugar de cargar objetos
WC_Productcompletos (50x más rápido). - Comparación de cambios: Solo se actualizan los productos cuyo stock realmente cambió.
- Lock con transient: Previene ejecuciones concurrentes (lock de 10 minutos).
- Solo background: La sincronización periódica solo se ejecuta en contextos de cron, WP-CLI o AJAX (nunca bloquea un request de visitante).
11. Sincronización de Precios
La sincronización de precios fluye de Tango a WooCommerce (unidireccional). Funciona de forma similar al stock.
11.1 Lógica de Precios
Al actualizar un precio, el plugin maneja tres escenarios:
- Escenario 1 — Sin precio de oferta: Se actualiza
_regular_pricey_pricecon el nuevo precio de Tango. - Escenario 2 — Precio de oferta menor al nuevo precio regular: Se actualiza
_regular_pricey se mantiene el_sale_priceexistente. - Escenario 3 — Precio de oferta mayor o igual al nuevo precio regular: Se actualiza
_regular_pricey se elimina el_sale_price(ya no tiene sentido una oferta >= regular).
11.2 Sincronización Periódica
Se ejecuta junto con la de stock (mismo cron wc_tango_sync_stock_cron). Consulta GET /api/Aperture/Price?filter={price_list} con auto-paginación, y aplica actualizaciones con tolerancia de $0.01.
11.3 Metadata actualizada
_regular_price: Precio regular del producto_price: Precio efectivo (puede ser regular o de oferta)_sale_price: Se elimina si es >= al nuevo precio regularwc_product_meta_lookup.min_priceymax_price: Actualizados para queries de WC
12. Sincronización de Pedidos
La sincronización de pedidos es bidireccional: los pedidos se envían de WooCommerce a Tango, y los cambios de estado fluyen de Tango a WooCommerce.
12.1 Cuándo se envía un pedido
| Estado WooCommerce | ¿Se envía a Tango? |
|---|---|
| pending (Pendiente de pago) | NO |
| failed (Fallido) | NO |
| on-hold (En espera) | SÍ |
| processing (Procesando) | SÍ |
| completed (Completado) | SÍ |
| cancelled (Cancelado) | NO |
| refunded (Reembolsado) | NO |
12.2 Estructura del Pedido enviado a Tango
El pedido se envía al endpoint POST /api/Aperture/order. Ejemplo de estructura:
{
"Date": "2024-01-15T10:30:00",
"Total": 15000.00,
"TotalDiscount": 500.00,
"PaidTotal": 15000.00,
"SaleConditionCode": 1,
"OrderID": "123",
"WarehouseCode": "1",
"Customer": { ... },
"OrderItems": [ ... ],
"Shipping": { ... },
"CashPayments": [ ... ]
}Datos del Cliente
| Campo | Origen |
|---|---|
| DocumentType | 80 (CUIT, 11 dígitos) / 96 (DNI, 7-8 dígitos) / 99 (Sin identificar) |
| DocumentNumber | Campo _billing_dni o _billing_cuit del pedido |
| IVACategoryCode | Campo _billing_iva_category o CF (Consumidor Final) |
| Email de facturación | |
| FirstName / LastName | Nombre y apellido de facturación (max 30 caracteres) |
| BusinessName | Empresa o "Nombre Apellido" (max 60 caracteres) |
| Street / HouseNumber | Calle y número extraídos de la dirección |
| ProvinceCode | Código AFIP de la provincia |
| PostalCode | Código postal (max 8 caracteres) |
Items del Pedido
12.3 Mapeo de Provincias Argentinas
| Código WC | Provincia | Código AFIP |
|---|---|---|
| C | CABA | 0 |
| B | Buenos Aires | 1 |
| K | Catamarca | 2 |
| H | Chaco | 3 |
| U | Chubut | 4 |
| X | Córdoba | 5 |
| W | Corrientes | 6 |
| E | Entre Ríos | 7 |
| P | Formosa | 8 |
| Y | Jujuy | 9 |
| L | La Pampa | 10 |
| F | La Rioja | 11 |
| M | Mendoza | 12 |
| N | Misiones | 13 |
| Q | Neuquén | 14 |
| R | Río Negro | 15 |
| A | Salta | 16 |
| J | San Juan | 17 |
| D | San Luis | 18 |
| Z | Santa Cruz | 19 |
| S | Santa Fe | 20 |
| G | Santiago del Estero | 21 |
| V | Tierra del Fuego | 22 |
| T | Tucumán | 23 |
12.4 Sincronización de Estados (Tango -> WooCommerce)
| Estado Tango | Estado WooCommerce | Condición |
|---|---|---|
| INGRESADA | Sin cambio | Pedido recién recibido en Tango |
| RECIBIDA | processing | Solo si estaba en pending o on-hold |
| EN PROCESO | processing | Solo si estaba en pending o on-hold |
| FINALIZADA | completed | Siempre |
| RECHAZADA | failed | Siempre |
| CANCELADA | cancelled | Solo si no estaba ya cancelado |
| ANULADA | cancelled | Siempre |
12.5 Reenvío de Pedidos
Desde la página de Pedidos del plugin o desde el meta box del pedido, haga clic en "Reenviar". Esto elimina el mapeo existente y reenvía el pedido a Tango.
13. Campo DNI/CUIT en el Checkout
El plugin agrega automáticamente un campo obligatorio de DNI / CUIT al checkout de WooCommerce, necesario para la facturación electrónica argentina.
Características del campo
| Propiedad | Valor |
|---|---|
| Label | DNI / CUIT |
| Placeholder | Ej: 12345678 o 20-12345678-9 |
| Obligatorio | Sí |
| Tipo | Texto |
| Largo máximo | 13 caracteres |
| Patrón | Solo números y guiones |
| Input mode | Numérico |
Validación
- DNI: 7 a 8 dígitos (ej:
12345678) - CUIT: 11 dígitos, con o sin guiones (ej:
20-12345678-9o20123456789)
Almacenamiento
- Se guarda como meta del pedido:
_billing_dni - Si el cliente está logueado, también se guarda como meta del usuario:
billing_dni - En pedidos futuros del mismo cliente, el campo se prellenará automáticamente.
Detección del tipo de documento
- 11 dígitos → Tipo
80(CUIT) - 7-8 dígitos → Tipo
96(DNI) - Sin documento → Tipo
99(Sin identificar)
14. Facturación Electrónica
El plugin integra el acceso a facturas electrónicas generadas en Tango.
14.1 Recepción de Facturas
- Vía webhook
OrderBilled: Cuando Tango factura un pedido, el plugin consultaGET /api/Aperture/Invoices?orderId=X, almacena el número de factura y la URL del PDF, agrega una nota al pedido y actualiza el estado a "Completado". - Vía webhook
InvoiceFile: Cuando el PDF está disponible, consulta la API de Invoices y almacena la URL del PDF. - Vía polling periódico: El cron de estados también verifica si hay datos de factura disponibles.
14.2 Acceso a la Factura desde el Panel
Abra el pedido en WooCommerce. En el meta box "Tango Tiendas" encontrará el ID de Tango, fecha de envío, número de factura y el botón "Factura Tango" que abre un modal con información detallada y link para descargar el PDF.
15. Panel de Administración
El plugin agrega un menú principal "Tango Tiendas" con 4 subpáginas en la barra lateral de WordPress.
15.1 Página de Configuración
Ruta: Tango Tiendas > Configuración | Slug: wc-tango-tiendas
Secciones: Dashboard de estado, Conexión, Webhook, Sincronización, Configuración de Tango, Mapeo de productos, Avanzado (modo depuración), Botón Guardar.
15.2 Página de Productos
Ruta: Tango Tiendas > Productos | Slug: wc-tango-products
Barra de herramientas con botones para importar, mapear, sincronizar stock y precios. Tabla páginada (50 por página) con ID, nombre, SKU Tango, código, variante, stock, precio y fechas de sincronización.
15.3 Página de Pedidos
Ruta: Tango Tiendas > Pedidos | Slug: wc-tango-orders
Tabla con los últimos 50 pedidos sincronizados: número de pedido, ID Tango, estado Tango (con badge de color), estado WC, factura (número + link PDF), última sincronización y botón reenviar.
15.4 Página de Registro de Actividad
Ruta: Tango Tiendas > Registro | Slug: wc-tango-logs
Filtros por tipo (Stock, Precios, Pedidos, Webhooks, Facturas) y por estado. Tabla páginada con ID, fecha, tipo, dirección, entidad, estado y mensaje. Botón "Limpiar registros" para eliminar todos los registros.
16. Meta Box en Productos
Al editar un producto en WooCommerce, el plugin agrega un meta box en la columna lateral: "Tango Tiendas - Sincronización".
Estado: No Vinculado
Si el producto no tiene SKU de Tango asignado, el meta box muestra una advertencia, el botón "Mapear automáticamente" (si el producto tiene SKU de WC) y un campo de mapeo manual con botón "Vincular".
Estado: Vinculado
Si el producto está vinculado a Tango, el meta box muestra: badge "Conectado a Tango", SKU Tango, stock y precio actuales (con indicadores de color), fechas de última sincronización y botón "Sincronizar ahora" para forzar una actualización.
También incluye una sección colapsable "Historial de cambios" con los últimos 15 cambios del producto, mostrando tipo (Stock/Precio), fuente (webhook/cron), valores anterior y nuevo, y tiempo relativo.
Campos en la sección de Inventario
_tango_sku_code: Código de artículo en Tango Gestión._tango_product_code: Código de publicación en Tango Tiendas (opcional).
Al guardar el producto, estos campos actualizan automáticamente la tabla de mapeo.
17. Meta Box en Pedidos
Al editar un pedido en WooCommerce, el plugin agrega un meta box en la columna lateral: "Tango Tiendas".
Pedido Enviado a Tango
Muestra: badge verde "Enviado a Tango", ID Tango, fecha de envío, número de factura (si existe), botón "Factura Tango" (abre el modal con link al PDF) y botón "Reenviar".
Pedido No Enviado
Si el pedido no fue enviado a Tango, muestra un icono de información, texto explicativo y el botón "Enviar a Tango" para envío manual.
Compatibilidad HPOS
El meta box es compatible con High-Performance Order Storage de WooCommerce. Detecta automáticamente si HPOS está habilitado y usa la pantalla de edición correcta.
18. Registro de Actividad (Logs)
Tipos de eventos registrados
| Tipo | Descripción |
|---|---|
| stock | Sincronizaciones de stock (masivas e individuales) |
| price | Sincronizaciones de precios |
| order | Envío de pedidos a Tango |
| order_status | Cambios de estado de pedidos |
| webhook | Notificaciones recibidas |
| invoice | Facturas disponibles |
| import | Importaciones de productos |
Estados
| Estado | Significado |
|---|---|
| success | Operación exitosa |
| error | Error en la operación |
| warning | Advertencia (no crítico) |
| received | Notificación recibida (webhook) |
| started | Operación iniciada |
Limpieza automática
El cron diario wc_tango_cleanup_logs_cron realiza dos tareas de limpieza:
- Por cantidad: Si hay más de 10,000 registros, elimina los más antiguos para mantener solo los 10,000 más recientes.
- Por antigüedad: Elimina registros con más de 30 días.
19. Modo Depuración
Activar modo depuración
- Vaya a Tango Tiendas > Configuración > Avanzado.
- Active el toggle "Modo depuración".
- Guarde la configuración.
Qué se registra en modo depuración
Con el modo depuración activado, el plugin registra información detallada en WooCommerce > Estado > Registros (fuente: wc-tango-tiendas):
- Cada solicitud a la API: URL y método (GET/POST)
- Cada respuesta de la API: Código HTTP y body (primeros 2000 caracteres)
- Operaciones internas detalladas
- Decisiones de lógica (por qué un pedido no se envió, por qué un stock no se actualizó, etc.)
20. Tablas de Base de Datos
El plugin crea 4 tablas personalizadas al activarse. Todas usan el prefijo de tabla de WordPress (típicamente wp_).
20.1 {prefix}_tango_sync_log
CREATE TABLE {prefix}_tango_sync_log (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
type varchar(50) NOT NULL DEFAULT '',
direction varchar(20) NOT NULL DEFAULT '',
entity_id varchar(100) NOT NULL DEFAULT '',
status varchar(20) NOT NULL DEFAULT '',
message text,
request_data longtext,
response_data longtext,
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY type_idx (type),
KEY status_idx (status),
KEY created_at_idx (created_at)
);20.2 {prefix}_tango_product_map
CREATE TABLE {prefix}_tango_product_map (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wc_product_id bigint(20) unsigned NOT NULL,
tango_sku_code varchar(100) NOT NULL DEFAULT '',
tango_product_code varchar(100) NOT NULL DEFAULT '',
tango_variant_code varchar(100) DEFAULT '',
last_stock_sync datetime DEFAULT NULL,
last_price_sync datetime DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY wc_product_idx (wc_product_id),
KEY tango_sku_idx (tango_sku_code)
);20.3 {prefix}_tango_order_map
CREATE TABLE {prefix}_tango_order_map (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wc_order_id bigint(20) unsigned NOT NULL,
tango_order_id varchar(100) NOT NULL DEFAULT '',
tango_status varchar(50) DEFAULT '',
tango_invoice_number varchar(100) DEFAULT '',
tango_invoice_url text,
last_sync datetime DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY wc_order_idx (wc_order_id),
KEY tango_order_idx (tango_order_id),
KEY tango_status_idx (tango_status)
);20.4 {prefix}_tango_sync_history
CREATE TABLE {prefix}_tango_sync_history (
id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
wc_product_id bigint(20) unsigned NOT NULL,
field varchar(20) NOT NULL DEFAULT '',
old_value varchar(100) DEFAULT '',
new_value varchar(100) DEFAULT '',
source varchar(20) NOT NULL DEFAULT 'webhook',
created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY product_idx (wc_product_id),
KEY created_at_idx (created_at)
);21. Tareas Cron Automatizadas
El plugin registra 4 tareas cron recurrentes en WordPress.
| Hook | Frecuencia | Acción |
|---|---|---|
| wc_tango_sync_stock_cron | Cada N minutos (defecto: 5) | Sincronización masiva de stock y precios |
| wc_tango_sync_order_status_cron | Cada N minutos (misma frecuencia) | Polling de estados de pedidos (hasta 50 por ejecución) |
| wc_tango_sync_new_products_cron | Cada 15 minutos (fijo) | Detección y creación de productos nuevos |
| wc_tango_cleanup_logs_cron | Diaria | Limpieza de registros antiguos y historial de cambios |
22. Recomendaciones de Servidor
22.1 Cron real del servidor
El plugin muestra una advertencia si WP-Cron nativo está habilitado. Se recomienda deshabilitar WP-Cron y usar un cron real del servidor.
Cómo configurar:
1. Edite wp-config.php y agregue:
define( 'DISABLE_WP_CRON', true );
2. Configure un cron del servidor que ejecute WP-Cron cada minuto:
* * * * * cd /ruta/a/wordpress && php wp-cron.php > /dev/null 2>&1 # O usando wget: * * * * * wget -q -O - https://tudominio.com/wp-cron.php > /dev/null 2>&1
22.2 TLS 1.2
El servidor debe soportar TLS 1.2 o superior. Verifique con:
openssl s_client -connect tiendas.axoft.com:443 -tls1_2
22.3 Timeouts
Para catálogos grandes (10,000+ SKUs), asegúrese de: max_execution_time >= 300 y memory_limit >= 256M en PHP. El plugin establece internamente @set_time_limit(300) y usa @ignore_user_abort(true) para sincronizaciones masivas.
22.4 Certificado SSL
Su sitio WordPress debe tener un certificado SSL válido (HTTPS) para recibir webhooks de Tango (Tango solo envía a URLs HTTPS). Las llamadas a la API usan sslverify => true por seguridad.
23. API de Tango Tiendas — Referencia
23.1 URL Base
https://tiendas.axoft.com/api/Aperture/
23.2 Autenticación
Todas las solicitudes incluyen el header:
accesstoken: {tu_access_token}23.3 Endpoints utilizados por el plugin
| Método | Endpoint | Descripción | Usado por |
|---|---|---|---|
| POST | /dummy | Validar token | Probar conexión |
| GET | /Product | Listar artículos | Importación, mapeo automático |
| GET | /Stock | Obtener saldos de stock | Sincronización de stock |
| GET | /Price | Obtener precios | Sincronización de precios |
| GET | /PriceList | Listar listas de precios | Configuración |
| POST | /order | Enviar/cancelar pedido | Envío de pedidos |
| GET | /order | Consultar pedido | Polling de estados |
| GET | /Warehouse | Listar depósitos | Configuración |
| GET | /SaleCondition | Listar condiciones de venta | Configuración |
| GET | /Counterfoil | Listar talonarios | Configuración |
| GET | /Invoices | Obtener facturas | Facturación |
23.4 Paginación
La API de Tango usa paginación con los parámetros pageSize (máximo 500 en el plugin) y pageNumber (1-indexed). La respuesta incluye Paging.MoreData. El plugin implementa auto-paginación con límite de seguridad de 20 páginas (10,000 registros max).
23.5 Manejo de errores
- Error de red:
WP_Errorde WordPress (timeout, DNS, etc.) - Error HTTP: Código de estado 4xx/5xx
- Error de lógica: Campo
isOk: falseen la respuesta - Error de JSON: Respuesta que no se puede decodificar como JSON
El timeout por defecto para solicitudes a la API es de 30 segundos.
24. Seguridad
24.1 Almacenamiento del Access Token
El Access Token se almacena en la tabla wp_options de WordPress, protegido por la seguridad nativa de WordPress y la base de datos.
24.2 Webhook Secret
- Se genera automáticamente al activar el plugin usando
wp_generate_password(32, false). - Se verifica en cada notificación recibida.
- Se puede regenerar desactivando y reactivando el plugin (debe actualizar la URL en Tango).
24.3 Nonces AJAX
Todas las solicitudes AJAX del panel de administración incluyen y verifican un nonce de WordPress (wc_tango_admin) usando wp_create_nonce() y check_ajax_referer().
24.4 Permisos
Solo usuarios con el capability manage_woocommerce pueden acceder al panel del plugin. Todos los handlers AJAX verifican permisos con current_user_can('manage_woocommerce').
24.5 Sanitización de datos
Todos los datos de entrada se sanitizan con funciones nativas de WordPress: sanitize_text_field(), absint(), esc_html(), esc_url(). Las consultas SQL usan $wpdb->prepare() para prevenir inyección SQL.
24.6 Protección de archivos
Todos los archivos PHP del plugin incluyen if ( ! defined( 'ABSPATH' ) ) { exit; } para prevenir acceso directo. Los directorios incluyen archivos index.php vacíos para prevenir directory listing.
25. Solución de Problemas y FAQ
25.1 Problemas de conexión
Soluciones:
- Verifique que el Access Token sea correcto (cópielo nuevamente desde Tango).
- Verifique que el servidor puede conectarse a
tiendas.axoft.com(puerto 443). - Verifique que PHP tenga cURL habilitado.
- Verifique que el servidor soporte TLS 1.2.
- Revise si hay un firewall bloqueando conexiones salientes.
Soluciones: El token puede haber expirado (genere uno nuevo desde Tango Tiendas), verifique que la licencia esté vigente y asegúrese de que no haya espacios en blanco al inicio o final del token.
25.2 Problemas de sincronización
- Verifique que "Sincronizar stock" esté activado en Configuración.
- Verifique que la integración esté habilitada.
- Verifique que los productos estén mapeados (Tango Tiendas > Productos).
- Verifique que el depósito configurado sea correcto.
- Revise los logs en Tango Tiendas > Registro.
- Active el modo depuración para ver detalles.
- Verifique que "Sincronizar pedidos" esté activado.
- Verifique que todos los productos del pedido tengan SKU de Tango asignado.
- El pedido debe estar en estado
on-hold,processingocompleted. - Revise las notas del pedido para ver si hay errores.
- Intente reenviar el pedido desde el meta box.
25.3 Problemas de webhook
- Verifique que la URL del webhook esté correctamente configurada en Tango Tiendas.
- Verifique que su sitio sea accesible desde Internet (no localhost).
- Verifique que tenga certificado SSL válido (HTTPS).
- Verifique que la API REST de WordPress funcione (
/wp-json/debe responder). - Revise si algún plugin de seguridad (Wordfence, Sucuri, etc.) está bloqueando las solicitudes POST.
Pruebe la URL del webhook manualmente con cURL:
curl -X POST https://tudominio.com/wp-json/wc-tango/v1/webhook?secret=TU_SECRETO \
-H "Content-Type: application/json" \
-d '{"Topic":"test","Resource":"","Message":"test"}'
# Debería responder {"status":"ok"} o {"status":"disabled"}25.4 Problemas de importación
- Haga clic en "Reiniciar estado" en el panel de importación.
- Verifique que el servidor tenga suficiente memoria y tiempo de ejecución.
- Si el problema persiste, elimine manualmente el transient
wc_tango_product_import_lockdewp_options.
25.5 FAQ
¿Puedo usar el plugin con Tango Punto de Venta?
Sí, el plugin funciona con ambos sistemas siempre que tengan la licencia Tango Tiendas Full activada.
¿Puedo sincronizar más de una lista de precios?
No, actualmente el plugin sincroniza una sola lista de precios. Configure la lista que corresponda al precio público de su tienda.
¿Puedo sincronizar stock desde WooCommerce a Tango?
No, la sincronización de stock es unidireccional: de Tango a WooCommerce. Tango Gestión es la "fuente de verdad" del stock.
¿El plugin funciona con productos variables?
Sí, cada variación puede tener su propio SKU de Tango y código de variante.
¿Qué pasa si desactivo el plugin?
Las tareas cron se eliminan, pero las tablas de base de datos y opciones se conservan. Si lo reactiva, retomará donde dejó.
¿El plugin es compatible con HPOS?
Sí, el plugin declara compatibilidad con High-Performance Order Storage de WooCommerce.
¿Cada cuánto se ejecuta la sincronización?
La sincronización periódica se ejecuta cada N minutos (configurable, defecto: 5). Los webhooks proporcionan actualizaciones en tiempo real además del cron.
¿Qué sucede si Tango está caído?
Las sincronizaciones periódicas fallan silenciosamente y se reintentan en la siguiente ejecución del cron. Cuando Tango vuelva a estar disponible, la próxima sincronización actualizará todo.
26. Referencia Técnica para Desarrolladores
26.1 Constantes
| Constante | Valor | Descripción |
|---|---|---|
| WC_TANGO_VERSION | 1.2.0 | Versión del plugin |
| WC_TANGO_PLUGIN_FILE | Ruta al archivo principal | Path del archivo wc-tango-tiendas.php |
| WC_TANGO_PLUGIN_DIR | Directorio del plugin | Path al directorio del plugin |
| WC_TANGO_PLUGIN_URL | URL del plugin | URL publica del plugin |
| WC_TANGO_API_BASE_URL | https://tiendas.axoft.com/api/Aperture/ | URL base de la API |
26.2 Clase Principal
// Obtener la instancia del plugin $tango = wc_tango_tiendas(); // Acceder a los componentes $tango->api; // WC_Tango_API_Client $tango->webhook; // WC_Tango_Webhook_Handler $tango->stock_sync; // WC_Tango_Stock_Sync $tango->price_sync; // WC_Tango_Price_Sync $tango->order_sync; // WC_Tango_Order_Sync $tango->product_import; // WC_Tango_Product_Import $tango->checkout; // WC_Tango_Checkout $tango->logger; // WC_Tango_Logger // Verificar si la integración está activa WC_Tango_Tiendas::is_active(); // true/false // Obtener una configuración WC_Tango_Tiendas::get_setting( 'warehouse_code' );
26.3 Opciones de WordPress (wp_options)
| Opción | Tipo | Defecto | Descripción |
|---|---|---|---|
| wc_tango_access_token | string | '' | Access Token de Tango |
| wc_tango_enabled | string | 'no' | Integración habilitada ('yes'/'no') |
| wc_tango_sync_stock | string | 'yes' | Sincronizar stock |
| wc_tango_sync_prices | string | 'yes' | Sincronizar precios |
| wc_tango_sync_orders | string | 'yes' | Sincronizar pedidos |
| wc_tango_warehouse_code | string | '' | Código(s) de depósito |
| wc_tango_price_list_number | string | '1' | Número de lista de precios |
| wc_tango_sale_condition | string | '1' | Condición de venta |
| wc_tango_counterfoil | int | 0 | Talonario (0 = predeterminado) |
| wc_tango_webhook_secret | string | (generado) | Secreto del webhook |
| wc_tango_stock_cron_interval | int | 5 | Intervalo cron en minutos |
| wc_tango_debug_mode | string | 'no' | Modo depuración |
| wc_tango_auto_import_new | string | 'yes' | Importar productos nuevos automáticamente |
26.4 Meta datos de Productos
| Meta Key | Descripción |
|---|---|
| _tango_sku_code | Código SKU de Tango |
| _tango_product_code | Código de producto en Tango |
| _tango_variant_code | Código de variante (solo variaciones) |
| _tango_imported | yes si fue importado desde Tango |
| _tango_import_date | Fecha de importación |
| _barcode | Código de barras de Tango |
26.5 Meta datos de Pedidos
| Meta Key | Descripción |
|---|---|
| _tango_order_id | ID del pedido en Tango |
| _tango_order_sent | Fecha/hora de envío a Tango |
| _tango_invoice_number | Número de factura |
| _tango_invoice_url | URL del PDF de factura |
| _billing_dni | DNI/CUIT del cliente |
| _billing_iva_category | Categoría IVA (default: CF) |
| _tango_customer_code | Código de cliente en Tango (opcional) |
26.6 Hooks de WordPress
Actions del plugin
| Hook | Descripción |
|---|---|
| wc_tango_sync_stock_cron | Cron de sincronización de stock y precios |
| wc_tango_sync_order_status_cron | Cron de polling de estados de pedidos |
| wc_tango_sync_new_products_cron | Cron de detección de productos nuevos |
| wc_tango_cleanup_logs_cron | Cron de limpieza de logs |
| wc_tango_async_stock_update | Procesamiento async de webhook de stock |
| wc_tango_async_price_update | Procesamiento async de webhook de precio |
| wc_tango_async_order_event | Procesamiento async de webhook de pedido |
| wc_tango_async_send_order | Envío async de pedido a Tango |
| wc_tango_async_poll_order | Polling async de un pedido en Tango |
Hooks de WooCommerce que el plugin escucha
| Hook | Acción |
|---|---|
| woocommerce_payment_complete | Programar envío de pedido |
| woocommerce_order_status_processing | Programar envío de pedido |
| woocommerce_order_status_on-hold | Programar envío de pedido |
| woocommerce_order_status_completed | Programar envío de pedido |
| woocommerce_order_status_cancelled | Cancelar pedido en Tango |
| woocommerce_billing_fields | Agregar campo DNI |
| woocommerce_checkout_process | Validar DNI |
| woocommerce_checkout_update_order_meta | Guardar DNI |
| woocommerce_process_product_meta | Guardar mapeo SKU al guardar producto |
26.7 Endpoints REST registrados
| Ruta | Método | Permiso |
|---|---|---|
| /wc-tango/v1/webhook | POST | Verificación de secreto |
26.8 Transients utilizados
| Transient | Expiración | Propósito |
|---|---|---|
| wc_tango_stock_sync_lock | 10 min | Lock de sincronización de stock |
| wc_tango_price_sync_lock | 10 min | Lock de sincronización de precios |
| wc_tango_product_import_lock | 1 hora | Lock de importación de productos |
| wc_tango_new_product_sync_lock | 10 min | Lock de detección de productos nuevos |
| wc_tango_import_prices_cache | 2 horas | Caché de precios durante importación |
| wc_tango_import_stocks_cache | 2 horas | Caché de stock durante importación |
26.9 Estructura del Plugin
wc-tango-tiendas/ ├── wc-tango-tiendas.php # Archivo principal, clase singleton ├── index.php # Protección de directorio ├── assets/ │ ├── css/ │ │ └── admin.css # Estilos del panel de administración │ └── js/ │ └── admin.js # JavaScript del panel de administración ├── includes/ │ ├── class-wc-tango-logger.php # Sistema de logging │ ├── class-wc-tango-api-client.php # Cliente API REST │ ├── class-wc-tango-webhook-handler.php │ ├── class-wc-tango-stock-sync.php │ ├── class-wc-tango-price-sync.php │ ├── class-wc-tango-order-sync.php │ ├── class-wc-tango-product-import.php │ ├── class-wc-tango-checkout.php │ └── admin/ │ ├── class-wc-tango-admin.php │ └── views/ │ ├── settings-page.php │ ├── products-page.php │ ├── orders-page.php │ └── logs-page.php └── languages/ # Traducciones
26.10 Declaración de compatibilidad HPOS
add_action( 'before_woocommerce_init', function() {
if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility(
'custom_order_tables', __FILE__, true
);
}
});Documentación generada para Tango Tiendas para WooCommerce v1.2.0 — Marzo 2026