@pisell/pisellos 2.3.143 → 2.3.145

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 (33) hide show
  1. package/dist/modules/BookingContext/utils/productExtend.d.ts +7 -0
  2. package/dist/modules/BookingContext/utils/productExtend.js +62 -18
  3. package/dist/modules/Order/index.d.ts +2 -1
  4. package/dist/modules/Order/index.js +380 -198
  5. package/dist/modules/Order/types.d.ts +9 -0
  6. package/dist/modules/Order/utils.d.ts +5 -3
  7. package/dist/modules/Order/utils.js +32 -11
  8. package/dist/modules/ResourcePlanner/planner.d.ts +2 -0
  9. package/dist/modules/ResourcePlanner/planner.js +327 -22
  10. package/dist/modules/ResourcePlanner/types.d.ts +29 -0
  11. package/dist/solution/BookingByStep/index.d.ts +1 -1
  12. package/dist/solution/BookingTicket/utils/addProductDecision.d.ts +0 -1
  13. package/dist/solution/BookingTicket/utils/addProductDecision.js +1 -1
  14. package/dist/solution/UnifiedBookingSales/index.d.ts +3 -0
  15. package/dist/solution/UnifiedBookingSales/index.js +432 -163
  16. package/dist/solution/UnifiedBookingSales/types.d.ts +14 -2
  17. package/lib/modules/BookingContext/utils/productExtend.d.ts +7 -0
  18. package/lib/modules/BookingContext/utils/productExtend.js +45 -2
  19. package/lib/modules/Order/index.d.ts +2 -1
  20. package/lib/modules/Order/index.js +92 -10
  21. package/lib/modules/Order/types.d.ts +9 -0
  22. package/lib/modules/Order/utils.d.ts +5 -3
  23. package/lib/modules/Order/utils.js +29 -10
  24. package/lib/modules/ResourcePlanner/planner.d.ts +2 -0
  25. package/lib/modules/ResourcePlanner/planner.js +247 -7
  26. package/lib/modules/ResourcePlanner/types.d.ts +29 -0
  27. package/lib/solution/BookingByStep/index.d.ts +1 -1
  28. package/lib/solution/BookingTicket/utils/addProductDecision.d.ts +0 -1
  29. package/lib/solution/BookingTicket/utils/addProductDecision.js +1 -1
  30. package/lib/solution/UnifiedBookingSales/index.d.ts +3 -0
  31. package/lib/solution/UnifiedBookingSales/index.js +220 -27
  32. package/lib/solution/UnifiedBookingSales/types.d.ts +14 -2
  33. package/package.json +1 -1
@@ -7,6 +7,13 @@ import { TimeSlicesResult, TimeSlice, DurationSlice } from './timeSlices';
7
7
  * 让 OS 这层完全可在 Node 单测下运行(dayjs 在 Node 也是纯函数)。
8
8
  */
9
9
  export interface BookingCalcContext {
10
+ /** Sales channel; remembered duration starts are accepted only by POS. */
11
+ channel?: string;
12
+ /** Start-only device preference for this decision; never reuse a cached end/resource. */
13
+ rememberedTime?: {
14
+ businessDate: string;
15
+ startAt: string;
16
+ };
10
17
  /** 来自 `/core/board/management/config` 的整套配置;常用路径见 sliceTimeSlices / appointmentTimingPreference。 */
11
18
  bookingConfig?: any;
12
19
  /** 资源 origin map(id → resource origin)。 */
@@ -1,4 +1,3 @@
1
- function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
1
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3
2
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
3
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -10,6 +9,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
10
9
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
10
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
12
11
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
13
13
  import dayjs from 'dayjs';
14
14
  import { formatResources, getResourceByIds, getSumCapacity, getUsableTime, setDefaultCapacitys, setDefaultResource } from "./resources";
15
15
  import { hasActualResourceSelection, productNeedsResourceExtend } from "./resourceSelection";
@@ -24,6 +24,46 @@ import { flexibleObj, getDurationValue, isProductFlexibleDuration } from "./flex
24
24
  * 让 OS 这层完全可在 Node 单测下运行(dayjs 在 Node 也是纯函数)。
25
25
  */
26
26
 
27
+ /** Rebuild only the derived booking fields; SKU, quantity, notes and Holder stay intact. */
28
+ function seedRememberedBookingStart(cacheItem, ctx) {
29
+ var _cacheItem$cartDetail, _cacheItem$_extend;
30
+ var remembered = ctx.rememberedTime;
31
+ var invalid = function invalid() {
32
+ return Object.assign(new Error('Remembered time requires a valid POS duration start.'), {
33
+ code: 'INVALID_REMEMBERED_TIME'
34
+ });
35
+ };
36
+ var duration = cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.duration;
37
+ var durationType = _typeof(duration) === 'object' && duration ? String(duration.type || '').toLowerCase() : '';
38
+ var durationValue = _typeof(duration) === 'object' && duration ? duration.value : duration;
39
+ var isDuration = isProductFlexibleDuration(duration) || ['', 'fixed', 'minute', 'minutes', 'hour', 'hours'].includes(durationType) && Number.isFinite(Number(durationValue)) && Number(durationValue) > 0;
40
+ var isCalendarDate = function isCalendarDate(value) {
41
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
42
+ var date = new Date("".concat(value, "T00:00:00.000Z"));
43
+ return Number.isFinite(date.getTime()) && date.toISOString().slice(0, 10) === value;
44
+ };
45
+ var parts = typeof (remembered === null || remembered === void 0 ? void 0 : remembered.startAt) === 'string' ? /^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?(?:Z|[+-](\d{2}):(\d{2}))?$/.exec(remembered.startAt) : null;
46
+ if (String(ctx.channel || '').trim().toLowerCase() !== 'pos' || !isDuration || isMultiDayProduct(cacheItem) || isSessionProduct(cacheItem) || cacheItem !== null && cacheItem !== void 0 && (_cacheItem$cartDetail = cacheItem.cartDetailValue) !== null && _cacheItem$cartDetail !== void 0 && _cacheItem$cartDetail.session || cacheItem !== null && cacheItem !== void 0 && (_cacheItem$_extend = cacheItem._extend) !== null && _cacheItem$_extend !== void 0 && (_cacheItem$_extend = _cacheItem$_extend.other) !== null && _cacheItem$_extend !== void 0 && _cacheItem$_extend.session || !isCalendarDate(remembered === null || remembered === void 0 ? void 0 : remembered.businessDate) || !parts || !isCalendarDate(parts[1]) || Number(parts[2]) > 23 || Number(parts[3]) > 59 || Number(parts[4] || 0) > 59 || Number(parts[5] || 0) > 23 || Number(parts[6] || 0) > 59) throw invalid();
47
+ // Parse the actual instant with the same runtime clock used by the legacy booking helpers.
48
+ // The business-day label must not replace the calendar date of an overnight start.
49
+ var start = dayjs(remembered.startAt);
50
+ if (!start.isValid()) throw invalid();
51
+ var extend = _objectSpread({}, (cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem._extend) || {});
52
+ for (var _i = 0, _arr = ['start_date', 'startDate', 'start_time', 'end_date', 'endDate', 'end_time', 'duration', 'resource', 'resources', 'capacity', 'booking', 'availabilitySelection']; _i < _arr.length; _i++) {
53
+ var key = _arr[_i];
54
+ delete extend[key];
55
+ }
56
+ return _objectSpread(_objectSpread({}, cacheItem), {}, {
57
+ new: 1,
58
+ autoClose: false,
59
+ _data: {},
60
+ _extend: _objectSpread(_objectSpread({}, extend), {}, {
61
+ start_date: start.format('YYYY-MM-DD'),
62
+ start_time: start.format(start.millisecond() ? 'HH:mm:ss.SSS' : start.second() ? 'HH:mm:ss' : 'HH:mm')
63
+ })
64
+ });
65
+ }
66
+
27
67
  /** 从 BookingContext.date 提取 HH:mm(仅当日期带有效时分时)。 */
28
68
  export function derivePresetStartTimeFromDate(date) {
29
69
  if (date == null) return undefined;
@@ -46,12 +86,12 @@ function getAppointmentTimingPreference(ctx) {
46
86
  * 灵活时长选项(cacheItem.duration.type === 'flexible' 时)。
47
87
  */
48
88
  function getFlexibleOption(params) {
49
- var _cacheItem$_extend, _cacheItem$_extend2, _usable$_extend, _params$ctx;
89
+ var _cacheItem$_extend2, _cacheItem$_extend3, _usable$_extend, _params$ctx;
50
90
  var cacheItem = params.cacheItem,
51
91
  useStartTime = params.useStartTime;
52
92
  var duration = getDurationValue(cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.duration);
53
93
  if (duration !== 'flexible') return null;
54
- var startDate = dayjs("".concat(dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend = cacheItem._extend) === null || _cacheItem$_extend === void 0 ? void 0 : _cacheItem$_extend.start_date).format('YYYY-MM-DD'), " ").concat(useStartTime || (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend2 = cacheItem._extend) === null || _cacheItem$_extend2 === void 0 ? void 0 : _cacheItem$_extend2.start_time) || '00:00'));
94
+ var startDate = dayjs("".concat(dayjs(cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend2 = cacheItem._extend) === null || _cacheItem$_extend2 === void 0 ? void 0 : _cacheItem$_extend2.start_date).format('YYYY-MM-DD'), " ").concat(useStartTime || (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend3 = cacheItem._extend) === null || _cacheItem$_extend3 === void 0 ? void 0 : _cacheItem$_extend3.start_time) || '00:00'));
55
95
  var usable = getUsableTime(cacheItem);
56
96
  var usableEndAt = usable !== null && usable !== void 0 && (_usable$_extend = usable._extend) !== null && _usable$_extend !== void 0 && (_usable$_extend = _usable$_extend.usableTime) !== null && _usable$_extend !== void 0 && _usable$_extend.end_at ? dayjs(usable._extend.usableTime.end_at) : null;
57
97
  var endDate = getEndDate(startDate, 'flexible', usableEndAt, (_params$ctx = params.ctx) === null || _params$ctx === void 0 ? void 0 : _params$ctx.shopOpeningHours);
@@ -105,7 +145,7 @@ export function getTimeObj(params) {
105
145
  * - cacheItem.isCustomItem → 直接返回 `{ duration: null }`。
106
146
  */
107
147
  export function getServiceStartTimeAndEndTime(params) {
108
- var _cacheItem$_extend3;
148
+ var _cacheItem$_extend4;
109
149
  var cacheItem = params.cacheItem,
110
150
  timeObj = params.timeObj,
111
151
  ctx = params.ctx;
@@ -163,7 +203,7 @@ export function getServiceStartTimeAndEndTime(params) {
163
203
  _extend.start_date = (_extend$start_date = _extend.start_date) !== null && _extend$start_date !== void 0 ? _extend$start_date : startDate;
164
204
  _extend.end_date = (_extend$end_date = _extend.end_date) !== null && _extend$end_date !== void 0 ? _extend$end_date : endDate;
165
205
  }
166
- var session = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend3 = cacheItem._extend) === null || _cacheItem$_extend3 === void 0 || (_cacheItem$_extend3 = _cacheItem$_extend3.other) === null || _cacheItem$_extend3 === void 0 ? void 0 : _cacheItem$_extend3.session;
206
+ var session = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend4 = cacheItem._extend) === null || _cacheItem$_extend4 === void 0 || (_cacheItem$_extend4 = _cacheItem$_extend4.other) === null || _cacheItem$_extend4 === void 0 ? void 0 : _cacheItem$_extend4.session;
167
207
  if (isSessionProduct(cacheItem) && session) {
168
208
  var baseDate = ctx.date ? dayjs(ctx.date) : dayjs();
169
209
  var startAt = dayjs("".concat(baseDate.format('YYYY-MM-DD'), " ").concat(dayjs(session.start_at).format('HH:mm:ss')));
@@ -188,18 +228,22 @@ export function getServiceStartTimeAndEndTime(params) {
188
228
  * 入参 ctx 必须至少给:bookingConfig / resourcesOriginMap / resourcesOrigin / date。
189
229
  */
190
230
  export function getProductExtend(params) {
191
- var _cacheItem$_extend4;
192
- var cacheItem = params.cacheItem,
193
- ctx = params.ctx,
194
- isDisabledTime = params.isDisabledTime;
195
- var isNew = cacheItem.new || !((_cacheItem$_extend4 = cacheItem._extend) !== null && _cacheItem$_extend4 !== void 0 && _cacheItem$_extend4.endDate);
231
+ var _cacheItem$_extend5;
232
+ var isDisabledTime = params.isDisabledTime;
233
+ var hasRememberedTime = params.ctx.rememberedTime !== undefined;
234
+ var cacheItem = hasRememberedTime ? seedRememberedBookingStart(params.cacheItem, params.ctx) : params.cacheItem;
235
+ var ctx = hasRememberedTime ? _objectSpread(_objectSpread({}, params.ctx), {}, {
236
+ previousService: undefined,
237
+ presetStartTime: undefined
238
+ }) : params.ctx;
239
+ var isNew = cacheItem.new || !((_cacheItem$_extend5 = cacheItem._extend) !== null && _cacheItem$_extend5 !== void 0 && _cacheItem$_extend5.endDate);
196
240
  var _cacheItem = _objectSpread({}, cacheItem);
197
241
  var resourcesOriginMap = ctx.resourcesOriginMap || {};
198
242
  _cacheItem._data = {};
199
243
  if (isMultiDayProduct(cacheItem)) {
200
- var _cacheItem$_extend5;
244
+ var _cacheItem$_extend6;
201
245
  _cacheItem._extend = _cacheItem._extend || {};
202
- _cacheItem._extend.holder_id = (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend5 = cacheItem._extend) === null || _cacheItem$_extend5 === void 0 ? void 0 : _cacheItem$_extend5.holder_id) || [];
246
+ _cacheItem._extend.holder_id = (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend6 = cacheItem._extend) === null || _cacheItem$_extend6 === void 0 ? void 0 : _cacheItem$_extend6.holder_id) || [];
203
247
  _cacheItem._extend.sub_type = 'days';
204
248
  }
205
249
  if (isNew) {
@@ -260,14 +304,14 @@ export function getProductExtend(params) {
260
304
  _cacheItem._time = new Date().getTime();
261
305
  }
262
306
  } else {
263
- var _cacheItem$_extend7;
307
+ var _cacheItem$_extend8;
264
308
  if (!_cacheItem._data.capacitys) {
265
309
  _cacheItem._data.capacitys = cacheItem.capacity;
266
310
  }
267
311
  if (!_cacheItem._data.resourcesOrigin) {
268
- var _cacheItem$_extend6, _ctx$bookingConfig4;
312
+ var _cacheItem$_extend7, _ctx$bookingConfig4;
269
313
  var extraResources = [];
270
- if (Array.isArray((_cacheItem$_extend6 = _cacheItem._extend) === null || _cacheItem$_extend6 === void 0 ? void 0 : _cacheItem$_extend6.event_resources)) {
314
+ if (Array.isArray((_cacheItem$_extend7 = _cacheItem._extend) === null || _cacheItem$_extend7 === void 0 ? void 0 : _cacheItem$_extend7.event_resources)) {
271
315
  _cacheItem._extend.event_resources.forEach(function (er) {
272
316
  extraResources.push({
273
317
  form_id: er.form_id,
@@ -293,7 +337,7 @@ export function getProductExtend(params) {
293
337
  }
294
338
  _cacheItem._data.timeObj = getTimeObj({
295
339
  cacheItem: _cacheItem,
296
- useStartTime: (_cacheItem$_extend7 = _cacheItem._extend) === null || _cacheItem$_extend7 === void 0 ? void 0 : _cacheItem$_extend7.start_time,
340
+ useStartTime: (_cacheItem$_extend8 = _cacheItem._extend) === null || _cacheItem$_extend8 === void 0 ? void 0 : _cacheItem$_extend8.start_time,
297
341
  ctx: ctx
298
342
  });
299
343
  }
@@ -306,7 +350,7 @@ export function getProductExtend(params) {
306
350
  * `getAutoAllocationStorage` 抽象为入参 `isAutoAllocationOn(formId)`。
307
351
  */
308
352
  export function getIsAutoClose(cacheItem, isAutoAllocationOn) {
309
- var _cacheItem$_data, _cacheItem$_extend8;
353
+ var _cacheItem$_data, _cacheItem$_extend9;
310
354
  if (productNeedsResourceExtend(cacheItem) && !hasActualResourceSelection(cacheItem)) {
311
355
  return false;
312
356
  }
@@ -321,7 +365,7 @@ export function getIsAutoClose(cacheItem, isAutoAllocationOn) {
321
365
  }
322
366
  }
323
367
  }
324
- var entries = Object.entries(((_cacheItem$_extend8 = cacheItem._extend) === null || _cacheItem$_extend8 === void 0 ? void 0 : _cacheItem$_extend8.resource) || {});
368
+ var entries = Object.entries(((_cacheItem$_extend9 = cacheItem._extend) === null || _cacheItem$_extend9 === void 0 ? void 0 : _cacheItem$_extend9.resource) || {});
325
369
  if (entries.length === 0) {
326
370
  return !productNeedsResourceExtend(cacheItem);
327
371
  }
@@ -332,6 +332,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
332
332
  private applyOrderProductsDepositSummary;
333
333
  recalculateSummary(options?: {
334
334
  createIfMissing?: boolean;
335
+ isCurrentOrder?: () => boolean;
335
336
  }): Promise<OrderSummary | null>;
336
337
  getOrderSummary(): Promise<OrderSummary>;
337
338
  updateTempOrderNote(note: string): string;
@@ -592,7 +593,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
592
593
  generateIdempotencyToken(): string;
593
594
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
594
595
  createOrder(params: CommitOrderParams['query']): {
595
- type: "virtual" | "appointment_booking";
596
+ type: "appointment_booking" | "virtual";
596
597
  platform: string;
597
598
  sales_channel: string;
598
599
  order_sales_channel: string;