class OpeningHoursConverter::OpeningHoursRule

Attributes

comment[RW]
date[RW]
is_defined_off[RW]
time[RW]

Public Class Methods

new() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 8
def initialize
  @date = []
  @time = []
  @is_defined_off = false
  @comment = ''
end

Public Instance Methods

add_comment(comment) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 351
def add_comment(comment)
  @comment = comment
end
add_date(date) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 326
def add_date(date)
  if date.nil? || !date.instance_of?(OpeningHoursConverter::OpeningHoursDate)
    raise ArgumentError
  end

  if @date.empty? || date.same_weekdays?(@date.first.weekdays)
    @date << date
  else
    if !@date.first.same_weekdays?(date.weekdays)
      raise ArgumentError, "This date #{@date.inspect} can't be added to this rule #{inspect}"
    end
  end
end
add_overwritten_weekday(weekday) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 320
def add_overwritten_weekday(weekday)
  @date.each do |d|
    d.add_overwritten_weekday(weekday)
  end
end
add_ph_weekday() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 316
def add_ph_weekday
  @date.each(&:add_ph_weekday)
end
add_time(time) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 347
def add_time(time)
  @time << time if (@time.empty? || @time[0].get != 'off') && !include_time?(time)
end
add_weekday(weekday) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 310
def add_weekday(weekday)
  @date.each do |d|
    d.add_weekday(weekday)
  end
end
ends_month?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 263
def ends_month?(r)
  r[:end][:day] == MONTH_END_DAY[r[:end][:month]] - 1
end
ends_year?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 271
def ends_year?(r)
  r[:end][:month] == 11 && ends_month?(r)
end
equals(o) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 297
def equals(o)
  return false unless o.instance_of?(OpeningHoursConverter::OpeningHoursRule)
  (same_time?(o) && same_date?(o))
end
get() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 15
def get
  result = ''

  result += get_wide_selector if !@date.empty?

  if !@date.empty?
    wd = @date[0].get_weekdays
    result += " #{wd}" if !wd.empty?
  end
  if @is_defined_off
    result += ' off'
  elsif !@time.empty?
    result += ' '
    @time.uniq.each_with_index do |t, i|
      result += ',' if i > 0
      result += t.get
    end
  else
    result += ' off'
  end

  rgx_day = /(Mo|Tu|We|Th|Fr|Sa|Su)/

  if result.strip == '00:00-24:00' || (!(result =~ /00:00-24:00/).nil? && (result =~ rgx_day).nil?)
    result.gsub!('00:00-24:00', '24/7')
  end

  result += " #{comment}" if !comment.nil? && !comment.empty?

  result.strip
end
get_wide_selector() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 47
def get_wide_selector
  if @date.length == 1 && @date[0].wide_interval.type == 'holiday'
    if @date[0].wide_interval.start[:year].nil?
      return 'PH'
    else
      if @date[0].wide_interval.end && @date[0].wide_interval.end[:year]
        return "#{@date[0].wide_interval.start[:year]}-#{@date[0].wide_interval.end[:year]} PH"
      else
        return "#{@date[0].wide_interval.start[:year]} PH"
      end
    end
  end
  years = OpeningHoursConverter::Year.build_day_array_from_dates(@date)
  year_start = -1
  month_start = -1
  day_start = -1

  return result_to_string(years) if is_only_week_interval?(years)

  result = {}

  if !years['always'].nil?
    always = years.delete('always')

    always.each_with_index do |month_array, month|
      month_array.each_with_index do |day_bool, day|
        if day_bool && month_start < 0
          month_start = month
          day_start = day
        end
        if day_bool && month_start >= 0 && month == 11 && day == 30
          result['always'] ||= []
          result['always'] << { start: { day: day_start, month: month_start }, end: { day: 30, month: 11 } }
          month_start = -1
          day_start = -1
        elsif !day_bool && month_start >= 0
          result['always'] ||= []
          end_res = day == 0 ?
            month == 0 ?
              { day: 30, month: 11 } : { day: MONTH_END_DAY[month - 1] - 1, month: month - 1 } :
            { day: day - 1, month: month }
          result['always'] << { start: { day: day_start, month: month_start }, end: end_res }
          month_start = -1
          day_start = -1
        end
      end
    end
  end

  years.each do |year, months|
    months.each_with_index do |month_array, month|
      month_array.each_with_index do |day_bool, day|
        if day_bool && year_start < 0
          year_start = year
          month_start = month
          day_start = day
        end
        if day_bool && year_start >= 0 && month == 11 && day == 30 && years[year + 1].nil?
          if year_start == year
            result[year] ||= []
            result[year] << { start: { day: day_start, month: month_start }, end: { day: 30, month: 11 } }
          else
            result['multi_year'] ||= {}
            result['multi_year']["#{year_start}-#{year}"] ||= []
            result['multi_year']["#{year_start}-#{year}"] << { start: { day: day_start, month: month_start, year: year_start },
                                                               end: { day: 30, month: 11, year: year } }
          end
          year_start = -1
          month_start = -1
          day_start = -1
        elsif !day_bool && year_start >= 0
          end_res = {}

          end_res = if day == 0
                      if month == 0
                        { day: 30, month: 11 }
                      else
                        { day: MONTH_END_DAY[month - 1] - 1, month: month - 1 }
                      end
                    else
                      { day: day - 1, month: month }
                    end

          if year_start == year
            result[year] ||= []
            result[year] << { start: { day: day_start, month: month_start }, end: end_res }
          else
            result['multi_year'] ||= {}
            result['multi_year']["#{year_start}-#{year}"] ||= []
            end_res[:year] = year
            result['multi_year']["#{year_start}-#{year}"] << { start: { day: day_start, month: month_start, year: year_start },
                                                               end: end_res }
          end
          year_start = -1
          month_start = -1
          day_start = -1
        end
      end
    end
  end

  result_to_string(result)
end
has_overwritten_weekday?() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 306
def has_overwritten_weekday?
  !@date.empty? && !@date[0].weekdays_over.empty?
end
include_time?(time) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 340
def include_time?(time)
  @time.each do |t|
    return true if t.start == time.start && t.end == time.end
  end
  false
end
is_full_month?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 243
def is_full_month?(r)
  is_same_month?(r) && starts_month?(r) && ends_month?(r)
end
is_full_year?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 239
def is_full_year?(r)
  starts_year?(r) && ends_year?(r)
end
is_off?() click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 302
def is_off?
  @time.empty? || (@time.length == 1 && time[0].start.nil?)
end
is_only_week_interval?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 228
def is_only_week_interval?(r)
  r.all? do |year, intervals|
    intervals.all? do |interval|
      is_week_interval?(interval)
    end
  end
end
is_same_day?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 255
def is_same_day?(r)
  r[:start][:day] == r[:end][:day]
end
is_same_month?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 251
def is_same_month?(r)
  r[:start][:month] == r[:end][:month]
end
is_same_year?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 247
def is_same_year?(r)
  r[:start][:year] == r[:end][:year]
end
is_week_interval?(interval) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 235
def is_week_interval?(interval)
  !interval.is_a?(Array) && interval.key?(:start) && interval[:start].key?(:week)
end
result_to_string(result) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 151
def result_to_string(result)
  str_result = ''
  if is_only_week_interval?(result)
    local_str = result.keys == ['always'] ? 'week ' : result.keys.length == 1 ? result.keys.first.to_s + ' week ' : result.keys.min.to_s + '-' + result.keys.max.to_s + ' week '

    intervals = result[result.keys.first]
    intervals.each do |interval|
      local_str += "," if !(local_str[local_str.length - 1] =~ /^[0-9]$/).nil?
      local_str +=
        if interval[:modifier].nil?
          if interval[:start][:week] == interval[:end][:week]
            interval[:start][:week].to_s
          else
            "#{interval[:start][:week].to_s + '-' + interval[:end][:week].to_s}"
          end
        else
          "#{interval[:start][:week].to_s + '-' + interval[:end][:week].to_s}/#{interval[:modifier].to_s}"
        end
    end
    str_result += local_str
    local_str = ''
  else
    result.each do |selector, intervals|
      if selector == 'always'
        intervals.each do |interval|
          str_result += ',' if !str_result.empty?
          if is_full_year?(interval)
          elsif starts_year?(interval) && ends_year?(interval)
            str_result += "#{interval[:start][:year]}-#{interval[:end][:year]}"
          elsif is_full_month?(interval)
            str_result += (OSM_MONTHS[interval[:start][:month]]).to_s
          elsif is_same_month?(interval)
            if is_same_day?(interval)
              str_result += "#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}"
            else
              str_result += "#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}-#{interval[:end][:day] + 1 < 10 ? "0#{interval[:end][:day] + 1}" : interval[:end][:day] + 1}"
            end
          elsif starts_month?(interval) && ends_month?(interval)
            str_result += "#{OSM_MONTHS[interval[:start][:month]]}-#{OSM_MONTHS[interval[:end][:month]]}"
          else
            str_result += "#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}-#{OSM_MONTHS[interval[:end][:month]]} #{interval[:end][:day] + 1 < 10 ? "0#{interval[:end][:day] + 1}" : interval[:end][:day] + 1}"
          end
        end
      elsif selector == 'multi_year'
        intervals.each do |_years, intervals|
          intervals.each do |interval|
            str_result += ',' if !str_result.empty?
            if starts_year?(interval) && ends_year?(interval)
              str_result += "#{interval[:start][:year]}-#{interval[:end][:year]}"
            else
              str_result += "#{interval[:start][:year]} #{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}-#{interval[:end][:year]} #{OSM_MONTHS[interval[:end][:month]]} #{interval[:end][:day] + 1 < 10 ? "0#{interval[:end][:day] + 1}" : interval[:end][:day] + 1}"
            end
          end
        end
      else
        local_str = "#{selector} "
        intervals.each do |interval|
          if is_full_year?(interval)
          elsif is_same_month?(interval)
            if is_same_day?(interval)
              local_str += "#{local_str.length > 5 ? ',' : ''}#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}"
            else
              local_str += "#{local_str.length > 5 ? ',' : ''}#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}-#{interval[:end][:day] + 1 < 10 ? "0#{interval[:end][:day] + 1}" : interval[:end][:day] + 1}"
            end
          else
            local_str += "#{local_str.length > 5 ? ',' : ''}#{OSM_MONTHS[interval[:start][:month]]} #{interval[:start][:day] + 1 < 10 ? "0#{interval[:start][:day] + 1}" : interval[:start][:day] + 1}-#{selector} #{OSM_MONTHS[interval[:end][:month]]} #{interval[:end][:day] + 1 < 10 ? "0#{interval[:end][:day] + 1}" : interval[:end][:day] + 1}"
          end
          str_result += "#{!str_result.empty? ? ',' : ''}#{local_str}"
          local_str = ''
        end
      end
    end
  end

  str_result.strip
end
same_date?(o) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 286
def same_date?(o)
  if o.nil? || o.date.length != @date.length
    false
  else
    @date.each_with_index do |d, i|
      return false if !d.wide_interval.equals(o.date[i].wide_interval)
    end
    true
  end
end
same_time?(o) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 275
def same_time?(o)
  if o.nil? || o.time.length != @time.length || @is_defined_off != o.is_defined_off
    false
  else
    @time.each_with_index do |t, i|
      return false if !t.equals(o.time[i])
    end
    true
  end
end
starts_month?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 259
def starts_month?(r)
  r[:start][:day] == 0
end
starts_year?(r) click to toggle source
# File lib/opening_hours_converter/opening_hours_rule.rb, line 267
def starts_year?(r)
  r[:start][:month] == 0 && starts_month?(r)
end