Snippets

Adaptavist Jira Cloud Sum Up Story Points on Epic Issue

Updated by Kristian Walker

File JiraCloudSumUpStoryPointsonEpicIssue.groovy Modified

  • Ignore whitespace
  • Hide word diff
 }.sum()
 logger.info("Summed Story Points: ${estimate}")
 
-// Store the summed story points on the Story Points field of the parent issue
+// Store the summed story points on the Story Points field of the epic issue
 def summedEstimateField = fields.find { it.name == "Story Points" }.id
 
 logger.info("Custom field ID to update: ${summedEstimateField}")
Updated by Kristian Walker

File JiraCloudSumUpStoryPointsonEpicIssue.groovy Modified

  • Ignore whitespace
  • Hide word diff
 
 if(issue.fields.issuetype.name.toString() == "Epic"){
     
-// Retrieve all the subtasks of this issue's parent
+// Get the Epic Issue Key
 def epicIssueKey = issue.key.toString()
 logger.info("Epic Key = " + epicIssueKey)
 
 
 logger.info("Total stories for ${epicIssueKey}: ${allStories.size()}")
 
-// Sum the estimates
+// Sum the storyPoints
 def estimate = allStories.collect { Map story ->
     story.fields[storyPointsField] ?: 0  
 
 }.sum()
-logger.info("Summed estimate: ${estimate}")
+logger.info("Summed Story Points: ${estimate}")
 
-// Store the summed estimate on the Story Points field of the parent issue
+// Store the summed story points on the Story Points field of the parent issue
 def summedEstimateField = fields.find { it.name == "Story Points" }.id
 
 logger.info("Custom field ID to update: ${summedEstimateField}")
 
-// Now update the parent issue
+// Now update the Epic issue
 def result = put("/rest/api/2/issue/${epicIssueKey}")
         .header('Content-Type', 'application/json')
         .body([
 ])
         .asString()
 
-// check that updating the parent issue worked
+// check that updating the Epic issue worked
 assert result.status >= 200 && result.status < 300
     
 }else{
Updated by Kristian Walker

File JiraCloudSumUpStoryPointsonEpicIssue.groovy Modified

  • Ignore whitespace
  • Hide word diff
 /*
- * This script listiner which should be configured on the issue updated event shows how you can update the value of the story points field on the epic to show a sum of the values from the story points field for all stories linked to the epic, each time the epic issue is updated.
+ * This script listiner which should be configured on the issue updated event and shows how you can update the value of the story points field on the epic to show a sum of the values from the story points field for all stories linked to the epic, each time the epic issue is updated.
  * "All right, title and interest in this code snippet shall remain the exclusive intellectual property of Adaptavist Group Ltd and its affiliates. Customers with a valid ScriptRunner 
  * license shall be granted a  non-exclusive, non-transferable, freely revocable right to use this code snippet only within their own instance of Atlassian products. This licensing notice cannot be removed
  * or amended and must be included in any circumstances where the code snippet is shared by You or a third party." 
Created by Kristian Walker

File JiraCloudSumUpStoryPointsonEpicIssue.groovy Added

  • Ignore whitespace
  • Hide word diff
+/*
+ * This script listiner which should be configured on the issue updated event shows how you can update the value of the story points field on the epic to show a sum of the values from the story points field for all stories linked to the epic, each time the epic issue is updated.
+ * "All right, title and interest in this code snippet shall remain the exclusive intellectual property of Adaptavist Group Ltd and its affiliates. Customers with a valid ScriptRunner 
+ * license shall be granted a  non-exclusive, non-transferable, freely revocable right to use this code snippet only within their own instance of Atlassian products. This licensing notice cannot be removed
+ * or amended and must be included in any circumstances where the code snippet is shared by You or a third party." 
+ */
+
+if(issue.fields.issuetype.name.toString() == "Epic"){
+    
+// Retrieve all the subtasks of this issue's parent
+def epicIssueKey = issue.key.toString()
+logger.info("Epic Key = " + epicIssueKey)
+
+// Get the field ids
+def fields = get('/rest/api/2/field')
+        .asObject(List)
+        .body as List<Map>
+
+// Get the story points custom field to use in the script
+def storyPointsField =  fields.find { it.name == "Story Points" }.id
+logger.info("The id of the story points field is: $storyPointsField")
+
+// Note:  The search API is limited that to only be able to return a maximum of 50 results
+def allStories = get("/rest/api/2/search")
+        .queryString("jql", "parentEpic =${epicIssueKey} and issuetype = 'Story'")
+        .queryString("fields", "parent,$storyPointsField") 
+        .asObject(Map)
+        .body
+        .issues as List<Map>
+
+logger.info("Total stories for ${epicIssueKey}: ${allStories.size()}")
+
+// Sum the estimates
+def estimate = allStories.collect { Map story ->
+    story.fields[storyPointsField] ?: 0  
+
+}.sum()
+logger.info("Summed estimate: ${estimate}")
+
+// Store the summed estimate on the Story Points field of the parent issue
+def summedEstimateField = fields.find { it.name == "Story Points" }.id
+
+logger.info("Custom field ID to update: ${summedEstimateField}")
+
+// Now update the parent issue
+def result = put("/rest/api/2/issue/${epicIssueKey}")
+        .header('Content-Type', 'application/json')
+        .body([
+        fields: [
+                (summedEstimateField): estimate
+        ]
+])
+        .asString()
+
+// check that updating the parent issue worked
+assert result.status >= 200 && result.status < 300
+    
+}else{
+    logger.info("Not an Epic issue so do nothing")
+}
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.