18,23c18,29 < class Version < ActiveRecord::Base < include Redmine::SafeAttributes < < after_update :update_issues_from_sharing_change < after_save :update_default_project_version < before_destroy :nullify_projects_default_version --- > module FixedIssuesExtension > # Returns the total estimated time for this version > # (sum of leaves estimated_hours) > def estimated_hours > @estimated_hours ||= sum(:estimated_hours).to_f > end > # > # Returns the total amount of open issues for this version. > def open_count > load_counts > @open_count > end 25,37c31,35 < belongs_to :project < has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify do < # Returns the total estimated time for this version < # (sum of leaves estimated_hours) < def estimated_hours < @estimated_hours ||= sum(:estimated_hours).to_f < end < # < # Returns the total amount of open issues for this version. < def open_count < load_counts < @open_count < end --- > # Returns the total amount of closed issues for this version. > def closed_count > load_counts > @closed_count > end 39,42c37,45 < # Returns the total amount of closed issues for this version. < def closed_count < load_counts < @closed_count --- > # Returns the completion percentage of this version based on the amount of open/closed issues > # and the time spent on the open issues. > def completed_percent > if count == 0 > 0 > elsif open_count == 0 > 100 > else > issues_progress(false) + issues_progress(true) 43a47 > end 45,63c49,54 < # Returns the completion percentage of this version based on the amount of open/closed issues < # and the time spent on the open issues. < def completed_percent < if count == 0 < 0 < elsif open_count == 0 < 100 < else < issues_progress(false) + issues_progress(true) < end < end < < # Returns the percentage of issues that have been marked as 'closed'. < def closed_percent < if count == 0 < 0 < else < issues_progress(false) < end --- > # Returns the percentage of issues that have been marked as 'closed'. > def closed_percent > if count == 0 > 0 > else > issues_progress(false) 64a56 > end 66c58 < private --- > private 68,77c60,68 < def load_counts < unless @open_count < @open_count = 0 < @closed_count = 0 < self.group(:status).count.each do |status, count| < if status.is_closed? < @closed_count += count < else < @open_count += count < end --- > def load_counts > unless @open_count > @open_count = 0 > @closed_count = 0 > self.group(:status).count.each do |status, count| > if status.is_closed? > @closed_count += count > else > @open_count += count 80a72 > end 82,91c74,81 < # Returns the average estimated time of assigned issues < # or 1 if no issue has an estimated time < # Used to weight unestimated issues in progress calculation < def estimated_average < if @estimated_average.nil? < average = average(:estimated_hours).to_f < if average == 0 < average = 1 < end < @estimated_average = average --- > # Returns the average estimated time of assigned issues > # or 1 if no issue has an estimated time > # Used to weight unestimated issues in progress calculation > def estimated_average > if @estimated_average.nil? > average = average(:estimated_hours).to_f > if average == 0 > average = 1 93c83 < @estimated_average --- > @estimated_average = average 94a85,86 > @estimated_average > end 96,107c88,99 < # Returns the total progress of open or closed issues. The returned percentage takes into account < # the amount of estimated time set for this version. < # < # Examples: < # issues_progress(true) => returns the progress percentage for open issues. < # issues_progress(false) => returns the progress percentage for closed issues. < def issues_progress(open) < @issues_progress ||= {} < @issues_progress[open] ||= begin < progress = 0 < if count > 0 < ratio = open ? 'done_ratio' : 100 --- > # Returns the total progress of open or closed issues. The returned percentage takes into account > # the amount of estimated time set for this version. > # > # Examples: > # issues_progress(true) => returns the progress percentage for open issues. > # issues_progress(false) => returns the progress percentage for closed issues. > def issues_progress(open) > @issues_progress ||= {} > @issues_progress[open] ||= begin > progress = 0 > if count > 0 > ratio = open ? 'done_ratio' : 100 109,112c101,102 < done = open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f < progress = done / (estimated_average * count) < end < progress --- > done = open(open).sum("COALESCE(estimated_hours, #{estimated_average}) * #{ratio}").to_f > progress = done / (estimated_average * count) 113a104 > progress 115a107,117 > end > > class Version < ActiveRecord::Base > include Redmine::SafeAttributes > > after_update :update_issues_from_sharing_change > after_save :update_default_project_version > before_destroy :nullify_projects_default_version > > belongs_to :project > has_many :fixed_issues, :class_name => 'Issue', :foreign_key => 'fixed_version_id', :dependent => :nullify, :extend => FixedIssuesExtension