# Used to weight unestimated issues in progress calculation
def estimated_average
if @estimated_average.nil?
- average = average(:estimated_hours).to_f
- if average == 0
- average = 1
+ issues_with_total_estimated_hours = select {|c| c.total_estimated_hours.to_f > 0.0}
+ if issues_with_total_estimated_hours.any?
+ average = issues_with_total_estimated_hours.map(&:total_estimated_hours).sum.to_f / issues_with_total_estimated_hours.count
+ else
+ average = 1.0
end
@estimated_average = average
end
@issues_progress[open] ||= begin
progress = 0
if count > 0
- ratio = open ? 'done_ratio' : 100
-
- done = open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f
+ done = open(open).map {|c|
+ estimated = c.total_estimated_hours.to_f
+ estimated = estimated_average unless estimated > 0.0
+ ratio = c.closed? ? 100 : (c.done_ratio || 0)
+ estimated * ratio
+ }.sum
progress = done / (estimated_average * count)
end
progress
assert_progress_equal (100.0)/3, v.closed_percent
end
+ def test_progress_should_consider_closed_issues_with_0h_estimated_as_completed
+ project = Project.find(1)
+ closed = IssueStatus.where(:is_closed => true).first
+ v = Version.create!(:project => project, :name => 'Progress')
+ add_issue(v, :done_ratio => 100, :estimated_hours => 0)
+ add_issue(v, :done_ratio => 100, :estimated_hours => 0, :status => closed)
+ assert_progress_equal 100, v.completed_percent
+ assert_progress_equal 50, v.closed_percent
+ end
+
def test_progress_should_consider_estimated_hours_to_weight_issues
project = Project.find(1)
v = Version.create!(:project => project, :name => 'Progress')