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)) |