/** * Once triggered this script checks if the triggering issue is an Epic * * If it´s an epic, the issues status category is retrieved and mapped against an epic status on $statusToEpicMap * * The Epic status field ($epicStatusFieldId) is then updated accordingly. * * Posted by Lisa Förstberg, May 26, 2021, to * on https://community.atlassian.com/t5/Jira-Software-questions/EPIC-Status-Vs-Status/qaq-p/728237 */ import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.event.type.EventDispatchOption import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.Issue import com.atlassian.jira.issue.IssueManager import com.atlassian.jira.issue.MutableIssue import com.atlassian.jira.issue.customfields.manager.OptionsManager import com.atlassian.jira.issue.customfields.option.Option import com.atlassian.jira.issue.fields.CustomField import com.atlassian.jira.issue.fields.config.FieldConfig import com.atlassian.jira.issue.history.ChangeItemBean import com.atlassian.jira.user.ApplicationUser import groovy.transform.Field import org.apache.log4j.Level import org.apache.log4j.Logger Long epicStatusFieldId = 12403 //change to your epic status custom field ID Issue issue = event.issue Logger logger = Logger.getLogger("cevt.common.listeners.update-epic-status") CustomFieldManager customFieldManager = ComponentAccessor.customFieldManager logger.setLevel(Level.ALL) CustomField epicStatusField = customFieldManager.getCustomFieldObject(epicStatusFieldId) OptionsManager optionsManager = ComponentAccessor.getOptionsManager() IssueManager issueManager = ComponentAccessor.getIssueManager() ApplicationUser user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() logger.info("Event triggered for Issue:" + issue) if (issue.issueType.name != "Epic") { logger.info("Issue is not Epic, stopping further processing") logger.debug("\tIssue Type:" + issue.issueType.name) return } else { logger.debug("Issue is epic") } logger.debug("Issue status: "+issue.status) String statusCategory = issue.status.statusCategory.primaryAlias logger.debug(issue.status.statusCategory.properties) logger.info("Issue Status Category:" + statusCategory) logger.debug("\tIssue Status:" + issue.status.name) Map statusToEpicMap = [// Status category: Epic status "To Do" : "To Do", "In Progress": "In Progress", "Done" : "Done" ] logger.info("Based on Status category ($statusCategory) will set Epic Status to:" + statusToEpicMap.get(statusCategory)) MutableIssue mutableIssue = issue as MutableIssue FieldConfig fieldConfig = epicStatusField.getRelevantConfig(issue) Option option = optionsManager.getOptions(fieldConfig).getOptionForValue(statusToEpicMap.get(statusCategory), null) logger.info("Setting field Value") logger.debug("\tField:" + epicStatusField.toString()) logger.debug("\tValue:" + option.toString()) mutableIssue.setCustomFieldValue(epicStatusField, option) issueManager.updateIssue(user, mutableIssue, EventDispatchOption.ISSUE_UPDATED, false) import com.atlassian.jira.issue.index.IssueIndexingService IssueIndexingService indexingService = ComponentAccessor.getComponent(IssueIndexingService) indexingService.reIndex(issue)