@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,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