Module: Redmine::Utils::DateCalculation

Included in:
CalendarsHelper, Issue, IssueRelation, Helpers::Gantt
Defined in:
lib/redmine/utils/date_calculation.rb

Instance Method Summary collapse

Instance Method Details

#add_working_days(date, working_days) ⇒ Object

Adds working days to the given date



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/redmine/utils/date_calculation.rb', line 43

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

#next_working_date(date) ⇒ Object

Returns the date of the first day on or after the given date that is a working day



63
64
65
66
67
68
# File 'lib/redmine/utils/date_calculation.rb', line 63

def next_working_date(date)
  cwday = date.cwday
  days = 0
  days += 1 while non_working_week_days.include?(((cwday + days - 1) % 7) + 1)
  date + days
end

#non_working_week_daysObject

Returns the index of non working week days (1=monday, 7=sunday)



71
72
73
74
75
76
77
78
79
80
# File 'lib/redmine/utils/date_calculation.rb', line 71

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

#working_days(from, to) ⇒ Object

Returns the number of working days between from and to



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/redmine/utils/date_calculation.rb', line 24

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