Skip to content

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).


Al guardar un registro en la tabla de origen, el sistema realiza tres acciones en una sola transacción:

  1. Resta en el Origen: Localiza la fila en la tabla destino que coincide con los criterios en match_columns y 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.
  2. Suma en el Destino: Busca la fila que coincide con match_columns y 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.
  3. Validación de Existencias: Habitualmente se combina con la regla validation_save para 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.

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

  • 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.

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" }
}
]
}