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:
Jean-Philippe Lang committed 2012-10-29 10:06:30 +00:00
1 parent 48d83884c3
commit b71355f10b
12 files changed
+244 -19

No files matched your search

+63
View File
@@ -51,5 +51,68 @@ module Redmine
end
end
end
module DateCalculation
# Returns the number of working days between from and to
def working_days(from, to)
days = (to - from).to_i
if days > 0
weeks = days / 7
result = weeks * (7 - non_working_week_days.size)
days_left = days - weeks * 7
start_cwday = from.cwday
days_left.times do |i|
unless non_working_week_days.include?(((start_cwday + i - 1) % 7) + 1)
result += 1
end
end
result
else
0
end
end
# Adds working days to the given date
def add_working_days(date, working_days)
if working_days > 0
weeks = working_days / (7 - non_working_week_days.size)
result = weeks * 7
days_left = working_days - weeks * (7 - non_working_week_days.size)
cwday = date.cwday
while days_left > 0
cwday += 1
unless non_working_week_days.include?(((cwday - 1) % 7) + 1)
days_left -= 1
end
result += 1
end
next_working_date(date + result)
else
date
end
end
# Returns the date of the first day on or after the given date that is a working day
def next_working_date(date)
cwday = date.cwday
days = 0
while non_working_week_days.include?(((cwday + days - 1) % 7) + 1)
days += 1
end
date + days
end
# Returns the index of non working week days (1=monday, 7=sunday)
def non_working_week_days
@non_working_week_days ||= begin
days = Setting.non_working_week_days
if days.is_a?(Array) && days.size < 7
days.map(&:to_i)
else
[]
end
end
end
end
end
end