Project

General

Profile

Feature #14924 » percent_utilization_in_reports.diff

Patch it directly to the redmine core. No migrations necessary. - Devaroop Bhattacharya, 2013-09-16 17:43

View differences:

config/settings.yml (working copy)
230 230
  default:
231 231
  - '6'
232 232
  - '7'
233
standard_man_hours_a_day:
234
  format: int
235
  default: 8
config/locales/en.yml (working copy)
1092 1092
  description_date_from: Enter start date
1093 1093
  description_date_to: Enter end date
1094 1094
  text_repository_identifier_info: 'Only lower case letters (a-z), numbers, dashes and underscores are allowed.<br />Once saved, the identifier cannot be changed.'
1095
  setting_standard_man_hours_a_day: Standard man hours a day
1096
  utilization: Utilization
app/helpers/timelog_helper.rb (working copy)
101 101
    end
102 102
  end
103 103

  
104
  def calculate_availability(columns, hours, period)
105
    hours = hours.to_f
106
    std_hours = Setting.standard_man_hours_a_day.to_i
107
    business_days = case columns
108
                    when "week"
109
                      5
110
                    when "month"
111
                      period = period.split('-')
112
                      year, month = period[0].to_i, period[1].to_i
113
                      start_date =  Date.new(year, month)
114
                      TimeEntry.business_days_between start_date, start_date.end_of_month
115
                    when "day"
116
                      1
117
                    when "year"
118
                      year = period.to_i
119
                      start_date =  Date.new(year)
120
                      TimeEntry.business_days_between start_date, start_date.end_of_year
121
                    end
122
    availability = hours/(std_hours * business_days)
123
    "%.1f" % (availability * 100)
124
  end
125

  
126

  
104 127
  def report_to_csv(report)
105 128
    decimal_separator = l(:general_csv_decimal_separator)
106 129
    export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv|
app/models/time_entry.rb (working copy)
116 116
  def editable_by?(usr)
117 117
    (usr == user && usr.allowed_to?(:edit_own_time_entries, project)) || usr.allowed_to?(:edit_time_entries, project)
118 118
  end
119

  
120
  def self.business_days_between(date1, date2)
121
    business_days = 0
122
    date = date2
123
    while date >= date1
124
      business_days += 1 unless date.saturday? or date.sunday?
125
      date = date - 1
126
    end
127
    business_days
128
  end
129

  
119 130
end
app/controllers/timelog_controller.rb (working copy)
82 82

  
83 83
    @report = Redmine::Helpers::TimeReport.new(@project, @issue, params[:criteria], params[:columns], scope)
84 84

  
85
    @show_utilization = (params[:criteria].present? and params[:criteria].include? "utilization")
86

  
85 87
    respond_to do |format|
86 88
      format.html { render :layout => !request.xhr? }
87 89
      format.csv  { send_data(report_to_csv(@report), :type => 'text/csv; header=present', :filename => 'timelog.csv') }
app/views/timelog/report.html.erb (working copy)
12 12
  <% @report.criteria.each do |criterion| %>
13 13
    <%= hidden_field_tag 'criteria[]', criterion, :id => nil %>
14 14
  <% end %>
15
  <%= (hidden_field_tag 'criteria[]', "utilization", :id => nil) if @show_utilization %>
16

  
15 17
  <%= render :partial => 'timelog/date_range' %>
16 18

  
17 19
  <p><label for='columns'><%= l(:label_details) %></label>: <%= select_tag 'columns', options_for_select([[l(:label_year), 'year'],
......
19 21
                                                                            [l(:label_week), 'week'],
20 22
                                                                            [l(:label_day_plural).titleize, 'day']], @report.columns),
21 23
                                                        :onchange => "this.form.submit();" %>
22

  
23
  <label for='criterias'><%= l(:button_add) %></label>: <%= select_tag('criteria[]', options_for_select([[]] + (@report.available_criteria.keys - @report.criteria).collect{|k| [l_or_humanize(@report.available_criteria[k][:label]), k]}),
24
  <% select_opts = [[]] + (@report.available_criteria.keys - @report.criteria).collect{|k| [l_or_humanize(@report.available_criteria[k][:label]), k]} %>
25
  <% select_opts = select_opts + [[l(:utilization), "utilization"]] if (@report.criteria.count > 0 and !@show_utilization) %>
26
  <label for='criterias'><%= l(:button_add) %></label>: <%= select_tag('criteria[]', options_for_select(select_opts),
24 27
                                                          :onchange => "this.form.submit();",
25 28
                                                          :style => 'width: 200px',
26 29
                                                          :id => nil,
......
56 59
  <% total = 0 -%>
57 60
  <% @report.periods.each do |period| -%>
58 61
    <% sum = sum_hours(select_hours(@report.hours, @report.columns, period.to_s)); total += sum -%>
59
    <td class="hours"><%= html_hours("%.2f" % sum) if sum > 0 %></td>
62
    <td class="hours"><%= html_hours("%.2f" % sum) if sum > 0 %>
63
        <% if @show_utilization and sum > 0 %>
64
        <br/>
65
        (<%= calculate_availability(@report.columns, "%.2f" % sum, period.to_s) %>%)
66
      <% end %>
67
    </td>
60 68
  <% end -%>
61 69
  <td class="hours"><%= html_hours("%.2f" % total) if total > 0 %></td>
62 70
  </tr>
app/views/timelog/_report_criteria.html.erb (working copy)
8 8
  <% total = 0 -%>
9 9
  <% @report.periods.each do |period| -%>
10 10
    <% sum = sum_hours(select_hours(hours_for_value, @report.columns, period.to_s)); total += sum -%>
11
    <td class="hours"><%= html_hours("%.2f" % sum) if sum > 0 %></td>
11
      <td class="hours"><%= html_hours("%.2f" % sum) if sum > 0; %> 
12
      <% if @show_utilization and sum > 0 %>
13
        <br/>
14
        (<%= calculate_availability(@report.columns, "%.2f" % sum, period.to_s) %>%)
15
      <% end %>
16
      </td>
12 17
  <% end -%>
13 18
  <td class="hours"><%= html_hours("%.2f" % total) if total > 0 %></td>
14 19
</tr>
app/views/settings/_general.html.erb (working copy)
33 33
<p><%= setting_text_field :repositories_encodings, :size => 60 %>
34 34
<em class="info"><%= l(:text_comma_separated) %></em></p>
35 35

  
36

  
37
<p><%= setting_text_field :standard_man_hours_a_day, :size => 6 %></p>
36 38
<%= call_hook(:view_settings_general_form) %>
37 39
</div>
38 40

  
(4-4/4)