Class: FastBusinessTime::Schedule
- Inherits:
-
Object
- Object
- FastBusinessTime::Schedule
- 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
-
#seconds_per_week ⇒ Object
readonly
Returns the value of attribute seconds_per_week.
Instance Method Summary collapse
- #add_days_to_date(days, date) ⇒ Object
- #days_in_date_range(first_date, second_date) ⇒ Object
-
#initialize(times) ⇒ Schedule
constructor
A new instance of Schedule.
- #seconds_in_date_range(first_date, second_date) ⇒ Object
- #seconds_per_wday(wday) ⇒ Object
- #seconds_since_beginning_of_day(time) ⇒ Object
- #seconds_until_end_of_day(time) ⇒ Object
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_week ⇒ Object (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 |