@happychef/algorithm 1.2.11 → 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 (57) hide show
  1. package/.github/workflows/ci-cd.yml +234 -234
  2. package/BRANCH_PROTECTION_SETUP.md +167 -167
  3. package/CHANGELOG.md +8 -8
  4. package/README.md +144 -144
  5. package/RESERVERINGEN_GIDS.md +986 -986
  6. package/__tests__/filters.test.js +276 -276
  7. package/__tests__/isDateAvailable.test.js +175 -175
  8. package/__tests__/isTimeAvailable.test.js +168 -168
  9. package/__tests__/restaurantData.test.js +422 -422
  10. package/__tests__/tableHelpers.test.js +247 -247
  11. package/assignTables.js +424 -424
  12. package/changes/2025/December/PR2___change.md +14 -14
  13. package/changes/2025/December/PR3_add__change.md +20 -20
  14. package/changes/2025/December/PR4___.md +15 -15
  15. package/changes/2025/December/PR5___.md +15 -15
  16. package/changes/2025/December/PR6__del_.md +17 -17
  17. package/changes/2025/December/PR7_add__change.md +21 -21
  18. package/changes/2026/January/PR8_add__change.md +39 -0
  19. package/changes/2026/January/PR9_add__change.md +20 -0
  20. package/filters/maxArrivalsFilter.js +114 -114
  21. package/filters/maxGroupsFilter.js +221 -221
  22. package/filters/timeFilter.js +89 -89
  23. package/getAvailableTimeblocks.js +158 -158
  24. package/grouping.js +162 -162
  25. package/index.js +42 -42
  26. package/isDateAvailable.js +80 -80
  27. package/isDateAvailableWithTableCheck.js +171 -171
  28. package/isTimeAvailable.js +25 -25
  29. package/jest.config.js +23 -23
  30. package/package.json +27 -27
  31. package/processing/dailyGuestCounts.js +73 -73
  32. package/processing/mealTypeCount.js +133 -133
  33. package/processing/timeblocksAvailable.js +167 -167
  34. package/reservation_data/counter.js +64 -64
  35. package/restaurant_data/exceptions.js +149 -149
  36. package/restaurant_data/openinghours.js +123 -123
  37. package/simulateTableAssignment.js +709 -699
  38. package/tableHelpers.js +178 -178
  39. package/tables/time/parseTime.js +19 -19
  40. package/tables/time/shifts.js +7 -7
  41. package/tables/utils/calculateDistance.js +13 -13
  42. package/tables/utils/isTableFreeForAllSlots.js +14 -14
  43. package/tables/utils/isTemporaryTableValid.js +39 -39
  44. package/test/test_counter.js +194 -194
  45. package/test/test_dailyCount.js +81 -81
  46. package/test/test_datesAvailable.js +106 -106
  47. package/test/test_exceptions.js +172 -172
  48. package/test/test_isDateAvailable.js +330 -330
  49. package/test/test_mealTypeCount.js +54 -54
  50. package/test/test_timesAvailable.js +88 -88
  51. package/test-detailed-filter.js +100 -100
  52. package/test-lunch-debug.js +110 -110
  53. package/test-max-arrivals-filter.js +79 -79
  54. package/test-meal-stop-fix.js +147 -147
  55. package/test-meal-stop-simple.js +93 -93
  56. package/test-timezone-debug.js +47 -47
  57. package/test.js +336 -336
@@ -1,106 +1,106 @@
1
- // dateAvailabilityTests.js
2
-
3
- const { isDateAvailable } = require('../isDateAvailable');
4
- const { getDailyGuestCounts } = require('../processing/dailyGuestCounts');
5
-
6
- // Sample data
7
- const data = {
8
- "_id": "demo",
9
- "general-settings": {
10
- "zitplaatsen": "5",
11
- "duurReservatie": "120", // Reservation duration of 120 minutes
12
- "intervalReservatie": "30" // Time increment of 30 minutes
13
- },
14
- "openinghours-breakfast": {
15
- "schemeSettings": {
16
- "Monday": {
17
- "enabled": false,
18
- "startTime": "07:00",
19
- "endTime": "11:00",
20
- "maxCapacityEnabled": false, // Will fallback to zitplaatsen
21
- "maxCapacity": "0",
22
- "shiftsEnabled": false,
23
- "shifts": []
24
- }
25
- },
26
- "storedNumber": {
27
- "$numberInt": "0"
28
- }
29
- },
30
- "openinghours-lunch": {
31
- "schemeSettings": {
32
- "Monday": {
33
- "enabled": false,
34
- "startTime": "13:00", // Lunch starts at 13:00
35
- "endTime": "16:00",
36
- "maxCapacityEnabled": true,
37
- "maxCapacity": "20",
38
- "shiftsEnabled": false,
39
- "shifts": []
40
- }
41
- },
42
- "storedNumber": {
43
- "$numberInt": "0"
44
- }
45
- },
46
- "openinghours-dinner": {
47
- "schemeSettings": {
48
- "Monday": {
49
- "enabled": true,
50
- "startTime": "16:00",
51
- "endTime": "23:00",
52
- "maxCapacityEnabled": true,
53
- "maxCapacity": "5",
54
- "shiftsEnabled": false,
55
- }
56
- },
57
- "storedNumber": {
58
- "$numberInt": "0"
59
- }
60
- },
61
- "exceptions": []
62
- };
63
-
64
- // Sample reservations
65
- const reservations = [
66
- // Dinner reservations
67
- { guests: "5", time: "18:00", date: "2024-12-02" }, // Shift 1 is fully booked
68
- { guests: "2", time: "20:00", date: "2024-12-02" }, // Shift 2 has available seats
69
- ];
70
-
71
- console.log('--- Date Availability Tests ---');
72
-
73
- const guests = 3;
74
-
75
- // Test 1: Check availability on 2024-12-02
76
- const dateStr1 = '2024-12-02';
77
- const { guestCounts: dailyGuestCounts1, shiftsInfo } = getDailyGuestCounts(data, dateStr1, reservations);
78
- console.log(`Daily Guest Counts for ${dateStr1}:`);
79
- console.log(dailyGuestCounts1);
80
- console.log('Shifts Info:', shiftsInfo);
81
-
82
- const isAvailable1 = isDateAvailable(data, dateStr1, reservations, guests);
83
- console.log(`Is date ${dateStr1} available for ${guests} guests? ${isAvailable1}`);
84
- console.log('---');
85
-
86
- // Test 2: Check availability on 2024-12-03
87
- const dateStr2 = '2024-12-03';
88
- const { guestCounts: dailyGuestCounts2 } = getDailyGuestCounts(data, dateStr2, reservations);
89
- console.log(`Daily Guest Counts for ${dateStr2}:`);
90
- console.log(dailyGuestCounts2);
91
-
92
- const isAvailable2 = isDateAvailable(data, dateStr2, reservations, guests);
93
- console.log(`Is date ${dateStr2} available for ${guests} guests? ${isAvailable2}`);
94
- console.log('---');
95
-
96
- // Test 3: Check availability on 2024-12-02 for 5 guests
97
- const guests3 = 5;
98
- const isAvailable3 = isDateAvailable(data, dateStr1, reservations, guests3);
99
- console.log(`Is date ${dateStr1} available for ${guests3} guests? ${isAvailable3}`);
100
- console.log('---');
101
-
102
- // Test 4: Check availability on 2024-12-02 for 2 guests
103
- const guests4 = 2;
104
- const isAvailable4 = isDateAvailable(data, dateStr1, reservations, guests4);
105
- console.log(`Is date ${dateStr1} available for ${guests4} guests? ${isAvailable4}`);
106
- console.log('---');
1
+ // dateAvailabilityTests.js
2
+
3
+ const { isDateAvailable } = require('../isDateAvailable');
4
+ const { getDailyGuestCounts } = require('../processing/dailyGuestCounts');
5
+
6
+ // Sample data
7
+ const data = {
8
+ "_id": "demo",
9
+ "general-settings": {
10
+ "zitplaatsen": "5",
11
+ "duurReservatie": "120", // Reservation duration of 120 minutes
12
+ "intervalReservatie": "30" // Time increment of 30 minutes
13
+ },
14
+ "openinghours-breakfast": {
15
+ "schemeSettings": {
16
+ "Monday": {
17
+ "enabled": false,
18
+ "startTime": "07:00",
19
+ "endTime": "11:00",
20
+ "maxCapacityEnabled": false, // Will fallback to zitplaatsen
21
+ "maxCapacity": "0",
22
+ "shiftsEnabled": false,
23
+ "shifts": []
24
+ }
25
+ },
26
+ "storedNumber": {
27
+ "$numberInt": "0"
28
+ }
29
+ },
30
+ "openinghours-lunch": {
31
+ "schemeSettings": {
32
+ "Monday": {
33
+ "enabled": false,
34
+ "startTime": "13:00", // Lunch starts at 13:00
35
+ "endTime": "16:00",
36
+ "maxCapacityEnabled": true,
37
+ "maxCapacity": "20",
38
+ "shiftsEnabled": false,
39
+ "shifts": []
40
+ }
41
+ },
42
+ "storedNumber": {
43
+ "$numberInt": "0"
44
+ }
45
+ },
46
+ "openinghours-dinner": {
47
+ "schemeSettings": {
48
+ "Monday": {
49
+ "enabled": true,
50
+ "startTime": "16:00",
51
+ "endTime": "23:00",
52
+ "maxCapacityEnabled": true,
53
+ "maxCapacity": "5",
54
+ "shiftsEnabled": false,
55
+ }
56
+ },
57
+ "storedNumber": {
58
+ "$numberInt": "0"
59
+ }
60
+ },
61
+ "exceptions": []
62
+ };
63
+
64
+ // Sample reservations
65
+ const reservations = [
66
+ // Dinner reservations
67
+ { guests: "5", time: "18:00", date: "2024-12-02" }, // Shift 1 is fully booked
68
+ { guests: "2", time: "20:00", date: "2024-12-02" }, // Shift 2 has available seats
69
+ ];
70
+
71
+ console.log('--- Date Availability Tests ---');
72
+
73
+ const guests = 3;
74
+
75
+ // Test 1: Check availability on 2024-12-02
76
+ const dateStr1 = '2024-12-02';
77
+ const { guestCounts: dailyGuestCounts1, shiftsInfo } = getDailyGuestCounts(data, dateStr1, reservations);
78
+ console.log(`Daily Guest Counts for ${dateStr1}:`);
79
+ console.log(dailyGuestCounts1);
80
+ console.log('Shifts Info:', shiftsInfo);
81
+
82
+ const isAvailable1 = isDateAvailable(data, dateStr1, reservations, guests);
83
+ console.log(`Is date ${dateStr1} available for ${guests} guests? ${isAvailable1}`);
84
+ console.log('---');
85
+
86
+ // Test 2: Check availability on 2024-12-03
87
+ const dateStr2 = '2024-12-03';
88
+ const { guestCounts: dailyGuestCounts2 } = getDailyGuestCounts(data, dateStr2, reservations);
89
+ console.log(`Daily Guest Counts for ${dateStr2}:`);
90
+ console.log(dailyGuestCounts2);
91
+
92
+ const isAvailable2 = isDateAvailable(data, dateStr2, reservations, guests);
93
+ console.log(`Is date ${dateStr2} available for ${guests} guests? ${isAvailable2}`);
94
+ console.log('---');
95
+
96
+ // Test 3: Check availability on 2024-12-02 for 5 guests
97
+ const guests3 = 5;
98
+ const isAvailable3 = isDateAvailable(data, dateStr1, reservations, guests3);
99
+ console.log(`Is date ${dateStr1} available for ${guests3} guests? ${isAvailable3}`);
100
+ console.log('---');
101
+
102
+ // Test 4: Check availability on 2024-12-02 for 2 guests
103
+ const guests4 = 2;
104
+ const isAvailable4 = isDateAvailable(data, dateStr1, reservations, guests4);
105
+ console.log(`Is date ${dateStr1} available for ${guests4} guests? ${isAvailable4}`);
106
+ console.log('---');
@@ -1,173 +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
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
173