Class: FastBusinessTime::Schedule

Inherits:
Object
  • Object
show all
Defined in:
lib/fast_business_time/schedule.rb

Constant Summary collapse

WDAYS =
{
  sun: 0,
  mon: 1,
  tue: 2,
  wed: 3,
  thu: 4,
  fri: 5,
  sat: 6
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(times) ⇒ Schedule

Returns a new instance of Schedule.



14
15
16
17
18
19
20
21
# File 'lib/fast_business_time/schedule.rb', line 14

def initialize(times)
  @times = unpack_times(times)
  @seconds_per_week = @times.values.map(&:seconds).inject(&:+)
  @days_per_week = @times.keys.count
  @seconds_in_wday_ranges = calculate_seconds_in_wday_ranges
  @days_in_wday_ranges = calculate_days_in_wday_ranges
  @wdays_plus_days = calculate_wdays_plus_days
end

Instance Attribute Details

#seconds_per_weekObject (readonly)

Returns the value of attribute seconds_per_week.



12
13
14
# File 'lib/fast_business_time/schedule.rb', line 12

def seconds_per_week
  @seconds_per_week
end

Instance Method Details

#add_days_to_date(days, date) ⇒ Object



63
64
65
66
67
68
# File 'lib/fast_business_time/schedule.rb', line 63

def add_days_to_date(days, date)
  weeks = days / @days_per_week
  rest = days % @days_per_week

  date + 7 * weeks + @wdays_plus_days[[date.wday, rest]]
end

#days_in_date_range(first_date, second_date) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/fast_business_time/schedule.rb', line 37

def days_in_date_range(first_date, second_date)
  number_of_days = (second_date - first_date + 1).to_i
  full_weeks = number_of_days / 7
  work_days = @days_per_week * full_weeks
  return work_days if number_of_days % 7 == 0
  work_days + @days_in_wday_ranges[[first_date.wday, second_date.wday]]
end

#seconds_in_date_range(first_date, second_date) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/fast_business_time/schedule.rb', line 29

def seconds_in_date_range(first_date, second_date)
  number_of_days = (second_date - first_date + 1).to_i
  full_weeks = number_of_days / 7
  seconds = @seconds_per_week * full_weeks
  return seconds if number_of_days % 7 == 0
  seconds + @seconds_in_wday_ranges[[first_date.wday, second_date.wday]]
end

#seconds_per_wday(wday) ⇒ Object



23
24
25
26
27
# File 'lib/fast_business_time/schedule.rb', line 23

def seconds_per_wday(wday)
  day = @times[wday]
  return 0 unless day
  day.seconds
end

#seconds_since_beginning_of_day(time) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/fast_business_time/schedule.rb', line 45

def seconds_since_beginning_of_day(time)
  day = @times[time.wday]
  return 0 unless day
  time_in_seconds = time_in_seconds(time)
  day.times.map do |start, _end|
    time_intersection([start, time_in_seconds], [start, _end])
  end.inject(&:+)
end

#seconds_until_end_of_day(time) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/fast_business_time/schedule.rb', line 54

def seconds_until_end_of_day(time)
  day = @times[time.wday]
  return 0 unless day
  time_in_seconds = time_in_seconds(time)
  day.times.map do |start, _end|
    time_intersection([time_in_seconds, _end], [start, _end])
  end.inject(&:+)
end