Introduction
Le moteur de workflows de Nuxeo supporte les tâches parallèles. Un workflow incluant par défaut des tâches parallèles est même fourni avec la plateforme de base. Les tâches parallèles sont un excellent moyen d’améliorer la productivité des utilisateurs en leur permettant de réaliser plusieurs tâches sans avoir besoin d’attendre qu’elles soient toutes terminées.
Il est cependant nécessaire d’avoir la possibilité d’interrompre les tâches de workflow. D’avoir réellement la possibilité de changer de voie au cours d’une tâche. La gestion des branches est un processus simple pour les tâches répétitives et il vous suffit de définir les transitions nécessaires (et les conditions de ces transitions).
Une tâche parallèle de workflow n’est généralement pas terminée tant que tous les participants n’ont pas terminé leur tâche. Généralement, le moteur de workflows attend que toutes les tâches soient terminées puis choisit une transition en fonction des résultats. C’est en fait un peu plus complexe et nous allons voir aujourd’hui comment il est possible d’interrompre une tâche parralèle dans un workflow.
Présentation
Une “tâche parallèle” n’est qu’un type de node différent dans Nuxeo Studio, étiqueté en tant que “tâches multiples” :
La configuration d’un node d’une tâche multiple est la même que pour les autres nodes de niveau élevé. Elle contient des variables, des formes, des transitions et des règles de montée en charge comme n’importe quel autre node. La principale différence réside dans le fait que lorsque le moteur de workflows rencontre ce type de node, il crée une tâche séparée pour chacune des personnes assignées et par défaut, une transition n’est pas choisie tant que toutes les tâches ne sont pas terminées.
Cas d’utilisation
En partant d’une étape de “révision” ou de “validation” dans un workflow, je veux pouvoir renvoyer immédiatement le document à son auteur si un élément est vraiment inacceptable. Dans ce cas, il n’y a pas de raison d’attendre que les autres personnes assignées valident le document car je sais déjà qu’il a besoin d’être révisé.
Un autre moyen d’aborder ce cas d’utilisation est de donner à un “super utilisateur” la possibilité d’interrompre une tâche parallèle s’il le souhaite.
Workflow
Voici un workflow simple :
Dans ce cas, je veux que la transition “reject” soit suivie si au moins un utilisateur clique sur le bouton de rejet.
Interruption de tâche
Il y a quelques éléments importants qui rendent cette action possible :
- Définir une transition automatique pour le “rejet”
- Faire de la tâche parallèle un node exclusif
- Créer une règle de montée en charge lorsque l’utilisateur réalise le rejet
- Créer une chaîne d’automatisation pour forcer le moteur de workflows à évaluer la tâche
Transition automatique
Les transitions automatiques ont seulement besoin que la clause de condition soit définie sur “true” :
Node exclusif
Pour faire d’une tâche un node exclusif, localisez la case à cocher dans l’onglet Transitions pour la tâche :
Lorsque le moteur de workflows exécute un node exclusif, il évalue progressivement la transition et s’arrête lorsque les transitions sont “true”. Cela signifie que la transition de rejet ne sera utilisée que si toutes les autres échouent.
Règle de montée en charge
La règle de montée en charge doit se déclencher lorsque l’utilisateur clique sur le bouton de rejet. La condition est donc la même que pour toute transition “normale”, par ex. :
NodeVariables["button"]=="reject"
La chaîne d’automatisation utilisée force simplement le moteur de workflows à réévaluer les transitions grâce à la commande Workflow.ResumeNode :
- Context.FetchDocument - Workflow.ResumeNode: {}
Lorsque la chaîne est exécutée, le moteur de workflows évalue les transitions possibles de la tâche. Il convient de mentionner que la condition de la transition “approve” ressemble à :
@{NodeVariables["tasks"].getNumberEndedWithStatus("to_FinalReview")==NodeVariables["numberOfProcessedTasks"]}
Si l’une des tâches en cours est incomplète, cette condition est “false” et le moteur de workflows suit la transition automatique de rejet car il s’agit d’un node exclusif.
Conseil : n’oubliez pas de déclarer une transition de cycle de vie valide pour ce comportement si les états de cycle de vie changent au cours du processus.
Bonus : résolution de tâche proportionnelle
Il est possible d’obtenir des résultats intéressants en ajustant la condition pour une transition dans une tâche parallèle. Il serait par exemple possible de suivre une transition si au moins la moitié des personnes assignées choisissait l’action “NotLiable”. Voici l’expression :
@{NodeVariables["tasks"].getNumberEndedWithStatus("NotLiable") / NodeVariables["numberOfProcessedTasks"]>0.5}
Au lieu d’interrompre la tâche, cette expression supporte un système de “vote”. Il n’est défini sur “true” que si plus de la moitié des participants choisissent la transition “NotLiable”. Encore mieux, s’il n’y a aucun node exclusif, cela signifie que des transitions multiples peuvent être suivies par la même tâche.
Conclusion
Le moteur de workflows de Nuxeo est incroyablement flexible. C’est incroyable de pouvoir recevoir une demande raisonnable comme “Je veux pouvoir rejeter une tâche et ne pas faire perdre de temps aux autres utilisateurs” et la transposer directement dans la configuration.
Même lors de l’exécution, on ne reste pas bloqué sur un comportement donné. Avec autant d’options pour modifier le processus grâce à un workflow, le moteur est réellement capable de supporter les processus opérationnels modernes et de préparer le terrain pour la transformation numérique.