Transferencia en Secuencia (sequence_transfer)
La automatización sequence_transfer permite gestionar el flujo de piezas o mercancías a lo largo de una secuencia lineal de operaciones o etapas (por ejemplo, rutas de producción industrial como Corte $\rightarrow$ Desbarbado $\rightarrow$ Soldadura $\rightarrow$ Pintura $\rightarrow$ Ensamble).
A diferencia de inventory_transfer (que requiere definir manualmente una ubicación origen y destino en cada registro), sequence_transfer deduce automáticamente la operación origen (actual) y la siguiente operación en la secuencia (destino) utilizando el orden numérico y las relaciones del proceso.
Cómo Funciona
Section titled “Cómo Funciona”El proceso se activa mediante botones de interfaz (automation_buttons) asociados a un registro de operación. Al presionar el botón, el sistema ejecuta el siguiente flujo:
graph LR
A["Operación Actual (Origen)"] -->|sequence_column + 1| B["Operación Siguiente (Destino)"]
A -->|Resta Stock| C["Genera Registro SALIDA"]
B -->|Suma Stock| D["Genera Registro ENTRADA"]
-
Identificación del Siguiente Nodo:
- Lee el valor numérico de la operación actual en la columna especificada por
sequence_column(ej.1.0,2.0,3.0). - Agrupa las operaciones pertenecientes a la misma orden o producto mediante
sequence_path(que soporta enlaces mediante tablas junction). - Busca en la base de datos la siguiente operación perteneciente al mismo grupo con un número de secuencia strictly mayor (
sequence_column > origin_seq ORDER BY sequence_column ASC LIMIT 1).
- Lee el valor numérico de la operación actual en la columna especificada por
-
Impacto Doble (Salida y Entrada):
- En el Origen: Registra un movimiento de SALIDA (
origin_type_value, por defecto'SALIDA') descontando el stock correspondiente de la operación actual. - En el Destino: Registra un movimiento de ENTRADA (
destination_type_value, por defecto'ENTRADA') incrementando el stock en la siguiente operación.
- En el Origen: Registra un movimiento de SALIDA (
-
Última Operación de la Secuencia (
isLastStep):- Si no existe una operación posterior en la secuencia, el sistema detecta que la operación actual es el nodo final.
- En este escenario, la automatización únicamente registrará la Salida (despacho final o producto terminado) y la interfaz mostrará una advertencia indicando que se trata del último paso.
Modalidades Especiales
Section titled “Modalidades Especiales”1. Entrada Directa (direct_entry)
Section titled “1. Entrada Directa (direct_entry)”Permite ingresar stock o registrar piezas en una operación sin necesidad de que provengan de una etapa previa (por ejemplo, piezas iniciales, materia prima fresca o correcciones de inventario).
- Se puede habilitar mediante un interruptor (Switch) dentro del diálogo de transferencia.
- También se puede configurar para aparecer como un botón secundario en la barra de herramientas (por ejemplo, un botón “Ingresar” junto al botón principal “Transferir”).
- En el modo de entrada directa, solo se genera el registro de ENTRADA en la operación de destino elegida.
2. Manejo de Almacenes Intermedios (warehouse)
Section titled “2. Manejo de Almacenes Intermedios (warehouse)”En muchos procesos industriales existen almacenes o áreas de retención entre procesos (ej. Almacén de Cortes, Almacén de Retrabajo). sequence_transfer permite mapear operaciones a almacenes específicos mediante la propiedad warehouse:
- Categorización de Campos: En
form_fields, las cantidades se pueden marcar comostock: "main"(stock de proceso) ostock: "warehouse"(stock en almacén intermedio). - Validación de Saldos: Si se solicita transferir o despachar desde un almacén intermedio, el motor verifica la existencia de stock disponible en la operación asociada al almacén antes de autorizar el movimiento.
- Transacciones de Despacho y Conversión: Si se transfiere desde stock de almacén a proceso o se despacha material, el sistema genera automáticamente los pares de registros de
SALIDAyENTRADAcorrespondientes para mantener el balance exacto entre el proceso principal y los almacenes intermedios.
Configuración de Reglas JSON
Section titled “Configuración de Reglas JSON”Para registrar una automatización de tipo sequence_transfer, define las siguientes propiedades dentro del objeto rules:
Propiedades Principales
Section titled “Propiedades Principales”| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
sequence_column | Texto | Sí | Columna que indica el número o secuencia de la operación (ej. secuencia, n_orden, t1c4). |
sequence_path | Texto | Recomendado | Ruta de propiedades o columnas para agrupar las operaciones bajo la misma orden padre (ej. id_orden o id_orden, junction_ordenes_operaciones). |
target_path | Texto | Recomendado | Tabla de destino donde se guardarán los movimientos (ej. parciales o el nombre de una propiedad de lista/junction). Por defecto: parciales. |
stock_column | Texto | Opcional | Columna de stock o piezas disponibles en la operación origen para validar que no se transfiera una cantidad mayor a la existente. |
display_column | Texto | Opcional | Columna cuyo valor sirve como etiqueta legible de la operación (ej. nombre_operacion, proceso). |
type_column | Texto | Opcional | Columna que almacena el tipo de movimiento en la tabla destino. Por defecto: tipo_movimiento. |
origin_type_value | Texto | Opcional | Valor grabado para movimientos de salida. Por defecto: 'SALIDA'. |
destination_type_value | Texto | Opcional | Valor grabado para movimientos de entrada. Por defecto: 'ENTRADA'. |
form_fields | Lista | Sí | Lista de campos que se mostrarán en el formulario modal para ingresar cantidades u observaciones. |
info_fields | Lista | Opcional | Lista de campos de la operación origen que se mostrarán como texto informativo de lectura en la cabecera del diálogo. |
column_hide | Lista / Texto | Opcional | Columnas que deben ocultarse explícitamente en el diálogo de transferencia. |
default_now_fields | Lista | Opcional | Lista de campos de fecha/hora que se inicializarán automáticamente con la fecha y hora actual (now). |
default_current_date | Booleano | Opcional | Si se establece en true, inicializa todos los campos de tipo fecha/hora con la fecha actual. |
direct_entry | Varios | Opcional | Configuración para activar el modo de entrada directa (ver sección abajo). |
warehouse | Lista / Mapa | Opcional | Reglas para integrar y balancear almacenes intermedios (ver sección abajo). |
Configuración Detallada de form_fields
Section titled “Configuración Detallada de form_fields”Los elementos de form_fields se pueden especificar como simples cadenas con los nombres de las columnas (ej. ["qty_buenas", "qty_scrap"]), o como objetos con opciones avanzadas:
{ "column": "t20c1", "default": "now", "stock": "main", "visible": "{only_not: [DEBURR, WELD]}"}column: Nombre de la columna física en la tabla destino.default: Valor inicial por defecto ("now","today", o cualquier valor estático).stock:main(stock de piezas principales en proceso) owarehouse(stock en almacén intermedio).visible: Regla para mostrar u ocultar dinámicamente este campo según la operación actual.
Reglas Condicionales (evaluateSequenceRule)
Section titled “Reglas Condicionales (evaluateSequenceRule)”Las propiedades como visible, direct_entry y warehouse aceptan expresiones condicionales flexibles que se evalúan comparando contra la etiqueta de la operación actual (display_column):
- Booleano:
trueofalse. - String único:
"Inventario A"(coincide solo si la operación se llama Inventario A). - Lista JSON:
["Inventario A", "Inventario B"](coincide si la operación es Inventario A o Inventario B). - String codificada:
"[Inventario A, Inventario B]". - Negación / Exclusión (
only_not):"{only_not: Inventario A}"(visible en todas las operaciones excepto Inventario A)."{only_not: [Inventario A, Inventario B]}"(visible en todas excepto Inventario A e Inventario B).
Configuración de Entrada Directa (direct_entry)
Section titled “Configuración de Entrada Directa (direct_entry)”La regla direct_entry se puede configurar en tres formatos:
- Booleano:
truehabilita el switch de entrada directa en todas las operaciones. - Regla de Filtro:
"Inventario A"o"{only_not: Inventario A}"habilita el switch solo en las operaciones que cumplan la regla. - Objeto con Botón Secundario:
{ "direct_entry": { "display_value": "[Inventario A, Inventario B]", "secondary_button": "Ingresar piezas" }}[!NOTE] Al configurar
secondary_button, el sistema creará automáticamente un botón secundario en la barra de herramientas del registro para abrir el diálogo directamente en modo Entrada Directa.
Ejemplos de Configuración
Section titled “Ejemplos de Configuración”Ejemplo 1: Secuencia de Producción Básica
Section titled “Ejemplo 1: Secuencia de Producción Básica”Ruta de producción simple donde el stock de piezas buenas se encuentra en la columna t1c8, el orden de la secuencia en t1c4 y el formulario solicita piezas buenas, scrap y fecha de movimiento:
{ "sequence_column": "t1c4", "sequence_path": "id_orden", "target_path": "parciales", "stock_column": "t1c8", "display_column": "t1c3", "type_column": "tipo_movimiento", "origin_type_value": "SALIDA", "destination_type_value": "ENTRADA", "form_fields": [ { "column": "qty_buenas", "stock": "main" }, { "column": "qty_scrap" }, { "column": "fecha_movimiento", "default": "now" } ], "info_fields": ["codigo_pieza", "lote"]}Ejemplo 2: Secuencia Avanzada con Almacén Intermedio y Botón Secundario
Section titled “Ejemplo 2: Secuencia Avanzada con Almacén Intermedio y Botón Secundario”Configuración para un flujo industrial con control de almacenes intermedios, visibilidad condicional de campos y botón secundario de ingreso directo:
{ "sequence_column": "secuencia", "sequence_path": "id_orden, junction_ordenes_operaciones", "target_path": "parciales", "stock_column": "stock_disponible", "display_column": "nombre_operacion", "type_column": "tipo_movimiento", "origin_type_value": "SALIDA", "destination_type_value": "ENTRADA", "direct_entry": { "display_value": "[CORTE, PINTURA]", "secondary_button": "Ingresar a Proceso" }, "form_fields": [ { "column": "qty_buenas", "stock": "main", "visible": "{only_not: ALMACEN_CORTE}" }, { "column": "qty_almacen", "stock": "warehouse", "visible": "[CORTE, ALMACEN_CORTE]" }, { "column": "fecha_registro", "default": "now" } ], "info_fields": ["lote_produccion", "cliente_nombre"], "warehouse": [ { "name": "ALMACEN CORTE", "values": "[CORTE, ALMACEN_CORTE]", "output_to": ["DESBARBADO", "SOLDADURA"] } ]}