Skip to content

Movimiento de Inventario (inventory_movement)

La automatización inventory_movement gestiona el stock en una única dirección (ya sea entrada in o salida out) y lee las ubicaciones correspondientes desde el registro de origen.

A diferencia de inventory_transfer, que afecta dos ubicaciones en un solo paso, inventory_movement solo afecta una ubicación a la vez. Para realizar un traslado completo con este tipo de automatización, se requiere configurar dos reglas independientes (una de salida y otra de entrada) sobre la misma tabla de movimientos.


  1. Determinación de Dirección:
    • Si movement_direction es "out" (salida): Lee la ubicación de origen desde la columna indicada en transfer_columns.origin. Resta la cantidad al stock.
    • Si movement_direction es "in" (entrada): Lee la ubicación de destino desde la columna indicada en transfer_columns.destination. Suma la cantidad al stock.
  2. Exclusividad de Ubicación: Para evitar ejecuciones cruzadas, si la fila contiene tanto origen como destino al mismo tiempo (como en un traspaso), la automatización se aborta de forma segura.
  3. Limpieza de Saldo Cero: En salidas ("out"), si el saldo en la ubicación llega a cero o menos (<= 0), el registro de stock se elimina de la tabla destino automáticamente.

Integración con Relaciones de Objetos (object_list_sync)

Section titled “Integración con Relaciones de Objetos (object_list_sync)”

Este tipo de automatización admite un bloque avanzado llamado object_list_sync que se ejecuta en paralelo con el movimiento de stock. Sirve para enlazar relaciones de tipo ObjectList y registrar detalles en tablas junction automáticamente.

Al registrar una salida de inventario (p.ej. de un rollo de tela), el sistema debe:

  • Restar la cantidad en la tabla de existencias principal.
  • Buscar la fila correspondiente en la tabla del rollo (tabla B) o crearla si no existe.
  • Insertar un registro de detalle de consumo en una tabla foránea.
  • Enlazar automáticamente el rollo con ese nuevo detalle a través de una tabla de unión (junction table).

Estructura de propiedades requeridas dentro de rules para una automatización de tipo inventory_movement:

  • movement_direction: Dirección del movimiento. Valores válidos: "in" o "out".
  • target_table: La tabla donde se almacena el stock (ej. table15).
  • target_field: La columna numérica de stock (ej. t15c8).
  • transfer_columns: Objeto que define las columnas de ubicaciones:
    • origin: Columna de ubicación origen en la fila actual (usada si la dirección es out).
    • destination: Columna de ubicación destino en la fila actual (usada si la dirección es in).
    • target: Columna de ubicación en la tabla destino de stock.
  • match_columns: Criterios de coincidencia (ej. producto).
  • in_out_property (Opcional): Permite escribir de forma automática una etiqueta en el registro origen (ej. "ENTRADA" o "SALIDA").

Propiedades para object_list_sync (Opcional)

Section titled “Propiedades para object_list_sync (Opcional)”
  • target_table_b: Tabla secundaria que contiene la propiedad ObjectList.
  • target_b_match: Cómo buscar el registro en la tabla B:
    • source_column: Columna del origen que tiene el valor de búsqueda.
    • target_column: Columna de la tabla B contra la que se compara.
  • target_b_create_map: Si el registro en la tabla B no existe, define los valores para crearlo.
  • object_list_sync: Objeto de configuración de relaciones:
    • apply_on_directions: Direcciones en las que aplica (ej. ["out"]).
    • foreign_table: Tabla de detalle a la que se insertará la nueva fila.
    • junction_table: Tabla de unión (junction).
    • junction_object_list_column: Identificador de la propiedad ObjectList en la tabla B.
    • foreign_create_map: Mapeo para llenar las columnas del nuevo registro en la tabla de detalle.
    • extra_match_target (Opcional): Columna de la tabla de detalle donde se guardará el tipo de cantidad (por ejemplo, BUENAS o SCRAP).
    • ignore_duplicates: Booleano para evitar duplicados en la tabla de unión.

Ejemplo 1: Movimiento Simple de Entrada (in)

Section titled “Ejemplo 1: Movimiento Simple de Entrada (in)”

Suma existencias en la ubicación de destino definida en t10c5:

{
"movement_direction": "in",
"target_table": "table9",
"target_field": "t9c3",
"qty_field": "t10c2",
"transfer_columns": {
"destination": "t10c5",
"target": "t9c0"
},
"match_columns": [
{ "source": "t10c0", "target": "t9c1" }
],
"in_out_property": {
"column": "t10c1",
"in": "ENTRADA"
}
}

Ejemplo 2: Movimiento de Salida (out) con object_list_sync

Section titled “Ejemplo 2: Movimiento de Salida (out) con object_list_sync”

Resta existencias y crea un registro de consumo en la tabla de detalles (tableB_detail), enlazándolo automáticamente con la tabla principal del activo (table16) mediante la junction (junction_tableB_tableB_detail):

{
"movement_direction": "out",
"target_table": "table15",
"target_field": "t15c8",
"target_table_b": "table16",
"transfer_columns": {
"origin": "t12c5",
"target": "t15c5"
},
"match_columns": [
{ "source": "t12c1", "target": "t15c0" }
],
"target_b_match": {
"source_column": "t12c3",
"target_column": "t16c1"
},
"target_b_create_map": [
{ "source": "t12c3", "target": "t16c1" },
{ "source": "t12c4", "target": "t16c2" },
{ "value": "ACTIVO", "target": "t16c9" }
],
"object_list_sync": {
"apply_on_directions": ["out"],
"foreign_table": "tableB_detail",
"extra_match_target": "t21c_tipo",
"junction_table": "junction_tableB_tableB_detail",
"junction_object_list_column": "t16c8",
"foreign_create_map": [
{ "source": "t12c0", "target": "t21c0" },
{ "source": "t12c1", "target": "t21c1" }
],
"ignore_duplicates": true
},
"qty_mappings": [
{
"qty_field": "t12c7",
"extra_match": { "target": "t21c_tipo", "value": "BUENAS" }
},
{
"qty_field": "t12c8",
"extra_match": { "target": "t21c_tipo", "value": "SCRAP" }
}
]
}