Valores Dinámicos en Propiedades (dynamic_values)
En la arquitectura de metadatos de Axol Systems, las propiedades (properties) de cualquier entidad cuentan con un diccionario de configuración ejecutable de tipo JSONB llamado dynamic_values.
Este objeto otorga comportamiento reactivo en tiempo de ejecución a los atributos de una entidad sin necesidad de alterar el código fuente de la aplicación cliente ni el esquema físico en PostgreSQL.
{ "dynamic_values": { "formula": "...", "visible": "...", "sum_obj_list": { ... }, "sum_from": { ... }, "lookup": "...", "snapshot": { ... }, "default": "...", "sequence": true, "only_read": true, "visible_in_create": false, "id_array": "...", "foreign_table": "...", "junction_table": "..." }}Clasificación General de Llaves
Section titled “Clasificación General de Llaves”Las llaves configurables dentro de dynamic_values se dividen en dos categorías fundamentales:
- Llaves Operativas: Funciones y directivas opcionales que pueden aplicarse a múltiples tipos de propiedades (números, texto, fechas, booleanos, virtuales, etc.) para alterar su cálculo en caliente, su visibilidad dinámica o realizar agregaciones estadísticas.
- Llaves de Propiedad: Configuraciones obligatorias o exclusivas para tipos de datos específicos (como colecciones
array, listas de objetosobjListy referenciasreference), requeridas para su correcto enlace con el modelo relacional y los componentes de interfaz.
Bloque I: Llaves Operativas (Comportamiento Opcional)
Section titled “Bloque I: Llaves Operativas (Comportamiento Opcional)”1. formula (Fórmulas y Cálculos Dinámicos)
Section titled “1. formula (Fórmulas y Cálculos Dinámicos)”La llave "formula" permite definir expresiones lógicas, aritméticas y de transformación que la aplicación cliente y el backend evalúan dinámicamente sobre los registros en caliente.
Sintaxis y Capacidades del Motor
Section titled “Sintaxis y Capacidades del Motor”A. Referencias a Columnas
Section titled “A. Referencias a Columnas”Para hacer referencia al valor de otra propiedad dentro del mismo objeto o contexto, se utiliza el código técnico de la columna (ej. t0c1, t0c2) o la sintaxis explícita con llaves {t0c1}.
B. Operadores Aritméticos Base
Section titled “B. Operadores Aritméticos Base”Admite operaciones matemáticas estándar con precedencia de operadores y agrupación mediante paréntesis (...):
- Suma (
+) - Resta (
-) - Multiplicación (
*) - División (
/)
C. Redondeo y Formateo de Resultados (round y r)
Section titled “C. Redondeo y Formateo de Resultados (round y r)”- Redondeo (
round):round(expresión, decimales, [dirección])- Permite especificar el número de decimales a conservar.
- Opcionalmente acepta una dirección de redondeo:
'up'(hacia arriba) o'down'(hacia abajo).
- Unidad de retorno (
r):r(unidad);or(unidad, round(decimales, dirección));- Establece la unidad de medida asignada al resultado del cálculo.
- Ejemplo:
r(USD, round(2, up)); t0c1 * t0c2
D. Evaluación Condicional Ternaria (if)
Section titled “D. Evaluación Condicional Ternaria (if)”Permite aplicar lógica condicional para retornar distintos valores según se cumpla o no una premisa:
- Sintaxis:
if : condición ? valor_si_verdadero : valor_si_falso - Operadores de comparación:
==,!=,>,>=,<,<=. - Ejemplo:
if : t0c1 > 100 ? t0c1 * 0.9 : t0c1
E. Acceso a Estados Anteriores ({snapshot:...})
Section titled “E. Acceso a Estados Anteriores ({snapshot:...})”Permite consultar el valor que tenía una columna antes de ser modificada en la sesión actual de edición:
- Sintaxis:
{snapshot:t0c1} - Uso común: Cálculo de variaciones netas, deltas de inventario o comparaciones históricas inmediatas.
F. Palabras Clave Especiales
Section titled “F. Palabras Clave Especiales”now: Retorna la fecha y hora actual del servidor/cliente.res: Hace referencia al resultado de la sentencia previa en fórmulas compuestas multilínea (separadas por punto y coma;).
G. Variables Locales (var)
Section titled “G. Variables Locales (var)”Permite declarar un arreglo var dentro de dynamic_values para definir sub-evaluaciones o agregaciones intermedias y utilizarlas limpiamente dentro de la expresión de formula.
- Identificadores admitidos: Numéricos (
0,1) o alias de texto ("entradas","salidas"). - Sintaxis de invocación:
var(id)o{var:id}. - Reutilización: Una misma variable puede referenciarse múltiples veces dentro de la fórmula (ej.
(var(0) - var(1)) / var(0)).
{ "formula": "var(entradas) - var(salidas)", "var": [ { "id": "entradas", "value": { "sum_obj_list": { "obj_list_column": "t0c1", "sum_columns": ["t1c1"], "filter": { "column": "t1c2", "value": "ENTRADA" } } } }, { "id": "salidas", "value": { "sum_obj_list": { "obj_list_column": "t0c1", "sum_columns": ["t1c1"], "filter": { "column": "t1c2", "value": "SALIDA" } } } } ]}2. visible (Visibilidad Dinámica por Expresión)
Section titled “2. visible (Visibilidad Dinámica por Expresión)”Controla si una propiedad debe ser renderizada o permanecer oculta en la interfaz de usuario en tiempo real, evaluando dinámicamente los datos del registro actual.
Formatos Aceptados
Section titled “Formatos Aceptados”- Booleano directo:
"visible": trueo"visible": false. - Expresión condicional dinámica: Permite definir una condición lógica mediante una cadena de texto ejecutada en caliente:
- Si la expresión evalúa a
true, el campo se muestra en el formulario o tabla. - Si evalúa a
false, el campo se oculta automáticamente sin alterar los datos del objeto.
- Si la expresión evalúa a
{ "visible": "t0c1 > 0"}{ "visible": "t0c2 == 'RECHAZADO'"}3. sum_obj_list (Sumatoria de Objetos en Lista Local)
Section titled “3. sum_obj_list (Sumatoria de Objetos en Lista Local)”Permite realizar cálculos de agregación (sumatoria) directamente sobre las colecciones de objetos relacionados mediante una propiedad de tipo ObjectList o sub-tabla perteneciente a la misma entidad.
Parámetros
Section titled “Parámetros”| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
obj_list_column | Texto | Sí | Código de columna de la propiedad de sub-tabla contenedora (ej. t0c1). |
sum_columns / target_field | Array / Texto | Sí | Columna o columnas numéricas de la tabla hija cuyos valores se sumarán. |
filter | Objeto | Opcional | Criterio de filtrado (column, value) para restringir los registros sumados. |
{ "sum_obj_list": { "obj_list_column": "items_pedido", "target_field": "t1c5" }}4. sum_from (Sumatoria Externa y Relacional)
Section titled “4. sum_from (Sumatoria Externa y Relacional)”Realiza cálculos de agregación dinámica sobre registros ubicados en tablas externas o sub-tablas relacionales asociadas al objeto actual.
Parámetros
Section titled “Parámetros”| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
table / target_table | Texto | Sí | Tabla o entidad externa donde residen los registros a sumar (ej. table20). |
column / target_field | Texto | Sí | Columna numérica que contiene el valor a sumar (ej. t20c1). |
match | Array | Opcional | Condiciones relacionales o de filtrado (local, foreign, from_form, value, op). |
sign_by | Objeto | Opcional | Asigna signo positivo o negativo según el valor de una columna discriminadora. |
formula | Texto | Opcional | Expresión matemática que opera sobre la sumatoria resultante mediante la variable this. |
Criterios en match y sign_by
Section titled “Criterios en match y sign_by”from_form: Permite enlazar dinámicamente una condición dematchcon el valor de un campo del formulario activo ({ "foreign": "t3c2", "from_form": "t5c2" }), haciendo que el cálculo reaccione a selecciones en tiempo real (por ejemplo, filtrar existencias según el almacén actualmente seleccionado en el formulario).valuemúltiple: Acepta arreglos de valores (["CNC-1", "CNC-2"]) para comparacionesIN/NOT IN.op: Operador de comparación explícito:"eq","neq","gt","gte","lt","lte".sign_by: Permite balancear entradas y salidas en una sola agregación:
{ "sum_from": { "table": "table20", "column": "t20c1", "match": [ { "local": "t19c0", "foreign": "t20c0" }, { "foreign": "t20c6", "value": ["SCRAP", "RECHAZO"], "op": "neq" } ], "sign_by": { "column": "t20c5", "positive": ["ENTRADA", "CONVERSION"], "negative": ["SALIDA"] } }}Expresiones Matemáticas Integradas (formula y this)
Section titled “Expresiones Matemáticas Integradas (formula y this)”El bloque sum_from admite el parámetro "formula", permitiendo operar directamente sobre el resultado acumulado de la agregación utilizando la variable reservada this:
{ "sum_from": { "table": "table10_stock", "column": "existencia", "match": [ { "local": "t3c1", "foreign": "id_producto" } ], "formula": "this - t3c5" }}this: Representa el valor numérico total acumulado resultante de la sumatoria previa desum_from.- Operaciones compuestas: Es posible combinar
thiscon cualquier operador aritmético y códigos de columnas del registro actual (por ejemplo, restar la cantidad capturadathis - t3c5para calcular el saldo remanente, o aplicar factores de conversión e impuestosthis * 1.16).
5. lookup (Resolución de Propiedades Foráneas y Rutas Relacionales)
Section titled “5. lookup (Resolución de Propiedades Foráneas y Rutas Relacionales)”La llave "lookup" permite proyectar en caliente el valor de una propiedad perteneciente a otra entidad foránea relacionada, sin necesidad de duplicar ni persistir información redundante en la base de datos física.
Se utiliza comúnmente en propiedades virtuales o de solo lectura que deben mostrar datos contextuales del registro relacionado (por ejemplo, mostrar el nombre o RFC de un cliente a partir de su ID de referencia).
Formatos de Definición y Rutas de Acceso
Section titled “Formatos de Definición y Rutas de Acceso”A. Enlace Directo a Columna Foránea
Section titled “A. Enlace Directo a Columna Foránea”Indica directamente el código de la columna foránea que se desea proyectar desde la entidad asociada a la referencia actual:
{ "lookup": "t1c3"}B. Ruta Encadenada Multi-Nivel (Path)
Section titled “B. Ruta Encadenada Multi-Nivel (Path)”Cuando la información requerida se encuentra a más de un nivel de distancia relacional (por ejemplo: Registro Actual ➔ Referencia A ➔ Referencia B ➔ Columna Destino), se especifica una ruta separada por comas indicando la secuencia de columnas intermedias hasta la columna final:
{ "lookup": "t0c4, t1c2"}t0c4: Código de la propiedad de tiporeferenceen el objeto actual.t1c2: Código de la columna destino en el objeto foráneo enlazado.
C. Compatibilidad con Sub-tablas e Inversas
Section titled “C. Compatibilidad con Sub-tablas e Inversas”El motor de resolución de lookup soporta traversal automático a través de:
- Propiedades de tipo
reference. - Registros pertenecientes a sub-tablas (
objList). - Sub-tablas inversas donde el registro hijo accede a los atributos del objeto primario padre mediante
primary_table.
Ejemplo de Configuración JSON
Section titled “Ejemplo de Configuración JSON”{ "virtual": { "is": true }, "lookup": "t0c1, t2c5"}6. snapshot (Persistencia Inmutable de Cálculos)
Section titled “6. snapshot (Persistencia Inmutable de Cálculos)”Por defecto, las propiedades calculadas mediante sum_from o formula se revalúan dinámicamente en tiempo de ejecución. Al incorporar la directiva "snapshot", el valor resultante calculado al momento de guardar se estampa físicamente en la columna correspondiente de la tabla de PostgreSQL, congelando el dato y evitando recálculos posteriores que pudieran distorsionar la integridad histórica.
Esta funcionalidad es fundamental para preservar:
- Costos unitarios históricos o precios pactados al momento de emitir una orden.
- Saldo o existencias resultantes al momento exacto de un movimiento de inventario (Kardex).
- Totales facturados inalterables ante cambios futuros de listas de precios o tipos de cambio.
Formatos y Parámetros
Section titled “Formatos y Parámetros”- Booleano directo:
"snapshot": truehabilita la persistencia física del valor calculado con la configuración predeterminada (update_on_edit: false). - Objeto de configuración: Permite regular si el valor debe recalcularse al editar registros:
{ "snapshot": { "update_on_edit": false }}| Parámetro | Tipo | Por Defecto | Descripción |
|---|---|---|---|
update_on_edit | Booleano | false | Si es false, el valor congelado en la creación inicial se preserva inmutable incluso si el registro se abre y guarda nuevamente en edición. Si es true, revalúa la fórmula o sumatoria y sobreescribe la columna física al modificar el registro. |
7. default (Valores por Defecto y Tokens Dinámicos)
Section titled “7. default (Valores por Defecto y Tokens Dinámicos)”Permite inicializar y precargar automáticamente valores en los campos durante la apertura del formulario de creación de un nuevo objeto (ctxFormCreate), agilizando la captura y garantizando la consistencia de datos de auditoría y fechas.
Valores Admitidos
Section titled “Valores Admitidos”-
Valores Literales Estáticos:
- Cadenas de texto:
"PENDIENTE","NORMAL". - Valores numéricos:
0,100. - Booleanos:
true,false.
- Cadenas de texto:
-
Tokens Dinámicos de Sesión y Contexto:
{user.name}: Nombre completo o alias del usuario actualmente autenticado en la sesión.{user.id}: UUID del usuario en sesión.{user.rol}/{user.role}: Rol o nivel de seguridad del usuario activo.{today}: Fecha actual del sistema en formato ISO (YYYY-MM-DD).{now}: Fecha y hora exacta actual en formato ISO (YYYY-MM-DD HH:mm:ss).
-
Plantillas Compuestas Interpoladas: Permite mezclar texto fijo con uno o múltiples tokens contextuales dentro de una misma cadena:
{ "default": "Registrado por {user.name} ({user.rol}) el {today}"}{ "default": "{today}"}8. sequence (Generación Correlativa Automática)
Section titled “8. sequence (Generación Correlativa Automática)”Instruye al motor backend a calcular y asignar automáticamente el siguiente número correlativo o folio secuencial para la entidad en el momento exacto de persistir el registro en la base de datos.
{ "sequence": true}Características
Section titled “Características”- Garantía transaccional: El incremento se calcula de forma atómica en el servidor, evitando duplicidades o saltos de folio entre múltiples usuarios que capturen en paralelo.
- Integración habitual: Se combina usualmente con
"only_read": truepara impedir que el usuario altere el folio, o con"visible_in_create": falsesi se prefiere no mostrar el número hasta que el registro haya sido confirmado y guardado.
9. only_read / only_view (Bloqueo de Edición en Formularios)
Section titled “9. only_read / only_view (Bloqueo de Edición en Formularios)”Bloquea de forma incondicional la edición manual de un campo en los formularios de captura y actualización, manteniéndolo completamente visible y legible para el usuario.
{ "only_read": true}[!NOTE] La directiva acepta indistintamente
"only_read": trueo su alias equivalente"only_view": true.
Propósito y Casos de Uso
Section titled “Propósito y Casos de Uso”- Protección de cálculos e integridad: Impide la manipulación manual de columnas alimentadas por
sequence, cálculos deformula, estampados desnapshoto tokens de sesión endefault. - Diferencia con
block_field: Mientras queblock_fieldestá diseñado para evaluaciones condicionales complejas según el estado de otras columnas,only_readestablece un bloqueo permanente y ligero a nivel de interfaz.
10. visible_in_create (Visibilidad Contextual en Creación)
Section titled “10. visible_in_create (Visibilidad Contextual en Creación)”Regula si una propiedad debe mostrarse u ocultarse específicamente durante la fase de creación inicial de un nuevo registro (ctxFormCreate).
{ "visible_in_create": false}Comportamiento Contextual
Section titled “Comportamiento Contextual”- Al crear (
ctxFormCreate): Si está enfalse, el campo se omite visualmente en el formulario de alta inicial, reduciendo la sobrecarga cognitiva del operador. - Al editar (
ctxFormEdit) o consultar detalles: El campo se renderiza normalmente, permitiendo revisar folios asignados por el backend, estados calculados post-creación, firmas o fechas de resolución. - Diferencia con
visible: La llavevisibleevalúa expresiones condicionales sobre datos para ambos modos (creación y edición), mientras quevisible_in_createactúa como un interruptor de flujo exclusivo para la fase de alta.
11. Otras Llaves Operativas
Section titled “11. Otras Llaves Operativas”| Llave | Tipo | Uso / Descripción |
|---|---|---|
visible_in | Array | Lista explícita de vistas o modos de la interfaz donde la propiedad está habilitada (ej. ["form_create", "form_edit"]). |
virtual (Deprecación planeada) | Objeto | Declara que la propiedad es virtual y no genera columna física en la tabla de PostgreSQL ({ "is": true, "visible_in": [...] }). Aviso: Se planea dejar de usar esta llave en una próxima actualización. |
block_field | Objeto / Expresión | Bloquea la edición del campo en la interfaz bajo condiciones dinámicas evaluadas en tiempo real. |
valid_save | Objeto | Regla de validación condicional previa al guardado a nivel de campo. |
max_obj_list | Objeto | Establece un límite máximo de elementos hijos permitidos en una sub-tabla. |
Bloque II: Llaves de Propiedad (Configuración Estructural)
Section titled “Bloque II: Llaves de Propiedad (Configuración Estructural)”Estas llaves son requeridas para la inicialización y funcionamiento de tipos de propiedades específicos.
1. Propiedades de Colección y Selectores (Prop.array)
Section titled “1. Propiedades de Colección y Selectores (Prop.array)”Las propiedades de tipo array representan selectores simples (Dropdown) o multiselectores basados en catálogos de opciones estandarizados.
{ "dynamic_values": { "id_array": "c4b3a1d2-0000-0000-0000-000000000001", "allowed_values": { "t0c2 == 'ACTIVO'": ["OPCION_A", "OPCION_B"] } }}Llaves Disponibles
Section titled “Llaves Disponibles”| Llave | Tipo | Obligatoria | Descripción |
|---|---|---|---|
id_array | UUID / String | Sí | Identificador único del catálogo de opciones registrado en la tabla arrays de PostgreSQL. Vincula las opciones seleccionables (array_list) o valores atómicos (atomic_values). |
allowed_values | Objeto / Array | No | Regla de restricción dinámica que limita las opciones disponibles del catálogo según el valor de otra propiedad del registro. |
2. Propiedades de Lista de Objetos y Sub-tablas (Prop.objList)
Section titled “2. Propiedades de Lista de Objetos y Sub-tablas (Prop.objList)”Las propiedades de tipo objList representan colecciones de registros secundarios (sub-tablas relacionales 1:N o N:M) embebidas dentro de la entidad principal.
{ "dynamic_values": { "foreign_table": "table_partes_detalle", "junction_table": "junction_ordenes_partes", "column_show": ["t2c1", "t2c2", "t2c3"], "sort": { "column": "t2c1", "ascending": true }, "filters": [ { "column": "t2c4", "op": "eq", "value": "ACTIVO" } ], "inherit": { "t2c5": "t0c1" } }}Llaves Disponibles
Section titled “Llaves Disponibles”| Llave | Tipo | Obligatoria | Descripción |
|---|---|---|---|
foreign_table | Texto | Sí | Nombre físico de la tabla foránea secundaria donde se almacenan y consultan los registros hijos del objList. |
junction_table | Texto | Sí* | Nombre de la tabla física intermedia de unión (junction) que almacena las parejas de claves primarias (id_obj_primary_table e id_obj_foreign_table). Requerida en relaciones intermedias N:M. |
primary_table | Texto | Condicional | Nombre de la tabla del objeto primario en sub-tablas inversas, permitiendo al registro secundario acceder a la información de su objeto contenedor. |
column_show | Array (String[]) | No | Lista blanca explícita de códigos de columnas de la entidad hija a mostrar. Oculta automáticamente todas las demás. |
column_hide | Array (String[]) | No | Lista de códigos de columnas de la entidad hija (["t2c0", "t2c4"]) que se ocultan de forma predeterminada en la vista embebida de la sub-tabla. |
sort | Objeto | No | Define el criterio de ordenamiento inicial para los elementos de la sub-tabla (column, ascending). |
filters | Array (ObjListFilter[]) | No | Filtros persistentes predefinidos para condicionar qué registros hijos se despliegan en la sub-tabla. |
inherit | Objeto | No | Mapeo de sincronización/herencia de campos desde el objeto contenedor padre hacia los ítems hijos al crearlos ({ "col_hijo": "col_padre" }). |
column_filter | Objeto | No | Regla para filtrar dinámicamente las filas o columnas visibles de la sub-tabla en función del valor de otra propiedad del objeto primario. |
Comportamiento en Relaciones Directas 1:N
Section titled “Comportamiento en Relaciones Directas 1:N”Cuando la colección opera bajo una relación directa estrictamente 1 a N, el sistema detecta automáticamente la cardinalidad y oculta el botón de vincular registros existentes (“Agregar existente”). De esta manera, se restringe la interacción exclusivamente a la creación y gestión de nuevos registros dependientes.
Selección Explícita de Columnas (column_show)
Section titled “Selección Explícita de Columnas (column_show)”El parámetro column_show define de forma positiva y explícita qué columnas de la entidad foránea se muestran en la cuadrícula de la sub-tabla o vista embebida:
{ "column_show": ["t2c1", "t2c2", "t2c5"]}- Ventaja respecto a
column_hide: En entidades foráneas con un número elevado de atributos, evita tener que enumerar decenas de columnas a ocultar, garantizando que solo las columnas necesarias permanezcan visibles.
Filtros Persistentes (filters / ObjListFilter)
Section titled “Filtros Persistentes (filters / ObjListFilter)”Permite aplicar condiciones de filtrado fijas a la colección secundaria desplegada en la sub-tabla:
{ "filters": [ { "column": "t2c4", "op": "eq", "value": "ACTIVO" } ]}- Campos soportados:
column(código de columna foránea),op(operador relacional:"eq","neq","gt","gte","lt","lte","in"), yvalue(valor de comparación o lista de valores).
Herencia Automática de Valores (inherit)
Section titled “Herencia Automática de Valores (inherit)”Sincroniza y precarga automáticamente valores desde las columnas del registro principal padre hacia las columnas correspondientes de las nuevas filas creadas dentro de la sub-tabla:
{ "inherit": { "t2c5": "t0c1", "t2c8": "t0c3" }}- Estructura: Diccionario donde cada clave corresponde al código de columna del registro hijo (
"col_hijo"), y cada valor corresponde al código de columna del registro contenedor padre ("col_padre"). - Beneficio: Elimina errores de captura y evita que el usuario tenga que seleccionar manualmente claves foráneas o contextos repetitivos (como folios, almacenes o proyectos vinculados).
3. Propiedades de Referencia (Prop.reference)
Section titled “3. Propiedades de Referencia (Prop.reference)”Las propiedades de tipo reference almacenan identificadores foráneos (UUID) que apuntan a un único objeto de otra entidad del sistema.
{ "dynamic_values": { "reference_table": "table_productos", "reference_link": "t0c4" }}Llaves Disponibles
Section titled “Llaves Disponibles”| Llave | Tipo | Obligatoria | Descripción |
|---|---|---|---|
reference_table | Texto | Sí | Nombre físico de la tabla destino donde reside el objeto foráneo consultado. |
reference_link | Texto | No | Código de propiedad vinculada para establecer selecciones dependientes en cascada entre referencias. |
foreign_virtual | Objeto | No | Inyección de propiedades virtuales calculadas en el modal de selección de catálogo (ReferenceSelectDialog). |
filters | Array | No | Filtros dinámicos para el catálogo foráneo, compatibles con condiciones reactivas de formulario (when). |
Inyección de Propiedades Virtuales (foreign_virtual)
Section titled “Inyección de Propiedades Virtuales (foreign_virtual)”Permite inyectar columnas calculadas en tiempo real dentro del diálogo modal de selección de registros (ReferenceSelectDialog o multi_reference_view), sin necesidad de añadir columnas físicas ni persistir datos redundantes en la tabla foránea:
- Casos de uso: Visualizar existencias disponibles en vivo mediante
sum_from, precios vigentes calculados o indicadores de estado antes de confirmar la selección.
Contexto de Formulario Activo (from_form en sum_from)
Section titled “Contexto de Formulario Activo (from_form en sum_from)”Dentro de la sección match de una agregación sum_from (en foreign_virtual o referencias), el atributo from_form vincula una columna de la tabla foránea con el valor de un campo del formulario actual:
{ "foreign": "t3c2", "from_form": "t5c2" }Esto permite que los cálculos del modal respondan al contexto seleccionado en la cabecera del documento (por ejemplo, calcular el stock filtrado estrictamente por el almacén seleccionado en el formulario).
Filtros Condicionales Reactivos (when en filters)
Section titled “Filtros Condicionales Reactivos (when en filters)”Permite aplicar filtros dinámicos al catálogo foráneo condicionados al estado del formulario activo:
{ "reference_table": "table_productos", "foreign_virtual": { "column": "v_stock_actual", "name": "Stock Disponible", "type": 2, "dynamic_values": { "virtual": { "is": true }, "sum_from": { "table": "table_movimientos", "column": "t3c5", "sign_by": { "column": "t3c4", "positive": ["ENTRADA", "COMPRA"], "negative": ["SALIDA", "VENTA", "MERMA"] }, "match": [ { "local": "id_table_productos", "foreign": "t3c1" }, { "foreign": "t3c2", "from_form": "t5c2" } ] } } }, "filters": [ { "column": "v_stock_actual", "op": "gt", "value": 0, "when": { "column": "t5c1", "op": "eq", "value": "SALIDA" } } ]}- Comportamiento reactivo: Si el tipo de movimiento (
t5c1) en el formulario es"SALIDA", la condiciónwhense cumple y el catálogo oculta productos sin existencias (v_stock_actual > 0). Si el movimiento es"ENTRADA", la condición no se cumple y el selector despliega todos los productos.
Resumen Comparativo de Tipos y Llaves
Section titled “Resumen Comparativo de Tipos y Llaves”| Tipo de Propiedad | Llaves de Propiedad Obligatorias | Llaves de Propiedad Opcionales | Llaves Operativas Compatibles |
|---|---|---|---|
| Texto / Numérico / Fecha / Bool | Ninguna | Ninguna | formula, visible, visible_in, visible_in_create, only_read, sequence, default, virtual, lookup, block_field, valid_save |
Colección / Selector (array) | id_array | allowed_values | visible, visible_in, visible_in_create, only_read, default, block_field, valid_save |
Lista de Objetos (objList) | foreign_table, junction_table | column_show, column_hide, sort, filters, inherit, column_filter, primary_table | visible, visible_in, visible_in_create, max_obj_list, sum_obj_list |
Referencia (reference) | reference_table | reference_link, foreign_virtual, filters | visible, visible_in, visible_in_create, only_read, default, lookup, block_field, valid_save |
Virtual / Calculada (formula) | Ninguna | var | formula, visible, visible_in, visible_in_create, only_read, snapshot, virtual, sum_from, sum_obj_list |