Saltar a contenido

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:

{
  name: 'articulos',
  destinations: ['wms', 'mysql-web', 'mysql-development'],
}

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.

Helper getFlow

import { getFlow } from './config/sync-flows.js';

const flow = getFlow('articulos');
if (flow) {
  await poller.pollFlow(flow);
}