Feature #24277 » 03_calculate_done_ratio_using_time_3.4.1.patch
app/models/issue.rb | ||
---|---|---|
52 | 52 |
acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status), |
53 | 53 |
:author_key => :author_id |
54 | 54 | |
55 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status) |
|
55 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status issue_time)
|
|
56 | 56 | |
57 | 57 |
attr_accessor :deleted_attachment_ids |
58 | 58 |
attr_reader :current_journal |
... | ... | |
698 | 698 |
def done_ratio |
699 | 699 |
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio |
700 | 700 |
status.default_done_ratio |
701 |
elsif Issue.use_time_for_done_ratio? |
|
702 |
if done_ratio_derived? |
|
703 |
calculate_done_ratio_from_time(total_estimated_hours, total_remaining_hours) |
|
704 |
else |
|
705 |
calculate_done_ratio_from_time(estimated_hours, remaining_hours) |
|
706 |
end |
|
701 | 707 |
else |
702 | 708 |
read_attribute(:done_ratio) |
703 | 709 |
end |
... | ... | |
711 | 717 |
Setting.issue_done_ratio == 'issue_field' |
712 | 718 |
end |
713 | 719 | |
720 |
def self.use_time_for_done_ratio? |
|
721 |
Setting.issue_done_ratio == 'issue_time' |
|
722 |
end |
|
723 | ||
714 | 724 |
def validate_issue |
715 | 725 |
if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date |
716 | 726 |
errors.add :due_date, :greater_than_start_date |
... | ... | |
1902 | 1912 |
self.done_ratio ||= 0 |
1903 | 1913 |
end |
1904 | 1914 |
end |
1915 | ||
1916 |
def calculate_done_ratio_from_time(estimated, remaining) |
|
1917 |
if remaining.to_f == 0 |
|
1918 |
100 |
|
1919 |
elsif remaining.to_f > 0 |
|
1920 |
ratio = (estimated.to_f - remaining.to_f) / estimated.to_f * 100 |
|
1921 |
[ratio, 0].max.to_i |
|
1922 |
else |
|
1923 |
0.0 |
|
1924 |
end |
|
1925 |
end |
|
1905 | 1926 |
end |
config/locales/en.yml | ||
---|---|---|
435 | 435 |
setting_issue_done_ratio: Calculate the issue done ratio with |
436 | 436 |
setting_issue_done_ratio_issue_field: Use the issue field |
437 | 437 |
setting_issue_done_ratio_issue_status: Use the issue status |
438 |
setting_issue_done_ratio_issue_time: Use the issue remaining and estimated time |
|
438 | 439 |
setting_start_of_week: Start calendars on |
439 | 440 |
setting_rest_api_enabled: Enable REST web service |
440 | 441 |
setting_cache_formatted_text: Cache formatted text |
test/unit/issue_subtasking_test.rb | ||
---|---|---|
238 | 238 |
end |
239 | 239 |
end |
240 | 240 | |
241 |
def test_done_ratio_should_be_calculated_from_total_estimated_and_total_remaining_time |
|
242 |
with_settings :parent_issue_done_ratio => 'derived', :issue_done_ratio => 'issue_time' do |
|
243 |
parent = Issue.generate! |
|
244 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 20) |
|
245 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 10) |
|
246 |
parent.generate_child!(:estimated_hours => 20, :remaining_hours => 20) |
|
247 |
parent.generate_child!(:estimated_hours => 0, :remaining_hours => 0) |
|
248 | ||
249 |
assert_equal 50, parent.reload.done_ratio |
|
250 |
end |
|
251 |
end |
|
252 | ||
241 | 253 |
def test_done_ratio_of_parent_should_reflect_children |
242 | 254 |
root = Issue.generate! |
243 | 255 |
child1 = root.generate_child! |
test/unit/issue_test.rb | ||
---|---|---|
2656 | 2656 |
end |
2657 | 2657 |
end |
2658 | 2658 | |
2659 |
def test_done_ratio_should_be_calculated_from_estimated_and_remaining_time |
|
2660 |
@issue = Issue.find(1) |
|
2661 |
@issue.update_attribute(:estimated_hours, 50) |
|
2662 |
@issue.update_attribute(:remaining_hours, 25) |
|
2663 | ||
2664 |
@issue2 = Issue.find(2) |
|
2665 |
@issue2.update_attribute(:estimated_hours, 50) |
|
2666 |
@issue2.update_attribute(:remaining_hours, 50) |
|
2667 | ||
2668 |
@issue3 = Issue.find(3) |
|
2669 |
@issue3.update_attribute(:estimated_hours, 50) |
|
2670 |
@issue3.update_attribute(:remaining_hours, 0) |
|
2671 | ||
2672 |
with_settings :issue_done_ratio => 'issue_time' do |
|
2673 |
assert_equal 50, @issue.done_ratio |
|
2674 |
assert_equal 0, @issue2.done_ratio |
|
2675 |
assert_equal 100, @issue3.done_ratio |
|
2676 |
end |
|
2677 |
end |
|
2678 | ||
2659 | 2679 |
test "#by_tracker" do |
2660 | 2680 |
User.current = User.anonymous |
2661 | 2681 |
groups = Issue.by_tracker(Project.find(1)) |