@happychef/algorithm 1.0.0

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.
@@ -0,0 +1,173 @@
1
+ // test.js
2
+
3
+ const {
4
+ getDataByDayAndMeal,
5
+ getDataByDateAndMeal,
6
+ getDataByDateAndTime,
7
+ } = require('../restaurant_data/openinghours');
8
+
9
+ const {
10
+ getDataByDateAndMealWithExceptions,
11
+ getDataByDateAndTimeWithExceptions,
12
+ } = require('../restaurant_data/exceptions');
13
+
14
+ // Data including exceptions
15
+ const data = {
16
+ "_id": "demo",
17
+ "openinghours-breakfast": {
18
+ "schemeSettings": {
19
+ "Monday": {
20
+ "enabled": true,
21
+ "startTime": "07:00",
22
+ "endTime": "09:00",
23
+ "maxCapacityEnabled": true,
24
+ "maxCapacity": "12",
25
+ "shiftsEnabled": false,
26
+ "shifts": []
27
+ },
28
+ "Wednesday": {
29
+ "enabled": true,
30
+ "startTime": "07:00",
31
+ "endTime": "10:00",
32
+ "maxCapacityEnabled": true,
33
+ "maxCapacity": "12",
34
+ "shiftsEnabled": false,
35
+ "shifts": []
36
+ }
37
+ },
38
+ },
39
+ "openinghours-lunch": {
40
+ "schemeSettings": {
41
+ "Thursday": {
42
+ "enabled": false, // Disabled lunch on Thursday
43
+ "startTime": "13:00",
44
+ "endTime": "14:00",
45
+ "maxCapacityEnabled": true,
46
+ "maxCapacity": "10",
47
+ "shiftsEnabled": false,
48
+ "shifts": []
49
+ }
50
+ },
51
+ },
52
+ "openinghours-dinner": {
53
+ "schemeSettings": {
54
+ "Thursday": {
55
+ "enabled": true,
56
+ "startTime": "16:00",
57
+ "endTime": "17:30",
58
+ "maxCapacityEnabled": true,
59
+ "maxCapacity": "10",
60
+ "shiftsEnabled": false,
61
+ "shifts": []
62
+ },
63
+ "Friday": {
64
+ "enabled": true,
65
+ "startTime": "16:00",
66
+ "endTime": "17:00",
67
+ "maxCapacityEnabled": true,
68
+ "maxCapacity": "10",
69
+ "shiftsEnabled": false,
70
+ "shifts": []
71
+ },
72
+ "Saturday": {
73
+ "enabled": false, // Disabled day
74
+ "startTime": "16:00",
75
+ "endTime": "18:00",
76
+ "maxCapacityEnabled": true,
77
+ "maxCapacity": "10",
78
+ "shiftsEnabled": false,
79
+ "shifts": []
80
+ }
81
+ },
82
+ },
83
+ // Exceptions included in the data
84
+ "exceptions": [
85
+ {
86
+ "title": "Opening 4 tot 10 December",
87
+ "type": "Uitzondering",
88
+ "timeframe": "breakfast",
89
+ "startDate": "2024-12-04",
90
+ "endDate": "2024-12-10",
91
+ "startHour": "07:00",
92
+ "endHour": "09:00",
93
+ "maxSeats": "333",
94
+ "daysOfWeek": [
95
+
96
+ ],
97
+ },
98
+ {
99
+ "title": "Opening 4 tot 10 December",
100
+ "type": "Uitzondering",
101
+ "timeframe": "breakfast",
102
+ "startDate": "2024-12-04",
103
+ "endDate": "2024-12-10",
104
+ "startHour": "07:00",
105
+ "endHour": "09:00",
106
+ "maxSeats": "444",
107
+ "daysOfWeek": [
108
+
109
+ ],
110
+ },
111
+ {
112
+ "title": "Opening 4 tot 10 December",
113
+ "type": "Sluiting",
114
+ "timeframe": "breakfast",
115
+ "startDate": "2024-12-04",
116
+ "endDate": "2024-12-10",
117
+ "startHour": "07:00",
118
+ "endHour": "09:00",
119
+ "maxSeats": "333",
120
+ "daysOfWeek": [
121
+
122
+ ],
123
+ },
124
+ {
125
+ "title": "Closure on December 2nd",
126
+ "type": "Sluiting",
127
+ "timeframe": "dinner",
128
+ "startDate": "2024-12-02",
129
+ "endDate": "2024-12-04",
130
+ "daysOfWeek": [
131
+
132
+ ]
133
+ },
134
+ {
135
+ "title": "Uitzondering on December 4th",
136
+ "type": "Uitzondering",
137
+ "timeframe": "breakfast",
138
+ "startDate": "2024-12-04",
139
+ "endDate": "2024-12-04",
140
+ "startHour": "07:00",
141
+ "endHour": "08:00",
142
+ "maxSeats": "12",
143
+ "daysOfWeek": [
144
+ "woensdag"
145
+ ]
146
+ }
147
+ ]
148
+ };
149
+
150
+ // ------------------------
151
+ // Tests without exceptions
152
+ // ------------------------
153
+
154
+ console.log('--- Tests without exceptions ---');
155
+
156
+ // Test 1: Get data by date and meal - breakfast on December 4th
157
+ console.log('Test 1:', getDataByDateAndMeal(data, '2024-12-04', 'breakfast')); // Should return data
158
+
159
+ // Test 2: Get data by date and time exactly at startTime
160
+ console.log('Test 2:', getDataByDateAndTime(data, '2024-12-04', '07:00')); // Should return data for breakfast
161
+
162
+ // ----------------------
163
+ // Tests with exceptions
164
+ // ----------------------
165
+
166
+ console.log('\n--- Tests with exceptions ---');
167
+
168
+ // Test 1: Get data by date and meal - breakfast on December 4th (Opening applies)
169
+ console.log('Test 1:', getDataByDateAndMealWithExceptions(data, '2024-12-04', 'breakfast')); // Should return Opening data
170
+
171
+ // Test 2: Get data by date and time - breakfast on December 4th at 07:30 (within Opening time)
172
+ console.log('Test 2:', getDataByDateAndTimeWithExceptions(data, '2024-12-04', '07:00')); // Should return Opening data
173
+
@@ -0,0 +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));
@@ -0,0 +1,54 @@
1
+ // mealReservationTests.js
2
+
3
+ const { getGuestCountsForMeal } = require('../processing/mealTypeCount');
4
+
5
+ // Sample data including shifts
6
+ const data = {
7
+ "_id": "demo",
8
+ "openinghours-breakfast": {
9
+ "schemeSettings": {
10
+ "Monday": {
11
+ "enabled": true,
12
+ "startTime": "07:00",
13
+ "endTime": "09:30",
14
+ "maxCapacityEnabled": true,
15
+ "maxCapacity": "12",
16
+ "shiftsEnabled": true,
17
+ "shifts": [
18
+ {
19
+ "name": "Shift 1",
20
+ "time": "08:00"
21
+ },
22
+ {
23
+ "name": "Shift 2",
24
+ "time": "09:00"
25
+ }
26
+ ]
27
+ }
28
+ },
29
+ "storedNumber": {
30
+ "$numberInt": "0"
31
+ }
32
+ },
33
+ // Other meal data...
34
+ };
35
+
36
+ // Sample reservations
37
+ const reservations = [
38
+ { guests: "5", time: "08:00", date: "2024-12-02" },
39
+ { guests: "3", time: "09:00", date: "2024-12-02" },
40
+ { guests: "2", time: "07:00", date: "2024-12-02" },
41
+ { guests: "4", time: "07:30", date: "2024-12-02" },
42
+ { guests: "6", time: "08:00", date: "2024-12-02" }, // Reservation on a different date
43
+ ];
44
+
45
+ console.log('--- Meal Reservation Guest Counts Tests ---');
46
+
47
+ // Test 1: Breakfast on January 12th (Monday) with shifts
48
+ const dateStr = '2024-12-02';
49
+ const mealType = 'breakfast';
50
+
51
+ const guestCounts = getGuestCountsForMeal(data, dateStr, mealType, reservations);
52
+
53
+ console.log('Test 1 - Guest Counts for Breakfast on January 12th with Shifts:');
54
+ console.log(guestCounts);
@@ -0,0 +1,88 @@
1
+ // timeblocksAvailableTests.js
2
+
3
+ const { timeblocksAvailable } = require('../processing/timeblocksAvailable');
4
+
5
+ // Sample data (same as previous examples)
6
+ const data = {
7
+ "_id": "demo",
8
+ "general-settings": {
9
+ "zitplaatsen": "5",
10
+ "duurReservatie": "120", // Reservation duration of 120 minutes
11
+ "intervalReservatie": "30" // Time increment of 30 minutes
12
+ },
13
+ "openinghours-breakfast": {
14
+ "schemeSettings": {
15
+ "Monday": {
16
+ "enabled": false,
17
+ "startTime": "07:00",
18
+ "endTime": "11:00",
19
+ "maxCapacityEnabled": false,
20
+ "maxCapacity": "0",
21
+ "shiftsEnabled": false,
22
+ "shifts": []
23
+ }
24
+ },
25
+ "storedNumber": {
26
+ "$numberInt": "0"
27
+ }
28
+ },
29
+ "openinghours-lunch": {
30
+ "schemeSettings": {
31
+ "Monday": {
32
+ "enabled": false,
33
+ "startTime": "13:00",
34
+ "endTime": "16:00",
35
+ "maxCapacityEnabled": true,
36
+ "maxCapacity": "20",
37
+ "shiftsEnabled": false,
38
+ "shifts": []
39
+ }
40
+ },
41
+ "storedNumber": {
42
+ "$numberInt": "0"
43
+ }
44
+ },
45
+ "openinghours-dinner": {
46
+ "schemeSettings": {
47
+ "Monday": {
48
+ "enabled": true,
49
+ "startTime": "16:00",
50
+ "endTime": "23:00",
51
+ "maxCapacityEnabled": true,
52
+ "maxCapacity": "5",
53
+ "shiftsEnabled": true,
54
+ "shifts": [
55
+ {
56
+ "name": "Shift 1",
57
+ "time": "18:00"
58
+ },
59
+ {
60
+ "name": "Shift 2",
61
+ "time": "20:00"
62
+ }
63
+ ]
64
+ }
65
+ },
66
+ "storedNumber": {
67
+ "$numberInt": "0"
68
+ }
69
+ },
70
+ "exceptions": []
71
+ };
72
+
73
+ // Sample reservations
74
+ const reservations = [
75
+ // Dinner reservations
76
+ { guests: "5", time: "18:00", date: "2024-12-02" }, // Shift 1 is fully booked
77
+ { guests: "2", time: "20:00", date: "2024-12-02" }, // Shift 2 has available seats
78
+ ];
79
+
80
+ console.log('--- Time Blocks Availability Tests ---');
81
+
82
+ const guests = 3;
83
+ const dateStr = '2024-12-02';
84
+
85
+ const availableTimeblocks = timeblocksAvailable(data, dateStr, reservations, guests);
86
+
87
+ console.log(`Available time blocks for ${guests} guests on ${dateStr}:`);
88
+ console.log(availableTimeblocks);