Solicitud de Movimiento (request_movement)
La automatización request_movement gestiona solicitudes de movimiento de inventario que requieren aprobación antes de verse reflejadas en el stock de una ubicación.
Al insertar un registro en la tabla de origen (Tabla A), el sistema no altera el inventario de inmediato. En su lugar, crea un registro de solicitud en la tabla del sistema node_requests con estado "sent". Una vez que el usuario responsable en el nodo destino aprueba la solicitud, el motor aplica de forma automática un movimiento de entrada (inventory_movement en dirección in) sobre la tabla de inventario final (Tabla B).
Cómo Funciona
Section titled “Cómo Funciona”- Creación de la Solicitud: Al insertar una fila en la tabla de origen, se lee la información para resolver los nodos de origen y destino, el usuario solicitante y el mensaje.
- Generación del Payload: Se crea un registro en
node_requestscon los datos de las columnas origen, cantidades y criterios de coincidencia. - Resolución de Nodos: Las propiedades
request_target_nodeyrequest_source_nodese resuelven dinámicamente. Pueden ser un número entero fijo (ID del nodo), un texto descriptivo (nombre del nodo) o una referencia a una propiedad de la fila actual usandoprop(columna). - Impacto al Aprobar: Cuando la solicitud es aprobada en la interfaz:
- El sistema busca el registro coincidente en la tabla destino (Tabla B) según
match_columnsy la ubicación de destino (transfer_columns.target). - Si existe la fila en la tabla destino: Suma la cantidad del campo
qty_fielden el campotarget_field. - Si la fila NO existe: Crea un registro nuevo con dicha cantidad.
- El sistema busca el registro coincidente en la tabla destino (Tabla B) según
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 request_movement:
Propiedades Requeridas
Section titled “Propiedades Requeridas”target_table: Tabla de stock destino donde se sumará la cantidad al aprobarse la solicitud (ej.tableB).target_field: Columna numérica de existencias en el destino (ej.t15c8).qty_field: Columna de cantidad en la tabla origen (ej.t12c7).request_target_node: Nodo encargado de revisar y aprobar la solicitud. Admite ID numérico, nombre de nodo, oprop(columna).match_columns: Criterios de coincidencia para buscar la fila de existencias (soporta tanto columnas origen como valores constantes o la palabra clave"id_source"para referirse al ID de la fila origen).transfer_columns: Ubicación del movimiento:destination: Dónde se guardará la entrada en el destino. Admite:- Nombre de columna de origen (ej.
"t12c6"). - Constante directa (ej.
"Almacén Principal"). - Formato explícito:
"value(Almacén Principal)".
- Nombre de columna de origen (ej.
target: Columna en la tabla destino que almacena la ubicación.
Propiedades Opcionales
Section titled “Propiedades Opcionales”request_source_node: Nodo que emite la solicitud (si no se especifica, se registra como vacío).request_user_name: Nombre fijo del usuario para la solicitud.request_user_field: Columna de origen desde donde leer el nombre del usuario.message_template: Mensaje personalizado que se mostrará en el cajón de notificaciones de los aprobadores.
Ejemplo de Configuración Completa
Section titled “Ejemplo de Configuración Completa”El siguiente ejemplo genera una solicitud de aprobación para que el Nodo 2 autorice una entrada de stock en tableB proveniente de un registro en tableA:
{ "target_table": "tableB", "target_field": "t15c8", "qty_field": "t12c7", "request_target_node": 2, "request_source_node": "prop(t12c5)", "match_columns": [ { "source": "t12c1", "target": "t15c0" }, { "target": "t15c9", "value": "ACTIVO" }, { "source": "id_source", "target": "t15c10" } ], "transfer_columns": { "destination": "t12c6", "target": "t15c5" }, "message_template": "Solicitud de entrada de mercancía pendiente de aprobación"}