I am trying to create a scripted field that will sum the story points of issues linked to an epic that are in closed status.
JIRA version: 7.1.6 server
Scriptrunner version: 4.3.12
Searcher: Number searcher
Template: Number field
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.component.ComponentAccessor;
def componentManager = ComponentManager.getInstance()
def issueLinkManager = ComponentAccessor.getIssueLinkManager()
def cfManager = ComponentAccessor.getCustomFieldManager()
double totalSP = 0
customField = ComponentAccessor.getCustomFieldManager().getCustomFieldObject("customfield_12110");
enableCache = {-> false}
issueLinkManager.getOutwardLinks(issue.id)?.each {issueLink ->
if ((issueLink.issueLinkType.name == "Epic-Story Link" ) && (issue.getStatus() == "Closed")){
double SP = (double)(issueLink.destinationObject.getCustomFieldValue(customField) ?: 0)
totalSP = SP + totalSP;
}}
return totalSP
It is returning a result of 0.
I am new to scripted fields and need help troubleshooting. Thanks!
Hi Colleen,
I think what you miss (apart form the first import that does not exist) is the
issue.getStatus() == "Closed"
it should be
issue.getStatus().name == "Done" // or if you need the category and not just the name of the status issue.getStatus().statusCategory.name == "Closed"
apart from that your script seems fine. And one more thing, I suppose the customfield_12110 is the Story Points, wouldn't be more clear If it was
def customField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Story Points")
regards, Thanos
@Thanos Batagiannis [Adaptavist], thanks a lot for your help!
This is a script, that worked for me (without conditions of particular issue status and link type)
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.ComponentAccessor
import com.atlassian.jira.issue.CustomFieldManager
import com.atlassian.jira.component.ComponentAccessor;
def componentManager = ComponentManager.getInstance()
def issueLinkManager = ComponentAccessor.getIssueLinkManager()
def cfManager = ComponentAccessor.getCustomFieldManager()
double totalSP = 0
customField = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Story Points");
enableCache = {-> false}
issueLinkManager.getOutwardLinks(issue.id)?.each {issueLink ->
double SP = (double)(issueLink.destinationObject.getCustomFieldValue(customField) ?: 0)
totalSP = SP + totalSP;
}
return totalSP
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Hi @Thanos Batagiannis [Adaptavist] , just wondering why using the suggested one still not able to recognize the EPIC link story status? it seem it is only recognize on the EPIC status only.
issue.getStatus().name == "Done" // or if you need the category and not just the name of the status issue.getStatus().statusCategory.name == "Closed"
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Please try this script:
This script helps in sum up all the Story Points from Story to EPIC
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.jql.parser.JqlQueryParser
import com.atlassian.jira.web.bean.PagerFilter
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.event.type.EventDispatchOption
def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser)
def searchService = ComponentAccessor.getComponent(SearchService)
def issueManager = ComponentAccessor.getIssueManager()
def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
def issue = event.issue
if (issue.getIssueType().getName() == "Story"){
log.warn(issue.getIssueType().getName())
def epiclinkname = issue.getCustomFieldValue(ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Epic Link"))
log.warn("Epiclinkname :" + epiclinkname)
def jql = "'Epic Link' = $epiclinkname and issuetype = Story"
log.warn(jql)
// edit this query to suit
def query = jqlQueryParser.parseQuery("'Epic Link' = $epiclinkname and issuetype = Story")
def search = searchService.search(user, query, PagerFilter.getUnlimitedFilter())
log.debug("Total Stories Linked Epic: ${search.total}")
// Initialize the total story points to 0
Double total_story_points = 0
search.results.each { documentIssue ->
log.debug(documentIssue.key)
// if you need a mutable issue you can do:
issue = issueManager.getIssueObject(documentIssue.id)
// do something to the issue...
log.debug(issue.summary)
def story_points = issue.getCustomFieldValue(ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Story Points"))
if (story_points != null ){
total_story_points = total_story_points.toInteger() + story_points.toInteger()
log.warn(story_points)
}
}
log.warn("total_story_points : " + total_story_points)
MutableIssue epicIssue = issueManager.getIssueObject(epiclinkname.key)
def epicStoryPoint = ComponentAccessor.getCustomFieldManager().getCustomFieldObjectByName("Story Points")
log.warn("epicIssue:" + epicIssue.key.toString())
//Update the Epic's "Total Story Points" custom field
log.warn("EPIC Summary :" + epicIssue.summary)
log.warn "Story Point value Before updated: " + epicStoryPoint.getValue(epicIssue).toString()
epicIssue.setCustomFieldValue(epicStoryPoint, total_story_points)
issueManager.updateIssue(event.user, epicIssue, EventDispatchOption.ISSUE_UPDATED, false)
log.warn "total_story_points_field value After updated: " + epicStoryPoint.getValue(epicIssue).toString()
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Online forums and learning are now in one easy-to-use experience.
By continuing, you accept the updated Community Terms of Use and acknowledge the Privacy Policy. Your public name, photo, and achievements may be publicly visible and available in search engines.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.