From 1dcd2103e9347c3e6f9d48deb5f9a83d1802d8e4 Mon Sep 17 00:00:00 2001 From: Marius BALTEANU Date: Wed, 27 Mar 2019 12:30:12 +0000 Subject: [PATCH] Version progress should: - calculate the progress using total estimated hours of children - consider closed issues with 0h estimated as completed --- app/models/version.rb | 17 +++++++++++------ test/unit/version_test.rb | 10 ++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/models/version.rb b/app/models/version.rb index 3c62580..f3b7f1b 100644 --- a/app/models/version.rb +++ b/app/models/version.rb @@ -78,9 +78,11 @@ module FixedIssuesExtension # 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 @@ -98,9 +100,12 @@ module FixedIssuesExtension @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 diff --git a/test/unit/version_test.rb b/test/unit/version_test.rb index 046e20d..acf49b4 100644 --- a/test/unit/version_test.rb +++ b/test/unit/version_test.rb @@ -116,6 +116,16 @@ class VersionTest < ActiveSupport::TestCase 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') -- 2.1.4