class OpeningHoursConverter::Week

Attributes

intervals[RW]

Public Class Methods

new() click to toggle source
# File lib/opening_hours_converter/week.rb, line 8
def initialize
  @intervals = []
end

Public Instance Methods

add_interval(interval) click to toggle source
# File lib/opening_hours_converter/week.rb, line 190
def add_interval(interval)
  @intervals << interval
  @intervals.length - 1
end
clear_intervals() click to toggle source
# File lib/opening_hours_converter/week.rb, line 222
def clear_intervals
  @intervals = []
end
copy_intervals(intervals) click to toggle source
# File lib/opening_hours_converter/week.rb, line 226
def copy_intervals(intervals)
  @intervals = []

  intervals.each do |interval|
    @intervals << interval.dup if !interval.nil? && !interval.is_off
  end
end
edit_interval(id, interval) click to toggle source
# File lib/opening_hours_converter/week.rb, line 195
def edit_interval(id, interval)
  @intervals[id] = interval
end
get_as_minute_array() click to toggle source
# File lib/opening_hours_converter/week.rb, line 12
def get_as_minute_array
  minute_array = Array.new(DAYS_MAX + 1) { Array.new(MINUTES_MAX + 1, false) }

  @intervals.each do |interval|
    if !interval.nil?
      if interval.day_start > interval.day_end
        for day in 0..interval.day_end
          start_minute = 0
          end_minute = day == interval.day_end ? interval.end : MINUTES_MAX
          set_minute_array_for_interval(interval, minute_array, start_minute, end_minute, day)
        end
        for day in interval.day_start..6
          start_minute = day == interval.day_start ? interval.start : 0
          end_minute = MINUTES_MAX
          set_minute_array_for_interval(interval, minute_array, start_minute, end_minute, day)
        end
      else
        for day in interval.day_start..interval.day_end
          start_minute = day == interval.day_start ? interval.start : 0
          end_minute = day == interval.day_end ? interval.end : MINUTES_MAX
          set_minute_array_for_interval(interval, minute_array, start_minute, end_minute, day)
        end
      end
    end
  end

  minute_array
end
get_intervals(clean = false) click to toggle source
# File lib/opening_hours_converter/week.rb, line 58
def get_intervals(clean = false)
  if clean
    minute_array = get_as_minute_array
    intervals = []
    day_start = -1
    minute_start = -1
    minute_end = nil
    off = false
    minute_array.each_with_index do |day, day_index|
      day.each_with_index do |minute, minute_index|
        if day_index == 0 && minute_index == 0
          if minute
            off = minute == 'off'
            day_start = day_index
            minute_start = minute_index
          end
        elsif minute && day_index == DAYS_MAX && minute_index == day.length - 1
          off = minute == 'off'
          if day_start >= 0
            intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index, minute_index, off)
          else
            intervals << OpeningHoursConverter::Interval.new(6, minute_index, 6, minute_index, off)
          end
        else
          if minute && day_start < 0
            off = minute == 'off'
            day_start = day_index
            minute_start = minute_index
          elsif off && minute != 'off'
            intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index - 1, MINUTES_MAX, off)
            off = false
            day_start = minute ? day_index : -1
            minute_start = minute ? minute_index : -1
          elsif !minute && day_start >= 0
            if minute_index == 0
              intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index - 1, MINUTES_MAX, off)
            else
              intervals << OpeningHoursConverter::Interval.new(day_start, minute_start, day_index, minute_index - 1, off)
            end
            off = false
            day_start = -1
            minute_start = - 1
          end
        end
      end
    end

    intervals
  else
    @intervals
  end
end
get_intervals_diff(week) click to toggle source
# File lib/opening_hours_converter/week.rb, line 111
def get_intervals_diff(week)
  self_minutes_array = get_as_minute_array
  other_minutes_array = week.get_as_minute_array

  intervals = { open: [], closed: [] }
  day_start = -1
  min_start = -1

  for d in 0..DAYS_MAX
    diff_day = false
    m = 0
    off = false
    intervals_length = intervals[:open].length
    while m <= MINUTES_MAX
      off = self_minutes_array[d][m] == 'off'
      break if off
      # Copy entire day
      if diff_day
        # first minute of monday
        if d == 0 && m == 0
          if self_minutes_array[d][m]
            day_start = d
            min_start = m
          end
        # last minute of sunday
        elsif d == DAYS_MAX && m == MINUTES_MAX
          if day_start >= 0 && self_minutes_array[d][m]
            intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d, m, off)
          end
        # other days and minutes
        else
          # new interval
          if self_minutes_array[d][m] && day_start < 0
            day_start = d
            min_start = m
          # end interval
          elsif !self_minutes_array[d][m] && day_start >= 0
            if m == 0
              intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d - 1, MINUTES_MAX, off)
            else
              intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d, m - 1, off)
            end
            day_start = -1
            min_start = -1
          end
        end
        m += 1
      # check diff
      else
        diff_day = if !self_minutes_array[d][m]
                     other_minutes_array[d][m] != 'off' && other_minutes_array[d][m]
                   else
                     other_minutes_array[d][m] == 'off' || !other_minutes_array[d][m]
                   end

        if diff_day
          m = 0
        else
          m += 1
        end
      end
    end
    if !diff_day && day_start > -1 && !off
      intervals[:open] << OpeningHoursConverter::Interval.new(day_start, min_start, d - 1, MINUTES_MAX, off)
      day_start = -1
      min_start = -1
    end
    if diff_day && day_start == -1 && intervals_length == intervals[:open].length || off
      if !intervals[:closed].empty? && intervals[:closed][intervals[:closed].length - 1].day_end == d - 1
        intervals[:closed][-1] = OpeningHoursConverter::Interval.new(intervals[:closed].last.day_start, 0, d, MINUTES_MAX, off)
      else
        intervals[:closed] << OpeningHoursConverter::Interval.new(d, 0, d, MINUTES_MAX, off)
      end
    end
  end

  intervals
end
remove_interval(id) click to toggle source
# File lib/opening_hours_converter/week.rb, line 199
def remove_interval(id)
  @intervals[id] = nil
end
remove_intervals_during_day(day) click to toggle source
# File lib/opening_hours_converter/week.rb, line 203
def remove_intervals_during_day(day)
  @intervals.each_with_index do |interval, i|
    next if interval.nil?
    next unless interval.day_start <= day && interval.day_end >= day
    day_diff = interval.day_end - interval.day_start

    next unless day_diff > 1 || day_diff == 0 || interval.day_start == day || interval.start <= interval.end
    if interval.day_end - interval.day_start >= 1 && interval.start <= interval.end
      if interval.day_start < day
        add_interval(OpeningHoursConverter::Interval.new(interval.day_start, interval.start, day - 1, 24 * 60, interval.is_off))
      end
      if interval.day_end > day
        add_interval(OpeningHoursConverter::Interval.new(day + 1, 0, interval.day_end, interval.end, interval.is_off))
      end
    end
    remove_interval(i)
  end
end
same_as?(week) click to toggle source
# File lib/opening_hours_converter/week.rb, line 234
def same_as?(week)
  week.get_as_minute_array == get_as_minute_array
end
set_minute_array_for_interval(interval, minute_array, start_minute, end_minute, day) click to toggle source
# File lib/opening_hours_converter/week.rb, line 41
def set_minute_array_for_interval(interval, minute_array, start_minute, end_minute, day)
  if interval.is_off
    if start_minute && end_minute
      for minute in 0..MINUTES_MAX
        minute_array[day][minute] = 'off'
      end
    end
  else
    if start_minute && end_minute
      minute_array[day] = Array.new(MINUTES_MAX + 1, false) if minute_array[day][0] == 'off'
      for minute in start_minute..end_minute
        minute_array[day][minute] = true
      end
    end
  end
end