Saltar al contenido principal

DSL Reference

Referencia completa del DSL (Domain Specific Language) para reglas de negocio en Fyso.

Estructura general

{
"type": "compute | validate | action",
"triggers": ["campo1", "campo2"],
"triggerType": "field_change | before_save | after_save | on_load",
"compute": { ... },
"validate": [ ... ],
"transform": { ... },
"actions": [ ... ]
}

Compute

Calcula valores automaticamente. Soporta varios formatos:

Formula simple (shorthand)

{
"compute": {
"total": "cantidad * precio"
}
}

El shorthand se normaliza internamente a:

{
"compute": {
"total": { "type": "formula", "expression": "cantidad * precio" }
}
}

Formula explicita

{
"compute": {
"iva": { "type": "formula", "expression": "subtotal * 0.21" },
"total": { "type": "formula", "expression": "subtotal + iva" }
}
}

Condicional

Calcula un valor basado en condiciones:

{
"compute": {
"descuento": {
"type": "conditional",
"conditions": [
{ "when": "cantidad >= 100", "then": "0.15" },
{ "when": "cantidad >= 50", "then": "0.10" },
{ "when": "cantidad >= 10", "then": "0.05" }
],
"default": "0"
}
}
}

Lookup

Busca un valor en otra entidad:

{
"compute": {
"precio_unitario": {
"type": "lookup",
"entity": "productos",
"matchField": "id",
"matchValue": "producto_id",
"resultField": "precio"
}
}
}
PropiedadTipoDescripcion
entitystringEntidad donde buscar
matchFieldstringCampo de la entidad destino para hacer match
matchValuestringCampo del registro actual con el valor a buscar
resultFieldstringCampo de la entidad destino cuyo valor retornar

Aggregate

Agrega valores de multiples registros de otra entidad:

{
"compute": {
"total_lineas": {
"type": "aggregate",
"entity": "lineas_factura",
"aggregateOp": "sum",
"aggregateField": "subtotal",
"filter": { "factura_id": "id" }
},
"cantidad_items": {
"type": "aggregate",
"entity": "lineas_factura",
"aggregateOp": "count",
"filter": { "factura_id": "id" }
}
}
}
PropiedadTipoDescripcion
entitystringEntidad a agregar
aggregateOpstringOperacion: "sum" o "count"
aggregateFieldstringCampo a sumar (requerido para sum)
filterobjectFiltro: { campo_destino: "campo_actual" }

Validate

Array de reglas de validacion:

{
"validate": [
{
"id": "precio_positivo",
"condition": "precio > 0",
"message": "El precio debe ser mayor a cero",
"severity": "error",
"field": "precio"
}
]
}
PropiedadTipoRequeridoDescripcion
idstringSiIdentificador unico de la validacion
conditionstringSiExpresion booleana que debe ser verdadera
messagestringSiMensaje de error si la condicion es falsa
severitystringSi"error" (bloquea guardado), "warning", "info"
fieldstringNoCampo al que asociar el error en la UI

Transform

Transforma valores de campos:

{
"transform": {
"nombre": { "type": "uppercase" },
"email": { "type": "lowercase" },
"descripcion": { "type": "trim" },
"precio": { "type": "round", "decimals": 2 }
}
}
TipoDescripcion
uppercaseConvierte a mayusculas
lowercaseConvierte a minusculas
trimElimina espacios al inicio y final
roundRedondea a N decimales

Actions

Efectos secundarios que se ejecutan despues de guardar:

{
"actions": [
{
"type": "update_related",
"entity": "pedidos",
"recordId": "pedido_id",
"data": {
"total": {
"type": "aggregate",
"entity": "lineas",
"aggregateOp": "sum",
"aggregateField": "subtotal",
"filter": { "pedido_id": "pedido_id" }
}
}
}
]
}

Operadores permitidos

CategoriaOperadores
Aritmeticos+, -, *, /
Comparacion>, <, >=, <=, ==, !=
Logicosand, or

Funciones permitidas

FuncionDescripcionEjemplo
round(x, n)Redondea a n decimalesround(total, 2)
coalesce(a, b)Primer valor no nulocoalesce(descuento, 0)
abs(x)Valor absolutoabs(diferencia)
min(a, b)Minimomin(stock, pedido)
max(a, b)Maximomax(precio, precio_minimo)
floor(x)Redondeo hacia abajofloor(cantidad)
ceil(x)Redondeo hacia arribaceil(horas)
len(s)Longitud de stringlen(nombre)
upper(s)Mayusculasupper(codigo)
lower(s)Minusculaslower(email)
trim(s)Eliminar espaciostrim(nombre)
now()Fecha y hora actualnow()
today()Fecha actualtoday()
Creado con Fyso