Defect #4682 » wrong_completed_percent_computation_with_0_time_issues.patch
| app/models/version.rb (working copy) | ||
|---|---|---|
| 101 | 101 |
def closed_pourcent |
| 102 | 102 |
if issues_count == 0 |
| 103 | 103 |
0 |
| 104 |
elsif open_issues_count == 0 |
|
| 105 |
100 |
|
| 104 | 106 |
else |
| 105 | 107 |
issues_progress(false) |
| 106 | 108 |
end |
| ... | ... | |
| 200 | 202 |
# Used to weigth unestimated issues in progress calculation |
| 201 | 203 |
def estimated_average |
| 202 | 204 |
if @estimated_average.nil? |
| 203 |
average = fixed_issues.average(:estimated_hours).to_f |
|
| 205 |
average = fixed_issues.average(:estimated_hours, |
|
| 206 |
:conditions => 'estimated_hours > 0').to_f |
|
| 204 | 207 |
if average == 0 |
| 205 | 208 |
average = 1 |
| 206 | 209 |
end |
| ... | ... | |
| 208 | 211 |
end |
| 209 | 212 |
@estimated_average |
| 210 | 213 |
end |
| 211 |
|
|
| 214 |
|
|
| 212 | 215 |
# Returns the total progress of open or closed issues. The returned percentage takes into account |
| 213 | 216 |
# the amount of estimated time set for this version. |
| 214 | 217 |
# |
| ... | ... | |
| 220 | 223 |
@issues_progress[open] ||= begin |
| 221 | 224 |
progress = 0 |
| 222 | 225 |
if issues_count > 0 |
| 226 |
|
|
| 223 | 227 |
ratio = open ? 'done_ratio' : 100 |
| 224 |
|
|
| 225 |
done = fixed_issues.sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}",
|
|
| 228 |
|
|
| 229 |
if estimated_hours == 0 |
|
| 230 |
todo = issues_count |
|
| 231 |
done = fixed_issues.sum("#{ratio}",
|
|
| 226 | 232 |
:include => :status, |
| 227 |
:conditions => ["is_closed = ?", !open]).to_f |
|
| 228 |
progress = done / (estimated_average * issues_count) |
|
| 233 |
:conditions => ['is_closed = ?', !open]).to_f |
|
| 234 |
else |
|
| 235 |
todo = estimated_hours + estimated_average * fixed_issues.count(:conditions => { :estimated_hours => nil })
|
|
| 236 |
done = fixed_issues.sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}",
|
|
| 237 |
:include => :status, |
|
| 238 |
:conditions => ['is_closed = ?', !open]).to_f |
|
| 239 |
end |
|
| 240 |
progress = done / todo |
|
| 229 | 241 |
end |
| 230 | 242 |
progress |
| 231 | 243 |
end |
| test/unit/version_test.rb (working copy) | ||
|---|---|---|
| 72 | 72 |
assert_progress_equal (0.0 + 20.0 + 70.0)/3, v.completed_pourcent |
| 73 | 73 |
assert_progress_equal 0, v.closed_pourcent |
| 74 | 74 |
end |
| 75 |
|
|
| 75 |
|
|
| 76 |
def test_progress_should_consider_100pct_done_0h_issues_as_completed |
|
| 77 |
project = Project.find(1) |
|
| 78 |
closed = IssueStatus.find(:first, :conditions => {:is_closed => true})
|
|
| 79 |
v = Version.create!(:project => project, :name => 'Progress') |
|
| 80 |
add_issue(v, :done_ratio => 100, :estimated_hours => 0) |
|
| 81 |
add_issue(v, :done_ratio => 100, :estimated_hours => 0, :status => closed) |
|
| 82 |
assert_progress_equal 100, v.completed_pourcent |
|
| 83 |
assert_progress_equal 50, v.closed_pourcent |
|
| 84 |
end |
|
| 85 |
|
|
| 76 | 86 |
def test_progress_should_consider_closed_issues_as_completed |
| 77 | 87 |
project = Project.find(1) |
| 78 | 88 |
v = Version.create!(:project => project, :name => 'Progress') |
| ... | ... | |
| 82 | 92 |
assert_progress_equal (0.0 + 20.0 + 100.0)/3, v.completed_pourcent |
| 83 | 93 |
assert_progress_equal (100.0)/3, v.closed_pourcent |
| 84 | 94 |
end |
| 85 |
|
|
| 95 |
|
|
| 86 | 96 |
def test_progress_should_consider_estimated_hours_to_weigth_issues |
| 87 | 97 |
project = Project.find(1) |
| 88 | 98 |
v = Version.create!(:project => project, :name => 'Progress') |
| 99 |
add_issue(v, :estimated_hours => 0, :done_ratio => 100) |
|
| 89 | 100 |
add_issue(v, :estimated_hours => 10) |
| 90 | 101 |
add_issue(v, :estimated_hours => 20, :done_ratio => 30) |
| 91 | 102 |
add_issue(v, :estimated_hours => 40, :done_ratio => 10) |
| 92 | 103 |
add_issue(v, :estimated_hours => 25, :status => IssueStatus.find(:first, :conditions => {:is_closed => true}))
|
| 93 |
assert_progress_equal (10.0*0 + 20.0*0.3 + 40*0.1 + 25.0*1)/95.0*100, v.completed_pourcent
|
|
| 104 |
assert_progress_equal (0*100.0 + 10.0*0 + 20.0*0.3 + 40*0.1 + 25.0*1)/95.0*100, v.completed_pourcent
|
|
| 94 | 105 |
assert_progress_equal 25.0/95.0*100, v.closed_pourcent |
| 95 | 106 |
end |
| 96 |
|
|
| 107 |
|
|
| 97 | 108 |
def test_progress_should_consider_average_estimated_hours_to_weigth_unestimated_issues |
| 98 | 109 |
project = Project.find(1) |
| 99 | 110 |
v = Version.create!(:project => project, :name => 'Progress') |
| ... | ... | |
| 229 | 240 |
end |
| 230 | 241 |
|
| 231 | 242 |
def assert_progress_equal(expected_float, actual_float, message="") |
| 232 |
assert_in_delta(expected_float, actual_float, 0.000001, message="")
|
|
| 243 |
assert_in_delta(expected_float, actual_float, 0.000001, message)
|
|
| 233 | 244 |
end |
| 234 | 245 |
end |
- « Previous
- 1
- 2
- 3
- Next »