@happychef/algorithm 1.2.10 → 1.2.12

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.
Files changed (46) hide show
  1. package/.github/workflows/ci-cd.yml +133 -2
  2. package/BRANCH_PROTECTION_SETUP.md +167 -0
  3. package/CHANGELOG.md +8 -8
  4. package/RESERVERINGEN_GIDS.md +986 -986
  5. package/assignTables.js +424 -398
  6. package/changes/2025/December/PR2___change.md +14 -14
  7. package/changes/2025/December/PR3_add__change.md +20 -20
  8. package/changes/2025/December/PR4___.md +16 -0
  9. package/changes/2025/December/PR5___.md +16 -0
  10. package/changes/2025/December/PR6__del_.md +18 -0
  11. package/changes/2025/December/PR7_add__change.md +22 -0
  12. package/changes/2026/January/PR8_add__change.md +39 -0
  13. package/changes/2026/January/PR9_add__change.md +20 -0
  14. package/filters/maxArrivalsFilter.js +114 -114
  15. package/filters/maxGroupsFilter.js +221 -221
  16. package/filters/timeFilter.js +89 -89
  17. package/getAvailableTimeblocks.js +158 -158
  18. package/grouping.js +162 -162
  19. package/index.js +42 -42
  20. package/isDateAvailable.js +80 -80
  21. package/isDateAvailableWithTableCheck.js +171 -171
  22. package/isTimeAvailable.js +25 -25
  23. package/package.json +27 -27
  24. package/processing/dailyGuestCounts.js +73 -73
  25. package/processing/mealTypeCount.js +133 -133
  26. package/processing/timeblocksAvailable.js +167 -167
  27. package/reservation_data/counter.js +64 -64
  28. package/restaurant_data/exceptions.js +149 -149
  29. package/restaurant_data/openinghours.js +123 -123
  30. package/simulateTableAssignment.js +709 -699
  31. package/tableHelpers.js +178 -178
  32. package/tables/time/parseTime.js +19 -19
  33. package/tables/time/shifts.js +7 -7
  34. package/tables/utils/calculateDistance.js +13 -13
  35. package/tables/utils/isTableFreeForAllSlots.js +14 -14
  36. package/tables/utils/isTemporaryTableValid.js +39 -39
  37. package/test/test_counter.js +194 -194
  38. package/test/test_dailyCount.js +81 -81
  39. package/test/test_datesAvailable.js +106 -106
  40. package/test/test_exceptions.js +172 -172
  41. package/test/test_isDateAvailable.js +330 -330
  42. package/test/test_mealTypeCount.js +54 -54
  43. package/test/test_timesAvailable.js +88 -88
  44. package/test-meal-stop-fix.js +147 -147
  45. package/test-meal-stop-simple.js +93 -93
  46. package/test.js +336 -336
@@ -1,330 +1,330 @@
1
- // getAvailableTimeblocksTests.js
2
-
3
- const { getAvailableTimeblocks } = require('../getAvailableTimeblocks');
4
- const { isDateAvailable } = require('../isDateAvailable');
5
-
6
- // Sample data (same as previous examples)
7
- const data = {
8
- "_id": "poer",
9
- "general-settings": {
10
- "zitplaatsen": 30,
11
- "uurOpVoorhand": 4,
12
- "dagenInToekomst": 90,
13
- "maxGasten": 8,
14
- "intervalReservatie": 15,
15
- "duurReservatie": 120,
16
- "minutenTotEinde": 135,
17
- "showNoticeForMaxGuests": 0,
18
- "noticePhoneNumber": "",
19
- "storedNumber": 76
20
- },
21
- "menu": [
22
- {
23
- "name": "POER Menu",
24
- "startDate": "2024-11-01",
25
- "endDate": "2030-01-30",
26
- "startHour": "12:00",
27
- "endHour": "23:00",
28
- "daysOfWeek": [
29
- "zaterdag",
30
- "dinsdag",
31
- "woensdag",
32
- "donderdag",
33
- "vrijdag"
34
- ],
35
- "storedNumber": 36,
36
- "_id": "674a9033c1956dd233bafaad"
37
- },
38
- {
39
- "name": "A la carte",
40
- "startDate": "2024-11-30",
41
- "endDate": "2030-01-01",
42
- "startHour": "12:00",
43
- "endHour": "14:00",
44
- "daysOfWeek": [
45
- "dinsdag",
46
- "woensdag",
47
- "donderdag",
48
- "vrijdag"
49
- ],
50
- "storedNumber": 28,
51
- "_id": "674a9084c1956dd233bafaae"
52
- },
53
- {
54
- "name": "Ik weet het nog niet",
55
- "startDate": "2024-11-30",
56
- "endDate": "2030-01-01",
57
- "startHour": "12:00",
58
- "endHour": "14:00",
59
- "daysOfWeek": [
60
- "dinsdag",
61
- "woensdag",
62
- "donderdag",
63
- "vrijdag"
64
- ],
65
- "storedNumber": 41,
66
- "_id": "674a90bc64cc52acdd5e6cc2"
67
- },
68
- {
69
- "name": "Lunch",
70
- "startDate": "2024-11-01",
71
- "endDate": "2030-01-30",
72
- "startHour": "12:00",
73
- "endHour": "14:00",
74
- "daysOfWeek": [
75
- "dinsdag",
76
- "woensdag",
77
- "donderdag",
78
- "vrijdag"
79
- ],
80
- "storedNumber": 23,
81
- "_id": "674adb4e8d6385fb343499f7"
82
- },
83
- {
84
- "name": "A la carte",
85
- "startDate": "2024-11-01",
86
- "endDate": "2030-01-30",
87
- "startHour": "18:30",
88
- "endHour": "20:30",
89
- "daysOfWeek": [
90
- "dinsdag",
91
- "woensdag",
92
- "donderdag"
93
- ],
94
- "storedNumber": 50,
95
- "_id": "674adbf58d6385fb343499f8"
96
- },
97
- {
98
- "name": "Ik weet het nog niet",
99
- "startDate": "2024-11-01",
100
- "endDate": "2030-01-30",
101
- "startHour": "18:30",
102
- "endHour": "20:30",
103
- "daysOfWeek": [
104
- "dinsdag",
105
- "donderdag",
106
- "woensdag"
107
- ],
108
- "storedNumber": 54,
109
- "_id": "674adc208d6385fb343499f9"
110
- }
111
- ],
112
- "mededeling": [
113
- {
114
- "mededeling": "Gelieve er rekening mee te houden dat we op vrijdagavond en zaterdagavond enkel ons POER menu serveren.",
115
- "startDate": "2024-11-01",
116
- "endDate": "2030-01-30",
117
- "startTime": "18:30",
118
- "endTime": "20:30",
119
- "daysOfWeek": [
120
- "vrijdag",
121
- "zaterdag"
122
- ],
123
- "storedNumber": 95,
124
- "_id": "674ade0a8d6385fb343499fa"
125
- }
126
- ],
127
- "settings": {
128
- "pageTitle": "Reserveer nu",
129
- "generalNotification": "",
130
- "alignment": "fullScreenColor",
131
- "backgroundBlur": "blurBackground",
132
- "storedNumber": 61
133
- },
134
- "colors": {
135
- "backgroundType": "solid",
136
- "backgroundColor": "#e0debe",
137
- "gradientStartColor": "#FFFFFF",
138
- "gradientEndColor": "#000000",
139
- "animationType": "none",
140
- "widgetBackgroundColor": "#000000",
141
- "widgetTextColor": "#FFFFFF",
142
- "textColor": "#000000",
143
- "containerColor": "#FFFFFF",
144
- "buttonColor": "#000000",
145
- "buttonTextColor": "#FFFFFF",
146
- "storedNumber": 81
147
- },
148
- "exceptions": [
149
- {
150
- "title": "Extra mensen donderdagmiddag",
151
- "type": "Opening",
152
- "timeframe": "lunch",
153
- "startDate": "2024-12-05",
154
- "endDate": "2024-12-05",
155
- "startHour": "12:00",
156
- "endHour": "16:00",
157
- "maxSeats": "34",
158
- "daysOfWeek": [
159
- "donderdag"
160
- ],
161
- "storedNumber": 74,
162
- "_id": "67507dc98fb61d6afd54acb0"
163
- },
164
- {
165
- "title": "Extra personen donderdagavond",
166
- "type": "Uitzondering",
167
- "timeframe": "dinner",
168
- "startDate": "2024-12-05",
169
- "endDate": "2024-12-05",
170
- "startHour": "18:30",
171
- "endHour": "23:00",
172
- "maxSeats": "27",
173
- "daysOfWeek": [
174
- "donderdag"
175
- ],
176
- "storedNumber": 88,
177
- "_id": "67507e3383d7f2de02628f4a"
178
- },
179
- {
180
- "title": "Congé Periode 22/12 tot 9/01",
181
- "type": "Sluiting",
182
- "timeframe": "Volledige Dag",
183
- "startDate": "2024-12-22",
184
- "endDate": "2025-01-09",
185
- "daysOfWeek": [],
186
- "storedNumber": 89,
187
- "_id": "67511bb38fb61d6afd54acba"
188
- }
189
- ],
190
- "openinghours-lunch": {
191
- "schemeSettings": {
192
- "Tuesday": {
193
- "enabled": true,
194
- "startTime": "12:00",
195
- "endTime": "13:30",
196
- "maxCapacityEnabled": true,
197
- "maxCapacity": "30",
198
- "shiftsEnabled": false,
199
- "shifts": []
200
- },
201
- "Wednesday": {
202
- "enabled": true,
203
- "startTime": "12:00",
204
- "endTime": "16:00",
205
- "maxCapacityEnabled": true,
206
- "maxCapacity": "30",
207
- "shiftsEnabled": false,
208
- "shifts": []
209
- },
210
- "Thursday": {
211
- "enabled": true,
212
- "startTime": "12:00",
213
- "endTime": "16:00",
214
- "maxCapacityEnabled": true,
215
- "maxCapacity": "30",
216
- "shiftsEnabled": false,
217
- "shifts": []
218
- },
219
- "Friday": {
220
- "enabled": true,
221
- "startTime": "12:30",
222
- "endTime": "13:30",
223
- "maxCapacityEnabled": true,
224
- "maxCapacity": "30",
225
- "shiftsEnabled": false,
226
- "shifts": []
227
- }
228
- },
229
- "storedNumber": 2
230
- },
231
- "openinghours-dinner": {
232
- "schemeSettings": {
233
- "Tuesday": {
234
- "enabled": true,
235
- "startTime": "18:30",
236
- "endTime": "20:00",
237
- "maxCapacityEnabled": true,
238
- "maxCapacity": "24",
239
- "shiftsEnabled": false,
240
- "shifts": []
241
- },
242
- "Wednesday": {
243
- "enabled": true,
244
- "startTime": "16:00",
245
- "endTime": "20:00",
246
- "maxCapacityEnabled": true,
247
- "maxCapacity": "24",
248
- "shiftsEnabled": false,
249
- "shifts": []
250
- },
251
- "Thursday": {
252
- "enabled": true,
253
- "startTime": "16:00",
254
- "endTime": "20:00",
255
- "maxCapacityEnabled": true,
256
- "maxCapacity": "24",
257
- "shiftsEnabled": false,
258
- "shifts": []
259
- },
260
- "Friday": {
261
- "enabled": true,
262
- "startTime": "18:30",
263
- "endTime": "20:00",
264
- "maxCapacityEnabled": true,
265
- "maxCapacity": "30",
266
- "shiftsEnabled": false,
267
- "shifts": []
268
- },
269
- "Saturday": {
270
- "enabled": true,
271
- "startTime": "18:30",
272
- "endTime": "20:00",
273
- "maxCapacityEnabled": true,
274
- "maxCapacity": "30",
275
- "shiftsEnabled": false,
276
- "shifts": []
277
- }
278
- },
279
- "storedNumber": 6
280
- },
281
- "fonts": {
282
- "titleFont": {
283
- "font": "Poppins",
284
- "weight": "400"
285
- },
286
- "subtitleFont": {
287
- "font": "Poppins",
288
- "weight": "400"
289
- },
290
- "labelFont": {
291
- "font": "Poppins",
292
- "weight": "400"
293
- },
294
- "buttonFont": {
295
- "font": "Poppins",
296
- "weight": "400"
297
- }
298
- },
299
- "theme": {
300
- "id": 10,
301
- "title": "Herfstbladeren",
302
- "color": "#D35400",
303
- "image": "/static/media/default-theme.webp"
304
- }
305
- }
306
-
307
- // Sample reservations
308
- const reservations = [
309
- {
310
- "guests": 10,
311
- "time": "12:00",
312
- "date": "2024-12-18"
313
- },
314
- {
315
- "guests": 100,
316
- "time": "15:00",
317
- "date": "2024-12-04"
318
- },
319
- ]
320
-
321
- console.log('--- Available Time Blocks Tests ---');
322
-
323
- const guests = 1;
324
-
325
- const dateStr = '2024-12-10';
326
-
327
- const availableTimeblocks = isDateAvailable(data, dateStr, reservations, guests);
328
-
329
- console.log(`Available time blocks for ${guests} guests on ${dateStr}:`);
330
- console.log(JSON.stringify(availableTimeblocks, null, 2));
1
+ // getAvailableTimeblocksTests.js
2
+
3
+ const { getAvailableTimeblocks } = require('../getAvailableTimeblocks');
4
+ const { isDateAvailable } = require('../isDateAvailable');
5
+
6
+ // Sample data (same as previous examples)
7
+ const data = {
8
+ "_id": "poer",
9
+ "general-settings": {
10
+ "zitplaatsen": 30,
11
+ "uurOpVoorhand": 4,
12
+ "dagenInToekomst": 90,
13
+ "maxGasten": 8,
14
+ "intervalReservatie": 15,
15
+ "duurReservatie": 120,
16
+ "minutenTotEinde": 135,
17
+ "showNoticeForMaxGuests": 0,
18
+ "noticePhoneNumber": "",
19
+ "storedNumber": 76
20
+ },
21
+ "menu": [
22
+ {
23
+ "name": "POER Menu",
24
+ "startDate": "2024-11-01",
25
+ "endDate": "2030-01-30",
26
+ "startHour": "12:00",
27
+ "endHour": "23:00",
28
+ "daysOfWeek": [
29
+ "zaterdag",
30
+ "dinsdag",
31
+ "woensdag",
32
+ "donderdag",
33
+ "vrijdag"
34
+ ],
35
+ "storedNumber": 36,
36
+ "_id": "674a9033c1956dd233bafaad"
37
+ },
38
+ {
39
+ "name": "A la carte",
40
+ "startDate": "2024-11-30",
41
+ "endDate": "2030-01-01",
42
+ "startHour": "12:00",
43
+ "endHour": "14:00",
44
+ "daysOfWeek": [
45
+ "dinsdag",
46
+ "woensdag",
47
+ "donderdag",
48
+ "vrijdag"
49
+ ],
50
+ "storedNumber": 28,
51
+ "_id": "674a9084c1956dd233bafaae"
52
+ },
53
+ {
54
+ "name": "Ik weet het nog niet",
55
+ "startDate": "2024-11-30",
56
+ "endDate": "2030-01-01",
57
+ "startHour": "12:00",
58
+ "endHour": "14:00",
59
+ "daysOfWeek": [
60
+ "dinsdag",
61
+ "woensdag",
62
+ "donderdag",
63
+ "vrijdag"
64
+ ],
65
+ "storedNumber": 41,
66
+ "_id": "674a90bc64cc52acdd5e6cc2"
67
+ },
68
+ {
69
+ "name": "Lunch",
70
+ "startDate": "2024-11-01",
71
+ "endDate": "2030-01-30",
72
+ "startHour": "12:00",
73
+ "endHour": "14:00",
74
+ "daysOfWeek": [
75
+ "dinsdag",
76
+ "woensdag",
77
+ "donderdag",
78
+ "vrijdag"
79
+ ],
80
+ "storedNumber": 23,
81
+ "_id": "674adb4e8d6385fb343499f7"
82
+ },
83
+ {
84
+ "name": "A la carte",
85
+ "startDate": "2024-11-01",
86
+ "endDate": "2030-01-30",
87
+ "startHour": "18:30",
88
+ "endHour": "20:30",
89
+ "daysOfWeek": [
90
+ "dinsdag",
91
+ "woensdag",
92
+ "donderdag"
93
+ ],
94
+ "storedNumber": 50,
95
+ "_id": "674adbf58d6385fb343499f8"
96
+ },
97
+ {
98
+ "name": "Ik weet het nog niet",
99
+ "startDate": "2024-11-01",
100
+ "endDate": "2030-01-30",
101
+ "startHour": "18:30",
102
+ "endHour": "20:30",
103
+ "daysOfWeek": [
104
+ "dinsdag",
105
+ "donderdag",
106
+ "woensdag"
107
+ ],
108
+ "storedNumber": 54,
109
+ "_id": "674adc208d6385fb343499f9"
110
+ }
111
+ ],
112
+ "mededeling": [
113
+ {
114
+ "mededeling": "Gelieve er rekening mee te houden dat we op vrijdagavond en zaterdagavond enkel ons POER menu serveren.",
115
+ "startDate": "2024-11-01",
116
+ "endDate": "2030-01-30",
117
+ "startTime": "18:30",
118
+ "endTime": "20:30",
119
+ "daysOfWeek": [
120
+ "vrijdag",
121
+ "zaterdag"
122
+ ],
123
+ "storedNumber": 95,
124
+ "_id": "674ade0a8d6385fb343499fa"
125
+ }
126
+ ],
127
+ "settings": {
128
+ "pageTitle": "Reserveer nu",
129
+ "generalNotification": "",
130
+ "alignment": "fullScreenColor",
131
+ "backgroundBlur": "blurBackground",
132
+ "storedNumber": 61
133
+ },
134
+ "colors": {
135
+ "backgroundType": "solid",
136
+ "backgroundColor": "#e0debe",
137
+ "gradientStartColor": "#FFFFFF",
138
+ "gradientEndColor": "#000000",
139
+ "animationType": "none",
140
+ "widgetBackgroundColor": "#000000",
141
+ "widgetTextColor": "#FFFFFF",
142
+ "textColor": "#000000",
143
+ "containerColor": "#FFFFFF",
144
+ "buttonColor": "#000000",
145
+ "buttonTextColor": "#FFFFFF",
146
+ "storedNumber": 81
147
+ },
148
+ "exceptions": [
149
+ {
150
+ "title": "Extra mensen donderdagmiddag",
151
+ "type": "Opening",
152
+ "timeframe": "lunch",
153
+ "startDate": "2024-12-05",
154
+ "endDate": "2024-12-05",
155
+ "startHour": "12:00",
156
+ "endHour": "16:00",
157
+ "maxSeats": "34",
158
+ "daysOfWeek": [
159
+ "donderdag"
160
+ ],
161
+ "storedNumber": 74,
162
+ "_id": "67507dc98fb61d6afd54acb0"
163
+ },
164
+ {
165
+ "title": "Extra personen donderdagavond",
166
+ "type": "Uitzondering",
167
+ "timeframe": "dinner",
168
+ "startDate": "2024-12-05",
169
+ "endDate": "2024-12-05",
170
+ "startHour": "18:30",
171
+ "endHour": "23:00",
172
+ "maxSeats": "27",
173
+ "daysOfWeek": [
174
+ "donderdag"
175
+ ],
176
+ "storedNumber": 88,
177
+ "_id": "67507e3383d7f2de02628f4a"
178
+ },
179
+ {
180
+ "title": "Congé Periode 22/12 tot 9/01",
181
+ "type": "Sluiting",
182
+ "timeframe": "Volledige Dag",
183
+ "startDate": "2024-12-22",
184
+ "endDate": "2025-01-09",
185
+ "daysOfWeek": [],
186
+ "storedNumber": 89,
187
+ "_id": "67511bb38fb61d6afd54acba"
188
+ }
189
+ ],
190
+ "openinghours-lunch": {
191
+ "schemeSettings": {
192
+ "Tuesday": {
193
+ "enabled": true,
194
+ "startTime": "12:00",
195
+ "endTime": "13:30",
196
+ "maxCapacityEnabled": true,
197
+ "maxCapacity": "30",
198
+ "shiftsEnabled": false,
199
+ "shifts": []
200
+ },
201
+ "Wednesday": {
202
+ "enabled": true,
203
+ "startTime": "12:00",
204
+ "endTime": "16:00",
205
+ "maxCapacityEnabled": true,
206
+ "maxCapacity": "30",
207
+ "shiftsEnabled": false,
208
+ "shifts": []
209
+ },
210
+ "Thursday": {
211
+ "enabled": true,
212
+ "startTime": "12:00",
213
+ "endTime": "16:00",
214
+ "maxCapacityEnabled": true,
215
+ "maxCapacity": "30",
216
+ "shiftsEnabled": false,
217
+ "shifts": []
218
+ },
219
+ "Friday": {
220
+ "enabled": true,
221
+ "startTime": "12:30",
222
+ "endTime": "13:30",
223
+ "maxCapacityEnabled": true,
224
+ "maxCapacity": "30",
225
+ "shiftsEnabled": false,
226
+ "shifts": []
227
+ }
228
+ },
229
+ "storedNumber": 2
230
+ },
231
+ "openinghours-dinner": {
232
+ "schemeSettings": {
233
+ "Tuesday": {
234
+ "enabled": true,
235
+ "startTime": "18:30",
236
+ "endTime": "20:00",
237
+ "maxCapacityEnabled": true,
238
+ "maxCapacity": "24",
239
+ "shiftsEnabled": false,
240
+ "shifts": []
241
+ },
242
+ "Wednesday": {
243
+ "enabled": true,
244
+ "startTime": "16:00",
245
+ "endTime": "20:00",
246
+ "maxCapacityEnabled": true,
247
+ "maxCapacity": "24",
248
+ "shiftsEnabled": false,
249
+ "shifts": []
250
+ },
251
+ "Thursday": {
252
+ "enabled": true,
253
+ "startTime": "16:00",
254
+ "endTime": "20:00",
255
+ "maxCapacityEnabled": true,
256
+ "maxCapacity": "24",
257
+ "shiftsEnabled": false,
258
+ "shifts": []
259
+ },
260
+ "Friday": {
261
+ "enabled": true,
262
+ "startTime": "18:30",
263
+ "endTime": "20:00",
264
+ "maxCapacityEnabled": true,
265
+ "maxCapacity": "30",
266
+ "shiftsEnabled": false,
267
+ "shifts": []
268
+ },
269
+ "Saturday": {
270
+ "enabled": true,
271
+ "startTime": "18:30",
272
+ "endTime": "20:00",
273
+ "maxCapacityEnabled": true,
274
+ "maxCapacity": "30",
275
+ "shiftsEnabled": false,
276
+ "shifts": []
277
+ }
278
+ },
279
+ "storedNumber": 6
280
+ },
281
+ "fonts": {
282
+ "titleFont": {
283
+ "font": "Poppins",
284
+ "weight": "400"
285
+ },
286
+ "subtitleFont": {
287
+ "font": "Poppins",
288
+ "weight": "400"
289
+ },
290
+ "labelFont": {
291
+ "font": "Poppins",
292
+ "weight": "400"
293
+ },
294
+ "buttonFont": {
295
+ "font": "Poppins",
296
+ "weight": "400"
297
+ }
298
+ },
299
+ "theme": {
300
+ "id": 10,
301
+ "title": "Herfstbladeren",
302
+ "color": "#D35400",
303
+ "image": "/static/media/default-theme.webp"
304
+ }
305
+ }
306
+
307
+ // Sample reservations
308
+ const reservations = [
309
+ {
310
+ "guests": 10,
311
+ "time": "12:00",
312
+ "date": "2024-12-18"
313
+ },
314
+ {
315
+ "guests": 100,
316
+ "time": "15:00",
317
+ "date": "2024-12-04"
318
+ },
319
+ ]
320
+
321
+ console.log('--- Available Time Blocks Tests ---');
322
+
323
+ const guests = 1;
324
+
325
+ const dateStr = '2024-12-10';
326
+
327
+ const availableTimeblocks = isDateAvailable(data, dateStr, reservations, guests);
328
+
329
+ console.log(`Available time blocks for ${guests} guests on ${dateStr}:`);
330
+ console.log(JSON.stringify(availableTimeblocks, null, 2));