Jira Agile: Estimated/Remaining Time for each team member in Planning or Work board

Daniel Müller September 1, 2013

I am looking for a way to see the current work load (estimated time for all tasks in the sprint) during the planning or at least work phase of each individual team member on a glance.

Background:

We are using Jira with Greenhopper. In the old Agile boards, it was posible to sort the Planning Board by user and view the total time estimates for the selected Sprint for each user.

The new agile boards do not support this. I have found a Timesheet addin that would allow seeing the worked hours after the sprint, but I need an overview over an upcoming or current sprint.

What I would like to see is a report or view that would show me this information at a glance. It should be able to do so before the sprint has started (or completed), because it's needed in the planning phase. I considered using the Work board (since it lists hours on each task and I could manually note things), but unfortunately that only works for running sprints.

20 answers

1 accepted

12 votes
Answer accepted
gratnerDF January 23, 2014

Agreed. Not having this feature makes it very difficult

9 votes
Robert Appelbaum April 17, 2014

I think I was able to get what you are looking for by using the Worload Pie Gadget configured to show current estimate for future sprints (based on a filter for the future sprint tasks) by assignee.

gratnerDF April 17, 2014

Thanks this is helfpul, but this would be a lot more usefull in the agile view

Robert Appelbaum April 17, 2014

From what I can tell, it is compatible with the agile greenhopper plugin and can be used on the same dashboard along side the greenhopper burndown gadget.

Daniel Müller May 12, 2014

This solution works for me. It requires setting up a new filter each sprint (because the sprint in planning is not in openSprints()), but otherwise, it does what we need it to do.

jlengrand December 15, 2014

Can you please extend a bit on how you tweaked the pie chart? So far I only could get it to display the number of issues per user, even though every single issue has a time estimate. Thanks!

Daniel Müller December 15, 2014

There are several things you can configure. 1) The filter you want to use. That could be smoething like "openSprints()" or a specific sprint you searched for. 2) Statistic Type: This may be what you need to configure. You may want to enter assigne (I think that's the English term for it, I am using a German version of the board, there it is "Bearbeiter".) 3) Time field to report on: Current Estimate is usually the best, I think, becauseit means it will stay informative during the sprint, and the beginning of th esprint, Original and Current Estimate are the same. 4) Interval: Whatever works for you ;)

Like Lee-Ann COSTA likes this
jlengrand December 15, 2014

Thanks for the quick answer. I think I see the problem now. The pie chart doesn´t offer me the "Time field to report on" you are talking to me about. Is this something you got from a plug-in? Thanks again

jlengrand December 15, 2014

Ok, the reason was that I was using the normal pie chart and not the Workload pie chart. I had to install the Jira Charting Plugin to see it. Everything is solved now. Thanks for the help.

Like # people like this
jcimaszewski October 23, 2015

This is pretty late but I came across this thread in a Google search, so this may be helpful to someone else. In your filter, use "sprint in openSprints() AND sprint not in futureSprints()" to target your active sprint.

3 votes
Mary Van Nostern November 14, 2013

We are also looking for this functionality: "I am looking for a way to see the current work load (estimated time for all tasks in the sprint) during the planning phase of each individual team member on a glance."

Martin Ross January 14, 2014

We are looking for exactly the same thing. It would be great if you could add beside the sum of the issues in the Work when you set the swimlane to assingees.

2 votes
Dobroslawa Wierzbicka
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
May 12, 2014

To all who may want to get updates regarding implementation of this feature, here are the related tickets in our JIRA:

- GHS-1333 As a team manager I would like to be able to plan my capacitiy/utilization per team member (assignee)

- GHS-9689 Support preassigning work to specialists

2 votes
Martin Ross February 14, 2014

We want something like this.. Where it totals the count of the issues as well as the number of days. It is really annoying have to switch back to Classic (which doesn't actually work for sprints).

1 vote
Martin Poirier May 8, 2015

We use a little solution here, little jquery to copy paste in your annoncement banner.  If someone have better way (with only jquery, there's other way I know) you can add your inputs!

Requirement :

  • add reamining estimate column in card layout in config.  I use regex in the html page and not rest to poke the issue so no perf hit.

 

function throttle(fn, time) {
    var t = 0;
    return function() {
        var args = arguments,
            ctx = this;
        clearTimeout(t);
        t = setTimeout(function() {
            fn.apply(ctx, args);
        }, time);
    };
}
function getDaysWeeks(hours) {
    return {
        weeks: Math.floor(hours / (5 * 8)),
        days: Math.floor((hours  % (5 * 8))/8),
        hours: hours % 8
    };
}
AJS.$(document).ready(function () {
document.addEventListener("DOMSubtreeModified", throttle(function() { //rajoute un listener sur les changement dans la page html pour repartir le script a chaque 100 ms
            //var username = AJS.$('#header-details-user-fullname').attr('data-username');  //ajouter si vous voulez un IF username
             //if (username == 'martin.poirier@ubisoft.com') {
		
                var path = window.location.pathname;
                if (path.substring(path.lastIndexOf('/') + 1).indexOf('RapidBoard') > -1) {
                    try {
                        totalday = 0;
                        totalhour = 0;
                        totalweek = 0;
						totalminute = 0;
                        var activesptring = AJS.$('.ghx-backlog-container.ghx-sprint-active').find('.ghx-issues')
                        AJS.$("span[data-tooltip*='day']", activesptring).each(function() {
                            totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
                        });
                        AJS.$("span[data-tooltip*='hour']", activesptring).each(function() {
                            totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
                        });
                        AJS.$("span[data-tooltip*='week']", activesptring).each(function() {
                
                            totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
                        });
						AJS.$("span[data-tooltip*='minute']", activesptring).each(function() {                       
                            totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
                        });
                        totalremaininginhours = 0
                        if (totalweek != 0) {
                            totalremaininginhours += totalweek * 5 * 8
                        }
						 if (totalminute > 59) {
                            totalremaininginhours += Math.floor(totalminute / 60)
                        }
                        if (totalday != 0) {
                            totalremaininginhours += totalday * 8
                        }
                        if (totalhour != 0) {
                            totalremaininginhours += totalhour
                        }
                        var objRemaining = getDaysWeeks(totalremaininginhours);
						var weeks = ""
						var days = ""
						var hours = ""
//console.log(objRemaining);
                        var actions = AJS.$('.ghx-badge-group.ghx-right');  
var rowemptylist = AJS.$('[class="aui-badge ubiadded"]').text()
if (rowemptylist == undefined || rowemptylist == "")  // Si le box de no issue drag and drop est pas la encore
{				
AJS.$(actions).prepend('<span class="aui-badge ubiadded" title="Remaining estimate">' + objRemaining.weeks + 'w ' + objRemaining.days + 'd ' + objRemaining.hours + 'h</span>');
}
else
{
AJS.$('[class="aui-badge ubiadded"]').remove()
AJS.$(actions).prepend('<span class="aui-badge ubiadded" title="Remaining estimate">' + objRemaining.weeks + 'w ' + objRemaining.days + 'd ' + objRemaining.hours + 'h</span>');
}
                    } catch (ex) {
                      console.log("ERROR:" + ex);
                    }
                } //end of if path string
            // } //end of if username
//******************* CODE FOR THE WINDOWS ADDING COLOMNS REAMINING ESTIMATE
if (AJS.$('.form-body.ghx-assigned-work-table th').length < 4) //check si la colonne existe deja.. (par le nombre)
{
 try {
var estimatetable = AJS.$('.form-body.ghx-assigned-work-table');  
var firstthead = estimatetable.find('tr').eq(0);
AJS.$('<th class="ghx-right">Remaining Time Estimate</th>').appendTo(firstthead);
grandtotalremaininghours = 0;
estimatetable.find('tbody  > tr').each(function() { //chaque ligne..
currentuser = AJS.$(this).find('td:first').text() //first td avec le nom du user 
 var totalhour = 0;
 var totalweek = 0;
 var totalminute = 0;
 var totalday = 0;
 
 var activesptring = AJS.$('.ghx-backlog-container.ghx-sprint-active').find('.ghx-issues') //regarder dans la page pour le active sprint
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='day']").each(function() {
             totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='week']").each(function() {
             totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='hour']").each(function() {
             totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
        });
AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring).parent().parent().parent().find("span[data-tooltip*='minute']").each(function() {
             totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
        });
totalremaininginhours = 0
                        if (totalweek != 0) {
                            totalremaininginhours += totalweek * 5 * 8
                        }
						 if (totalminute > 59) {
                            totalremaininginhours += Math.floor(totalminute / 60)
                        }
                        if (totalday != 0) {
                            totalremaininginhours += totalday * 8
                        }
                        if (totalhour != 0) {
                            totalremaininginhours += totalhour
                        }
						grandtotalremaininghours += totalremaininginhours
                        var objRemaining = getDaysWeeks(totalremaininginhours);
var weeks = ""	
var days = ""	
var hours = ""					    
if (objRemaining.weeks != 0)
weeks = objRemaining.weeks + 'w '
if (objRemaining.days != 0)
days = objRemaining.days + 'd '
if (objRemaining.hours != 0)
hours = objRemaining.hours + 'h'

if ((weeks || days || hours) != "")
{
AJS.$(this).append('<td class="ghx-right">'+weeks + days + hours + '</td>')	
}	
else
AJS.$(this).append('<td class="ghx-right">0</td>')	
});
var objgrandtotalremaining = getDaysWeeks(grandtotalremaininghours);
if (objgrandtotalremaining.weeks != 0)
weeks = objgrandtotalremaining.weeks + 'w '
if (objgrandtotalremaining.days != 0)
days = objgrandtotalremaining.days + 'd '
if (objgrandtotalremaining.hours != 0)
hours = objgrandtotalremaining.hours + 'h'
if ((weeks || days || hours) != "")
estimatetable.find('tfoot  > tr:last').append('<td class="ghx-right">'+weeks + days + hours + '</td>')	
else
estimatetable.find('tfoot  > tr:last').append('<td class="ghx-right">0</td>')	
 } catch (ex) {
                      console.log("ERROR:" + ex);
                    }
 }
//***  END CODE REMAINING CODE ESTIMATE
         },100 ), false ); //})); //end listener
}); //end ready

 

This will add 2 things:remainingjquery.png

 

</script>

Have fun

Martin Poirier

Ubisoft

Yossi Bengigi February 13, 2016

Thanks Martin!

Works for me (having some bugs in the calc in the summery window...)

Matteo Fontana May 11, 2016

Hi, great solution! Works perfect for me. Only a question: is there a way to hide the "Remaining Estimate" filed in card layout with the your script?

I need this because every card is enlarged and the backlog is more difficult to view.

Can you help me?

jfperusse_bhvr May 19, 2016

This solution is great, but it didn't work for us as-is because our users did not have an avatar set in their account (first initial displayed instead). We had to modify how the "currentUser" is fetched, and look for "span" and not just "img". Otherwise, we would get remaining times with values of 0.

The first part of the fix is to the currentUser code. This looks for the text portion of the td node only (otherwise, the first letter in the user's name would be included twice).

currentuser = AJS.$(this).find('td:first').contents().filter(function(){ return this.nodeType === 3; }).text();

 

Here's the second part of the fix.

var imgOrSpan = AJS.$("img[data-tooltip*='" + currentuser + "']", activesptring);
if (!imgOrSpan.length) {
	imgOrSpan = AJS.$("span[data-tooltip*='" + currentuser + "']", activesptring);
}
imgOrSpan = imgOrSpan.parent().parent().parent();
imgOrSpan.find("span[data-tooltip*='day']").each(function() {
	totalday += parseInt(AJS.$(this).text().match(/(\d*).(?=day)/));
});
imgOrSpan.find("span[data-tooltip*='week']").each(function() {
	totalweek += parseInt(AJS.$(this).text().match(/(\d*).(?=week)/));
});
imgOrSpan.find("span[data-tooltip*='hour']").each(function() {
	totalhour += parseInt(AJS.$(this).text().match(/(\d*).(?=hour)/));
});
imgOrSpan.find("span[data-tooltip*='minute']").each(function() {
	totalminute += parseInt(AJS.$(this).text().match(/(\d*).(?=minute)/));
});
1 vote
Robert Appelbaum April 17, 2014

Michael Gibson January 13, 2016

Hi Robert, how do you get the chart to show Current Estimate instead of the count of Issues?

Tim Purcell January 19, 2016

Exactly!

 

1 vote
Michael Mott February 3, 2014

I agree, some sort of widget / report that breaks down the amount of time remaining by person and task would be great.

While the work board can get you this information, you have to manually total up (from what I can see) and lose the quick at a glance that a more compact report can give.

0 votes
Emily Stewart October 31, 2016

There is a little drop-down in the bottom right corner of the chart window, and if you select it, Edit is an option. On the Edit window you can select Current Estimate.

0 votes
LASER December 2, 2015

How I can get the totals of remaining time when there are sub-tasks associated with an issue.

0 votes
daniel May 5, 2015

It seems far fetched to try to come with workarounds for what should be a given feature for a project management/planning tool. In my case, I am not allowed to apply add-ins and to have our JIRA admin do anything requires about a thousand sign-offs

To me a simple solution would be to create quick filters for each resource and then to dynamically adjust the traffic light timings in the top right hand corner in plan mode and add this to each swim lane too (since I can show each resource per swim lane). Easily seeing how much time each resource has allocated to them has to be bread and butter for any planning tool surely??

0 votes
gratnerDF September 2, 2014

Hi Viðar,

It doesn't look like Tempo is available for could/onDemand. Do you have plans to make a cloud version?

Thanks,
Greg

Dobroslawa Wierzbicka
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
September 2, 2014

Tempo comes pre-installed with JIRA Cloud, you'll only need to activate it. Go to JIRA Admin > Add-ons > Manage add-ons and look up Tempo Timesheets, and click Free trial there to start using it.

Alexey Zimarev September 2, 2014

Not the Tempo Planner

Viðar Svansson [Tempo]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
September 2, 2014

You are correct. Planner is not yet available for JIRA Cloud but the team is working hard on getting it there.

0 votes
George Donev May 12, 2014

Looking for the same thing as well.

0 votes
Paul Alexander
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
April 18, 2014

The best means of answering the question, "How much time does each resource have in the sprint container we're working?" is to setup a Workload Pie gadget on a dashboard and use a filter like this - note use of the JQL function, futureSprints(). This will sum all subtasks in all sprints (containers) that have not been started yet. In my example, I'm including a cateogry of projects to include along with exluding two subtask issue types in the counts. This way, at sprint planning, we can stuff everyone up to capacity by referring to this pie chart, and then officially, "Start" the sprint.

category = A-Team AND
issuetype in subTaskIssueTypes() AND
issuetype not in ("Standup Meeting", "Sprint Mgmt") AND
Sprint in futureSprints()
ORDER BY assignee ASC, progress ASC, key ASC

0 votes
David Plott February 12, 2014

I see that Tempo Planner has been released. Browsing over the materials I can not find a definate answer to wether this will solve this problem we are all having. Since Tempo Planner is only available on Jira 6 and above I am not able to test it out.

Anyone able to give this a test? If we could add the Tempo Planner tag to the question maybe those guys have an answer.

Viðar Svansson [Tempo]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
February 16, 2014

Hi David,

We @Tempoare looking into this problem and will report here when we have a solution.

Cheers,
Viðar

Viðar Svansson [Tempo]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
September 1, 2014

Hi,

Tempo Planner does show you the estimate and assignee information for an iteration. This works great with JIRA Agile. See screenshot here for example: https://tempoplugin.jira.com/wiki/display/PLANNER/Team+Backlog

Better docs about this feature will be available soon!

Alexey Zimarev September 2, 2014

As I see it, the issue is that this screen is completely separate from the JIRA Agile sprint planning screen.

Viðar Svansson [Tempo]
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
September 2, 2014

It is but we are doing a few things to make it more user friendly. The first is that you can perform many of the actions that you do on the sprint planning screen in the Planner screen. But we have other ideas and if you like to share some suggestions then we would love to hear them.

0 votes
Alexey Zimarev February 2, 2014

We also need to see

  1. An assignee on each issue in the sprint backlog, if available
  2. Grouping per assignee with estimation and remaining total sum
  3. Capacity in hours per team member per sprint to see how it copes with the plan

I am very surprised these basic features are not implemented. Even TFS has this now.

0 votes
mwarton
Rising Star
Rising Star
Rising Stars are recognized for providing high-quality answers to other users. Rising Stars receive a certificate of achievement and are on the path to becoming Community Leaders.
January 26, 2014

Hi everyone,

We have just released JIRA Agile integration for our plugin Intelligent Reports. You can easily get this information into a report using the plugin. Simply design your report visually in Microsoft Word, then use simple point and click rules to fill in the data and estimates. No scripting or API to learn.

There is even an included example "Sprint timesheet" report which displays the hours logged in a sprint after the sprint, which is similar except it reports logged hours instead of estimates.

Alexey Zimarev February 2, 2014

Report is not something that can be used during spring planning.

0 votes
Koen Lasuy January 19, 2014

We are looking for the same functionality.

0 votes
Jeremy Blanchard December 1, 2013

If it is available to you, Agile > Classic ..., is the only way I have found to see this information. This is not very useful as the Classic version is no longer being updated or supported AND it also goes off of FixVersion rather than Sprint. We are creating a version for each sprint which allows us to track it thus. Hopefully a Sprint based solution will be implemented.

Jeremy Blanchard December 1, 2013

One other workaround I just discovered is to make a Quick Filter for each of your Developers which will filter issues assigned to them and then show the sum of the estimates.

Daniel Müller December 2, 2013

I am more looking for plugins or funtionality in Jira Agile then workarounds.

As a workaround, this search query would give you each developers task and then you have to compute manually (is tedious, e.g. would be somethnig you'd want a plugin for)

assignee = [developername] AND type = "[task type for work tasks*]" AND Sprint = "[sprint number]"

*) If you make any distinctions in this regard.

v December 29, 2013

The ability to add each participant to the sprint, plan the team's capacity and see as we plan the sprint each participant's workload is a very important feature.

When will this be made available?

0 votes
Daniel Müller November 21, 2013

I am currently Open Question Reminders, and yes, the question is still open, I am not aware of any features that would allow me to see estimated time/remaining time by team member.

Suggest an answer

Log in or Sign up to answer