Feature #24277 » 03_calculate_done_ratio_using_time_5.1.2.patch
app/models/issue.rb | ||
---|---|---|
56 | 56 | |
57 | 57 |
acts_as_mentionable :attributes => ['description'] |
58 | 58 | |
59 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status) |
|
59 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status issue_time)
|
|
60 | 60 | |
61 | 61 |
attr_reader :transition_warning |
62 | 62 |
attr_writer :deleted_attachment_ids |
... | ... | |
747 | 747 |
def done_ratio |
748 | 748 |
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio |
749 | 749 |
status.default_done_ratio |
750 |
elsif Issue.use_time_for_done_ratio? |
|
751 |
if done_ratio_derived? |
|
752 |
calculate_done_ratio_from_time(total_estimated_hours, total_remaining_hours) |
|
753 |
else |
|
754 |
calculate_done_ratio_from_time(estimated_hours, remaining_hours) |
|
755 |
end |
|
750 | 756 |
else |
751 | 757 |
read_attribute(:done_ratio) |
752 | 758 |
end |
... | ... | |
760 | 766 |
Setting.issue_done_ratio == 'issue_field' |
761 | 767 |
end |
762 | 768 | |
769 |
def self.use_time_for_done_ratio? |
|
770 |
Setting.issue_done_ratio == 'issue_time' |
|
771 |
end |
|
772 | ||
763 | 773 |
def validate_issue |
764 | 774 |
if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date |
765 | 775 |
errors.add :due_date, :greater_than_start_date |
... | ... | |
2127 | 2137 |
self.remaining_hours = self.estimated_hours |
2128 | 2138 |
end |
2129 | 2139 |
end |
2140 | ||
2141 |
def calculate_done_ratio_from_time(estimated, remaining) |
|
2142 |
if remaining.to_f == 0 |
|
2143 |
100 |
|
2144 |
elsif remaining.to_f > 0 |
|
2145 |
ratio = (estimated.to_f - remaining.to_f) / estimated.to_f * 100 |
|
2146 |
[ratio, 0].max.to_i |
|
2147 |
else |
|
2148 |
0.0 |
|
2149 |
end |
|
2150 |
end |
|
2130 | 2151 |
end |
config/locales/en.yml | ||
---|---|---|
479 | 479 |
setting_issue_done_ratio: Calculate the issue done ratio with |
480 | 480 |
setting_issue_done_ratio_issue_field: Use the issue field |
481 | 481 |
setting_issue_done_ratio_issue_status: Use the issue status |
482 |
setting_issue_done_ratio_issue_time: Use the issue remaining and estimated time |
|
482 | 483 |
setting_start_of_week: Start calendars on |
483 | 484 |
setting_rest_api_enabled: Enable REST web service |
484 | 485 |
setting_cache_formatted_text: Cache formatted text |
test/unit/issue_subtasking_test.rb | ||
---|---|---|
272 | 272 |
end |
273 | 273 |
end |
274 | 274 | |
275 |
def test_done_ratio_should_be_calculated_from_total_estimated_and_total_remaining_time |
|
276 |
with_settings :parent_issue_done_ratio => 'derived', :issue_done_ratio => 'issue_time' do |
|
277 |
parent = Issue.generate! |
|
278 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 20) |
|
279 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 10) |
|
280 |
parent.generate_child!(:estimated_hours => 20, :remaining_hours => 20) |
|
281 |
parent.generate_child!(:estimated_hours => 0, :remaining_hours => 0) |
|
282 | ||
283 |
assert_equal 50, parent.reload.done_ratio |
|
284 |
end |
|
285 |
end |
|
286 | ||
275 | 287 |
def test_done_ratio_of_parent_should_reflect_children |
276 | 288 |
root = Issue.generate! |
277 | 289 |
child1 = root.generate_child! |
test/unit/issue_test.rb | ||
---|---|---|
2941 | 2941 |
end |
2942 | 2942 |
end |
2943 | 2943 | |
2944 |
def test_done_ratio_should_be_calculated_from_estimated_and_remaining_time |
|
2945 |
@issue = Issue.find(1) |
|
2946 |
@issue.update_attribute(:estimated_hours, 50) |
|
2947 |
@issue.update_attribute(:remaining_hours, 25) |
|
2948 | ||
2949 |
@issue2 = Issue.find(2) |
|
2950 |
@issue2.update_attribute(:estimated_hours, 50) |
|
2951 |
@issue2.update_attribute(:remaining_hours, 50) |
|
2952 | ||
2953 |
@issue3 = Issue.find(3) |
|
2954 |
@issue3.update_attribute(:estimated_hours, 50) |
|
2955 |
@issue3.update_attribute(:remaining_hours, 0) |
|
2956 | ||
2957 |
with_settings :issue_done_ratio => 'issue_time' do |
|
2958 |
assert_equal 50, @issue.done_ratio |
|
2959 |
assert_equal 0, @issue2.done_ratio |
|
2960 |
assert_equal 100, @issue3.done_ratio |
|
2961 |
end |
|
2962 |
end |
|
2963 | ||
2944 | 2964 |
test "#by_tracker" do |
2945 | 2965 |
User.current = User.find(2) |
2946 | 2966 |
groups = Issue.by_tracker(Project.find(1)) |