Flujos de Sincronización
Los flujos definen qué datos se sincronizan, de dónde a dónde, y con qué frecuencia.
Flujos Configurados
flowchart LR
%% ================================
%% PRODUCCION
%% ================================
subgraph Producción
direction LR
T1[(Tango)]
W1[WMS]
M1[(MySQL Web)]
WS1[WMS Source]
MT[(MySQL Transcaden)]
BT[(BAS Transcaden)]
P1[provincias]
P2[zonas]
P3[transportes]
P4[depositos]
P5[categorias]
C1[clientes]
PR1[proveedores]
A1[articulos]
PED1[pedidos]
OC1[ordenesDeCompra]
PP1[pedidosPreparados]
AT1[articulos-transcaden]
T1 --> P1 --> W1
T1 --> P2 --> W1
T1 --> P3 --> W1
T1 --> P4 --> W1
T1 --> P5 --> W1
T1 --> C1 --> W1
T1 --> C1 --> M1
T1 --> PR1 --> W1
T1 --> A1 --> W1
T1 --> A1 --> M1
T1 --> PED1 --> W1
T1 --> OC1 --> W1
WS1 --> PP1 --> T1
BT --> AT1 --> MT
end
%% ================================
%% DESARROLLO
%% ================================
subgraph Desarrollo
direction LR
T2[(Tango Dev)]
W2[WMS Dev]
M2[(MySQL Dev)]
WS2[WMS Source Dev]
PD1[provincias-dev]
ZD1[zonas-dev]
TD1[transportes-dev]
DD1[depositos-dev]
CD1[categorias-dev]
CLD1[clientes-dev]
PRD1[proveedores-dev]
AD1[articulos-dev]
PEDD1[pedidos-dev]
OCD1[ordenesDeCompra-dev]
PPD1[pedidosPreparados-dev]
T2 --> PD1 --> W2
T2 --> ZD1 --> W2
T2 --> TD1 --> W2
T2 --> DD1 --> W2
T2 --> CD1 --> W2
T2 --> CLD1 --> W2
T2 --> PRD1 --> W2
T2 --> AD1 --> W2
T2 --> PEDD1 --> W2
T2 --> OCD1 --> W2
WS2 --> PPD1 --> T2
end
Lista de Flujos
Producción
| Flow | Source | Destinations | Intervalo | Transform |
|---|---|---|---|---|
| provincias | tango | wms | 1h | - |
| zonas | tango | wms | 1h | - |
| transportes | tango | wms | 1h | - |
| depositos | tango | wms | 1h | - |
| categorias | tango | wms | 24h | - |
| clientes | tango | wms, mysql-web, mysql-development | 5m | - |
| proveedores | tango | wms | 5m | - |
| articulos | tango | wms, mysql-web, mysql-development | 1m | - |
| pedidos | tango | wms | 30s | agruparPedidos |
| ordenesDeCompra | tango | wms | 1m | agruparOrdenesCompra |
| pedidosPreparados | wms-source | tango | 1m | procesarPedidoPreparado |
| articulos-transcaden | bas-transcaden | mysql-transcaden-web | 1m | procesarArticulosTranscaden |
Desarrollo
| Flow | Source | Destinations | Intervalo | Transform |
|---|---|---|---|---|
| provincias-dev | tango-development | wms-development | 1h | - |
| zonas-dev | tango-development | wms-development | 1h | - |
| transportes-dev | tango-development | wms-development | 1h | - |
| depositos-dev | tango-development | wms-development | 1h | - |
| categorias-dev | tango-development | wms-development | 24h | - |
| clientes-dev | tango-development | wms-development | 5m | - |
| proveedores-dev | tango-development | wms-development | 5m | - |
| articulos-dev | tango-development | wms-development | 1m | - |
| pedidos-dev | tango-development | wms-development | 30s | agruparPedidos |
| ordenesDeCompra-dev | tango-development | wms-development | 1m | agruparOrdenesCompra |
| pedidosPreparados-dev | wms-source-development | tango-development | 1m | procesarPedidoPreparado |
Note
Algunos flows de producción (clientes, articulos) también sincronizan hacia mysql-development
para entornos de testing o staging web.
Definición de Flow
// src/config/sync-flows.ts
export const syncFlows: SyncFlowConfig[] = [
{
name: 'articulos',
source: { adapter: 'tango' },
destinations: ['wms', 'mysql-web'],
pollInterval: 60 * 1000, // 1 minuto
priority: 'high',
},
{
name: 'pedidos',
source: { adapter: 'tango' },
destinations: ['wms'],
pollInterval: 30 * 1000, // 30 segundos
priority: 'high',
transform: 'agruparPedidos',
},
{
name: 'pedidosPreparados',
source: { adapter: 'wms-source' },
destinations: ['tango'],
pollInterval: 60 * 1000,
priority: 'high',
useLastSync: true, // Incremental
transform: 'procesarPedidoPreparado',
},
];
Propiedades del Flow
| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
name |
string | ✅ | Identificador único |
source.adapter |
string | ✅ | Nombre del source |
source.entity |
string | ❌ | Entity en source (default: name) |
destinations |
string[] | ✅ | Lista de destinations |
pollInterval |
number | ✅ | Intervalo en ms |
priority |
'high' | 'normal' | 'low' | ✅ | Prioridad de jobs |
transform |
string | string[] | ❌ | Transform(s) a aplicar |
useLastSync |
boolean | ❌ | Usar filtro incremental |
Intervalos Recomendados
gantt
title Intervalos de Polling
dateFormat X
axisFormat %S
section Alta Frecuencia
pedidos (30s) :0, 30
articulos (60s) :0, 60
section Media Frecuencia
clientes (5m) :0, 300
proveedores (5m) :0, 300
section Baja Frecuencia
provincias (1h) :0, 3600
categorias (24h) :0, 86400
| Frecuencia | Intervalo | Casos de Uso |
|---|---|---|
| Alta | 30s - 1m | Pedidos, artículos (cambios frecuentes) |
| Media | 5m | Clientes, proveedores |
| Baja | 1h - 24h | Tablas maestras (rara vez cambian) |
Flujos Incrementales
Con useLastSync: true, el flow solo trae cambios desde la última sincronización:
sequenceDiagram
participant Poller
participant Source
participant HashStore
Note over Poller: Primera ejecución
Poller->>Source: getData(since: now - 5min)
Source-->>Poller: rows[]
Poller->>Poller: lastSync = now
Note over Poller: Segunda ejecución
Poller->>Source: getData(since: lastSync)
Source-->>Poller: only new/changed rows
Poller->>Poller: lastSync = now
Limitaciones
- No detecta eliminaciones automáticamente
- Requiere que el source soporte filtro por fecha
- El campo de fecha debe configurarse en
dateField
Múltiples Destinations
Un flow puede escribir a múltiples destinations:
Esto genera un job separado por cada destination:
flowchart LR
A[Cambio detectado] --> B[Job → WMS]
A --> C[Job → MySQL Web]
A --> D[Job → MySQL Dev]
Agregar Nuevo Flow
1. Verificar Source y Entity
// Asegurar que el source tenga la entity configurada
// src/config/sources/tango.ts
entities: {
miEntidad: {
table: 'MI_TABLA',
primaryKey: ['ID'],
},
}
2. Verificar Destination y Entity
// src/config/destinations/wms.ts
entities: {
miEntidad: {
endpoint: 'miEntidad',
keyField: 'codigo',
fields: {
codigo: 'ID',
nombre: 'DESCRIPCION',
},
},
}
3. Agregar Flow
// src/config/sync-flows.ts
{
name: 'miEntidad',
source: { adapter: 'tango' },
destinations: ['wms'],
pollInterval: 5 * 60 * 1000, // 5 minutos
priority: 'normal',
}
4. (Opcional) Crear Transform
Si necesitás transformar los datos, crear en src/transforms/ y registrar.