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.
Cómo Funciona
Section titled “Cómo Funciona”- Determinación de Dirección:
- Si
movement_directiones"out"(salida): Lee la ubicación de origen desde la columna indicada entransfer_columns.origin. Resta la cantidad al stock. - Si
movement_directiones"in"(entrada): Lee la ubicación de destino desde la columna indicada entransfer_columns.destination. Suma la cantidad al stock.
- Si
- 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.
- 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.
Caso de Uso Común
Section titled “Caso de Uso Común”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).
Configuración de Reglas JSON
Section titled “Configuración de Reglas JSON”Estructura de propiedades requeridas dentro de rules para una automatización de tipo inventory_movement:
Propiedades Base
Section titled “Propiedades Base”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 esout).destination: Columna de ubicación destino en la fila actual (usada si la dirección esin).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 propiedadObjectList.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 propiedadObjectListen 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.
Ejemplos de Configuración
Section titled “Ejemplos de Configuració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" } } ]}