opening_hours_converter 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|