Un fil d'Ariane pour vos demandes liées

Visionnez nos Webinars à la demande | Agilité à l'échelle, IT Service Management, Cloud, Bonnes pratiques Jira, Témoignages clients... Cliquez-ici !

valiantys-logo
Back

Configurez un Fil d’Ariane pour organiser vos demandes liées dans JIRA

De plus en plus de problématiques intégrées dans JIRA impliquent la mise en place de demandes liées sur plusieurs niveaux hiérarchiques, créant au final une arborescence de demandes.

Vous pouvez créer ces types d’organisations grâce à certains add-ons : EXOCET par exemple, fournit des opérations pour créer des demandes et des tableaux listant les demandes liées. Cependant, aucune des solutions actuelles ne permettent d’avoir une vue globale de l’arborescence. Ainsi, si on imagine une architecture de demandes sur 3 niveaux, lorsqu’on se positionne sur la demande de troisième niveau, nous aurons un lien vers la demande de deuxième niveau (fourni par JIRA ou enrichi par Exocet) mais nous n’aurons pas d’information concernant la demande de premier niveau.

Pour pallier à ce manque, nous pouvons créer un fil d’Ariane dynamique qui vous donnera une vue de la hiérarchie de la demande et vous permettra de remonter aux demandes « parents ».

Comment faire ?

Le pré-requis à cette méthode est que l’add-on gratuit Script Runner soit installé. Le champ personnalisé « Scripted Field » qu’il fournit sera largement utilisé dans cet article.

Pour illustrer cette problématique, nous allons implémenter le cas d’utilisation de la gestion des notes de frais :

Pour un Projet informatique en cours, un consultant a la possibilité de créer une ou plusieurs notes de frais. Pour chacune des notes de frais, les types de dépenses devront être distingués (Restaurant, Parking, Frais kilométriques etc…).

D’un point de vue conceptuel, nous obtenons ceci :

MCD_Blog

Nous utiliserons 3 types de demandes « Standard » afin de ne pas être limité par le système de sous-tâche classique qui ne propose que 2 niveaux de demandes.

Créer sa hiérarchie de demandes

3 demandes seront utilisées pour démontrer ce cas d’utilisation :

  • La demande WPM-27 de  type « Project » sera notre « niveau 1 » :

Blog_01

  • La demande WPM-28 de  type « Expenses Report » sera notre « niveau 2 » :

Blog_02

  • La demande WPM-30 de type  «Mileage expense» sera notre  « niveau 3 » :

Blog_03

Ces demandes sont liées de la manière suivante :

  • La WPM-27 a pour Note de Frais la WPM-28 :

Blog_04

  •  La WPM-28 a pour Type de Frais la WPM-30 :

Blog_05

  Des tableaux Exocet sont configurés :

  • Un tableau « Notes de Frais » affiche les notes de frais créées pour un Projet.

Blog_06

  • Un tableau «Types de frais» affiche dans la liste des frais pour chacune des notes de frais.

Blog_07

Dans une implémentation « réelle », des champs personnalisés calculant les différentes sommes devront être ajoutés au niveau de la note de frais (Somme de la note de frais) et/ou au niveau du projet (Somme Totale des notes de frais). Un exemple de champ de « Scoring » est disponible dans l’article suivant.

Créer et configurer un champ personnalisé Scripted Field

Créez un champ personnalisé «Navigation Path » de type « Champ Scripté » et ajoutez le aux écrans de vue de votre projet.

Ensuite, dans le menu « Scripted Field », associez le script suivant au champ que vous venez de créer :

import com.atlassian.jira.ComponentManager
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.ManagerFactory

enableCache = {-> false}

def componentManager = ComponentManager.getInstance()
def issueLinkManager = componentManager.getIssueLinkManager()

String navPath

String separator = " > "
String urlJIRA1 = "<a class='issue-link' href='http://localhost:8080/browse/"
String urlJIRA2 = "'>"
String urlJIRA3 = "</a>"

//If issue type is "Level 2" (id = 10104) and issue link is "L1 to L2" (id = 10130)
if(issue.getIssueTypeId().equals("10104")){
    issueLinkManager.getInwardLinks(issue.id).each {issueLink ->
        if (issueLink.issueLinkType.id == 10130) {
            def linkedIssue = issueLink.sourceObject
            navPath = urlJIRA1+linkedIssue.key+urlJIRA2+linkedIssue.key+urlJIRA3+separator+issue.key
        }
    }
}

//If issue type is "Level 3" (id = 10200) and issue link is "L3 to L2" (id = 10031)
if(issue.getIssueTypeId().equals("10200")){
    issueLinkManager.getInwardLinks(issue.id).each {issueLink2ndLevel ->
        //Get Issue in 2nd Level
        if (issueLink2ndLevel.issueLinkType.id == 10031) {
            def linkedIssue2ndLevel = issueLink2ndLevel.sourceObject
            //Get Issue in First level
            //If issue type is "Level 2" (id = 10104) and issue link is "L1 to L2" (id = 10130)
            if(linkedIssue2ndLevel.getIssueTypeId().equals("10104")){
                issueLinkManager.getInwardLinks(linkedIssue2ndLevel.id).each {issueLinkFirstLevel ->
                    if (issueLinkFirstLevel.issueLinkType.id == 10130) {
                        def linkedIssueFirstLevel = issueLinkFirstLevel.sourceObject
                        navPath = urlJIRA1+linkedIssueFirstLevel.key+urlJIRA2+linkedIssueFirstLevel.key+urlJIRA3+separator+urlJIRA1+linkedIssue2ndLevel.key+urlJIRA2+linkedIssue2ndLevel.key+urlJIRA3+separator+issue.key
                    }
                }
            }
        }
    }
}

return navPath
Il faudra adapter le script en fonction de vos propres identifiants de type de demandes et de type de liens.

Utilisation du fil d’Ariane

Un fil d’Ariane apparaît alors dans la vue de vos demandes et est désormais utilisable dans les demandes de niveau 2 et de niveau 3 :

  • Exemple dans le niveau 2 :

Blog_08

Ainsi il sera possible de remonter à la demande WPM-27 depuis la demande WPM-28 :

Blog_09

  • Exemple dans le niveau 3 :

Blog_10

Ainsi il sera possible de remonter à la demande WPM-27 ou à la demande WPM-28 depuis la demande WPM-30.

Blog_11

Des demandes liées hiérarchiquement organisées

Ainsi, grâce à cet exemple très simple à implémenter dans vos instances JIRA, vous pourrez afficher l’arborescence des demandes liées et permettre à vos utilisateurs d’y naviguer rapidement et simplement.

Cela correspond à l’un de vos besoins? N’hésitez pas à l’essayer et à partager vos retours et suggestions en commentaire !

Cutted Triangle

Inscrivez-vous à notre newsletter

Demande enregistrée ! Demande en cours... Ceci n'est pas un email Une erreur s'est produite

Conformément à notre politique de confidentialité, nous nous engageons à respecter vos données personnelles.

Contactez-nous

Nos consultants certifiés Atlassian seront ravis de vous répondre.

Rejoindre Valiantys

Nous sommes en train de construire un équipe extraordinaire. Vous en êtes ?

Suivez-nous

Nous utilisons des cookies pour le fonctionnement de ce site, pour améliorer son utilisation, personnaliser votre expérience et réaliser des statistiques de visite. Vous pouvez gérer les paramètres et choisir d’accepter ou non certains cookies durant votre navigation. Pour plus d’informations, consultez notre politique de confidentialité. Nos politique de confidentialité

Paramètres de confidentialité

Afin de faciliter votre navigation et de vous apporter le meilleur service possible, nous utilisons des cookies pour améliorer le site aux besoins des visiteurs, notamment selon la fréquentation.  Pour plus d’informations, consultez notre politique de confidentialité. Nos politique de confidentialité

Recaptcha

Google reCAPTCHA est un système conçu pour distinguer les humains des ordinateurs, de telle sorte que les bots soient incapables de remplir les formulaires de manière malveillante au nom d’un être humain.

Analytics

Utilisé pour envoyer des données à Google Analytics sur le périphérique et le comportement du visiteur. Suit l'internaute à travers les appareils et les canaux de marketing. Utilisé par Google Analytics pour diminuer radicalement le taux de requêtes. Enregistre un identifiant unique utilisé pour générer des données statistiques sur la façon dont le visiteur utilise le site.

LinkedIn

Cookies pour une publicité ciblée : Ces cookies peuvent être mis en place au sein de notre site Web par nos partenaires publicitaires. Ils peuvent être utilisés par ces sociétés pour établir un profil de vos intérêts et vous proposer des publicités pertinentes sur d'autres sites Web. Ils ne stockent pas directement des données personnelles, mais sont basés sur l'identification unique de votre navigateur et de votre appareil Internet. Si vous n'autorisez pas ces cookies, votre publicité sera moins ciblée.

Cookies "réseaux sociaux" : Ces cookies sont activés par les services proposés sur les réseaux sociaux que nous avons ajoutés au site Web afin de vous donner la possibilité de partager notre contenu avec votre réseau et vos connaissances. Ils nous permettent également de suivre votre navigation sur d’autres sites Web et d’établir un profil de vos intérêts. Cela peut avoir un impact sur le contenu et les messages affichés sur les autres sites Web que vous consultez. Si vous n'autorisez pas ces cookies, il se peut que vous ne puissiez pas utiliser ou visualiser ces outils de partage.