--- title: "Configuration d'un circuit d'approbation (code)" slug: "configuration-of-workflows-code" updated: 2022-10-11T17:40:40Z published: 2022-10-11T17:40:40Z canonical: "help.cooperlink.io/configuration-of-workflows-code" --- > ## Documentation Index > Fetch the complete documentation index at: https://help.cooperlink.io/llms.txt > Use this file to discover all available pages before exploring further. # Configuration of workflows (code) This article applies to DELIVER EMPOWER licenses **NOTE : this article is currently only available in French** ## Purpose of the article This article describes how to create and modify workflows for use in document approval circuits, using cooperlink's JSON code interface. ## **What is a workflow?** Cooperlink has an engine that allows you to generate a succession of automated actions or actions for the end user (the workflow). Here we will study the configuration of the workflow for use for document approval circuits. ## **Prerequisite** - Knowledge of code, and JSON in particular, is required. - The workflow engine uses the map concept. Please refer to the corresponding section for more information [by clicking here](/docs/en/en/quest-ce-quune-carte). - A workspace must first exist. For more information, [click here](/docs/en/en/creer-un-premier-espace-de-travail). ## **Principes de base** Un workflow est défini par un ensemble d'éléments de base - Le type de cible `targetType`. Il définit le type de modèle de données auquel le workflow se rapporte. - La carte de démarrage `startCard`. Elle est utilisée pour permettre à l'utilisateur de définir les valeurs du workflow configurables à l'exécution (à la volée). - Les états `states`. Ils définissent les macro-étapes de l'exécution du workflow. Les états sont toujours exécutés en série (linéaire). L'étape actuelle du moteur est dénommé `current step`. - Les actions `actions`. Il peut s'agir d'une action effectuée par le moteur de Cooperlink ou une action de l'utilisateur final. Pour les opérations effectuées en **série**, un état ne contient qu'une seule action. Pour les opérations effectuées en **parallèle**, un état contient plusieurs actions. - Les actions d'attente `waitFor`. Les actions automatiques sont exécutées successivement tandis que les actions requérant une intervention de l'utilisateur sont mise en attente. Lorsque l'événement d'attente se réalise, un processus décisionnel identifie le résultat de sortie `out` et si le workflow doit continuer à se réaliser. - Les séquences `sequences`. Elles définissent l'ordonnancement des actions. Ces différents éléments peuvent se schématiser comme suit. ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143463988.png) ## **Les cartes** Les cartes jouent un rôle essentiel dans l'élaboration d'un workflow dans Cooperlink. En effet celles-ci servent aussi bien aux interactions avec les utilisateurs finaux, qu'à la configuration du workflow à la volée. ### Carte de démarrage et configuration à la volée Lorsqu'un utilisateur démarre un workflow, selon la configuration définie, la carte de démarrage peut récupérer les valeurs des cartes projet, espace de travail et document sur base des clés des champs. Ceci permet d'éviter les ré-encodages multiples et les erreurs de traitement. ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143479143.png) ### Cartes (de réponse) Les interactions avec les utilisateurs se passe à travers une carte de réponse. Cette carte est jointe à une tâche et assignée à l'utilisateur ou au partenaire. L'action d'attente `waitFor` scrute le remplissage de cette carte de réponse. ### Résultat dans la carte du targetType (document) Cooperlink enregistre le résultat du workflow dans la carte de la cible (le document en l'occurence) en identifiant la clé du champ correspondant. ## **Exemple de création d'un circuit d'approbation** ### Demande du client Dans cet exemple, nous allons créer un circuit d'approbation de document en trois étapes : - A la première étape, un utilisateur interne au choix est invité à consulter le document et à y répondre. Celui-ci ne peut qu'accepter ou refuser le document. Il peut également commenter sa réponse. En cas de réponse négative, le workflow s'arrête. - A la seconde étape, 3 partenaires sont invités à consulter le document et à y répondre. Ils peuvent chacun approuver, refuser ou indiquer ne pas être concerné par le document. Ils peuvent également commenter leur réponse. En cas de réponse négative (au moins une), le workflow s'arrête. - A la troisième étape, un partenaire est invité à consulter le document et à y répondre. Il ne peut qu'accepter ou refuser le document. Il peut également commenter sa réponse. En cas de réponse positive, le workflow est clôturé avec succès. ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143499248.png) Pour permettre à l'utilisateur interne et aux partenaires de se prononcer, il est nécessaire de communiquer : - Le numéro de révision du document (valeur auto-incrémentée "0, a, b, c, ..." après chaque circuit d'approbation) - L'objet de la demande (texte libre) - Le lot concerné (valeur parmi une liste prédéfinie Lot1, Lot2, Lot3) ### Etape 1. Créer ou identifier une carte espace de travail Créez une carte espace de travail, ou identifiez une carte existante. Pour plus d'informations, [cliquez ici](/docs/en/creerediter-un-modele-de-carte-pour-un-espace). Liez également cette carte avec votre espace de travail en [cliquant ici](/docs/en/definir-le-modele-de-carte-par-defaut). La demande du client précise : - L'existence d'un utilisateur interne (nous l’appellerons `ex_intern1`) et 4 partenaires (`ex_partner1` à `ex_partner4`) - Le numéro de révision `ex_rev` au premier circuit d'approbation est 0 Ajouter les champs suivants à la carte espace de travail : - Validateur interne, type `User`, clé `ex_intern1` - Partenaire N, type `User`, clé `ex_partnerN` (N = 1, 2, 3, 4) - Révision par défaut, type `Text`, clé `ex_rev` Une fois enregistré, accédez au tableau de bord de l'espace de travail et remplissez les champs de la carte avec les valeurs suivantes : - Utilisateur interne au choix - Partenaires au choix - Révision par défaut : 0 ### Etape 2. Créer ou identifier une carte document Créez une carte document, ou identifiez une carte existante. Pour plus d'informations, [cliquez ici](/docs/en/exemple-pratique-de-configuration-de-cartes). Ajoutez le champ suivant à la carte document : - Statut workflow, type `Text`, clé `ex_document_status`, cocher option `Read only` Enregistrez vos changements. ### Etape 3. Créer ou identifier une carte de démarrage Créez une carte de démarrage, ou identifiez une carte existante. Pour plus d'informations, [cliquez ici](/v2/docs/exemple-pratique-de-configuration-de-cartes). Définissez les champs suivants à la carte de démarrage (type `card`) : - Objet de la demande, type `Text`, clé `ex_request`, cocher `Champs requis` - Lot, type `ValueList`, clé `ex_package`, valeurs `Lot1`, `Lot2`, `Lot3` - Révision, type `ValueList`, clé `ex_rev`, valeurs `0|Intial`, `A|Revision A`, `B|Revision B`, `C|Revision C`, `D|Revision D`, cocher option AutoIncrement - Utilisateur interne, type `User`, clé `ex_intern1`, cocher Champs requis - Partenaire N, type `User`, clé `ex_partnerN` (N = 1, 2, 3, 4), cocher Champs requis pour partner4 uniquement Les valeurs d'une liste sont séparées par la touche `Entrée`. Pour plus d'informations sur le format `valeur|texte_affiché` des listes de valeur, référez-vous à l'article en [cliquant ici](/v2/docs/configurer-les-modeles-de-cartes-theorie). **IMPORTANT :** notez l'identifiant `id` de la carte (p.ex. 121). ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143513384.png) ### Etape 4. Créer ou identifier une carte de réponse Sur la base de la demande du client, nous constatons qu'il peut y avoir deux types de réponse. Nous allons donc créer 2 cartes de réponse différentes. **4.1. Première carte** Créez une première carte de réponse, ou identifiez une carte existante. Pour plus d'informations, cliquez ici. Définissez les champs suivants à la carte de réponse (type `card`) : - Réponse, type `ValueList`, clé `ex_response`, valeurs `A|Accepté`, `B|Refusé`, cocher option Champ requis, Outcome `A` - Commentaire, type `Text`, clé `ex_comment` **IMPORTANT :** notez l'identifiant `id` de cette première carte de réponse (p.ex. 122) ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143536892.png) **4.2. Seconde carte** Réitérez la même opération avec une seconde carte. Cette fois définissez les champs comme suit (type `card`) : - Réponse, type `ValueList`, clé `ex_response`, valeurs `A|Accepté`, `B|Refusé`, `NA|Non concerné`, cocher option Champ requis, Outcome `A`, `NA` - Commentaire, type `Text`, clé `ex_comment` **IMPORTANT :** notez l'identifiant `id` de cette seconde carte de réponse (p.ex. 123) ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143551352.png) ### Etape 5. Créer un nouveau workflow Accédez aux `Paramètres de l'application`, section `Workflows templates`. Créez un nouveau modèle de workflow en cliquant `Nouveau design de workflow`. ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143567816.png) Nommez votre workflow en remplissant les champs `label` et `description`. - Label : Approbation document - Description : Circuit d'approbation pour documents Créez le workflow en cliquant sur `Créer design`. ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143577764.png) **CONSEIL :** Afin de rafraîchir l'écran, cliquez de nouveau sur l'onglet `Workflows templates`, et cliquez ensuite sur le workflow nouvellement créé. Dans l'éditeur de code JSON, sélectionnez le mode `Code` ou `Text`. Sélectionnez tout le code (CTRL+A), copiez-le (CTRL+C) et collez le dans un éditeur de texte ou un éditeur de code (p.ex. Komodo Edit, Notepad++). ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143589552.png) ### Etape 6a. Configurer le workflow - PROPRIETES DE BASE Le fichier de configuration du workflow identifie un ensemble de propriétés de base : **NOTE : seuls les champs sur fond blanc peuvent être modifiés.** Ajoutez les propriétés suivantes : - usePreviousStartCard : true - startCardDesignId : indiquez l'identifiant de la carte créée à l'étape 3 ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143610029.png) ### Etape 6b. Configurer le workflow - STATES La propriété `states` est un tableau. Le workflow est découpé en macro-étapes auxquelles nous donnons un titre sous forme de texte libre. Les propriétés utiles de `states` sont : ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143624113.png) Code : ```json "states":[ { "name":"Interne" }, { "name":"Externe 1" }, { "name":"Externe 2" }, { "name":"Approuvé" } ], ``` ### Etape 6c. Configurer le workflow - ACTIONS (structure) Précédemment, nous avons créé des cartes de réponse que nous allons attribuer aux intervenants. Pour ce faire, nous allons créer une ou plusieurs actions de type `.actions.CreateCard`. Cette action est non bloquante. Elle est donc toujours exécutée. Ensuite, nous allons créer une action `.actions.WaitForOpenCard` dans l'attente des actions utilisateurs. Cette action `waitFor` attend le résultat de ensemble des cartes de l'étape `state` avant d'être exécutée. Pour l'exemple, nous allons créer le code suivant : ```json "actions": [ { // ex_action_intern1 (create card) // Voir étape 6d } { // ex_wait_action_intern1 (wait for) // Voir étape 6e } { // ex_action_partner1 (create card) // Voir étape 6f } { // ex_action_partner2 (create card) // Voir étape 6f } { // ex_action_partner3 (create card) // Voir étape 6f } { // ex_wait_action_parter3 (wait for) // Voir étape 6f } { // ex_action_partner4 (create card) // Voir étape 6f } { // ex_wait_action_parter4 (wait for) // Voir étape 6f } { // ex_wait_final (wait for) // Voir étape 6g } ``` ### Etape 6d. Configurer le workflow - ACTIONS STATE 1 (créer carte de réponse) Chaque étape `state` est une succession d'une ou plusieurs actions non bloquantes. Les propriétés utiles de l'action sont : ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143635818.png) Code : ```json { "objectType":".actions.CreateCard", "key":"ex_action_intern1", "title":{ "literal":"Approbation Interne" }, "description":{ "literal":"Merci de prendre connaissance du document en pièce jointe et répondre aux questions ci-après." }, "assignedUser":{ "metaDataDefinition":{ "elementType":"CARD", "name":"ex_intern1" } }, "dueDate":{ "remainingDays":10 }, "addTask":true, "cardDesignId":122 }, ``` Nous assignerons la première carte de réponse à l'approbateur interne. En indiquant la valeur `true` à la propriété `addTask`, une instance de la carte `cardDesignId` est associée à une tâche, assignée à un utilisateur. La tâche se voit attribuer les valeurs suivants : - Titre de la tâche : titre de l'action - Description de la tâche : description de l'action (literal) - Date de fin : date d'exécution de l'action + dueDate (jours) Le champ `Outcome`, définit à l'étape 4, détermine les valeurs de réponse qui donnent lieu à une réponse positive en clôture de l'instance de la carte `cardDesignId`. ### Etape 6e. Configurer le workflow - WAITFOR STATE 1 Chaque étape `state` est terminée par une action de type `.actions.WaitForOpenCards`. Le moteur Cooperlink attend donc les réponses aux différentes cartes précédemment attribuées. Propriétés : ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143645544.png) Code : ```json { "objectType":".actions.WaitForOpenCards", "key":"ex_wait_action_intern1", "stateName":"Interne", "outMetaData":"ex_document_status", "outValueIfOK":"Approuvé Interne", "outValueIfNOK":"Refusé Interne", "completeIfNOK":true }, ``` **IMPORTANT :** le `stateName` doit être strictement identique à l'un des states créés à l'étape 6b **CONSEIL :** à l'étape 2, nous avons créé le champ ex_status dans la carte document. Par simplicité, nous avons défini un champ de type texte, vous permettant de définir n'importe quel type de résultat lors de la configuration workflow (texte libre pour outValueIfOK / outValueIfNOK). ### Etape 6f. Configurer le workflow - STATES 2 et 3 Répétez les opérations des étapes 6d et 6e pour les STATES 2 et 3. Pour exécuter des actions en parallèle, il suffit : - De créer des actions` .actions.CreateCard` de façon séquentielle - De terminer l'étape par une action `.actions.WaitForOpenCards` Nous assignerons : - La seconde carte de réponse aux partenaires 1 à 3 - La première carte de réponse au partenaire 4 ### Etape 6g. Configurer le workflow - ACTION FINALE Lorsqu'un workflow se termine, il affiche par défaut le nom du dernier `state`. Afin d'afficher dans l'application un nom convivial à l'utilisateur lorsque le workflow s'est terminé avec succès, il est de bonne pratique de créer un state ainsi qu'une action de finalisation du workflow comme suit : ```json { "objectType": ".actions.WaitForOpenCards", "key": "ex_wait_final", "stateName": "Approuvé" } ``` 🔥 CONSEIL JSONNotez l'absence de virgule après la parenthèse fermante. Le dernier objet en synthase JSON ne contient jamais de virgule. En présence d'une virgule fermante, le moteur Cooperlink ne pourra pas exécuter correctement les requêtes. ### Etape 6h. Configurer le workflow - SEQUENCES Les séquences définissent les relations entre les actions. Propriétés : ![](https://cdn.document360.io/c21b52e3-341e-4ea9-8692-3488bd21cd8d/Images/Documentation/image-1610143658172.png) Code : ```json "sequences":[ { "endPoint":null, "from":"ex_action_intern1", "to":"ex_wait_action_intern1" }, { "endPoint":null, "from":"ex_wait_action_intern1", "to":"ex_action_partner1" }, { "endPoint":null, "from":"ex_action_partner1", "to":"ex_action_partner2" }, { "endPoint":null, "from":"ex_action_partner2", "to":"ex_action_partner3" }, { "endPoint":null, "from":"ex_action_partner3", "to":"ex_wait_action_partner3" }, { "endPoint":null, "from":"ex_wait_action_partner3", "to":"ex_action_partner4" }, { "endPoint":null, "from":"ex_action_partner4", "to":"ex_wait_action_partner4" }, { "endPoint":null, "from":"ex_wait_action_partner4", "to":"ex_wait_final" } ] ``` Sur base du schéma ci-avant, les actions `ex_action_partner1`, `ex_action_partner2`, `ex_action_partner3` sont exécutées en parallèle. L'action `ex_action_partner4` est exécutée une fois les actions précédentes terminées. ## Félicitations! Vous avez terminé la configuration du workflow. Pour votre facilité, vous trouverez le [fichier de configuration en cliquant ici](http://www.cooperlink.io/help-cooperlink-io/workflow_example_approval_circuit_200810.json).