Transferencia de Inventario (inventory_transfer)
La automatización inventory_transfer permite gestionar movimientos bidireccionales de mercancía utilizando una única fila de origen. En este flujo, el registro indica explícitamente una ubicación de Origen (de donde sale el stock) y una ubicación de Destino (donde entra).
Cómo Funciona
Section titled “Cómo Funciona”Al guardar un registro en la tabla de origen, el sistema realiza tres acciones en una sola transacción:
- Resta en el Origen: Localiza la fila en la tabla destino que coincide con los criterios en
match_columnsy la ubicación de origen (transfer_columns.origin). Resta la cantidad indicada.- Si el inventario en el origen llega a cero o menos (
<= 0), la fila se elimina automáticamente para mantener limpia la tabla de existencias.
- Si el inventario en el origen llega a cero o menos (
- Suma en el Destino: Busca la fila que coincide con
match_columnsy la ubicación de destino (transfer_columns.destination). Suma la cantidad.- Si no existe un registro para esa combinación en la ubicación destino, se crea automáticamente.
- Validación de Existencias: Habitualmente se combina con la regla
validation_savepara verificar si el origen cuenta con saldo suficiente antes de autorizar el traspaso.
Soporte para Fallbacks (Sustitución de Categorías)
Section titled “Soporte para Fallbacks (Sustitución de Categorías)”Cuando se utiliza la propiedad qty_mappings, el sistema admite la regla fallback_match. Esto es muy útil en almacenes que manejan categorías de calidad (por ejemplo, BUENAS y SCRAP):
- Si intentas transferir una cantidad de la categoría principal (ej. SCRAP) pero no hay saldo suficiente en la ubicación de origen, el motor calcula el déficit.
- Si se define un fallback (ej. BUENAS), el sistema descontará la diferencia disponible de la categoría principal y tomará el saldo restante de la categoría de fallback en el origen.
- En la ubicación destino, sin importar de dónde se restó en el origen, el registro recibirá la cantidad completa bajo la categoría principal configurada en
extra_match.
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_transfer:
Propiedades Requeridas
Section titled “Propiedades Requeridas”target_table: La tabla donde se almacena el stock (ej.table7).target_field: La columna numérica de stock (ej.t7c7).qty_field(Opcional si usas mappings): Columna de cantidad a transferir.transfer_columns: Objeto que define las columnas de ubicaciones:origin: Columna origen de la fila actual.destination: Columna destino de la fila actual.target: Columna de ubicación en la tabla destino de stock.
match_columns: Columnas de coincidencia de producto o lote.
Ejemplos de Configuración
Section titled “Ejemplos de Configuración”Ejemplo 1: Traspaso de Inventario Clásico (Simple)
Section titled “Ejemplo 1: Traspaso de Inventario Clásico (Simple)”En este ejemplo, transferimos una cantidad t8c7 del origen t8c5 al destino t8c6, y validamos que el origen tenga suficiente stock antes de guardar:
{ "target_table": "table7", "target_field": "t7c7", "qty_field": "t8c7", "transfer_columns": { "origin": "t8c5", "destination": "t8c6", "target": "t7c5" }, "match_columns": [ { "source": "t8c0", "target": "t7c0" } ], "validation_save": [ { "catch": "El inventario de origen no tiene cantidad suficiente", "logic": "lt", "value": "target_field", "formula": "target_qty", "property": "t8c7", "transfer": "origin" } ], "bulk_properties": ["t8c5", "t8c6"]}Ejemplo 2: Traspaso con Mapeo de Categorías y Sustitución (Fallback)
Section titled “Ejemplo 2: Traspaso con Mapeo de Categorías y Sustitución (Fallback)”En este ejemplo se definen dos columnas de cantidad independientes en el origen (t8c7 y t8c8). Si no hay suficiente cantidad en la categoría SCRAP al transferir, se tomará el saldo disponible de BUENAS en el origen:
{ "target_table": "table7", "target_field": "t7c7", "transfer_columns": { "origin": "t8c5", "destination": "t8c6", "target": "t7c5" }, "match_columns": [ { "source": "t8c0", "target": "t7c0" } ], "qty_mappings": [ { "qty_field": "t8c7", "extra_match": { "target": "t7c9", "value": "BUENAS" } }, { "qty_field": "t8c8", "extra_match": { "target": "t7c9", "value": "SCRAP" }, "fallback_match": { "target": "t7c9", "value": "BUENAS" } } ]}