Project

General

Profile

Feature #1953 ยป issue_1953.diff

Patch To Update Due Date When Estimated Hours Is Set - David Davis, 2009-12-28 21:51

View differences:

app/controllers/issues_controller.rb
14 14
# You should have received a copy of the GNU General Public License
15 15
# along with this program; if not, write to the Free Software
16 16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17
require 'date'
17 18

  
18 19
class IssuesController < ApplicationController
19 20
  menu_item :new_issue, :only => :new
......
168 169
  UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id fixed_version_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
169 170
  
170 171
  def edit
172
    if ! manage_issue_due_date params
173
      flash[:error] = l(:error_update_due_date_fields_required)
174
      redirect_to(params[:back_to] || {:action => 'show', :id => @issue}) and return
175
    end
176

  
171 177
    @allowed_statuses = @issue.new_statuses_allowed_to(User.current)
172 178
    @priorities = IssuePriority.all
173 179
    @edit_allowed = User.current.allowed_to?(:edit_issues, @project)
......
459 465
  end
460 466
  
461 467
private
468
  def manage_issue_due_date(params)
469
    if params[:issue][:update_due_date_based_on_estimated_hours].to_i == 1
470
      if params[:issue][:estimated_hours].blank? or params[:issue][:start_date].blank?
471
        return false
472
      else
473
        additional_days = 0
474
        if params[:issue][:estimated_hours].to_f % Setting.hours_in_work_day.to_f != 0 && params[:issue][:estimated_hours].to_f > Setting.hours_in_work_day.to_f
475
          additional_days += 1
476
        end
477
        work_days_needed = (params[:issue][:estimated_hours].to_f / Setting.hours_in_work_day.to_f).to_i
478
        work_days_needed += additional_days
479
        params[:issue][:due_date] = (Date.parse(params[:issue][:start_date]) + work_days_needed-1)
480

  
481
        # In the span from start date to due date, add additional days for every non-work day
482
        number_of_non_work_days = 0
483
        (Date.parse(params[:issue][:start_date])..params[:issue][:due_date]).each do |date|
484
          if ! Setting.days_in_work_week.include?(Date::DAYNAMES[date.wday].downcase)
485
            number_of_non_work_days += 1
486
          end
487
        end
488
        params[:issue][:due_date] = params[:issue][:due_date] + number_of_non_work_days
489
        # Now make sure our end date isn't a non-work day...
490
        while ! Setting.days_in_work_week.include?(Date::DAYNAMES[params[:issue][:due_date].wday].downcase)
491
          params[:issue][:due_date] = params[:issue][:due_date] + 1
492
        end
493
        params[:issue][:due_date] = params[:issue][:due_date].strftime('%Y-%m-%d')
494
      end
495
    end
496

  
497
    return true
498
  end
499

  
462 500
  def find_issue
463 501
    @issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author, :priority, :category])
464 502
    @project = @issue.project
app/models/issue.rb
60 60

  
61 61
  before_save :update_done_ratio_from_issue_status
62 62
  after_save :create_journal
63

  
64
  attr_accessor :update_due_date_based_on_estimated_hours
63 65
  
64 66
  # Returns true if usr or current user is allowed to view the issue
65 67
  def visible?(usr=nil)
app/views/issues/_attributes.rhtml
34 34
<p><%= f.text_field :start_date, :size => 10 %><%= calendar_for('issue_start_date') %></p>
35 35
<p><%= f.text_field :due_date, :size => 10 %><%= calendar_for('issue_due_date') %></p>
36 36
<p><%= f.text_field :estimated_hours, :size => 3 %> <%= l(:field_hours) %></p>
37
<p><%= f.check_box :update_due_date_based_on_estimated_hours %></p>
37 38
<% if Issue.use_field_for_done_ratio? %>
38 39
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) %></p>
39 40
<% end %>
app/views/settings/_issues.rhtml
15 15
<%= select_tag 'settings[issue_done_ratio]',
16 16
								options_for_select(Issue::DONE_RATIO_OPTIONS.collect {|i| [l("setting_issue_done_ratio_#{i}"), i]}, Setting.issue_done_ratio) %></p>
17 17

  
18
<p><label><%= l(:setting_hours_in_work_day) %></label>
19
<%= text_field_tag 'settings[hours_in_work_day]', Setting.hours_in_work_day, :size => 2 %></p>
20

  
18 21
<p><label><%= l(:setting_issues_export_limit) %></label>
19 22
<%= text_field_tag 'settings[issues_export_limit]', Setting.issues_export_limit, :size => 6 %></p>
20 23
</div>
21 24

  
25
<fieldset class="box settings"><legend><%= l(:setting_days_in_work_week) %></legend>
26
<%= hidden_field_tag 'settings[days_in_work_week][]', '' %>
27
<% l('date.day_names').map{|d| d.downcase}.each do |day| %>
28
  <label><%= check_box_tag 'settings[days_in_work_week][]', day, Setting.days_in_work_week.include?(day) %>
29
	<%= day.capitalize %></label><br />
30
<% end %>
31
</fieldset>
32

  
22 33
<fieldset class="box settings"><legend><%= l(:setting_issue_list_default_columns) %></legend>
23 34
<%= hidden_field_tag 'settings[issue_list_default_columns][]', '' %>
24 35
<% Query.new.available_columns.each do |column| %>
config/locales/en.yml
161 161
  error_issue_done_ratios_not_updated: "Issue done ratios not updated."
162 162
  error_workflow_copy_source: 'Please select a source tracker or role'
163 163
  error_workflow_copy_target: 'Please select target tracker(s) and role(s)'
164
  error_update_due_date_fields_required: Start date and estimated time are required in order to update due date based on estimated hours.
164 165
  
165 166
  warning_attachments_not_saved: "{{count}} file(s) could not be saved."
166 167
  
......
272 273
  field_content: Content
273 274
  field_group_by: Group results by
274 275
  field_sharing: Sharing
276
  field_update_due_date_based_on_estimated_hours: Update Due Date Based On Estimated Hours
275 277
  
276 278
  setting_app_title: Application title
277 279
  setting_app_subtitle: Application subtitle
......
323 325
  setting_issue_done_ratio_issue_field: Use the issue field
324 326
  setting_issue_done_ratio_issue_status: Use the issue status
325 327
  setting_start_of_week: Start calendars on
328
  setting_hours_in_work_day: Hours in work day
329
  setting_days_in_work_week: Days in work week
326 330
  
327 331
  permission_add_project: Create project
328 332
  permission_edit_project: Edit project
config/settings.yml
118 118
  default: 0
119 119
mail_handler_api_key:
120 120
  default: 
121
days_in_work_week:
122
  default:
123
  - monday
124
  - tuesday
125
  - wednesday
126
  - thursday
127
  - friday
121 128
issue_list_default_columns:
122 129
  serialized: true
123 130
  default: 
......
131 138
  default: 1
132 139
issue_done_ratio:
133 140
  default: 'issue_field'
141
hours_in_work_day:
142
  default: 8
134 143
default_projects_public:
135 144
  default: 1
136 145
default_projects_modules:
    (1-1/1)