This section has use cases which help you understand the usage of the Calculated fields provided by JMCF.
On this page:
Calculated (scripted) Date custom field type
A Calculated (scripted) Date custom field type represents a java.util.Date
calculated from a Groovy script.
Sample use cases:
Calculate and display the Sprint end date in the statistics
Expand |
---|
Create a Calculated (scripted) Date custom field type, Sprint End Date , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula in the editor Code Block |
---|
for (Object sprint : issue.get("Sprint")) {
if (sprint.isActive())
return sprint.getEndDate().toDate();
} |
Click on “Save” Add this field in the statistics gadgets
|
Calculated (scripted) Date/Time custom field type
A Calculated (scripted) Date/Time custom field type represents a java.util.Date
and is displayed as date+time.
Sample use cases:
Calculate and display the probable date of resolution (excluding weekends) for an issue based on its Priority
...
Expand |
---|
|
Create a Calculated (scripted) Date/Time custom field type, Sprint end date from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula in the editor Code Block |
---|
for (Object sprint : issue.get("Sprint")) {
if (sprint.isActive())
return sprint.getEndDate().toDate();
} |
Click on Save . Click on Edit Date Column Format and select RELATIVE . Click on Save .
|
Calculated (scripted) Duration custom field type
A Calculated (scripted) Duration custom field type represents a duration and is displayed either as a duration string or as a number in a Long format representing the number of seconds.
Sample use cases:
Calculate and display how many days an issue has been open
...
Expand |
---|
|
Create a Calculated (scripted) Duration custom field type, Due change, from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
import java.text.SimpleDateFormat;
Date curDueDate = issue.get("duedate");
if (curDueDate == null)
return null;
if (issue.getFieldHistory("duedate").size() == 0)
return null;
oldVal = issue.getFieldHistory("duedate")[-1].getFrom()
if (oldVal==null)
return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date oldDueDate = sdf.parse(oldVal);
return (curDueDate.getTime() - oldDueDate.getTime())/1000L; |
Click on Save .
|
Calculate and display the Total Original Estimate of all the Stories associated to the Epic.
Expand |
---|
|
Create a Calculated (scripted) Duration custom field type: Total Original Estimate , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
def totalOE = 0
issue.getStories().each{
totalOE += it.get("timeoriginalestimate",0)
}
return totalOE |
Click on Save . Select the Duration in the configuration as Duration (Time Tracking Format)
|
Calculate and display the Remaining Estimate of all the Stories associated to the Epic.
Expand |
---|
|
Create a Calculated (scripted) Number custom field type: Total Remaining Estimate , from the Custom fields administration page. Click on Configure. Click on Edit Groovy Formula and write the following formula. Code Block |
---|
def totalRE = 0
issue.getStories().each{
totalRE += it.get("timeestimate",0)
}
return totalRE |
Click on Save . Select the Duration in the configuration as Duration (Time Tracking Format)
|
Calculated (scripted) Multi-select custom field type
A Calculated (scripted) Multi-select custom field type represents a collection of Options and is displayed as a String representing the option values.
Sample use cases:
Calculate and display the access to be provided to the user in a custom field based on the project role the user belongs to.
Expand |
---|
|
Create a Calculated (scripted) Multi-select custom field type, "Access to" from the Custom fields administration page. Click on Configure Click on Edit Options Add the options to the custom field. Click on Edit Groovy Formula and write the following formula. Code Block |
---|
| if(issue.get("New user")== null)
return null
def user = issue.get("New user")
def roles = []
def project = issue.get("project")
if(user.isInProjectRole("Customer Support",project)){
roles += "Jira Service Desk"
}
if(user.isInProjectRole("Document writer",project)){
roles += "Confluence"
}
if(user.isInProjectRole("Project Manager",project)){
roles += "Jira Software"
}
return roles |
Click on Save.
|
Calculated (scripted) Multi-user custom field type
A Calculated (scripted) Multi-user custom field type represents a collection of users and is displayed as a String representing the user display names
Sample use cases:
Calculate and display the assignees of the sub-tasks on the parent issue.
Expand |
---|
|
Create a Calculated (scripted) Multi-user custom field type, "Assignees of Sub-tasks" from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
| Set users = []
issue.get("subtasks").each{
if(it.assignee)
{
users += it.assignee
}
}
return users |
Click on Save.
|
Calculated (scripted) Number custom field type
A Calculated (scripted) Number custom field type represents a number and is displayed in Double format.
Sample use cases:
Calculate and display the number of Stories associated to the Epic.
Expand |
---|
|
Create a Calculated (scripted) Number custom field type: Total Stories , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
if (issue.stories){
return issue.getStories().size()
}
else{
return 0
} |
Click on Save .
|
...
Calculated (scripted) Single-select custom field type
A Calculated (scripted) Single-select custom field type represents an Option and is displayed as a String representing an Option value.
Sample use cases:
Calculate and display the company name with logo based on the value provided in the text field holding the URL of the company
Expand |
---|
|
Create a Calculated (scripted) Single-select custom field type: Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
import com.google.common.net.InternetDomainName;
import java.net.URL;
import org.apache.commons.validator.routines.UrlValidator;
if (issue.get("URL field")==null)
return null;
def urlString = issue.get("URL field")
def urlValidator = new UrlValidator()
if(urlValidator.isValid(issue.get("URL field")) == false)
return null;
def url = new URL(urlString)
def host = url.getHost()
def name = InternetDomainName.from(host).topPrivateDomain();
return name.parts()[0].toUpperCase() |
Click on Save . Click on Edit Velocity template and write the following template Code Block |
---|
#if ($value == "AMAZON")
<img src='https://images-na.ssl-images-amazon.com/images/I/31YAf-cs2oL._AC_UL160_.jpg' width=30px >$value
#elseif ($value == "MYNTRA")
<img src='https://images-na.ssl-images-amazon.com/images/I/31YAf-cs2oL._AC_UL160_.jpg' width=30px >$value
#else
return $value
#end |
|
Calculated (scripted) Single-user custom field type
A Calculated (scripted) Single-user custom field type represents an ApplicationUser and is displayed as a String representing the display name of the user.
Sample use cases:
Calculate and display the user who last commented on the issue
...
Calculated (scripted) Text/Html custom field type
A Calculated (scripted) Text/Html custom field displays text calculated using a Groovy script and supporting HTML formatting.
Sample use cases:
Calculate and display the last comment, its author, and timestamp in a text field.
Expand |
---|
|
Create a Calculated (scripted) Text/Html custom field type: Last comment details , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
if(issue.get("comment")){
return "Comment body: " + issue.get("comment").last().getBody() + "\n" +
"Comment Author: " + issue.get("comment").last(). getAuthor() + "\n" + "Comment timestamp: " + issue.get("comment").last().getUpdated()
}
else{
return null
} |
Click on Save .
|
Calculate and display the current issues' linked issues with "is blocked by" link type and are not in Resolved
or Closed
status.
Expand |
---|
|
Create a Calculated (scripted) Text/Html custom field type: Blocking issues , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
return issue.getLinkedIssues("is blocked by").findAll{
it.get("status").name!= "Resolved" || it.get("status").name!= "Closed"
}*.key.join(",") |
Click on Save .
|
...
Expand |
---|
|
Create a Calculated (scripted) Text/Html custom field type: Previous Due dates , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
def dueDates = ""
issue.getFieldHistory("duedate").each{
if(it.getFrom()){
dueDates += it.getFrom() + "\n"
}
}
return dueDates |
Click on Save .
|
Calculate and display estimated hours for each day, using not more than 8 hours per day, until the due date.
Expand |
---|
|
Create a Calculated (scripted) Text/Html custom field type: Daily estimates , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
import org.apache.commons.lang.StringUtils;
import java.text.SimpleDateFormat;
dateStrings = new ArrayList();
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dueDate = issue.get("duedate");
estimate = issue.get("timeoriginalestimate");
if (dueDate != null && estimate != null && estimate > 0) {
calendar = Calendar.getInstance();
calendar.setTime(dueDate);
hours = estimate / 3600.0;
while (hours > 0) {
dateHours = hours > 8 ? 8 : hours;
dateStrings.add(
dateFormat.format(calendar.getTime()) + "," +
String.valueOf(dateHours) + " hours"
);
hours -= dateHours;
calendar.add(Calendar.DATE, -1);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
calendar.add(Calendar.DAY_OF_MONTH, -1)
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY)
calendar.add(Calendar.DAY_OF_MONTH, -1)
}
}
if (dateStrings.isEmpty()) return null;
return StringUtils.join(dateStrings, "\n"); |
Click on Save .
|
...
Calculated (scripted) Wiki Text custom field type
A Calculated (scripted) Wiki custom field displays text calculated using a Groovy script and optionally supporting wiki-style formatting.
Sample use cases:
Calculate and display the last comment, its author, and timestamp in a text field without escaping the formatting .
Expand |
---|
|
Create a Calculated (scripted) Text/Html custom field type: Last comment details , from the Custom fields administration page. Click on Configure Click on Edit Groovy Formula and write the following formula. Code Block |
---|
if(issue.get("comment")){
return "Comment body: " + issue.get("comment").last().getBody() + "\n" +
"Comment Author: " + issue.get("comment").last(). getAuthor() + "\n" + "Comment timestamp: " + issue.get("comment").last().getUpdated()
}
else{
return null
} |
Click on Save .
|
Last Field Value Change Author custom field type
A Last Field Value change Author custom field type that represents the author of the last modification made to a field and is displayed as a String representing the display name of the user.
Sample use cases:
Calculate and display the author who has last added this issue to a Sprint
Expand |
---|
|
Create a Last Field Value Change Author custom field type: Moved to Sprint by , from the Custom fields administration page. Click on Edit Field to look for Select the Sprint field. Click on Save
|
Last Field Value Change Date/Time custom field type
A Last Field Value Change Date/Time custom field type represents a java.util.Date
and is displayed as date+time.
Sample use cases:
Calculate and display the last time the issue was Flagged.
Expand |
---|
|
Create a Last Field Value Change Date/Time custom field type: Last Flagged , from the Custom fields administration page. Click on Edit Field to look for Select the Flagged field. Click on Save
|
Parent Status custom field type
A Parent status calculated custom field type represents the status of the issue's parent issue, if any, and is displayed as a String representing the status name.
Sample use cases:
Calculate and display the status of the parent issue and the name of the user to whom the issue is assigned.
Expand |
---|
|
Create a Parent Status custom field type: Parent Status field , from the Custom fields administration page. Click on Edit Velocity Template Write the following template Code Block |
---|
#if ($issue.assignee.name)
$formattedValue and assigned to $issue.assignee.displayName
#else
$formattedValue
#end |
|
Status entered by user custom field type
A Status entered by user custom field type represents a user who last (or first) moved the issue to the specified status and is displayed as a String representing the user display name.
Sample use cases:
Calculate and display the author name and the email address of the user who first Approved the issue
Expand |
---|
|
Create a Status entered by user custom field type, First Approved on, from the Custom fields administration page. Click on Edit Statuse(s) to look for. Select the Approval status. Select Earliest from Which transition execution field Click on Save .
|
Status entered on date/time custom field type
A Status entered on Date/Time custom field type represents a date+time the issue has been last (or first) moved to the specified status and is displayed as date+time.
Sample use cases:
Calculate and display the date/time an issue entered the Approval status for the first time
Expand |
---|
|
Create a Status entered on date/time custom field type, First Approved on, from the Custom fields administration page. Click on Edit Statuse(s) to look for. Select the Approval status. Select Earliest from Which transition execution field Click on Save
|
Time in status custom field type
A Calculated Time in status custom field type represents a duration and is displayed either as a duration String or as a number in a Long format representing the number of seconds.
Sample use cases:
Calculate and display the time spent in the Pull request status
Expand |
---|
|
Create a Time in status custom field type, Time in Pull request, from the Custom fields administration page. Click on Edit Statuse(s) to look for. Select the statuses you would like the calculated field to look for. Click on Save.
|
Calculate and display the total resolution time for a ticket in an error banner if the time spent is more than 3 days
Expand |
---|
|
Create a Time in status custom field type, Total resolution time, from the Custom fields administration page. Click on Edit Statuse(s) to look for. Select In Progress from the list of statuse(s) Click on Save . Click on Edit Velocity Template Write the following template Code Block |
---|
#if ($value > 252900)
<div class="aui-banner aui-banner-error">
$formattedValue
</div>
#else
$formattedValue
#end |
|
...
Transition Caller custom field type
A Transition Caller custom field type returns the user who first/last executed a specific workflow transition and is displayed as a String representing the display name of the user.
Sample use cases:
Calculate and display the author who last fixed the issue
Expand |
---|
|
Create a Transition caller custom field type, Last fixed by, from the Custom fields administration page. Click on Edit Transition(s) to look for. Provide the transition name or ID of the transition to Fixed status, either manually or using the Transition picker Click on Add . Click on Save . Select Latest from the Transition Execution field.
|
...
Transition Callers custom field type
A Transition Callers custom field type rreturns the users who triggered a specific workflow transition and is displayed as a String representing the display names of the users.
Sample use cases:
Calculate and display the authors who approved the ticket
Expand |
---|
|
Create a Transition callers custom field type, Approved by, from the Custom fields administration page. Click on Edit Transition(s) to look for. Select the "Approve" transition using the Transition picker Click on Add . Click on Save .
|
...
Transition Count custom field type
A Transition Count custom field represents the number of times a specified workflow transition(s) was executed and is displayed as a number in Double format.
Sample use cases:
Calculate and count the number of times an issue fix has been rejected
Expand |
---|
|
Create a Transition Count Custom field type, Rejected, from the Custom fields administration page. Click on Edit Transition(s) to look for. Provide the transition name or ID of the transition "Reject" either manually or using the Transition picker Click on Add . Click on Save .
|
...
Expand |
---|
|
Create a Transition Count Custom field type, Revisions, from the Custom fields administration page. Click on Edit Transition(s) to look for. Provide the transition name or ID of the transition "Needs revision" either manually or using the Transition picker Click on Add . Click on Save .
|
Transition Date/Time custom field type
A Transition Date/Time custom field type represents a java.util.Date
and is displayed as date+time.
Sample use cases:
Calculate and display the date/time as a relative time when the issue has been last approved.
Expand |
---|
|
Create a Transition Date/Time Custom field type, Last Approved on, from the Custom fields administration page. Click on Edit Transition(s) to look for. Provide the transition name or ID either manually or using the Transition picker Click on Add . Click on Save . Select Latest from the Transition Execution field. Click on Edit Date Format Select RELATIVE Click on Save
|
Calculate and display the "Fix date" when an issue is moved to Fixed/Checked-in status for the first time
Expand |
---|
|
Create a Transition Date/Time Custom field type, Fix date, from the Custom fields administration page. Click on Edit Transition(s) to look for. Click on the Transition picker. Select the workflow name and the transition that leads to the respective status Click on Add Repeat the same with the other transitions of the workflows. Click on Save . Select Earliest from the Transition Execution field
|