@perdieminc/time-slots 1.0.1 → 1.1.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.
- package/README.md +85 -15
- package/lib/index.d.ts +0 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -3
- package/lib/index.js.map +1 -1
- package/lib/schedule/generate.d.ts.map +1 -1
- package/lib/schedule/generate.js +9 -10
- package/lib/schedule/generate.js.map +1 -1
- package/lib/schedule/get-schedules.d.ts.map +1 -1
- package/lib/schedule/get-schedules.js +3 -29
- package/lib/schedule/get-schedules.js.map +1 -1
- package/lib/types/index.d.ts +1 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/utils/business-hours.js +2 -2
- package/lib/utils/business-hours.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -40,10 +40,9 @@ Builds the schedule for the current location and fulfillment preference.
|
|
|
40
40
|
| `locations` | List of locations (with `location_id`, `timezone`, and business hours). |
|
|
41
41
|
| `cartItems` | Cart items (used for pre-sale, weekly pre-sale, catering prep time, and category-based filtering). |
|
|
42
42
|
| `fulfillmentPreference` | `"PICKUP"` \| `"DELIVERY"` \| `"CURBSIDE"`. |
|
|
43
|
-
| `prepTimeSettings` | Prep time in minutes,
|
|
43
|
+
| `prepTimeSettings` | Prep time in minutes, gap, busy times, **fulfillAtBusinessDayStart** (when true, prep is treated as whole days; when false, as raw minutes), opening/closing buffers, and optional `estimatedDeliveryMinutes` for delivery. |
|
|
44
44
|
| `currentLocation` | The location to generate the schedule for. |
|
|
45
|
-
| `isCateringFlow` | If `true`,
|
|
46
|
-
| `platform` | `"web"` \| `"ios"` \| `"android"` for timezone handling (default `"web"`). |
|
|
45
|
+
| `isCateringFlow` | If `true`, business hours come from `location.catering.pickup` / `location.catering.delivery` instead of `pickup_hours` / `delivery_hours`. |
|
|
47
46
|
|
|
48
47
|
**Returns:** `{ schedule: FulfillmentSchedule, isWeeklyPreSaleAvailable: boolean }`.
|
|
49
48
|
|
|
@@ -52,14 +51,12 @@ Builds the schedule for the current location and fulfillment preference.
|
|
|
52
51
|
### Types and constants
|
|
53
52
|
|
|
54
53
|
- **Fulfillment:** `FULFILLMENT_TYPES`, `FulfillmentType`, `FulfillmentSchedule`, `DaySchedule`.
|
|
55
|
-
- **Prep time:** `
|
|
56
|
-
- **Store / cart:** `StoreConfig`, `PreSaleConfig`, `WeeklyPreSaleConfig`, `CartItem
|
|
54
|
+
- **Prep time:** `DEFAULT_PREP_TIME_IN_MINUTES`, `DEFAULT_GAP_IN_MINUTES`, `MINUTES_PER_DAY`, `PrepTimeSettings`, `PrepTimeCadence` (minute / hour / day).
|
|
55
|
+
- **Store / cart:** `StoreConfig`, `PreSaleConfig`, `WeeklyPreSaleConfig`, `CartItem`.
|
|
57
56
|
- **Location / hours:** `LocationLike`, `BusinessHour`, `BusinessHoursOverrideInput` / `Output`, `getLocationsBusinessHoursOverrides`, `getOpeningClosingTime`.
|
|
58
|
-
- **Platform:** `PLATFORM` (web, ios, android).
|
|
59
57
|
|
|
60
58
|
## Utilities (exported)
|
|
61
59
|
|
|
62
|
-
- **`getCateringPrepTimeConfig(params)`** – Derives prep time cadence and frequency from cart items for catering.
|
|
63
60
|
- **`getPreSalePickupDates(pickupDays, orderingDays)`** – Dates when weekly pre-sale pickup is allowed.
|
|
64
61
|
- **`isTodayInTimeZone(date, timezone)`** / **`isTomorrowInTimeZone(date, timezone)`** – Date checks in a given timezone.
|
|
65
62
|
- **`overrideTimeZoneOnUTC(utcDate, timezone)`** – Interpret a UTC date in a store timezone.
|
|
@@ -67,17 +64,90 @@ Builds the schedule for the current location and fulfillment preference.
|
|
|
67
64
|
- **`filterMenusFromSchedule`** – Filter schedule by menu type.
|
|
68
65
|
- **`getOpeningClosingTime(params)`** – Opening/closing time for a given date and business hours.
|
|
69
66
|
|
|
70
|
-
Internal schedule generation uses **`getNextAvailableDates`**-style logic (timezone-aware
|
|
67
|
+
Internal schedule generation uses **`getNextAvailableDates`**-style logic (timezone-aware "next N open days") and slot generation with configurable prep time and gap.
|
|
71
68
|
|
|
72
|
-
## Prep time
|
|
69
|
+
## Prep time
|
|
73
70
|
|
|
74
|
-
Prep time
|
|
71
|
+
Prep time controls **when the first available slot lands** relative to "now." It runs in one of two cadences, picked by `fulfillAtBusinessDayStart`:
|
|
75
72
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
73
|
+
| Cadence | When | Treats `prepTimeInMinutes` as | First-slot rule on landing day |
|
|
74
|
+
| -------- | ------------------------------------ | ----------------------------- | ------------------------------------------------------- |
|
|
75
|
+
| MINUTE | `fulfillAtBusinessDayStart: false` | raw minutes | `max(now + prep, opening + openingBuffer)` |
|
|
76
|
+
| DAY | `fulfillAtBusinessDayStart: true` | whole days (`/ 1440`) | `opening + openingBuffer` (time-of-day ignored) |
|
|
77
|
+
|
|
78
|
+
Buffers (`openingBuffer`, `closingBuffer`) trim the slot window from either end. `estimatedDeliveryMinutes` adds on top for delivery.
|
|
79
|
+
|
|
80
|
+
### Same-day, no day skipping (MINUTE cadence, prep < 1 day)
|
|
81
|
+
|
|
82
|
+
Most common case. The first slot is whichever is later: store open (with buffer) or `now + prep`.
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
now+prep
|
|
86
|
+
│
|
|
87
|
+
opening ─────┼─────────────────── close
|
|
88
|
+
▼
|
|
89
|
+
first slot
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
If `now + prep` falls past today's close, today is dropped and the schedule starts at tomorrow's open.
|
|
93
|
+
|
|
94
|
+
### Day skipping (prep ≥ 1 day OR DAY cadence)
|
|
95
|
+
|
|
96
|
+
When prep crosses a full-day boundary, the schedule **skips entire business days** before placing the first slot.
|
|
97
|
+
|
|
98
|
+
**The algorithm:**
|
|
99
|
+
|
|
100
|
+
1. **Build a list of upcoming open business days.** Today is included unless the store is closed today, *or* `now` is past today's closing time.
|
|
101
|
+
2. **Slice off the first N entries.** N depends on cadence:
|
|
102
|
+
- **DAY cadence:** `N = prepTimeInMinutes / 1440`
|
|
103
|
+
- **MINUTE cadence:** `N = floor(prepTimeInMinutes / 1440)`; the leftover minutes (`prepTimeInMinutes % 1440`) are applied as prep on the landing day.
|
|
104
|
+
3. **The first remaining entry is the landing day.** Place the first slot using the cadence's first-slot rule.
|
|
105
|
+
|
|
106
|
+
**Note on closed days:** they are never in the dates list, so they don't count toward N. A closed weekday in the middle of the week is automatically "skipped over."
|
|
107
|
+
|
|
108
|
+
### MINUTE cadence projects time-of-day; DAY cadence doesn't
|
|
109
|
+
|
|
110
|
+
This is the key behavioral difference once you're skipping days.
|
|
111
|
+
|
|
112
|
+
- **DAY cadence:** every landing day starts at `opening + openingBuffer`. The user's order time doesn't matter.
|
|
113
|
+
- **MINUTE cadence:** the time-of-day from `now` is **projected** onto the landing day, then any leftover minutes are added. If the projected time falls past the landing day's close, that day is dropped and the schedule spills to the next open day.
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
MINUTE cadence projection:
|
|
117
|
+
|
|
118
|
+
now = Mon 10:00, prep = 1500 min = 1 day + 60 min
|
|
119
|
+
│ │
|
|
120
|
+
skip 1 day│ │ remainder
|
|
121
|
+
▼ ▼
|
|
122
|
+
land on Tue, then Tue 10:00 + 60 = Tue 11:00
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Worked example — 1-day prep, three different `now` values
|
|
126
|
+
|
|
127
|
+
Setup: store open Mon–Fri 09:00–17:00, `prepTimeInMinutes: 1440`.
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
Case A — now = Mon 07:00 (before opening)
|
|
131
|
+
Mon stays in the list → dates = [Mon, Tue, ...] → slice(1) = [Tue, ...]
|
|
132
|
+
DAY: Tue 09:00 ◀── opening + buffer
|
|
133
|
+
MINUTE: Tue 09:00 ◀── projected 07:00 < open, clamps up to opening
|
|
134
|
+
|
|
135
|
+
Case B — now = Mon 10:00 (mid-day)
|
|
136
|
+
Mon stays in the list → dates = [Mon, Tue, ...] → slice(1) = [Tue, ...]
|
|
137
|
+
DAY: Tue 09:00 ◀── opening + buffer (time-of-day ignored)
|
|
138
|
+
MINUTE: Tue 10:00 ◀── projected from now's 10:00
|
|
139
|
+
|
|
140
|
+
Case C — now = Mon 18:00 (after closing)
|
|
141
|
+
Mon dropped (past close) → dates = [Tue, Wed, ...] → slice(1) = [Wed, ...]
|
|
142
|
+
DAY: Wed 09:00 ◀── opening + buffer
|
|
143
|
+
MINUTE: Thu 09:00 ◀── projected Wed 18:00 is past Wed close → spill to Thu
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The Case C divergence is intentional: late-day MINUTE-cadence orders can lose an extra day because the projected ready time falls outside business hours. DAY cadence sidesteps this by anchoring to "business day start" instead of the wall clock.
|
|
147
|
+
|
|
148
|
+
### Catering
|
|
149
|
+
|
|
150
|
+
Set `isCateringFlow: true`. The schedule pipeline is identical, but business hours come from `location.catering.pickup.{start_time,end_time}` (or `.delivery` for delivery) and apply uniformly across every weekday that has a `pickup_hours` entry. All prep time, day-skipping, and buffer rules above behave the same way.
|
|
81
151
|
|
|
82
152
|
QA-friendly test cases (Given / When / Expected) are in [docs/TEST-CASES.md](docs/TEST-CASES.md).
|
|
83
153
|
|
package/lib/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export { getSchedules } from "./schedule/get-schedules";
|
|
|
4
4
|
export * from "./types";
|
|
5
5
|
export type { BusinessHour, BusinessHourInput, BusinessHoursOverrideInput, BusinessHoursOverrideOutput, } from "./types/business-hours";
|
|
6
6
|
export { getLocationsBusinessHoursOverrides } from "./utils/business-hours";
|
|
7
|
-
export { getCateringPrepTimeConfig } from "./utils/catering";
|
|
8
7
|
export { getPreSalePickupDates, isTodayInTimeZone, isTomorrowInTimeZone, overrideTimeZoneOnUTC, } from "./utils/date";
|
|
9
8
|
export { filterBusyTimesFromSchedule, filterMenusFromSchedule, } from "./utils/schedule-filter";
|
|
10
9
|
export { getOpeningClosingTime } from "./utils/store-hours";
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,cAAc,SAAS,CAAC;AACxB,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,iBAAiB,GACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,cAAc,SAAS,CAAC;AACxB,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kCAAkC,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,EACN,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACN,2BAA2B,EAC3B,uBAAuB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.getOpeningClosingTime = exports.filterMenusFromSchedule = exports.filterBusyTimesFromSchedule = exports.overrideTimeZoneOnUTC = exports.isTomorrowInTimeZone = exports.isTodayInTimeZone = exports.getPreSalePickupDates = exports.
|
|
17
|
+
exports.getOpeningClosingTime = exports.filterMenusFromSchedule = exports.filterBusyTimesFromSchedule = exports.overrideTimeZoneOnUTC = exports.isTomorrowInTimeZone = exports.isTodayInTimeZone = exports.getPreSalePickupDates = exports.getLocationsBusinessHoursOverrides = exports.getSchedules = exports.FULFILLMENT_TYPES = exports.DEFAULT_PREP_TIME_IN_MINUTES = exports.DEFAULT_GAP_IN_MINUTES = void 0;
|
|
18
18
|
var constants_1 = require("./constants");
|
|
19
19
|
Object.defineProperty(exports, "DEFAULT_GAP_IN_MINUTES", { enumerable: true, get: function () { return constants_1.DEFAULT_GAP_IN_MINUTES; } });
|
|
20
20
|
Object.defineProperty(exports, "DEFAULT_PREP_TIME_IN_MINUTES", { enumerable: true, get: function () { return constants_1.DEFAULT_PREP_TIME_IN_MINUTES; } });
|
|
@@ -24,8 +24,6 @@ Object.defineProperty(exports, "getSchedules", { enumerable: true, get: function
|
|
|
24
24
|
__exportStar(require("./types"), exports);
|
|
25
25
|
var business_hours_1 = require("./utils/business-hours");
|
|
26
26
|
Object.defineProperty(exports, "getLocationsBusinessHoursOverrides", { enumerable: true, get: function () { return business_hours_1.getLocationsBusinessHoursOverrides; } });
|
|
27
|
-
var catering_1 = require("./utils/catering");
|
|
28
|
-
Object.defineProperty(exports, "getCateringPrepTimeConfig", { enumerable: true, get: function () { return catering_1.getCateringPrepTimeConfig; } });
|
|
29
27
|
var date_1 = require("./utils/date");
|
|
30
28
|
Object.defineProperty(exports, "getPreSalePickupDates", { enumerable: true, get: function () { return date_1.getPreSalePickupDates; } });
|
|
31
29
|
Object.defineProperty(exports, "isTodayInTimeZone", { enumerable: true, get: function () { return date_1.isTodayInTimeZone; } });
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,yCAIqB;AAHpB,mHAAA,sBAAsB,OAAA;AACtB,yHAAA,4BAA4B,OAAA;AAC5B,8GAAA,iBAAiB,OAAA;AAElB,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,0CAAwB;AAOxB,yDAA4E;AAAnE,oIAAA,kCAAkC,OAAA;AAC3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AACA,yCAIqB;AAHpB,mHAAA,sBAAsB,OAAA;AACtB,yHAAA,4BAA4B,OAAA;AAC5B,8GAAA,iBAAiB,OAAA;AAElB,0DAAwD;AAA/C,6GAAA,YAAY,OAAA;AACrB,0CAAwB;AAOxB,yDAA4E;AAAnE,oIAAA,kCAAkC,OAAA;AAC3C,qCAKsB;AAJrB,6GAAA,qBAAqB,OAAA;AACrB,yGAAA,iBAAiB,OAAA;AACjB,4GAAA,oBAAoB,OAAA;AACpB,6GAAA,qBAAqB,OAAA;AAEtB,2DAGiC;AAFhC,8HAAA,2BAA2B,OAAA;AAC3B,0HAAA,uBAAuB,OAAA;AAExB,mDAA4D;AAAnD,oHAAA,qBAAqB,OAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/schedule/generate.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGX,WAAW,EACX,sBAAsB,EACtB,MAAM,UAAU,CAAC;AA6ElB,wBAAgB,gBAAgB,CAAC,EAChC,WAAwB,EACxB,QAAQ,EACR,KAAU,EACV,aAAkB,EAClB,sBAA2B,EAC3B,oBAAoB,EACpB,YAAiB,EACjB,eAAsB,EACtB,iBAAqB,EACrB,aAAiB,EACjB,aAAiB,EACjB,wBAA4B,GAC5B,EAAE,sBAAsB,GAAG,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/schedule/generate.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGX,WAAW,EACX,sBAAsB,EACtB,MAAM,UAAU,CAAC;AA6ElB,wBAAgB,gBAAgB,CAAC,EAChC,WAAwB,EACxB,QAAQ,EACR,KAAU,EACV,aAAkB,EAClB,sBAA2B,EAC3B,oBAAoB,EACpB,YAAiB,EACjB,eAAsB,EACtB,iBAAqB,EACrB,aAAiB,EACjB,aAAiB,EACjB,wBAA4B,GAC5B,EAAE,sBAAsB,GAAG,WAAW,EAAE,CAyQxC"}
|
package/lib/schedule/generate.js
CHANGED
|
@@ -149,15 +149,12 @@ function generateSchedule({ currentDate = new Date(), timeZone, dates = [], busi
|
|
|
149
149
|
]);
|
|
150
150
|
}
|
|
151
151
|
else {
|
|
152
|
-
// Actual today with MINUTE cadence
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const openingPlusBuffer = (0, date_fns_1.addMinutes)(openingTime, openingBuffer);
|
|
159
|
-
effectiveFirstSlot = (0, date_fns_1.max)([nowPlusPrep, openingPlusBuffer]);
|
|
160
|
-
}
|
|
152
|
+
// Actual today with MINUTE cadence: prep time is always added
|
|
153
|
+
// to `now`. The first slot is the later of (now + prep) and
|
|
154
|
+
// (opening + buffer).
|
|
155
|
+
const nowPlusPrep = (0, date_fns_1.addMinutes)(currentDate, prepTimeFrequency);
|
|
156
|
+
const openingPlusBuffer = (0, date_fns_1.addMinutes)(openingTime, openingBuffer);
|
|
157
|
+
effectiveFirstSlot = (0, date_fns_1.max)([nowPlusPrep, openingPlusBuffer]);
|
|
161
158
|
}
|
|
162
159
|
// Delivery always added on top
|
|
163
160
|
effectiveFirstSlot = (0, date_fns_1.addMinutes)(effectiveFirstSlot, estimatedDeliveryMinutes);
|
|
@@ -201,7 +198,9 @@ function generateSchedule({ currentDate = new Date(), timeZone, dates = [], busi
|
|
|
201
198
|
const effectiveOpeningBuffer = isRealFirstShift ? openingBuffer : 0;
|
|
202
199
|
// Roll from the opening time for the real first shift; other shifts from their own start
|
|
203
200
|
const rollFromDate = isRealFirstShift && storeTimes.openingTime
|
|
204
|
-
?
|
|
201
|
+
? hasMidnightContinuation
|
|
202
|
+
? startDate
|
|
203
|
+
: storeTimes.openingTime
|
|
205
204
|
: startDate;
|
|
206
205
|
const prepTimeSlot = (0, date_fns_1.addMinutes)(rollFromDate, effectiveOpeningBuffer + estimatedDeliveryMinutes);
|
|
207
206
|
// Use the later of prepTimeSlot and effectiveShiftStart, so that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/schedule/generate.ts"],"names":[],"mappings":";;AA4FA,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/schedule/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-schedules.d.ts","sourceRoot":"","sources":["../../src/schedule/get-schedules.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGX,kBAAkB,EAClB,kBAAkB,EAGlB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"get-schedules.d.ts","sourceRoot":"","sources":["../../src/schedule/get-schedules.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAGX,kBAAkB,EAClB,kBAAkB,EAGlB,MAAM,UAAU,CAAC;AAiGlB,wBAAgB,YAAY,CAAC,EAC5B,KAAK,EACL,SAAS,EACT,SAAS,EACT,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,cAAsB,GACtB,EAAE,kBAAkB,GAAG,kBAAkB,CAyHzC"}
|
|
@@ -4,7 +4,6 @@ exports.getSchedules = getSchedules;
|
|
|
4
4
|
const date_fns_1 = require("date-fns");
|
|
5
5
|
const constants_1 = require("../constants");
|
|
6
6
|
const business_hours_1 = require("../utils/business-hours");
|
|
7
|
-
const catering_1 = require("../utils/catering");
|
|
8
7
|
const date_1 = require("../utils/date");
|
|
9
8
|
const schedule_filter_1 = require("../utils/schedule-filter");
|
|
10
9
|
const location_1 = require("./location");
|
|
@@ -44,13 +43,10 @@ function getPreSaleHoursOverride(preSaleConfig, hasPreSaleItem) {
|
|
|
44
43
|
}
|
|
45
44
|
return null;
|
|
46
45
|
}
|
|
47
|
-
function resolveStartDate({ preSaleStartDate, hasPreSaleItem,
|
|
46
|
+
function resolveStartDate({ preSaleStartDate, hasPreSaleItem, }) {
|
|
48
47
|
if (hasPreSaleItem) {
|
|
49
48
|
return new Date(Math.max(preSaleStartDate.getTime(), Date.now()));
|
|
50
49
|
}
|
|
51
|
-
if (cateringShiftMinutes > 0) {
|
|
52
|
-
return (0, date_fns_1.addMinutes)(new Date(), cateringShiftMinutes);
|
|
53
|
-
}
|
|
54
50
|
return new Date();
|
|
55
51
|
}
|
|
56
52
|
/**
|
|
@@ -74,34 +70,13 @@ function getPrepTimeCadenceAndFrequency(settings) {
|
|
|
74
70
|
: (settings?.prepTimeInMinutes ?? 0),
|
|
75
71
|
};
|
|
76
72
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Resolves prep time config: for catering flow uses cart-derived cadence/frequency.
|
|
79
|
-
* estimatedDeliveryMinutes is now passed directly to generateSchedule rather than
|
|
80
|
-
* being baked into prep time, so it is always additive on top of prep time.
|
|
81
|
-
*/
|
|
82
|
-
function resolvePrepTimeConfig(prepTimeSettings, cartItems, isCateringFlow) {
|
|
83
|
-
if (!isCateringFlow) {
|
|
84
|
-
return prepTimeSettings;
|
|
85
|
-
}
|
|
86
|
-
const cateringPrepTimeConfig = (0, catering_1.getCateringPrepTimeConfig)({
|
|
87
|
-
items: cartItems,
|
|
88
|
-
prepTimeCadence: prepTimeSettings.prepTimeCadence,
|
|
89
|
-
prepTimeFrequency: prepTimeSettings.prepTimeFrequency,
|
|
90
|
-
});
|
|
91
|
-
return {
|
|
92
|
-
...prepTimeSettings,
|
|
93
|
-
...cateringPrepTimeConfig,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
73
|
// ── Main ────────────────────────────────────────────────────────────────────
|
|
97
74
|
function getSchedules({ store, locations, cartItems, fulfillmentPreference, prepTimeSettings, currentLocation, isCateringFlow = false, }) {
|
|
98
75
|
const { isAsapOrders, isSameDayOrders, max_future_order_days: daysCount = 7, weeklyPreSaleConfig, preSaleConfig, } = store;
|
|
99
76
|
const cart = deriveCartInfo(cartItems);
|
|
100
|
-
const resolvedPrepTime =
|
|
77
|
+
const resolvedPrepTime = getPrepTimeCadenceAndFrequency(prepTimeSettings);
|
|
101
78
|
const { gapInMinutes, busyTimes: busyTimesByLocationId, prepTimeFrequency: rawPrepTimeFrequency, prepTimeCadence, openingBuffer = 0, closingBuffer = 0, } = resolvedPrepTime;
|
|
102
|
-
const
|
|
103
|
-
const cateringShiftMinutes = isCateringFlow && !isDayCadence ? (rawPrepTimeFrequency ?? 0) : 0;
|
|
104
|
-
const prepTimeFrequency = cateringShiftMinutes > 0 ? 0 : (rawPrepTimeFrequency ?? 0);
|
|
79
|
+
const prepTimeFrequency = rawPrepTimeFrequency ?? 0;
|
|
105
80
|
const isDelivery = fulfillmentPreference === constants_1.FULFILLMENT_TYPES.DELIVERY;
|
|
106
81
|
const estimatedDeliveryMinutes = isDelivery
|
|
107
82
|
? (resolvedPrepTime.estimatedDeliveryMinutes ?? 0)
|
|
@@ -158,7 +133,6 @@ function getSchedules({ store, locations, cartItems, fulfillmentPreference, prep
|
|
|
158
133
|
currentDate: resolveStartDate({
|
|
159
134
|
preSaleStartDate: preSaleDates.startDate,
|
|
160
135
|
hasPreSaleItem: cart.hasPreSaleItem,
|
|
161
|
-
cateringShiftMinutes,
|
|
162
136
|
}),
|
|
163
137
|
prepTimeFrequency: isPreSaleEnabled ? 0 : prepTimeFrequency,
|
|
164
138
|
prepTimeCadence: isPreSaleEnabled ? undefined : prepTimeCadence,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-schedules.js","sourceRoot":"","sources":["../../src/schedule/get-schedules.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"get-schedules.js","sourceRoot":"","sources":["../../src/schedule/get-schedules.ts"],"names":[],"mappings":"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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export type { BusinessHour, BusinessHourInput, BusinessHoursOverrideInput, BusinessHoursOverrideOutput, } from "./business-hours";
|
|
2
2
|
export type { BusyTimeItem } from "./common";
|
|
3
|
-
export type { CartItem,
|
|
3
|
+
export type { CartItem, GetSchedulesParams, GetSchedulesResult, InitScheduleParams, InitScheduleResult, PrepTimeSettings, PreSaleConfig, StoreConfig, WeeklyPreSaleConfig, } from "./get-schedules";
|
|
4
4
|
export type { FulfillmentPreference, LocationLike } from "./location";
|
|
5
5
|
export type { DaySchedule, FulfillmentSchedule, GenerateLocationFulfillmentScheduleParams, GenerateScheduleParams, GetNextAvailableDatesParams, GetOpeningClosingTimeOnDateParams, GetOpeningClosingTimeParams, } from "./schedule";
|
|
6
6
|
export type { FilterBusyTimesFromScheduleParams, MenuType, } from "./schedule-filter";
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EACX,QAAQ,EACR,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,2BAA2B,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EACX,QAAQ,EACR,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,mBAAmB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACtE,YAAY,EACX,WAAW,EACX,mBAAmB,EACnB,yCAAyC,EACzC,sBAAsB,EACtB,2BAA2B,EAC3B,iCAAiC,EACjC,2BAA2B,GAC3B,MAAM,YAAY,CAAC;AACpB,YAAY,EACX,iCAAiC,EACjC,QAAQ,GACR,MAAM,mBAAmB,CAAC"}
|
|
@@ -21,7 +21,7 @@ function getLocationsBusinessHoursOverrides(businessHoursOverrides, locations) {
|
|
|
21
21
|
if (allLocations === true) {
|
|
22
22
|
for (const location of locations || []) {
|
|
23
23
|
const id = location.location_id;
|
|
24
|
-
result[id]
|
|
24
|
+
result[id] ??= [];
|
|
25
25
|
result[id].push(toBusinessHoursOverride(override));
|
|
26
26
|
}
|
|
27
27
|
}
|
|
@@ -29,7 +29,7 @@ function getLocationsBusinessHoursOverrides(businessHoursOverrides, locations) {
|
|
|
29
29
|
for (const id of locationIds || []) {
|
|
30
30
|
const location = locations.find((loc) => loc.location_id === id);
|
|
31
31
|
if (location) {
|
|
32
|
-
result[id]
|
|
32
|
+
result[id] ??= [];
|
|
33
33
|
result[id].push(toBusinessHoursOverride(override));
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"business-hours.js","sourceRoot":"","sources":["../../src/utils/business-hours.ts"],"names":[],"mappings":";;;AASA,0DAiBC;AAED,gFA4BC;AAWD,wFAoDC;AAvHD,4CAAiD;AASjD,SAAgB,uBAAuB,CACtC,qBAAiD;IAEjD,MAAM,EACL,KAAK,EACL,GAAG,EACH,UAAU,EAAE,SAAS,EACrB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,MAAM,GACf,GAAG,qBAAqB,CAAC;IAE1B,OAAO;QACN,KAAK;QACL,GAAG;QACH,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;QACpC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KAChC,CAAC;AACH,CAAC;AAED,SAAgB,kCAAkC,CACjD,sBAAoD,EACpD,SAAyB;IAEzB,MAAM,MAAM,GAAkD,EAAE,CAAC;IAEjE,KAAK,MAAM,QAAQ,IAAI,sBAAsB,EAAE,CAAC;QAC/C,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,GAC/D,QAAQ,IAAI,EAAE,CAAC;QAEhB,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,CAAC;gBAChC,MAAM,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"business-hours.js","sourceRoot":"","sources":["../../src/utils/business-hours.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@perdieminc/time-slots",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Generate time slots for scheduling",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"time-slots",
|
|
@@ -39,17 +39,17 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@date-fns/tz": "^1.4.1",
|
|
41
41
|
"date-fns": "^4.1.0",
|
|
42
|
-
"timezone-support": "^
|
|
42
|
+
"timezone-support": "^3.1.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@biomejs/biome": "2.3.11",
|
|
46
46
|
"@types/node": "^20.19.27",
|
|
47
|
-
"@vitest/coverage-v8": "^
|
|
47
|
+
"@vitest/coverage-v8": "^4.1.5",
|
|
48
48
|
"husky": "^9.1.7",
|
|
49
49
|
"lint-staged": "^16.2.7",
|
|
50
50
|
"tsx": "^4.21.0",
|
|
51
51
|
"typescript": "^5.9.3",
|
|
52
|
-
"vitest": "^
|
|
52
|
+
"vitest": "^4.1.5"
|
|
53
53
|
},
|
|
54
54
|
"files": [
|
|
55
55
|
"lib"
|