Defect #4682 » wrong_completed_percent_computation_with_0_time_issues.patch
app/models/version.rb (working copy) | ||
---|---|---|
196 | 196 |
end |
197 | 197 |
|
198 | 198 |
# Returns the average estimated time of assigned issues |
199 |
# or 1 if no issue has an estimated time
|
|
199 |
# or 1 hour if no issue has an estimated time
|
|
200 | 200 |
# Used to weigth unestimated issues in progress calculation |
201 | 201 |
def estimated_average |
202 | 202 |
if @estimated_average.nil? |
203 |
average = fixed_issues.average(:estimated_hours).to_f |
|
203 |
average = fixed_issues.average(:estimated_hours, |
|
204 |
:conditions => 'estimated_hours > 0').to_f |
|
204 | 205 |
if average == 0 |
205 | 206 |
average = 1 |
206 | 207 |
end |
... | ... | |
208 | 209 |
end |
209 | 210 |
@estimated_average |
210 | 211 |
end |
211 |
|
|
212 |
|
|
212 | 213 |
# Returns the total progress of open or closed issues. The returned percentage takes into account |
213 | 214 |
# the amount of estimated time set for this version. |
214 | 215 |
# |
... | ... | |
218 | 219 |
def issues_progress(open) |
219 | 220 |
@issues_progress ||= {} |
220 | 221 |
@issues_progress[open] ||= begin |
222 |
|
|
223 |
todo = estimated_hours + estimated_average * fixed_issues.count(:conditions => { :estimated_hours => nil }) |
|
224 |
|
|
221 | 225 |
progress = 0 |
222 |
if issues_count > 0
|
|
226 |
if todo > 0
|
|
223 | 227 |
ratio = open ? 'done_ratio' : 100 |
224 |
|
|
228 |
|
|
225 | 229 |
done = fixed_issues.sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}", |
226 | 230 |
:include => :status, |
227 |
:conditions => ["is_closed = ?", !open]).to_f
|
|
228 |
progress = done / (estimated_average * issues_count)
|
|
231 |
:conditions => ['is_closed = ?', !open]).to_f
|
|
232 |
progress = done / todo
|
|
229 | 233 |
end |
230 | 234 |
progress |
231 | 235 |
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, :status => closed) |
|
81 |
add_issue(v, :status => closed) |
|
82 |
assert_progress_equal 100, v.completed_pourcent |
|
83 |
assert_progress_equal 100, 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 |