Ignore non-working days when rescheduling an issue (#2161).
Weekly non-working days can be configured in application settings (set to saturday and sunday by default). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10747 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
1 parent
48d83884c3
commit
b71355f10b
12 files changed
+244
-19
No files matched your search
+21
-4
@@ -17,6 +17,7 @@
|
||||
|
||||
class Issue < ActiveRecord::Base
|
||||
include Redmine::SafeAttributes
|
||||
include Redmine::Utils::DateCalculation
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :tracker
|
||||
@@ -863,6 +864,11 @@ class Issue < ActiveRecord::Base
|
||||
(start_date && due_date) ? due_date - start_date : 0
|
||||
end
|
||||
|
||||
# Returns the duration in working days
|
||||
def working_duration
|
||||
(start_date && due_date) ? working_days(start_date, due_date) : 0
|
||||
end
|
||||
|
||||
def soonest_start
|
||||
@soonest_start ||= (
|
||||
relations_to.collect{|relation| relation.successor_soonest_start} +
|
||||
@@ -870,22 +876,33 @@ class Issue < ActiveRecord::Base
|
||||
).compact.max
|
||||
end
|
||||
|
||||
def reschedule_after(date)
|
||||
# Sets start_date on the given date or the next working day
|
||||
# and changes due_date to keep the same working duration.
|
||||
def reschedule_on(date)
|
||||
wd = working_duration
|
||||
date = next_working_date(date)
|
||||
self.start_date = date
|
||||
self.due_date = add_working_days(date, wd)
|
||||
end
|
||||
|
||||
# Reschedules the issue on the given date or the next working day and saves the record.
|
||||
# If the issue is a parent task, this is done by rescheduling its subtasks.
|
||||
def reschedule_on!(date)
|
||||
return if date.nil?
|
||||
if leaf?
|
||||
if start_date.nil? || start_date < date
|
||||
self.start_date, self.due_date = date, date + duration
|
||||
reschedule_on(date)
|
||||
begin
|
||||
save
|
||||
rescue ActiveRecord::StaleObjectError
|
||||
reload
|
||||
self.start_date, self.due_date = date, date + duration
|
||||
reschedule_on(date)
|
||||
save
|
||||
end
|
||||
end
|
||||
else
|
||||
leaves.each do |leaf|
|
||||
leaf.reschedule_after(date)
|
||||
leaf.reschedule_on!(date)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -135,7 +135,7 @@ class IssueRelation < ActiveRecord::Base
|
||||
def set_issue_to_dates
|
||||
soonest_start = self.successor_soonest_start
|
||||
if soonest_start && issue_to
|
||||
issue_to.reschedule_after(soonest_start)
|
||||
issue_to.reschedule_on!(soonest_start)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in new issue
Block a user