opening_hours_converter 1.8.0 → 1.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/opening_hours_converter/constants.rb +7 -7
- data/lib/opening_hours_converter/interval.rb +1 -1
- data/lib/opening_hours_converter/iterator.rb +36 -46
- data/lib/opening_hours_converter/opening_hours_builder.rb +128 -161
- data/lib/opening_hours_converter/opening_hours_date.rb +52 -57
- data/lib/opening_hours_converter/opening_hours_parser.rb +114 -137
- data/lib/opening_hours_converter/opening_hours_rule.rb +69 -85
- data/lib/opening_hours_converter/opening_hours_time.rb +7 -9
- data/lib/opening_hours_converter/public_holiday.rb +19 -19
- data/lib/opening_hours_converter/week.rb +36 -44
- data/lib/opening_hours_converter/wide_interval.rb +145 -160
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8182729b4890b6c79b8173b5ed0722da103a4f82820ff62119d63f2d0ca2de72
|
4
|
+
data.tar.gz: bbbab689b9eddebb5dd17e715a15c940dd62cd0fa58b06b860c1234544c2bdf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 241b74370dd846929cccb2fdde19960689d05ce6a7a31c863ea331b6450ce57ba0a88042abb2ecbc588cf38229356e82f43a3d16496513311445aa2787ff40e9
|
7
|
+
data.tar.gz: 528266324133acf97320be51b0f8f4f2b3e99907e2ff3a0c620b5d7e41cfa3339bb7d00bfeb3d915111fbfaa7a966100f20ee723f56ada32d0adf40572d67f0b
|
@@ -9,13 +9,13 @@ module OpeningHoursConverter
|
|
9
9
|
VENDREDI: 4,
|
10
10
|
SAMEDI: 5,
|
11
11
|
DIMANCHE: 6
|
12
|
-
}
|
13
|
-
OSM_DAYS = [
|
14
|
-
IRL_DAYS = [
|
15
|
-
OSM_MONTHS = [
|
16
|
-
IRL_MONTHS = [
|
17
|
-
|
18
|
-
MONTH_END_DAY = [
|
12
|
+
}.freeze
|
13
|
+
OSM_DAYS = %w[Mo Tu We Th Fr Sa Su].freeze
|
14
|
+
IRL_DAYS = %w[Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche].freeze
|
15
|
+
OSM_MONTHS = %w[Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec].freeze
|
16
|
+
IRL_MONTHS = %W[Janvier Fevrier Mars Avril Mai Juin Juillet Aout Septembre
|
17
|
+
Octobre Novembre D\u00E9cembre].freeze
|
18
|
+
MONTH_END_DAY = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31].freeze
|
19
19
|
MINUTES_MAX = 1440
|
20
20
|
DAYS_MAX = 6
|
21
21
|
YEAR_DAYS_MAX = 365
|
@@ -5,7 +5,7 @@ module OpeningHoursConverter
|
|
5
5
|
include Constants
|
6
6
|
attr_reader :day_start, :day_end, :start, :end, :is_off
|
7
7
|
|
8
|
-
def initialize(day_start, min_start, day_end=0, min_end=0, is_off=false)
|
8
|
+
def initialize(day_start, min_start, day_end = 0, min_end = 0, is_off = false)
|
9
9
|
@day_start = day_start
|
10
10
|
@day_end = day_end
|
11
11
|
@start = min_start
|
@@ -23,9 +23,9 @@ module OpeningHoursConverter
|
|
23
23
|
year_start = year
|
24
24
|
month_start = month
|
25
25
|
day_start = day
|
26
|
-
elsif day_bool && year_start >= 0 && month == 11 && day == 30 && years[year+1].nil?
|
26
|
+
elsif day_bool && year_start >= 0 && month == 11 && day == 30 && years[year + 1].nil?
|
27
27
|
|
28
|
-
result << { start: DateTime.new(year_start, month_start+1, day_start+1), end: DateTime.new(year, 12, 31)}
|
28
|
+
result << { start: DateTime.new(year_start, month_start + 1, day_start + 1), end: DateTime.new(year, 12, 31) }
|
29
29
|
|
30
30
|
year_start = -1
|
31
31
|
month_start = -1
|
@@ -33,18 +33,18 @@ module OpeningHoursConverter
|
|
33
33
|
elsif !day_bool && year_start >= 0
|
34
34
|
end_res = {}
|
35
35
|
|
36
|
-
if day == 0
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
end_res = if day == 0
|
37
|
+
if month == 0
|
38
|
+
DateTime.new(year - 1, 12, 31)
|
39
|
+
else
|
40
|
+
DateTime.new(year, month, MONTH_END_DAY[month - 1])
|
41
|
+
end
|
42
|
+
else
|
43
43
|
|
44
|
-
|
45
|
-
|
44
|
+
DateTime.new(year, month + 1, day)
|
45
|
+
end
|
46
46
|
|
47
|
-
result << { start: DateTime.new(year_start, month_start+1, day_start+1), end: end_res }
|
47
|
+
result << { start: DateTime.new(year_start, month_start + 1, day_start + 1), end: end_res }
|
48
48
|
year_start = -1
|
49
49
|
month_start = -1
|
50
50
|
day_start = -1
|
@@ -56,8 +56,7 @@ module OpeningHoursConverter
|
|
56
56
|
date_ranges_array << result
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
return date_ranges_array
|
59
|
+
date_ranges_array
|
61
60
|
end
|
62
61
|
|
63
62
|
def get_time_iterator(date_ranges)
|
@@ -70,7 +69,6 @@ module OpeningHoursConverter
|
|
70
69
|
date_ranges_array = get_iterator(date_ranges)
|
71
70
|
datetime_result = []
|
72
71
|
|
73
|
-
|
74
72
|
date_ranges_array.each_with_index do |result, index|
|
75
73
|
result.each do |interval|
|
76
74
|
(interval[:start]..interval[:end]).each do |day|
|
@@ -79,20 +77,17 @@ module OpeningHoursConverter
|
|
79
77
|
year_ph = PublicHoliday.ph_for_year(year)
|
80
78
|
end
|
81
79
|
date_ranges[index].typical.intervals.each do |i|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
88
|
-
end
|
80
|
+
next unless !i.nil? && !i.is_off
|
81
|
+
next unless (i.day_start..i.day_end).cover?(fix_datetime_wday(day.wday)) || (is_ph && year_ph.include?(Time.new(day.year, day.month, day.day)))
|
82
|
+
itr = { start: Time.new(day.year, day.month, day.day, i.start / 60, i.start % 60),
|
83
|
+
end: Time.new(day.year, day.month, day.day, i.end / 60, i.end % 60) }
|
84
|
+
datetime_result << itr unless datetime_result.include?(itr)
|
89
85
|
end
|
90
86
|
end
|
91
87
|
end
|
92
88
|
end
|
93
89
|
|
94
|
-
datetime_result.
|
95
|
-
|
90
|
+
datetime_result.sort_by { |a| a[:start] }
|
96
91
|
end
|
97
92
|
|
98
93
|
def get_datetime_iterator(date_ranges)
|
@@ -103,67 +98,63 @@ module OpeningHoursConverter
|
|
103
98
|
result.each do |interval|
|
104
99
|
(interval[:start]..interval[:end]).each do |day|
|
105
100
|
date_ranges[index].typical.intervals.each do |i|
|
106
|
-
if (i.day_start..i.day_end).
|
107
|
-
datetime_result << { start: DateTime.new(day.year, day.month, day.day, i.start/60, i.start%60),
|
108
|
-
|
101
|
+
if (i.day_start..i.day_end).cover?(fix_datetime_wday(day.wday))
|
102
|
+
datetime_result << { start: DateTime.new(day.year, day.month, day.day, i.start / 60, i.start % 60),
|
103
|
+
end: DateTime.new(day.year, day.month, day.day, i.end / 60, i.end % 60) }
|
109
104
|
end
|
110
105
|
end
|
111
106
|
end
|
112
107
|
end
|
113
108
|
end
|
114
109
|
|
115
|
-
datetime_result.
|
110
|
+
datetime_result.sort_by { |a| a[:start] }
|
116
111
|
end
|
117
112
|
|
118
|
-
|
119
|
-
|
120
113
|
def fix_datetime_wday(d)
|
121
|
-
d==0 ? 6 : d-1
|
114
|
+
d == 0 ? 6 : d - 1
|
122
115
|
end
|
123
116
|
|
124
117
|
# A partir d'une string OH et d'une DateTime (= now par défaut), renvoyer le current state (début / fin / commentaire)
|
125
|
-
def state(opening_hours_string, time=Time.now)
|
118
|
+
def state(opening_hours_string, time = Time.now)
|
126
119
|
date_ranges = OpeningHoursConverter::OpeningHoursParser.new.parse(opening_hours_string)
|
127
120
|
ti = get_time_iterator(date_ranges)
|
128
121
|
ti.each do |interval|
|
129
122
|
return interval if interval[:start] <= time && interval[:end] >= time
|
130
123
|
end
|
131
|
-
|
124
|
+
false
|
132
125
|
end
|
133
126
|
|
134
127
|
# A partir d'une string OH et d'une DateTime (= now par défaut), renvoyer le prochain state (début / fin / commentaire - nextState dans opening_hours.js) permettant d'afficher à l'utilisateur le prochain événement (ouverture/fermeture)
|
135
|
-
def next_state(opening_hours_string, time=Time.now)
|
128
|
+
def next_state(opening_hours_string, time = Time.now)
|
136
129
|
date_ranges = OpeningHoursConverter::OpeningHoursParser.new.parse(opening_hours_string)
|
137
130
|
ti = get_time_iterator(date_ranges)
|
138
131
|
ti.each_with_index do |interval, index|
|
139
|
-
return {end: interval[:end]} if interval[:start] <= time && interval[:end] >= time
|
140
|
-
return {start: interval[:start]} if interval[:start] > time && ti[index-1][:end] <= time
|
132
|
+
return { end: interval[:end] } if interval[:start] <= time && interval[:end] >= time
|
133
|
+
return { start: interval[:start] } if interval[:start] > time && ti[index - 1][:end] <= time
|
141
134
|
end
|
142
|
-
|
135
|
+
false
|
143
136
|
end
|
144
137
|
|
145
|
-
|
146
|
-
def next_period(opening_hours_string, time=Time.now)
|
138
|
+
def next_period(opening_hours_string, time = Time.now)
|
147
139
|
date_ranges = OpeningHoursConverter::OpeningHoursParser.new.parse(opening_hours_string)
|
148
140
|
ti = get_time_iterator(date_ranges)
|
149
141
|
ti.each_with_index do |interval, index|
|
150
|
-
return ti[index+1] if interval[:start] <= time && interval[:end] >= time
|
151
|
-
return interval if interval[:start] > time && ti[index-1][:end] <= time
|
142
|
+
return ti[index + 1] if interval[:start] <= time && interval[:end] >= time
|
143
|
+
return interval if interval[:start] > time && ti[index - 1][:end] <= time
|
152
144
|
end
|
153
|
-
|
145
|
+
false
|
154
146
|
end
|
155
147
|
|
156
148
|
# A partir d'une string OH et d'une DateTime (= now par défaut), déterminer cela correspond à une période d'ouverture : renvoyer un boolean.
|
157
|
-
def is_opened?(opening_hours_string, time=Time.now)
|
149
|
+
def is_opened?(opening_hours_string, time = Time.now)
|
158
150
|
date_ranges = OpeningHoursConverter::OpeningHoursParser.new.parse(opening_hours_string)
|
159
151
|
ti = get_time_iterator(date_ranges)
|
160
152
|
ti.each do |interval|
|
161
153
|
return true if interval[:start] <= time && interval[:end] >= time
|
162
154
|
end
|
163
|
-
|
155
|
+
false
|
164
156
|
end
|
165
157
|
|
166
|
-
|
167
158
|
def datetime_to_time(datetime)
|
168
159
|
Time.new(datetime.year, datetime.month, datetime.day, datetime.hour, datetime.min, datetime.sec, datetime.zone)
|
169
160
|
end
|
@@ -171,6 +162,5 @@ module OpeningHoursConverter
|
|
171
162
|
def time_to_datetime(time)
|
172
163
|
DateTime.new(time.year, time.month, time.day, time.hour, time.min, time.sec, Rational(time.gmt_offset / 3600, 24))
|
173
164
|
end
|
174
|
-
|
175
165
|
end
|
176
166
|
end
|
@@ -14,115 +14,100 @@ module OpeningHoursConverter
|
|
14
14
|
off_day_ph = false
|
15
15
|
|
16
16
|
date_ranges.each_with_index do |date_range, date_range_index|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
end
|
26
|
-
date_range.typical.remove_interval(interval_id)
|
27
|
-
end
|
17
|
+
next unless !date_range.nil?
|
18
|
+
if date_range.typical.intervals.length != 1
|
19
|
+
date_range.typical.intervals.each_with_index do |interval, interval_id|
|
20
|
+
next unless interval&.day_start == -2 && interval&.day_start == interval&.day_end
|
21
|
+
if interval.is_off
|
22
|
+
off_day_ph = true
|
23
|
+
else
|
24
|
+
day_ph = true
|
28
25
|
end
|
26
|
+
date_range.typical.remove_interval(interval_id)
|
29
27
|
end
|
28
|
+
end
|
30
29
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
30
|
+
range_general = nil
|
31
|
+
range_general_for = nil
|
32
|
+
range_general_id = date_range_index - 1
|
33
|
+
|
34
|
+
while range_general_id >= 0 && range_general.nil?
|
35
|
+
if !date_range.nil?
|
36
|
+
general_for = date_ranges[range_general_id].is_general_for?(date_range)
|
37
|
+
if date_ranges[range_general_id].has_same_typical?(date_range) && (date_ranges[range_general_id].wide_interval.equals(date_range.wide_interval) || general_for)
|
38
|
+
range_general = range_general_id
|
39
|
+
elsif general_for && date_ranges[range_general_id].defines_typical_week? && date_range.defines_typical_week?
|
40
|
+
range_general_for = range_general_id
|
43
41
|
end
|
44
|
-
range_general_id -= 1
|
45
42
|
end
|
43
|
+
range_general_id -= 1
|
44
|
+
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
46
|
+
next unless date_range_index == 0 || range_general.nil?
|
47
|
+
if date_range.typical&.intervals&.length == 1 && date_range.typical&.intervals[0].day_start == -2 && date_range.typical&.intervals[0].day_end == -2
|
48
|
+
oh_rules = build_holiday(date_range)
|
49
|
+
elsif date_range.defines_typical_week?
|
50
|
+
oh_rules = if !range_general_for.nil?
|
51
|
+
build_week_diff(date_range, date_ranges[range_general_for])
|
52
|
+
else
|
53
|
+
build_week(date_range)
|
54
|
+
end
|
55
|
+
else
|
56
|
+
oh_rules = build_day(date_range)
|
57
|
+
end
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
oh_rules.each_with_index do |_rule, i|
|
60
|
+
oh_rules[i].add_comment(date_range.comment)
|
61
|
+
end
|
65
62
|
|
63
|
+
oh_rules.map do |oh_rule|
|
64
|
+
oh_rule_added = false
|
65
|
+
rule_index = 0
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
elsif rules[rule_index].date[0].wide_interval.type == "holiday" && rules[rule_index].date[0].wide_interval.get_time_selector == "PH"
|
84
|
-
oh_rule.add_ph_weekday
|
85
|
-
rules[rule_index] = oh_rule
|
86
|
-
oh_rule_added = true
|
87
|
-
else
|
88
|
-
rule_index += 1
|
89
|
-
end
|
90
|
-
end
|
67
|
+
while !oh_rule_added && rule_index < rules.length
|
68
|
+
if rules[rule_index].same_time?(oh_rule) && !rules[rule_index].equals(oh_rule) && rules[rule_index].comment == oh_rule.comment
|
69
|
+
begin
|
70
|
+
for date_id in 0...oh_rule.date.length
|
71
|
+
rules[rule_index].add_date(oh_rule.date[date_id])
|
72
|
+
end
|
73
|
+
oh_rule_added = true
|
74
|
+
rescue Exception => e
|
75
|
+
puts e
|
76
|
+
if oh_rule.date[0].wide_interval.type == 'holiday' && oh_rule.date[0].wide_interval.get_time_selector == 'PH'
|
77
|
+
rules[rule_index].add_ph_weekday
|
78
|
+
oh_rule_added = true
|
79
|
+
elsif rules[rule_index].date[0].wide_interval.type == 'holiday' && rules[rule_index].date[0].wide_interval.get_time_selector == 'PH'
|
80
|
+
oh_rule.add_ph_weekday
|
81
|
+
rules[rule_index] = oh_rule
|
82
|
+
oh_rule_added = true
|
91
83
|
else
|
92
|
-
rule_index+=1
|
84
|
+
rule_index += 1
|
93
85
|
end
|
94
86
|
end
|
87
|
+
else
|
88
|
+
rule_index += 1
|
89
|
+
end
|
90
|
+
end
|
95
91
|
|
96
|
-
|
97
|
-
oh_rule.add_ph_weekday
|
98
|
-
end
|
99
|
-
|
92
|
+
oh_rule.add_ph_weekday if day_ph
|
100
93
|
|
101
|
-
|
102
|
-
rules << oh_rule
|
103
|
-
end
|
94
|
+
rules << oh_rule if !oh_rule_added
|
104
95
|
|
105
|
-
|
106
|
-
rules += build_off_holiday(date_range)
|
107
|
-
end
|
96
|
+
rules += build_off_holiday(date_range) if off_day_ph
|
108
97
|
|
109
|
-
|
110
|
-
|
98
|
+
next unless oh_rule == oh_rules.last && oh_rule.has_overwritten_weekday?
|
99
|
+
oh_rule_over = OpeningHoursConverter::OpeningHoursRule.new
|
111
100
|
|
112
|
-
|
113
|
-
|
114
|
-
end
|
115
|
-
oh_rule_over.add_time(OpeningHoursConverter::OpeningHoursTime.new)
|
116
|
-
oh_rules << oh_rule_over
|
117
|
-
end
|
118
|
-
end
|
101
|
+
oh_rule.date.each do |date|
|
102
|
+
oh_rule_over.add_date(OpeningHoursConverter::OpeningHoursDate.new(date.wide_interval, date.weekdays_over))
|
119
103
|
end
|
104
|
+
oh_rule_over.add_time(OpeningHoursConverter::OpeningHoursTime.new)
|
105
|
+
oh_rules << oh_rule_over
|
120
106
|
end
|
121
107
|
end
|
122
108
|
|
123
|
-
|
124
|
-
|
125
|
-
if rules.length == 0
|
109
|
+
result = ''
|
110
|
+
if rules.empty?
|
126
111
|
date_ranges.each do |dr|
|
127
112
|
result += "#{dr.wide_interval.get_time_selector} off"
|
128
113
|
end
|
@@ -130,32 +115,29 @@ module OpeningHoursConverter
|
|
130
115
|
result += rules.map(&:get).join('; ')
|
131
116
|
end
|
132
117
|
|
133
|
-
|
118
|
+
result.strip
|
134
119
|
end
|
135
120
|
|
136
121
|
def build_off_holiday(date_range)
|
137
|
-
|
138
122
|
start_year = date_range.wide_interval.start&.key?(:year) ? date_range.wide_interval.start[:year] : date_range.wide_interval.start
|
139
123
|
end_year = date_range.wide_interval.end&.key?(:year) ? date_range.wide_interval.end[:year] : date_range.wide_interval.end
|
140
124
|
|
141
|
-
date_range = OpeningHoursConverter::DateRange.new(OpeningHoursConverter::WideInterval.new.holiday(
|
125
|
+
date_range = OpeningHoursConverter::DateRange.new(OpeningHoursConverter::WideInterval.new.holiday('PH', start_year, end_year))
|
142
126
|
|
143
127
|
rule = OpeningHoursConverter::OpeningHoursRule.new
|
144
128
|
date = OpeningHoursConverter::OpeningHoursDate.new(date_range.wide_interval, [-1])
|
145
129
|
rule.add_date(date)
|
146
130
|
rule.is_defined_off = true
|
147
131
|
|
148
|
-
|
132
|
+
[rule]
|
149
133
|
end
|
150
134
|
|
151
135
|
def build_holiday(date_range)
|
152
|
-
|
153
136
|
start_year = date_range.wide_interval.start&.key?(:year) ? date_range.wide_interval.start[:year] : date_range.wide_interval.start
|
154
137
|
end_year = date_range.wide_interval.end&.key?(:year) ? date_range.wide_interval.end[:year] : date_range.wide_interval.end
|
155
138
|
|
156
|
-
|
157
139
|
intervals = date_range.typical.get_intervals(true)
|
158
|
-
date_range = OpeningHoursConverter::DateRange.new(OpeningHoursConverter::WideInterval.new.holiday(
|
140
|
+
date_range = OpeningHoursConverter::DateRange.new(OpeningHoursConverter::WideInterval.new.holiday('PH', start_year, end_year))
|
159
141
|
|
160
142
|
for i in 0..6
|
161
143
|
intervals.each do |interval|
|
@@ -175,8 +157,7 @@ module OpeningHoursConverter
|
|
175
157
|
end
|
176
158
|
end
|
177
159
|
|
178
|
-
|
179
|
-
return [ rule ]
|
160
|
+
[rule]
|
180
161
|
end
|
181
162
|
|
182
163
|
def build_day(date_range)
|
@@ -193,7 +174,7 @@ module OpeningHoursConverter
|
|
193
174
|
end
|
194
175
|
end
|
195
176
|
|
196
|
-
|
177
|
+
[rule]
|
197
178
|
end
|
198
179
|
|
199
180
|
def build_week(date_range)
|
@@ -218,22 +199,19 @@ module OpeningHoursConverter
|
|
218
199
|
else
|
219
200
|
md_off += 1
|
220
201
|
end
|
221
|
-
if !merged
|
222
|
-
result << days[index]
|
223
|
-
end
|
202
|
+
result << days[index] if !merged
|
224
203
|
end
|
225
204
|
elsif days_status[index] <= 0 && days_status[index] > -8
|
226
205
|
days_status[index] = index + 1
|
227
206
|
last_same_day = index
|
228
207
|
same_day_count = 1
|
229
208
|
|
230
|
-
for j in (index+1)...days.length do
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
end
|
209
|
+
for j in (index + 1)...days.length do
|
210
|
+
next unless day.same_time?(days[j])
|
211
|
+
days_status[j] = index + 1
|
212
|
+
day.add_weekday(j)
|
213
|
+
last_same_day = j
|
214
|
+
same_day_count += 1
|
237
215
|
end
|
238
216
|
if same_day_count == 1
|
239
217
|
result << day
|
@@ -246,22 +224,19 @@ module OpeningHoursConverter
|
|
246
224
|
end
|
247
225
|
end
|
248
226
|
end
|
249
|
-
if result == [] && days_status == [8, 8, 8, 8, 8, 8, 8]
|
250
|
-
result = days
|
251
|
-
end
|
227
|
+
result = days if result == [] && days_status == [8, 8, 8, 8, 8, 8, 8]
|
252
228
|
|
253
229
|
result = merge_days(result)
|
254
230
|
|
255
|
-
|
231
|
+
result
|
256
232
|
end
|
257
233
|
|
258
234
|
def build_week_diff(date_range, general_date_range)
|
259
235
|
intervals = date_range.typical.get_intervals_diff(general_date_range.typical)
|
260
236
|
days = create_time_intervals(
|
261
237
|
date_range.wide_interval,
|
262
|
-
intervals[:open]
|
263
|
-
|
264
|
-
|
238
|
+
intervals[:open]
|
239
|
+
)
|
265
240
|
|
266
241
|
intervals[:closed].each do |interval|
|
267
242
|
for i in interval.day_start..interval.day_end do
|
@@ -287,10 +262,8 @@ module OpeningHoursConverter
|
|
287
262
|
end
|
288
263
|
end
|
289
264
|
|
290
|
-
if !merged
|
291
|
-
|
292
|
-
end
|
293
|
-
elsif day.is_off? && day.time.length == 0
|
265
|
+
result << day if !merged
|
266
|
+
elsif day.is_off? && day.time.empty?
|
294
267
|
days_status[index] = 8
|
295
268
|
elsif days_status[index] <= 0 && days_status[index] > -8
|
296
269
|
days_status[index] = index + 1
|
@@ -299,12 +272,11 @@ module OpeningHoursConverter
|
|
299
272
|
result << day
|
300
273
|
|
301
274
|
for j in (index + 1)...days.length do
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
end
|
275
|
+
next unless day.same_time?(days[j])
|
276
|
+
days_status[j] = index + 1
|
277
|
+
day.add_weekday(j)
|
278
|
+
last_same_day = j
|
279
|
+
same_day_count += 1
|
308
280
|
end
|
309
281
|
|
310
282
|
if same_day_count == 1
|
@@ -314,12 +286,9 @@ module OpeningHoursConverter
|
|
314
286
|
result << day
|
315
287
|
elsif same_day_count > 2
|
316
288
|
for j in (index + 1)...last_same_day do
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
day.add_overwritten_weekday(j)
|
321
|
-
end
|
322
|
-
end
|
289
|
+
next unless days_status[j] == 0
|
290
|
+
days_status[j] = -index - 1
|
291
|
+
day.add_overwritten_weekday(j) if !days[j].time.empty?
|
323
292
|
end
|
324
293
|
day.add_weekday(last_same_day)
|
325
294
|
result << day
|
@@ -328,11 +297,11 @@ module OpeningHoursConverter
|
|
328
297
|
end
|
329
298
|
end
|
330
299
|
result = merge_days(result)
|
331
|
-
|
300
|
+
result
|
332
301
|
end
|
333
302
|
|
334
303
|
def merge_days(rules)
|
335
|
-
return rules if rules.
|
304
|
+
return rules if rules.empty?
|
336
305
|
result = []
|
337
306
|
result << rules[0]
|
338
307
|
dm = 0
|
@@ -350,51 +319,49 @@ module OpeningHoursConverter
|
|
350
319
|
end
|
351
320
|
dm += 1
|
352
321
|
end
|
353
|
-
if !date_merged
|
354
|
-
result << rules[d]
|
355
|
-
end
|
322
|
+
result << rules[d] if !date_merged
|
356
323
|
end
|
357
324
|
|
358
|
-
|
325
|
+
result
|
359
326
|
end
|
360
327
|
|
361
328
|
def create_time_intervals(wide_interval, intervals)
|
362
329
|
days = []
|
363
330
|
for i in 0...7
|
364
331
|
days << OpeningHoursConverter::OpeningHoursRule.new
|
365
|
-
days[i].add_date(OpeningHoursConverter::OpeningHoursDate.new(wide_interval, [
|
332
|
+
days[i].add_date(OpeningHoursConverter::OpeningHoursDate.new(wide_interval, [i]))
|
366
333
|
end
|
367
334
|
|
368
335
|
intervals.each do |interval|
|
369
|
-
if
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
336
|
+
next if interval.nil?
|
337
|
+
|
338
|
+
begin
|
339
|
+
if interval.day_start == interval.day_end
|
340
|
+
days[interval.day_start].add_time(OpeningHoursConverter::OpeningHoursTime.new(interval.start, interval.end))
|
341
|
+
days[interval.day_start].is_defined_off = days[interval.day_start].is_defined_off ? true : interval.is_off
|
342
|
+
elsif interval.day_end - interval.day_start == 1
|
343
|
+
days[interval.day_start].add_time(OpeningHoursConverter::OpeningHoursTime.new(interval.start, MINUTES_MAX))
|
344
|
+
days[interval.day_start].is_defined_off = days[interval.day_start].is_defined_off ? true : interval.is_off
|
345
|
+
days[interval.day_end].add_time(OpeningHoursConverter::OpeningHoursTime.new(0, interval.end))
|
346
|
+
days[interval.day_end].is_defined_off = days[interval.day_end].is_defined_off ? true : interval.is_off
|
347
|
+
else
|
348
|
+
for j in interval.day_start..interval.day_end
|
349
|
+
days[j].is_defined_off = days[j].is_defined_off ? true : interval.is_off
|
350
|
+
if j == interval.day_start
|
351
|
+
days[j].add_time(OpeningHoursConverter::OpeningHoursTime.new(interval.start, MINUTES_MAX))
|
352
|
+
elsif j == interval.day_end
|
353
|
+
days[j].add_time(OpeningHoursConverter::OpeningHoursTime.new(0, interval.end))
|
354
|
+
else
|
355
|
+
days[j].add_time(OpeningHoursConverter::OpeningHoursTime.new(0, MINUTES_MAX))
|
389
356
|
end
|
390
357
|
end
|
391
|
-
rescue Exception => e
|
392
|
-
puts e
|
393
358
|
end
|
359
|
+
rescue Exception => e
|
360
|
+
puts e
|
394
361
|
end
|
395
362
|
end
|
396
363
|
|
397
|
-
|
364
|
+
days
|
398
365
|
end
|
399
366
|
end
|
400
367
|
end
|