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