Uploaded image for project: 'Jira Data Center'
  1. Jira Data Center
  2. JRASERVER-10042

Add an improvement to workflow to allow multiple users to approve an issue in any order

    • We collect Jira feedback from various sources, and we evaluate what we've collected when planning our product roadmap. To understand how this piece of feedback will be reviewed, see our Implementation of New Features Policy.

      NOTE: This suggestion is for JIRA Server. Using JIRA Cloud? See the corresponding suggestion.

      A customer has requested that an issue could be approved by mutiple users in a non-linear fashion, but still ensuring that those designated users would all still have to approve the issue before it could change its status to approved.

      e.g. an issue is assigned for approval by a certain group. Each member of that group is alerted to the fact that an issue is awaiting their approval and the issue is not approved until all members of that group have approved the issue. Any member of the group can approve the issue at any time and there is no set order.

            [JRASERVER-10042] Add an improvement to workflow to allow multiple users to approve an issue in any order

            Dave Meyer added a comment -

            Hi everyone,
            There is no plan to implement this feature in the foreseeable future. Currently the top priorities of the JIRA development team are:

            1. Performance, especially initial page loads for highly-used pages
            2. Reducing complexity of setting up and maintaining projects
            3. Improving the UX of key tasks for software teams

            Thanks for your patience. Please contact me if you have any questions: dmeyer (at) atlassian (dot) com
            Regards,
            Dave Meyer
            Product Manager, JIRA Platform

            Dave Meyer added a comment - Hi everyone, There is no plan to implement this feature in the foreseeable future. Currently the top priorities of the JIRA development team are: 1. Performance, especially initial page loads for highly-used pages 2. Reducing complexity of setting up and maintaining projects 3. Improving the UX of key tasks for software teams Thanks for your patience. Please contact me if you have any questions: dmeyer (at) atlassian (dot) com Regards, Dave Meyer Product Manager, JIRA Platform

            Has there been any progress in getting this into development? In the next month or two, we'll need to replace our current process for administering new Hires and Terminations. Upon initiating a New Hire/Termination Request, serveral Managers, as well as their assistant, receive a notification requesting their approval.

            Once approved, it is then forwarded to the appropriate groups for getting him/her on board,(desk top support, facilities, Human Resources, TCOM).
            All approvals are required before moving into next status.

            mary benben added a comment - Has there been any progress in getting this into development? In the next month or two, we'll need to replace our current process for administering new Hires and Terminations. Upon initiating a New Hire/Termination Request, serveral Managers, as well as their assistant, receive a notification requesting their approval. Once approved, it is then forwarded to the appropriate groups for getting him/her on board,(desk top support, facilities, Human Resources, TCOM). All approvals are required before moving into next status.

            I think this has significance especially for those On Demand - most of the plug-ins are not supported with On Demand so having the baked in functionality would be significant for us.

            Crystelle Spinnler added a comment - I think this has significance especially for those On Demand - most of the plug-ins are not supported with On Demand so having the baked in functionality would be significant for us.

            MattS added a comment -

            I like the idea of using the voting system for this, but there is no accountability to go back and see who approved it. I guess it could be added as a comment?

            MattS added a comment - I like the idea of using the voting system for this, but there is no accountability to go back and see who approved it. I guess it could be added as a comment?

            A Cowan added a comment -

            I'm trialling JIRA for use in my organisation and this requirement is a show-stopper for us. Extremely surprised that this has not been implemented as standard out-of-the-box functionality, and (unless I'm missing something) the fact this request has been sitting open for 6 years now with little/no action is somewhat concerning to say the least...

            A Cowan added a comment - I'm trialling JIRA for use in my organisation and this requirement is a show-stopper for us. Extremely surprised that this has not been implemented as standard out-of-the-box functionality, and (unless I'm missing something) the fact this request has been sitting open for 6 years now with little/no action is somewhat concerning to say the least...

            I would also like to see this issue addressed. I feel that non-linear workflows would be very helpful in processing approvals and possibly other things. Although I think approvals is more than enough reason to implement this.

            Christopher Jackson added a comment - I would also like to see this issue addressed. I feel that non-linear workflows would be very helpful in processing approvals and possibly other things. Although I think approvals is more than enough reason to implement this.

            mzreda added a comment -

            My idea is to use voting for approvals. Works like a charm !!! Jelly script is running as a service and do a transition from "Waiting for approval" to "Approved" status. Custom field Approved (Multiuser picker) is used for choosing people to approve (it might be a group picker or project role in future). Script is checking if users who vote quals users from custom field.

            Simple and fast

            Jelly:

            <JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log" >
            <jira:Login username="service" password="servicewkp2010">

            <log:info>Running approve service</log:info>

            <!-- Properties -->
            <core:set var="filterForIssues" value="10010" />
            <core:set var="approveUsersField" value="Approve" />

            <!-- Components -->
            <core:invokeStatic className="com.atlassian.jira.ComponentManager" method="getInstance" var="componentManager"/>
            <core:invoke on="${componentManager}" method="getIssueManager" var="issueManager"/>
            <core:invoke on="${componentManager}" method="getProjectManager" var="projectManager"/>
            <core:invoke on="${componentManager}" method="getCustomFieldManager" var="customFieldManager" />
            <core:invoke on="${componentManager}" method="getVoteManager" var="voteManager" />

            <!-- Run the SearchRequestFilter -->
            <jira:RunSearchRequest filterid="${filterForIssues}" var="issues" />

            <!-- Iterate over the issues -->
            <core:forEach var="issue" items="${issues}">
            <log:warn>Checking for approve issue: ${issue.key}</log:warn>

            <core:invoke on="${projectManager}" method="getProject" var="project">
            <core:arg type="java.lang.Long" value="${issue.project}"/>
            </core:invoke>

            <core:invoke on="${issueManager}" method="getIssueObject" var="jiraIssue">
            <core:arg type="java.lang.String" value="${issue.key}"/>
            </core:invoke>

            <!-- Get Custom FieldObject: customFieldObj -->
            <core:invoke on="${customFieldManager}" method="getCustomFieldObjectByName" var="customFieldObj">
            <core:arg type="java.lang.String" value="${approveUsersField}"/>
            </core:invoke>

            <!-- Get Approve Users for issue -->
            <core:invoke on="${customFieldObj}" method="getValue" var="approveUsers">
            <core:arg type="com.atlassian.jira.issue.IssueImpl" value="${jiraIssue}"/>
            </core:invoke>

            <!-- Check voters equals users to approve -->
            <core:if test="${approveUsers!=null}">

            <core:forEach var="approveUser" items="${approveUsers}">
            <core:set var="approveUsersString" value="${approveUser.name} ${approveUsersString}" />
            </core:forEach>

            <core:set var="usersEquals" value="1" />

            <core:invoke on="${voteManager}" method="getVoterUsernames" var="voters">
            <core:arg type="org.ofbiz.core.entity.GenericValue" value="${issue}"/>
            </core:invoke>

            <core:forEach var="voter" items="${voters}">

            <core:if test="${!approveUsersString.contains(voter)}">
            <core:set var="usersEquals" value="0" />
            </core:if>

            </core:forEach>

            <core:if test="${usersEquals==1}">

            <!-- Do whatever possible, comment, transition issue etc -->
            <jira:AddComment comment="Approved" issue-key="${issue.key}" />

            </core:if>

            </core:if>

            </core:forEach>
            </jira:Login>
            </JiraJelly>

            mzreda added a comment - My idea is to use voting for approvals. Works like a charm !!! Jelly script is running as a service and do a transition from "Waiting for approval" to "Approved" status. Custom field Approved (Multiuser picker) is used for choosing people to approve (it might be a group picker or project role in future). Script is checking if users who vote quals users from custom field. Simple and fast Jelly: <JiraJelly xmlns:jira="jelly:com.atlassian.jira.jelly.enterprise.JiraTagLib" xmlns:core="jelly:core" xmlns:log="jelly:log" > <jira:Login username="service" password="servicewkp2010"> <log:info>Running approve service</log:info> <!-- Properties --> <core:set var="filterForIssues" value="10010" /> <core:set var="approveUsersField" value="Approve" /> <!-- Components --> <core:invokeStatic className="com.atlassian.jira.ComponentManager" method="getInstance" var="componentManager"/> <core:invoke on="${componentManager}" method="getIssueManager" var="issueManager"/> <core:invoke on="${componentManager}" method="getProjectManager" var="projectManager"/> <core:invoke on="${componentManager}" method="getCustomFieldManager" var="customFieldManager" /> <core:invoke on="${componentManager}" method="getVoteManager" var="voteManager" /> <!-- Run the SearchRequestFilter --> <jira:RunSearchRequest filterid="${filterForIssues}" var="issues" /> <!-- Iterate over the issues --> <core:forEach var="issue" items="${issues}"> <log:warn>Checking for approve issue: ${issue.key}</log:warn> <core:invoke on="${projectManager}" method="getProject" var="project"> <core:arg type="java.lang.Long" value="${issue.project}"/> </core:invoke> <core:invoke on="${issueManager}" method="getIssueObject" var="jiraIssue"> <core:arg type="java.lang.String" value="${issue.key}"/> </core:invoke> <!-- Get Custom FieldObject: customFieldObj --> <core:invoke on="${customFieldManager}" method="getCustomFieldObjectByName" var="customFieldObj"> <core:arg type="java.lang.String" value="${approveUsersField}"/> </core:invoke> <!-- Get Approve Users for issue --> <core:invoke on="${customFieldObj}" method="getValue" var="approveUsers"> <core:arg type="com.atlassian.jira.issue.IssueImpl" value="${jiraIssue}"/> </core:invoke> <!-- Check voters equals users to approve --> <core:if test="${approveUsers!=null}"> <core:forEach var="approveUser" items="${approveUsers}"> <core:set var="approveUsersString" value="${approveUser.name} ${approveUsersString}" /> </core:forEach> <core:set var="usersEquals" value="1" /> <core:invoke on="${voteManager}" method="getVoterUsernames" var="voters"> <core:arg type="org.ofbiz.core.entity.GenericValue" value="${issue}"/> </core:invoke> <core:forEach var="voter" items="${voters}"> <core:if test="${!approveUsersString.contains(voter)}"> <core:set var="usersEquals" value="0" /> </core:if> </core:forEach> <core:if test="${usersEquals==1}"> <!-- Do whatever possible, comment, transition issue etc --> <jira:AddComment comment="Approved" issue-key="${issue.key}" /> </core:if> </core:if> </core:forEach> </jira:Login> </JiraJelly>

            I think this functionality could be achieved by writing a plugin.

            I would suggest first creating a Custom Field Type that allows a multi-select of Users, but only the logged in user can add or remove themselves.
            This should be fairly easy to achieve by extending JIRA's existing "Multi User Picker".

            Next one would create a custom Workflow Condition that looked at the Multi user picker above and only allowed the transition to proceed if the minimum number of users appeared in the field.

            Mark Lassau (Inactive) added a comment - I think this functionality could be achieved by writing a plugin. I would suggest first creating a Custom Field Type that allows a multi-select of Users, but only the logged in user can add or remove themselves. This should be fairly easy to achieve by extending JIRA's existing "Multi User Picker". Next one would create a custom Workflow Condition that looked at the Multi user picker above and only allowed the transition to proceed if the minimum number of users appeared in the field.

            I agree that the priority should be raised on this

            David Tildesley added a comment - I agree that the priority should be raised on this

            Why is this one such a low priority? This is a feature that my company really want. We need to be able to have signoffs using different sets of users that changes per ticket.

            John Taber added a comment - Why is this one such a low priority? This is a feature that my company really want. We need to be able to have signoffs using different sets of users that changes per ticket.

              Unassigned Unassigned
              ben@atlassian.com BenjaminA
              Votes:
              45 Vote for this issue
              Watchers:
              25 Start watching this issue

                Created:
                Updated:
                Resolved: