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” :

Tasks

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 :

Workflow

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” :

Automatic Transition

Node exclusif

Pour faire d’une tâche un node exclusif, localisez la case à cocher dans l’onglet Transitions pour la tâche :

Exclusive Node

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.