Feature #24277 » 03_calculate_done_ratio_using_time.patch
app/models/issue.rb | ||
---|---|---|
57 | 57 |
acts_as_activity_provider :scope => preload(:project, :author, :tracker, :status), |
58 | 58 |
:author_key => :author_id |
59 | 59 | |
60 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status) |
|
60 |
DONE_RATIO_OPTIONS = %w(issue_field issue_status issue_time)
|
|
61 | 61 | |
62 | 62 |
attr_reader :current_journal |
63 | 63 |
delegate :notes, :notes=, :private_notes, :private_notes=, :to => :current_journal, :allow_nil => true |
... | ... | |
675 | 675 |
def done_ratio |
676 | 676 |
if Issue.use_status_for_done_ratio? && status && status.default_done_ratio |
677 | 677 |
status.default_done_ratio |
678 |
elsif Issue.use_time_for_done_ratio? |
|
679 |
if done_ratio_derived? |
|
680 |
calculate_done_ratio_from_time(total_estimated_hours, total_remaining_hours) |
|
681 |
else |
|
682 |
calculate_done_ratio_from_time(estimated_hours, remaining_hours) |
|
683 |
end |
|
678 | 684 |
else |
679 | 685 |
read_attribute(:done_ratio) |
680 | 686 |
end |
... | ... | |
688 | 694 |
Setting.issue_done_ratio == 'issue_field' |
689 | 695 |
end |
690 | 696 | |
697 |
def self.use_time_for_done_ratio? |
|
698 |
Setting.issue_done_ratio == 'issue_time' |
|
699 |
end |
|
700 | ||
691 | 701 |
def validate_issue |
692 | 702 |
if due_date && start_date && (start_date_changed? || due_date_changed?) && due_date < start_date |
693 | 703 |
errors.add :due_date, :greater_than_start_date |
... | ... | |
1751 | 1761 |
self.done_ratio ||= 0 |
1752 | 1762 |
end |
1753 | 1763 |
end |
1764 | ||
1765 |
def calculate_done_ratio_from_time(estimated, remaining) |
|
1766 |
if remaining.to_f == 0 |
|
1767 |
100 |
|
1768 |
elsif remaining.to_f > 0 |
|
1769 |
ratio = (estimated.to_f - remaining.to_f) / estimated.to_f * 100 |
|
1770 |
[ratio, 0].max.to_i |
|
1771 |
else |
|
1772 |
0.0 |
|
1773 |
end |
|
1774 |
end |
|
1754 | 1775 |
end |
config/locales/en.yml | ||
---|---|---|
421 | 421 |
setting_issue_done_ratio: Calculate the issue done ratio with |
422 | 422 |
setting_issue_done_ratio_issue_field: Use the issue field |
423 | 423 |
setting_issue_done_ratio_issue_status: Use the issue status |
424 |
setting_issue_done_ratio_issue_time: Use the issue remaining and estimated time |
|
424 | 425 |
setting_start_of_week: Start calendars on |
425 | 426 |
setting_rest_api_enabled: Enable REST web service |
426 | 427 |
setting_cache_formatted_text: Cache formatted text |
test/unit/issue_subtasking_test.rb | ||
---|---|---|
218 | 218 |
end |
219 | 219 |
end |
220 | 220 | |
221 |
def test_done_ratio_should_be_calculated_from_total_estimated_and_total_remaining_time |
|
222 |
with_settings :parent_issue_done_ratio => 'derived', :issue_done_ratio => 'issue_time' do |
|
223 |
parent = Issue.generate! |
|
224 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 20) |
|
225 |
parent.generate_child!(:estimated_hours => 40, :remaining_hours => 10) |
|
226 |
parent.generate_child!(:estimated_hours => 20, :remaining_hours => 20) |
|
227 |
parent.generate_child!(:estimated_hours => 0, :remaining_hours => 0) |
|
228 | ||
229 |
assert_equal 50, parent.reload.done_ratio |
|
230 |
end |
|
231 |
end |
|
232 | ||
221 | 233 |
def test_done_ratio_of_parent_should_reflect_children |
222 | 234 |
root = Issue.generate! |
223 | 235 |
child1 = root.generate_child! |
test/unit/issue_test.rb | ||
---|---|---|
2590 | 2590 |
end |
2591 | 2591 |
end |
2592 | 2592 | |
2593 |
def test_done_ratio_should_be_calculated_from_estimated_and_remaining_time |
|
2594 |
@issue = Issue.find(1) |
|
2595 |
@issue.update_attribute(:estimated_hours, 50) |
|
2596 |
@issue.update_attribute(:remaining_hours, 25) |
|
2597 | ||
2598 |
@issue2 = Issue.find(2) |
|
2599 |
@issue2.update_attribute(:estimated_hours, 50) |
|
2600 |
@issue2.update_attribute(:remaining_hours, 50) |
|
2601 | ||
2602 |
@issue3 = Issue.find(3) |
|
2603 |
@issue3.update_attribute(:estimated_hours, 50) |
|
2604 |
@issue3.update_attribute(:remaining_hours, 0) |
|
2605 | ||
2606 |
with_settings :issue_done_ratio => 'issue_time' do |
|
2607 |
assert_equal 50, @issue.done_ratio |
|
2608 |
assert_equal 0, @issue2.done_ratio |
|
2609 |
assert_equal 100, @issue3.done_ratio |
|
2610 |
end |
|
2611 |
end |
|
2612 | ||
2593 | 2613 |
test "#by_tracker" do |
2594 | 2614 |
User.current = User.anonymous |
2595 | 2615 |
groups = Issue.by_tracker(Project.find(1)) |