Workflow expressies syntax
Concept
Workflow expressies worden geschreven in een door Camunda gecustomiseerde versie van JUEL (een op Java-gebaseerde expressietaal).
Klik hier om de officiële documentatie van JUEL te consulteren (let wel: niet alles wordt ondersteund).
Een expressie is pas uitvoerbaar als die tussen accolades genoteerd staat. Het geheel wordt door een $ dollarteken voorafgegaan.
${expressie}
Expressies hebben ook beperkingen. Heb je nood aan meer complexiteit (bijvoorbeeld itereren over lijstelementen)? Dan kan je gebruik maken van scripts.
Wil je een apart stukje code opstellen en deze vervolgens oproepen via een workflow expressie? Kijk dan onder de sectie extensies en customizaties.
Data types
Volgende data types zijn ondersteund binnen workflow expressies.
Data type | Voorbeeld waarde |
---|---|
Null | Geen waarde |
String | 'Hello World!' |
Boolean |
|
Integer | 15 (geheel getal, negatief of positief) |
Double | 15.5 (decimaal getal, negatief of positief) |
Datum | 2025-04-01T13:49:13 (altijd inclusief tijdsstempel) |
Data objecten
De data zit typisch in volgende Java-gebaseerde structuren.
Data structuur | Voorbeeld opbouw |
---|---|
Directe waarde | ‘Hello World!’ |
Lijst | ['value1','value2','value3'] |
Map | {“key1”:'value1',“key2”:'value2',“key3”:'value3'} |
Lijst-Map | [{“key1”:'value1',“key2”:'value2',“key3”:'value3'},{“key1”:'value1',“key2”:'value2',“key3”:'value3'},{“key1”:'value1',“key2”:'value2',“key3”:'value3'}] |
Omgaan met data objecten
Procesvariabelen met een complexere structuur zoals lijsten, maps en lijst-maps kan je op volgende manieren manipuleren vanuit een expressie. De mogelijkheden zijn erg beperkt. Via een workflow script kan je extra zaken doen zoals bijvoorbeeld waardes toevoegen aan of verwijderen uit een lijst.
Waarde ophalen
Je kan een waarde ophalen via volgende expressie.
${mijnVariabele}
Waarde uit een lijst ophalen
Je kan een waarde uit een lijst ophalen via de index.
$[mijnLijst[0]}
retourneert het eerste item in de lijst.
Aantal items in een lijst vaststellen
Lengte van een lijst vaststellen.
mijnLijst
= ['jan','mieke','paul']
${mijnLijst.size()}
retourneert het aantal items in de lijst als integer (bijvoorbeeld 3).
Waarde uit een map ophalen
Je kan een waarde uit een map ophalen via de key.
${mijnMap['leeftijd']}
retourneert de waarde van de key ‘leeftijd’ in de map.
Operatoren
Booleaanse operatoren
Operator | Beschrijving | Data types |
---|---|---|
&& | Verbindt twee booleaanse waardes. Indien de twee waardes | Boolean |
|| | Verbindt twee booleaanse waardes. Vanaf het ogenblik dat één van beide waardes (of allebei) | Boolean |
Vergelijkende operatoren
Operator | Beschrijving | Data types |
---|---|---|
== | Vergelijk twee waardes met elkaar. Indien identiek, retourneert de expressie | String, boolean, number, date |
!= | Vergelijk twee waardes met elkaar. Indien identiek, retourneert de expressie | String, boolean, number, date |
< | Vergelijkt twee waardes met elkaar. Indien waarde A kleiner dan waarde B, retourneert de expressie | Number, date |
> | Vergelijkt twee waardes met elkaar. Indien waarde A groter dan waarde B, retourneert de expressie | Number, date |
<= | Vergelijkt twee waardes met elkaar. Indien waarde A kleiner of gelijk aan waarde B, retourneert de expressie | Number, date |
>= | Vergelijkt twee waardes met elkaar. Indien waarde A groter of gelijk aan waarde B, retourneert de expressie | Number, date |
Logische statements
Statement | Beschrijving |
---|---|
[boolean] ? [functie A] : [functie B] | Indien boolean |
[(getal A + getalB) * 3] / 2 | Via haakjes kan je verschillende numerieke bewerkingen groeperen en hiërarchisch met elkaar combineren. |
Functies
Functies worden aaneengeregen tot expressies via de Fluent API methodiek (method chaining).
Functies gelinkt aan een Camunda service
Onderstaande is een lijst van Camunda proces functies die je kan gebruiken om procesinstanties, procesvariabelen, taken, activiteiten, messages, signals enzovoort te manipuleren.
Case execution stopzetten
Documentatie volgt.
Message uitsturen
Typisch zal je onderstaande expressies gebruiken binnen een message send task.
Message sturen naar procesinstantie binnen één en hetzelfde dossier
Een message aanmaken en versturen binnen de huidige procesinstantie of naar een op basis van business key gerelateerde procesinstantie (d.w.z. een andere procesinstantie, maar binnen één en hetzelfde dossier). De message opvangen gebeurt via een message receive task of via een message catch event.
${runtimeService.createMessageCorrelation('jouwMessage').processInstanceBusinessKey(execution.processBusinessKey).correlate()}
Vul daarbij een message key in. Tip: je kan deze expressie opstellen via de workflow expression builder.
Message sturen naar procesinstantie binnen een ander dossier
Een message aanmaken en versturen naar een andere procesinstantie behorend tot een ander dossier binnen de applicatie. Typische Skryv use case is bulk workflows.
${execution.getProcessEngineServices().getRuntimeService().createMessageCorrelation("jouwMessage").processInstanceVariableEquals("dossierId", selectedDossier).correlateWithResult()}
Vul een message key in. De method .processInstanceVariableEquals(value1,value2)
laat toe om de andere procesinstantie te specifiëren. Zo stuur je de message enkel uit naar een procesinstantie waarvan de eigenschap value1
matcht met de waarde in value2
. In de voorbeeldexpressie hierboven wordt verwezen naar de eigenschap “dossierId”
. Je verstuurt de message dus enkel naar die procesinstantie met eigenschap (procesvariabele) dossierId
die matcht met de waarde in de variabele selectedDossier
. Concreet zal deze waarde een specifieke GUID zijn. De message opvangen gebeurt via een message receive task of via een message catch event in het ontvangende proces.
Het is ook mogelijk om variabelen mee te sturen via de message correlation. In onderstaand voorbeeld sturen we de variabele “mijnBoodschap”
mee. Deze wordt ingevuld vanuit de lokale variabele “mijnVariabele”
. De variabele “mijnBoodschap”
kan je dan weer opvangen en gebruiken in het proces dat de message ontvangt.
${execution.getProcessEngineServices().getRuntimeService().createMessageCorrelation("mijnBericht").processInstanceVariableEquals("dossierId", selectedDossier).setVariable("mijnBoodschap", execution.getVariableLocal("mijnVariabele")).correlateWithResult()}
Proces business key (dossier id) ophalen
Haalt de business key van het proces op. Dit is hetzelfde als het dossier id. Klik hier voor meer info over het verband tussen dossier- en procesinformatie.
${execution.processBusinessKey}
Je kan deze bijvoorbeeld via een listener op het start event in een procesvariabele “dossierId”
vatten. Use case binnen Skryv is het correct correleren van messages uitgestuurd vanuit een bulkworkflow.
${execution.setVariable("dossierId", execution.processBusinessKey)}
Procesvariabelen checken
Check of een specifieke procesvariabele aanwezig is binnen het proces.
${execution.hasVariable('mijnVariabele')}
Dit retourneert true
indien de variabele aanwezig is, en false
indien de variabele niet aanwezig is.
Procesvariabelen instellen
Hierbij kan je gebruik maken van twee systemen.
Gebruik een expressie zoals
${execution.setVariable(“mijnVariabele”,'Hello World!')}
Gebruik een expressie als
${'Hello World!'}
en definieer de naam van de procesvariabele in de taakeigenschap‘Resultaatvariabele’
.
In de voorbeelden hieronder maken we gebruik van het eerste systeem.
Via directe input
Dit gebruik je bij een enkelvoudige datastructuur.
String
${execution.setVariable('mijnStringVariabele','Hello World!')}
Getal
${execution.setVariable('mijnGetalVariabele',99)}
Datum ('yyyy-MM-dd')
${execution.setVariable('mijnDatumVariabele',‘2025-05-30’)}
Via input variabele of input parameter
Hierbij moet je eerst een taak inputparameter instellen. Dit gebruik je om de complexere datastructuren zoals lijsten en maps aan te maken.
Lijst
Bijvoorbeeld mijnLijst
= ['paul','maria','jozef','antoon']
${execution.setVariable('mijnLijstVariabele',mijnLijst)}
Map
Bijvoorbeeld mijnMap
= {"geslacht":"man","leeftijd":"60","naam":"paul"}
${execution.setVariable('mijnMapVariabele',mijnMap)}
Procesvariabelen ophalen
Een procesvariabele is direct beschikbaar via zijn key. Het kan gaan om een enkelvoudige waarde zoals een string, getal of datum, of een complexe waarde (ook wel collection genoemd) zoals een lijst, map of lijst-map.
Twee systemen mogelijk hier:
Directe referentie via
${mijnVariabele}
Via de execution service
${execution.getVariable('mijnVariabele')}
Procesvariabelen verwijderen
Verwijdert een specifieke variabele uit het proces.
${execution.removeVariable('mijnVariabele')}
Signal uitsturen
Een signal aanmaken en versturen naar alle actieve procesinstanties binnen de applicatie.
Functies gelinkt aan Skryv platform specifieke services
Onderstaande is een lijst van Skryv-specifieke dossier functies die je kan aanspreken binnen de workflow.
Anonimiseer dossier
${skryv.dossierFromScope(execution).anonymize(processDefinitionKeys)}
Voert de anonymisatie van het dossier uit. Als inputwaarde geef je een lijst van workflows waarvan je de procesvariabelen wilt wissen. Er wordt geen waarde geretourneerd.
Zie ook de service task template ‘anonimiseer dossier’ in Studio.
Bijlage id ophalen
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').getField('fieldKey').attachmentId}
Haalt id van een bijlage of attachment op die opgeladen is binnen de scope van een specifiek formulier. Deze id kan je opslaan in een procesvariabele en vervolgens gebruiken in specifieke service taken op andere plaatsen in de workflow.
Bijlage toevoegen aan formuliercontext
${lbAttachmentService.setContextAttachment(execution, 'yourContextFormKey', 'attachmentId')}
Plaatst een bijlage in de formuliercontext. Hiervoor heb je drie parameters nodig: execution
(huidige procesinstantie), ‘yourContextFormKey’
(de key van het formulier waar je de bijlage in context wil plaatsen) en ‘attachmentId’
(de id van de bijlage, eventueel eerder opgehaald via de functie ‘bijlage id ophalen’).
Bijlage toevoegen aan frontoffice downloadzone
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey(formKey).getAttachmentField(formField).addToDownloadZone(labelForDownloadZone, fileNameForDownload)}
Haalt een bijlage op die upgeload is binnen een formulier bijlageveld (formField is key van het veld, formKey is key van het formulier) en voert deze vervolgens toe aan de frontoffice download zone. Je kan de weergave naam van de bijlage in de frontoffice definiëren, alsook de naam van de bijlage na download uit de frontoffice.
Zie ook de service task template ‘voeg document toe aan frontoffice’ in Studio.
Bijlage verwijderen uit dossier (soft deletion)
Documentatie volgt.
Communicatie aanmaken
${skryv.dossierFromScope(execution).createCommunicationByTemplateName('templateName')}
Genereert een communicatie op basis van de gespecificeerde template.
Communicatie id ophalen
${skryv.dossierFromScope(execution).createCommunicationByTemplateName('templateName').getId()}
Genereert een communicatie op basis van de gespecificeerde template en retourneert de ID ervan. Deze ID kan je opslaan in een procesvariabele en vervolgens gebruiken in specifieke service taken op andere plaatsen in de workflow.
Communicatie toevoegen aan frontoffice download zone
${skryv.dossierFromScope(execution).getLatestOrCreateCommunicationByTemplateName(communicationTemplate).addToDownloadZone(labelForDownloadZone, fileNameForDownload)}
Genereert communicatie of haalt laatst gegenereerde communicatie op (vul key in van de communicatietemplate) en voegt deze als PDF toe aan de frontoffice download zone. Je kan de weergave naam van de PDF in de frontoffice definiëren, alsook de naam van de PDF na download uit de frontoffice.
Zie ook de service task template ‘voeg document toe aan frontoffice’ in Studio.
Cumul check - opzoeken
${genericCumulService.findByKeyWithoutSelf(dossierId, cumulType, cumulKey)}
De drie meegestuurde parameters:
dossierId
: dit is het specifieke dossier waarvoor je de cumul check wil uitvoeren.cumulType
: stemt doorgaans overeen met het dossiertype.cumulKey
: string aan de hand waarvan je de uniciteit wil checken.
Als resultaat zal je een lijst met dubbele dossiers terugkrijgen (in de vorm van een Java lijst object) die je moet vatten onder een resultaatvariabele.
Cumul check - toevoegen
In deze service taak voegen we het dossier waarvoor de cumul check wordt uitgevoerd, toe aan de cumul database.
${genericCumulService.add(dossierId, cumulType, cumulKey)}
De drie meegestuurde parameters zijn opnieuw:
dossierId
: dit is het specifieke dossier waarvoor je net de cumul check hebt uitgevoerd.cumulType
: stemt doorgaans overeen met het dossiertype.cumulKey
: string aan de hand waarvan je de uniciteit checkt.
Dossierlabel herberekenen (recalculateLabel)
${skryv.dossierFromScope(execution).recalculateLabel()}
Geen specifieke parameters nodig.
Deze functie herberekent het dossierlabel waarbij de uitkomst steeds de standaard formattering is. Dit wordt gebruikt bij opstart van het dossier vanuit de frontoffice met een aangepast labelformaat. Belangrijk: deze functie wordt achterliggend ook gebruikt binnen ‘Dossier indienen (submitDossier)’.
Links naar meer info: Dossiertype instellingen (ander labelformaat bij opstart vanuit frontoffice of bij opstart in draftmodus).
Dossierlabel ophalen (getLabel)
${skryv.dossierFromScope(execution).getLabel()}
Geen specifieke parameters nodig.
Deze functie retourneert het dossierlabel. Hou er rekening mee dat het mogelijk is om een dossier met een alternatief labelformaat op te starten (bijvoorbeeld in draft modus of met een aangepast label bij opstart vanuit de frontoffice).
Links naar meer info: Dossiertype instellingen (ander labelformaat bij opstart vanuit frontoffice of bij opstart in draftmodus).
Dossier indienen (submitDossier)
${skryv.dossierFromScope(execution).submitDossier()}
Geen specifieke parameters nodig. De expressie retourneert geen waarde.
In geval het dossier opgestart wordt als ‘concept’ (draft) dossier, is dit de functie die het dossier markeert als ‘ingediend’ (submitted). De functie wijzigt enerzijds de dossiereigenschap Concept
en vervangt anderzijds het dossierlabel van concept-formattering naar de standaard formattering.
Links naar meer info:
Wat is een dossier? (onderscheid concept en ingediend)
Dossierinformatie (zie dossier eigenschappen concept en dossierlabel)
Dossiertype instellingen (om het dossier als concept op te starten, zie eigenschap
startAsDraft
)Service taak template in Studio
Formulier toevoegen aan frontoffice download zone
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey(formKey).addToDownloadZone(labelForDownloadZone, fileNameForDownload)}
Genereert formulier of haalt laatste versie van formulier op (vul key in van de formulierdefinitie) en voegt deze als PDF toe aan de frontoffice download zone. Je kan de weergave naam van de bijlage in de frontoffice definiëren, alsook de naam van de PDF na download uit de frontoffice.
Zie ook de service task template ‘voeg document toe aan frontoffice’ in Studio.
Formulierveld invullen (setField)
Hier maken we onderscheid tussen setField met directe input en setField met input variabele of input parameter.
setField met directe input
Dit gebruik je bij een enkelvoudige datastructuur.
String
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').setField('fieldKey','Hello World')}
Getal
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').setField('fieldKey', 99)}
Datum ('yyyy-MM-dd')
Een formulier datumveld kan je zowel invullen met een datum waarde (bijvoorbeeld 2025-15-05T15:00:00
) of een string waarde met specifieke formattering ‘yyyy-MM-dd’ (bijvoorbeeld ‘2025-15-05’).
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').setField('fieldKey', '2025-02-30')}
Keuzeveld
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("formKey").setField("yourChoice",'option1')}
Key van de keuze die je wil aanduiden meegeven als string value.
Meerkeuzeveld
setField ondersteunt het meerkeuze veldtype (multichoice) niet.
Lijst
setField ondersteunt het lijst veldtype niet.
setField met input variabele of input parameter
Complexe structuren (lijst, map, lijst-map) kan je niet mappen op een formulierveld.
Formulierveld waarde ophalen (getField)
Onderstaande expressies kan je geassisteerd bouwen via de workflow expression builder.
Tekst, getal, ja/nee
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').getField('fieldKey')}
Als je een tekstveld, een getal of een ja/nee ophaalt komt die terecht in een variabele met enkelvoudige waarde van het type string, integer, float of boolean.
Datum
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').getField('yourDate')}
Opgelet: het resultaat is een string waarde zoals ‘2025-15-05’. Zie datum tijd functies om deze string om te zetten naar een datum waarde waarmee je kan beginnen rekenen.
Keuze
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("formKey").getField("yourChoice")}
Deze expressie retourneert de key van de aangeduide keuze. Deze zit gedefineerd in je procesvariabele als string.
Meerkeuze
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("formKey").getField("yourMultiChoice")}
Deze expressie retourneert een Map zoals hieronder. Voor elke keuze (key) zie je via een boolean of deze aangevinkt is (true
) of niet (false
).
{“choice1”:true,”choice2”:false,”choice3”:true,”choice4”:false}
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("formKey").getField("yourMultiChoice").keyChoice}
Deze expressie checkt of een specifieke keuze (key) aangevinkt is (true
) of niet (false
).
Lijst
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey('formKey').getField('lijstKey')}
Als je een lijst ophaalt, komt die terecht in een Lijst-Map.
Gebruikersnaam ophalen van de user die een specifieke taak is toegewezen
${skryv.userService.getBySub(task.assignee).getUsername()}
Documentatie in opbouw.
Snapshot van het dossier nemen
${skryv.dossierFromScope(execution).takeSnapshot('naamSnapshot')}
Voor meer info, zie de documentatie sectie omtrent snapshots in dossiers.
Datum tijd functies
De huidige datum en tijd ophalen
Hiervoor heb je twee mogelijke expressies:
${now()}
${dateTime().toDate}
Deze resulteren in een datum waarde als 2025-04-01T13:49:13
Een specifieke datum en tijd instellen
Ook hiervoor heb je verschillende mogelijkheden. Onderstaande is er één van.
${dateTime().withDate(2030,12,30).toDate()}
Het resultaat is een datum waarde 2030-12-30T09:24:30
, waarbij de tijdsstempel gelijk is aan het ogenblik waarop de variabele aangemaakt wordt.
Wil je ook de tijdsstempel preciseren, dan voeg je .withTime()
method toe.
${dateTime().withDate(2030,12,30).withTime(12,0,0,0).toDate()}
Opgelet, de workflow engine zit in tijdszone UTC, en een tijdsstempel zetten is dus vanuit UTC tijd gezien. Doordat België zich in de winter in UTC+1 bevindt, zal de resulterende datum waarde 2030-12-30T13:00:00
zijn. In de zomer bevindt België zich in UTC+2, dus zal de resulterende datum waarde bijvoorbeeld 2030-06-30T14:00:00
zijn.
Datumveld uit formulier omzetten naar een datum waarde
Dit kan je doen in twee stappen:
Stap 1: Breng de waarde van het datumveld formulier over naar een procesvariabele zoals
mijnDatum
. De waarde is nu evenwel van het type string.Stap 2: Zet daarom nu de procesvariabele om naar een datum waarde via volgende expressie
${dateTime().parse(mijnDatum).toDate()}
Het resultaat is een datum waarde, bijvoorbeeld: 2025-04-01T00:00:00
Datum waarde wegschrijven naar een datumveld in formulier
Een procesvariabele (bijvoorbeeld ‘test’) met een datum waarde kan je via de setField
functie in het formulierveld (bijvoorbeeld ‘datum’) wegschrijven.
${skryv.dossierFromScope(execution).getOrCreateDocumentByDefinitionKey("testFormulierC").setField("datum",test)}
De tijdsstempel wordt hierbij achterwege gelaten.
Rekenen met datum tijd binnen workflow
Binnen de scope van de workflow is het best practice om timer events te gebruiken. Enkele voorbeelden van use cases: na weigering krijgt de aanvrager nog 30 dagen de mogelijkheid om beroep aan te tekenen, twee dagen vóór de opleveringsdatum van een taak wordt een reminder uitgestuurd naar de uitvoerder van de taak, enzovoort. Klik hier voor meer uitleg over timer events, hun gedrag en eigenschappen.
Rekenen met datum tijd binnen expressies
Binnen de scope van een expressie kan je volgende functies aanspreken.
Functie met voorbeeld | Beschrijving |
---|---|
Zelfde opbouw lukt ook met plusYears(), plusMonths(), plusWeeks(), plusHours(), plusMinutes(), plusSeconds(). Je kan ook combinaties maken. | Huidige datum plus één dag. |
Zelfde opbouw lukt ook met minusYears(), minusMonths(), minusWeeks(), minusHours(), minusMinutes(), minusSeconds(). Je kan ook combinaties maken. | Huidige datum min één dag. |
Getal functies
Overzicht van functies die je kan uitvoeren op een variabele van het type getal.
Operator | Beschrijving |
+ | Som van twee getalwaardes. |
- | Verschil van twee getalwaardes. |
/ | Quotiënt van twee getalwaardes. |
* | Product van twee getalwaardes. |
String functies
Overzicht van een aantal courante functies die je kan uitvoeren op een variabele van het type string.
Functie met voorbeeld | Beschrijving |
---|---|
‘Hello'.concat(' ’).concat('world‘).concat(’!') | Twee of meerdere string waardes met elkaar concateneren. Retourneert ‘Hello world!’. |
| Waarde in procesvariabele omzetten naar een string. |
| Retourneert |
| Retourneert |
| Retourneert |
| Retourneert |
| Retourneert |
' tekst met whitespace voor en na '.trim() | Verwijdert whitespace voor en na en retourneert ‘tekst met whitespace voor en na’. |
‘Jan Peeters’.toLowerCase() | Retourneert ‘jan peeters'. |
‘Jan Peeters’.toUpperCase() | Retourneert ‘JAN PEETERS’. |
'Jan Peeters'.replaceAll('Peeters','Janssen') | Retourneert ‘Jan Janssen’. |
‘Jan Peeters’.substring(0,2) | Retourneert ‘Jan’. Dit het stuk van de string dat zich uitstrekt van index positie 0 tot en met index positie 2. |
‘Jan Peeters’.substring(4) | Retourneert ‘Peeters’. Dit is het stuk van de string dat zich uitstrekt van index positie 4 tot en met de laatste index positie. |