@pisell/pisellos 2.3.137 → 2.3.139
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/dist/model/strategy/adapter/promotion/index.js +9 -0
- package/dist/modules/Order/utils.js +1 -1
- package/dist/modules/ResourcePlanner/planner.js +10 -8
- package/dist/server/test.json +1 -1
- package/dist/shared/receipt/customerInvoiceLanguages.d.ts +8 -0
- package/dist/shared/receipt/customerInvoiceLanguages.js +60 -0
- package/dist/shared/receipt/loadCustomerInvoiceLayout.d.ts +5 -0
- package/dist/shared/receipt/loadCustomerInvoiceLayout.js +46 -4
- package/dist/shared/receipt/small-ticket.d.ts +9 -0
- package/dist/shared/receipt/small-ticket.js +246 -186
- package/dist/solution/OrderInvoicePreview/index.d.ts +10 -0
- package/dist/solution/OrderInvoicePreview/index.js +84 -14
- package/dist/solution/RegisterAndLogin/config.js +33 -11
- package/dist/solution/RegisterAndLogin/index.d.ts +2 -0
- package/dist/solution/RegisterAndLogin/index.js +1 -1
- package/dist/solution/RegisterAndLogin/utils.d.ts +12 -4
- package/dist/solution/RegisterAndLogin/utils.js +36 -16
- package/dist/solution/Sales/index.d.ts +2 -0
- package/dist/solution/Sales/index.js +15 -1
- package/dist/solution/UnifiedBookingSales/index.js +3 -4
- package/lib/modules/Order/utils.js +1 -1
- package/lib/modules/ResourcePlanner/planner.js +10 -8
- package/lib/server/test.json +1 -1
- package/lib/shared/receipt/customerInvoiceLanguages.d.ts +8 -0
- package/lib/shared/receipt/customerInvoiceLanguages.js +58 -0
- package/lib/shared/receipt/loadCustomerInvoiceLayout.d.ts +5 -0
- package/lib/shared/receipt/loadCustomerInvoiceLayout.js +42 -4
- package/lib/shared/receipt/small-ticket.d.ts +9 -0
- package/lib/shared/receipt/small-ticket.js +122 -9
- package/lib/solution/OrderInvoicePreview/index.d.ts +10 -0
- package/lib/solution/OrderInvoicePreview/index.js +60 -7
- package/lib/solution/RegisterAndLogin/config.js +32 -11
- package/lib/solution/RegisterAndLogin/index.d.ts +2 -0
- package/lib/solution/RegisterAndLogin/index.js +9 -1
- package/lib/solution/RegisterAndLogin/utils.d.ts +12 -4
- package/lib/solution/RegisterAndLogin/utils.js +24 -17
- package/lib/solution/Sales/index.d.ts +2 -0
- package/lib/solution/Sales/index.js +10 -1
- package/lib/solution/UnifiedBookingSales/index.js +3 -4
- package/package.json +1 -1
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Module, ModuleOptions, PisellCore } from '../../types';
|
|
2
2
|
import { BaseModule } from '../../modules/BaseModule';
|
|
3
|
+
import { type CustomerInvoiceLanguageCode, type CustomerInvoiceLanguageOption } from '../../shared/receipt/customerInvoiceLanguages';
|
|
4
|
+
export type { CustomerInvoiceLanguageCode, CustomerInvoiceLanguageOption, } from '../../shared/receipt/customerInvoiceLanguages';
|
|
3
5
|
import type { InvoiceLayoutConfig } from '../../modules/OpenData';
|
|
4
6
|
import { type SmallTicketData } from '../../shared/receipt/small-ticket';
|
|
5
7
|
export interface OrderInvoicePreviewInput {
|
|
@@ -19,6 +21,9 @@ export interface OrderInvoicePreviewResult {
|
|
|
19
21
|
sourceRevision: string;
|
|
20
22
|
generatedAt: string;
|
|
21
23
|
locale: string;
|
|
24
|
+
secondaryLocale?: string;
|
|
25
|
+
languageOptions: CustomerInvoiceLanguageOption[];
|
|
26
|
+
selectedLanguage: CustomerInvoiceLanguageCode;
|
|
22
27
|
orderId: string | number;
|
|
23
28
|
source: Record<string, any>;
|
|
24
29
|
shop: Record<string, any>;
|
|
@@ -40,6 +45,7 @@ export declare class OrderInvoicePreviewImpl extends BaseModule implements Modul
|
|
|
40
45
|
private disposed;
|
|
41
46
|
private input?;
|
|
42
47
|
private activeKey;
|
|
48
|
+
private languageSelection?;
|
|
43
49
|
private pending?;
|
|
44
50
|
private snapshotCache;
|
|
45
51
|
constructor(name?: string);
|
|
@@ -51,6 +57,10 @@ export declare class OrderInvoicePreviewImpl extends BaseModule implements Modul
|
|
|
51
57
|
private loadContext;
|
|
52
58
|
private loadSource;
|
|
53
59
|
prepare(input: OrderInvoicePreviewInput): Promise<OrderInvoicePreviewResult>;
|
|
60
|
+
private getSelectionScope;
|
|
61
|
+
private documentIdentity;
|
|
62
|
+
/** Switch only the ready receipt projection; no fetching or rebuilding data. */
|
|
63
|
+
selectLanguage(code: string): OrderInvoicePreviewResult;
|
|
54
64
|
retry(): Promise<OrderInvoicePreviewResult>;
|
|
55
65
|
destroy(): void;
|
|
56
66
|
}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
var _excluded = ["secondaryLocale"];
|
|
2
|
+
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
3
|
+
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
1
4
|
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
5
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
6
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
8
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
2
9
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
10
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
11
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
@@ -26,7 +33,8 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
|
|
|
26
33
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
27
34
|
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); }
|
|
28
35
|
import { BaseModule } from "../../modules/BaseModule";
|
|
29
|
-
import {
|
|
36
|
+
import { loadCustomerInvoiceTemplate } from "../../shared/receipt/loadCustomerInvoiceLayout";
|
|
37
|
+
import { resolveCustomerInvoiceLanguages } from "../../shared/receipt/customerInvoiceLanguages";
|
|
30
38
|
import { buildSmallTicketData } from "../../shared/receipt/small-ticket";
|
|
31
39
|
import { loadSalesOrderSnapshot } from "../../shared/sales/loadSalesOrderSnapshot";
|
|
32
40
|
import { loadPaymentMethods, withPaymentMethodNames } from "../../shared/payment/loadPaymentMethods";
|
|
@@ -53,6 +61,8 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
53
61
|
_defineProperty(_assertThisInitialized(_this), "disposed", false);
|
|
54
62
|
_defineProperty(_assertThisInitialized(_this), "input", void 0);
|
|
55
63
|
_defineProperty(_assertThisInitialized(_this), "activeKey", '');
|
|
64
|
+
// Hosts retain this readonly instance while the same order modal is closed.
|
|
65
|
+
_defineProperty(_assertThisInitialized(_this), "languageSelection", void 0);
|
|
56
66
|
_defineProperty(_assertThisInitialized(_this), "pending", void 0);
|
|
57
67
|
_defineProperty(_assertThisInitialized(_this), "snapshotCache", new Map());
|
|
58
68
|
_defineProperty(_assertThisInitialized(_this), "getState", function () {
|
|
@@ -95,7 +105,7 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
95
105
|
cache = new Map();
|
|
96
106
|
contextCaches.set(this.request, cache);
|
|
97
107
|
}
|
|
98
|
-
var key = JSON.stringify([input.tenantId, input.shopId, input.identity
|
|
108
|
+
var key = JSON.stringify([input.tenantId, input.shopId, input.identity]);
|
|
99
109
|
var cached = cache.get(key);
|
|
100
110
|
if (cached) return cached;
|
|
101
111
|
var task = Promise.all([this.request.get('/shop/show', {}, {
|
|
@@ -154,6 +164,7 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
154
164
|
var _this$core$getPlugin,
|
|
155
165
|
_this$core$getPlugin$,
|
|
156
166
|
_this$core$getPlugin$2,
|
|
167
|
+
_this$languageSelecti,
|
|
157
168
|
_this3 = this;
|
|
158
169
|
if (this.disposed) return Promise.reject(new Error('Invoice preview disposed'));
|
|
159
170
|
var currentShop = (_this$core$getPlugin = this.core.getPlugin('app')) === null || _this$core$getPlugin === void 0 || (_this$core$getPlugin$ = _this$core$getPlugin.getData) === null || _this$core$getPlugin$ === void 0 || (_this$core$getPlugin$2 = _this$core$getPlugin$.call(_this$core$getPlugin)) === null || _this$core$getPlugin$2 === void 0 ? void 0 : _this$core$getPlugin$2('shop_id');
|
|
@@ -166,6 +177,7 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
166
177
|
if (this.state.status === 'ready' && this.state.result) return Promise.resolve(this.state.result);
|
|
167
178
|
}
|
|
168
179
|
if (this.input && this.getScope(this.input) !== this.getScope(input)) this.snapshotCache.clear();
|
|
180
|
+
if (((_this$languageSelecti = this.languageSelection) === null || _this$languageSelecti === void 0 ? void 0 : _this$languageSelecti.scope) !== this.getSelectionScope(input)) this.languageSelection = undefined;
|
|
169
181
|
this.input = input;
|
|
170
182
|
this.activeKey = key;
|
|
171
183
|
var generation = ++this.generation;
|
|
@@ -175,19 +187,19 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
175
187
|
error: null
|
|
176
188
|
});
|
|
177
189
|
var task = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
178
|
-
var _this3$core$getPlugin, _this3$core$getPlugin2, _coreData$core;
|
|
179
|
-
var _yield$Promise$all, _yield$Promise$all2, snapshot, context,
|
|
190
|
+
var _this3$core$getPlugin, _this3$core$getPlugin2, _coreData$core, _this3$languageSelect;
|
|
191
|
+
var _yield$Promise$all, _yield$Promise$all2, snapshot, context, template, source, getData, coreData, shop, languageOptions, remembered, selected, locale, result;
|
|
180
192
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
181
193
|
while (1) switch (_context.prev = _context.next) {
|
|
182
194
|
case 0:
|
|
183
195
|
_context.next = 2;
|
|
184
|
-
return Promise.all([_this3.loadSource(input), _this3.loadContext(input),
|
|
196
|
+
return Promise.all([_this3.loadSource(input), _this3.loadContext(input), loadCustomerInvoiceTemplate(_this3.request, input)]);
|
|
185
197
|
case 2:
|
|
186
198
|
_yield$Promise$all = _context.sent;
|
|
187
199
|
_yield$Promise$all2 = _slicedToArray(_yield$Promise$all, 3);
|
|
188
200
|
snapshot = _yield$Promise$all2[0];
|
|
189
201
|
context = _yield$Promise$all2[1];
|
|
190
|
-
|
|
202
|
+
template = _yield$Promise$all2[2];
|
|
191
203
|
source = withPaymentMethodNames(snapshot, context.methods);
|
|
192
204
|
getData = (_this3$core$getPlugin = _this3.core.getPlugin('app')) === null || _this3$core$getPlugin === void 0 || (_this3$core$getPlugin2 = _this3$core$getPlugin.getData) === null || _this3$core$getPlugin2 === void 0 ? void 0 : _this3$core$getPlugin2.call(_this3$core$getPlugin);
|
|
193
205
|
if (!((getData === null || getData === void 0 ? void 0 : getData('shop_id')) != null && String(getData('shop_id')) !== String(input.shopId))) {
|
|
@@ -206,30 +218,42 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
206
218
|
}
|
|
207
219
|
throw new Error('Invoice request superseded');
|
|
208
220
|
case 15:
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
221
|
+
languageOptions = resolveCustomerInvoiceLanguages(template.language, input.locale);
|
|
222
|
+
remembered = (_this3$languageSelect = _this3.languageSelection) === null || _this3$languageSelect === void 0 ? void 0 : _this3$languageSelect.code;
|
|
223
|
+
selected = languageOptions.find(function (option) {
|
|
224
|
+
return option.code === remembered;
|
|
225
|
+
}) || languageOptions[0];
|
|
226
|
+
locale = selected.locales[0];
|
|
227
|
+
result = _objectSpread(_objectSpread({
|
|
228
|
+
identity: _this3.documentIdentity(key, selected.code),
|
|
229
|
+
languageOptions: languageOptions,
|
|
230
|
+
selectedLanguage: selected.code
|
|
231
|
+
}, selected.locales[1] ? {
|
|
232
|
+
secondaryLocale: selected.locales[1]
|
|
233
|
+
} : {}), {}, {
|
|
213
234
|
orderId: input.orderId,
|
|
214
235
|
sourceRevision: input.sourceRevision,
|
|
215
236
|
generatedAt: new Date().toISOString(),
|
|
216
237
|
locale: locale,
|
|
217
238
|
source: source,
|
|
218
239
|
shop: shop,
|
|
219
|
-
layout: layout,
|
|
240
|
+
layout: template.layout,
|
|
220
241
|
smallTicketData: buildSmallTicketData({
|
|
221
242
|
order: source,
|
|
222
243
|
shopInfo: shop,
|
|
223
|
-
locales:
|
|
244
|
+
locales: _toConsumableArray(new Set(languageOptions.flatMap(function (option) {
|
|
245
|
+
return option.locales;
|
|
246
|
+
}))),
|
|
247
|
+
includeReceiptKeys: true
|
|
224
248
|
})
|
|
225
|
-
};
|
|
249
|
+
});
|
|
226
250
|
_this3.publish({
|
|
227
251
|
status: 'ready',
|
|
228
252
|
result: result,
|
|
229
253
|
error: null
|
|
230
254
|
});
|
|
231
255
|
return _context.abrupt("return", result);
|
|
232
|
-
case
|
|
256
|
+
case 22:
|
|
233
257
|
case "end":
|
|
234
258
|
return _context.stop();
|
|
235
259
|
}
|
|
@@ -249,6 +273,52 @@ export var OrderInvoicePreviewImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
249
273
|
this.pending = task;
|
|
250
274
|
return task;
|
|
251
275
|
}
|
|
276
|
+
}, {
|
|
277
|
+
key: "getSelectionScope",
|
|
278
|
+
value: function getSelectionScope(input) {
|
|
279
|
+
return JSON.stringify([this.getScope(input), input.orderId]);
|
|
280
|
+
}
|
|
281
|
+
}, {
|
|
282
|
+
key: "documentIdentity",
|
|
283
|
+
value: function documentIdentity(key, language) {
|
|
284
|
+
return JSON.stringify([key, language]);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Switch only the ready receipt projection; no fetching or rebuilding data. */
|
|
288
|
+
}, {
|
|
289
|
+
key: "selectLanguage",
|
|
290
|
+
value: function selectLanguage(code) {
|
|
291
|
+
var _this$core$getPlugin2, _this$core$getPlugin3, _this$core$getPlugin4;
|
|
292
|
+
if (this.disposed) throw new Error('Invoice preview disposed');
|
|
293
|
+
var current = this.state.result;
|
|
294
|
+
if (this.state.status !== 'ready' || !current || !this.input) throw new Error('Invoice preview is not ready');
|
|
295
|
+
var currentShop = (_this$core$getPlugin2 = this.core.getPlugin('app')) === null || _this$core$getPlugin2 === void 0 || (_this$core$getPlugin3 = _this$core$getPlugin2.getData) === null || _this$core$getPlugin3 === void 0 || (_this$core$getPlugin4 = _this$core$getPlugin3.call(_this$core$getPlugin2)) === null || _this$core$getPlugin4 === void 0 ? void 0 : _this$core$getPlugin4('shop_id');
|
|
296
|
+
if (currentShop != null && String(currentShop) !== String(this.input.shopId)) throw new Error('Invoice shop changed');
|
|
297
|
+
var selected = current.languageOptions.find(function (option) {
|
|
298
|
+
return option.code === code;
|
|
299
|
+
});
|
|
300
|
+
if (!selected) throw new Error('Invoice language is unavailable');
|
|
301
|
+
this.languageSelection = {
|
|
302
|
+
scope: this.getSelectionScope(this.input),
|
|
303
|
+
code: selected.code
|
|
304
|
+
};
|
|
305
|
+
if (selected.code === current.selectedLanguage) return current;
|
|
306
|
+
var _previousSecondary = current.secondaryLocale,
|
|
307
|
+
rest = _objectWithoutProperties(current, _excluded);
|
|
308
|
+
var result = _objectSpread(_objectSpread({}, rest), {}, {
|
|
309
|
+
identity: this.documentIdentity(this.activeKey, selected.code),
|
|
310
|
+
selectedLanguage: selected.code,
|
|
311
|
+
locale: selected.locales[0]
|
|
312
|
+
}, selected.locales[1] ? {
|
|
313
|
+
secondaryLocale: selected.locales[1]
|
|
314
|
+
} : {});
|
|
315
|
+
this.publish({
|
|
316
|
+
status: 'ready',
|
|
317
|
+
result: result,
|
|
318
|
+
error: null
|
|
319
|
+
});
|
|
320
|
+
return result;
|
|
321
|
+
}
|
|
252
322
|
}, {
|
|
253
323
|
key: "retry",
|
|
254
324
|
value: function retry() {
|
|
@@ -733,6 +733,16 @@ var defaultConfig = {
|
|
|
733
733
|
/**
|
|
734
734
|
* webpos 渠道配置
|
|
735
735
|
*/
|
|
736
|
+
var webposPasswordResetOptions = {
|
|
737
|
+
prefix: false,
|
|
738
|
+
isDefaultSaasDomain: true,
|
|
739
|
+
cache: false,
|
|
740
|
+
noToast: true,
|
|
741
|
+
headers: {
|
|
742
|
+
Accept: 'application/json',
|
|
743
|
+
'Content-Type': 'application/json'
|
|
744
|
+
}
|
|
745
|
+
};
|
|
736
746
|
var webposConfig = {
|
|
737
747
|
sendEmailVerificationCode: {
|
|
738
748
|
url: '/auth/email/register-code',
|
|
@@ -885,15 +895,23 @@ var webposConfig = {
|
|
|
885
895
|
}
|
|
886
896
|
},
|
|
887
897
|
checkEmailCode: {
|
|
888
|
-
url: '/
|
|
889
|
-
method: '
|
|
898
|
+
url: '/tenant/account/reset-password/email-code/verify',
|
|
899
|
+
method: 'POST',
|
|
890
900
|
transformParams: function transformParams(params) {
|
|
891
901
|
return {
|
|
892
902
|
email: params.email,
|
|
893
|
-
code: params.code
|
|
894
|
-
action: params.action
|
|
903
|
+
code: params.code
|
|
895
904
|
};
|
|
896
|
-
}
|
|
905
|
+
},
|
|
906
|
+
// SaaS 成功时 data 为 null,统一为既有验证码校验返回结构。
|
|
907
|
+
transformResponse: function transformResponse(response) {
|
|
908
|
+
return (response === null || response === void 0 ? void 0 : response.status) === true ? _objectSpread(_objectSpread({}, response), {}, {
|
|
909
|
+
data: {
|
|
910
|
+
valid: true
|
|
911
|
+
}
|
|
912
|
+
}) : response;
|
|
913
|
+
},
|
|
914
|
+
options: webposPasswordResetOptions
|
|
897
915
|
},
|
|
898
916
|
checkMobileCode: {
|
|
899
917
|
url: '/auth/mobile/check-mobile-code',
|
|
@@ -919,13 +937,14 @@ var webposConfig = {
|
|
|
919
937
|
}
|
|
920
938
|
},
|
|
921
939
|
sendPasswordResetEmail: {
|
|
922
|
-
url: '/
|
|
923
|
-
method: '
|
|
940
|
+
url: '/tenant/account/reset-password/email-code/send',
|
|
941
|
+
method: 'POST',
|
|
924
942
|
transformParams: function transformParams(params) {
|
|
925
943
|
return {
|
|
926
944
|
email: params.email
|
|
927
945
|
};
|
|
928
|
-
}
|
|
946
|
+
},
|
|
947
|
+
options: webposPasswordResetOptions
|
|
929
948
|
},
|
|
930
949
|
sendPasswordResetSms: {
|
|
931
950
|
url: '/auth/mobile/sms-forget',
|
|
@@ -966,15 +985,18 @@ var webposConfig = {
|
|
|
966
985
|
}
|
|
967
986
|
},
|
|
968
987
|
resetPasswordByEmail: {
|
|
969
|
-
url: '/
|
|
988
|
+
url: '/tenant/account/reset-password/email-code',
|
|
970
989
|
method: 'POST',
|
|
971
990
|
transformParams: function transformParams(params) {
|
|
972
991
|
return {
|
|
973
992
|
email: params.email,
|
|
974
993
|
password: params.password,
|
|
975
|
-
code: params.code
|
|
994
|
+
code: params.code,
|
|
995
|
+
// 页面先校验两次输入完全一致,SDK 保持原有重置参数。
|
|
996
|
+
password_confirmation: params.password
|
|
976
997
|
};
|
|
977
|
-
}
|
|
998
|
+
},
|
|
999
|
+
options: webposPasswordResetOptions
|
|
978
1000
|
},
|
|
979
1001
|
resetPasswordByPhone: {
|
|
980
1002
|
url: '/auth/mobile/reset-password',
|
|
@@ -4,6 +4,8 @@ import { RegisterParams, LoginParams, OAuthLoginParams, SendVerificationCodePara
|
|
|
4
4
|
import { ApiCaller } from './config';
|
|
5
5
|
export * from './types';
|
|
6
6
|
export * from './config';
|
|
7
|
+
export { validatePassword } from './utils';
|
|
8
|
+
export type { PasswordValidationOptions } from './utils';
|
|
7
9
|
/**
|
|
8
10
|
* 注册登录解决方案实现
|
|
9
11
|
*/
|
|
@@ -22,7 +22,7 @@ import { RegisterAndLoginHooks, VerificationCodeType, VerificationPurpose } from
|
|
|
22
22
|
import { createApiCaller } from "./config";
|
|
23
23
|
export * from "./types";
|
|
24
24
|
export * from "./config";
|
|
25
|
-
|
|
25
|
+
export { validatePassword } from "./utils";
|
|
26
26
|
/**
|
|
27
27
|
* 注册登录解决方案实现
|
|
28
28
|
*/
|
|
@@ -10,10 +10,18 @@ export declare function validateEmail(email: string): boolean;
|
|
|
10
10
|
* 验证手机号格式(支持多种国际格式)
|
|
11
11
|
*/
|
|
12
12
|
export declare function validatePhone(phone: string): boolean;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
export interface PasswordValidationOptions {
|
|
14
|
+
minLength?: number;
|
|
15
|
+
maxLength?: number;
|
|
16
|
+
requireLowercase?: boolean;
|
|
17
|
+
requireUppercase?: boolean;
|
|
18
|
+
requireNumber?: boolean;
|
|
19
|
+
requireSpecialCharacters?: boolean;
|
|
20
|
+
specialCharactersPattern?: RegExp;
|
|
21
|
+
messages?: Partial<Record<'minLength' | 'maxLength' | 'requireLowercase' | 'requireUppercase' | 'requireNumber' | 'requireSpecialCharacters', string>>;
|
|
22
|
+
}
|
|
23
|
+
/** 验证密码强度;不传 options 时保持原有规则与返回格式。 */
|
|
24
|
+
export declare function validatePassword(password: string, options?: PasswordValidationOptions): {
|
|
17
25
|
isValid: boolean;
|
|
18
26
|
errors: string[];
|
|
19
27
|
};
|
|
@@ -33,29 +33,49 @@ export function validatePhone(phone) {
|
|
|
33
33
|
var phoneRegex = /^(\+\d{1,3}[- ]?)?\d{10,14}$/;
|
|
34
34
|
return phoneRegex.test(cleanPhone);
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* 验证密码强度
|
|
39
|
-
*/
|
|
36
|
+
/** 验证密码强度;不传 options 时保持原有规则与返回格式。 */
|
|
40
37
|
export function validatePassword(password) {
|
|
38
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
41
39
|
var errors = [];
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
var _options$minLength = options.minLength,
|
|
41
|
+
minLength = _options$minLength === void 0 ? 8 : _options$minLength,
|
|
42
|
+
_options$maxLength = options.maxLength,
|
|
43
|
+
maxLength = _options$maxLength === void 0 ? 128 : _options$maxLength,
|
|
44
|
+
_options$requireLower = options.requireLowercase,
|
|
45
|
+
requireLowercase = _options$requireLower === void 0 ? true : _options$requireLower,
|
|
46
|
+
_options$requireUpper = options.requireUppercase,
|
|
47
|
+
requireUppercase = _options$requireUpper === void 0 ? true : _options$requireUpper,
|
|
48
|
+
_options$requireNumbe = options.requireNumber,
|
|
49
|
+
requireNumber = _options$requireNumbe === void 0 ? true : _options$requireNumbe,
|
|
50
|
+
_options$requireSpeci = options.requireSpecialCharacters,
|
|
51
|
+
requireSpecialCharacters = _options$requireSpeci === void 0 ? true : _options$requireSpeci,
|
|
52
|
+
_options$specialChara = options.specialCharactersPattern,
|
|
53
|
+
specialCharactersPattern = _options$specialChara === void 0 ? /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/ : _options$specialChara,
|
|
54
|
+
_options$messages = options.messages,
|
|
55
|
+
messages = _options$messages === void 0 ? {} : _options$messages;
|
|
56
|
+
if (password.length < minLength) {
|
|
57
|
+
var _messages$minLength;
|
|
58
|
+
errors.push((_messages$minLength = messages.minLength) !== null && _messages$minLength !== void 0 ? _messages$minLength : "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A".concat(minLength, "\u4F4D"));
|
|
44
59
|
}
|
|
45
|
-
if (password.length >
|
|
46
|
-
|
|
60
|
+
if (password.length > maxLength) {
|
|
61
|
+
var _messages$maxLength;
|
|
62
|
+
errors.push((_messages$maxLength = messages.maxLength) !== null && _messages$maxLength !== void 0 ? _messages$maxLength : "\u5BC6\u7801\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7".concat(maxLength, "\u4F4D"));
|
|
47
63
|
}
|
|
48
|
-
if (!/[a-z]/.test(password)) {
|
|
49
|
-
|
|
64
|
+
if (requireLowercase && !/[a-z]/.test(password)) {
|
|
65
|
+
var _messages$requireLowe;
|
|
66
|
+
errors.push((_messages$requireLowe = messages.requireLowercase) !== null && _messages$requireLowe !== void 0 ? _messages$requireLowe : '密码必须包含至少一个小写字母');
|
|
50
67
|
}
|
|
51
|
-
if (!/[A-Z]/.test(password)) {
|
|
52
|
-
|
|
68
|
+
if (requireUppercase && !/[A-Z]/.test(password)) {
|
|
69
|
+
var _messages$requireUppe;
|
|
70
|
+
errors.push((_messages$requireUppe = messages.requireUppercase) !== null && _messages$requireUppe !== void 0 ? _messages$requireUppe : '密码必须包含至少一个大写字母');
|
|
53
71
|
}
|
|
54
|
-
if (!/\d/.test(password)) {
|
|
55
|
-
|
|
72
|
+
if (requireNumber && !/\d/.test(password)) {
|
|
73
|
+
var _messages$requireNumb;
|
|
74
|
+
errors.push((_messages$requireNumb = messages.requireNumber) !== null && _messages$requireNumb !== void 0 ? _messages$requireNumb : '密码必须包含至少一个数字');
|
|
56
75
|
}
|
|
57
|
-
if (
|
|
58
|
-
|
|
76
|
+
if (requireSpecialCharacters && !specialCharactersPattern.test(password)) {
|
|
77
|
+
var _messages$requireSpec;
|
|
78
|
+
errors.push((_messages$requireSpec = messages.requireSpecialCharacters) !== null && _messages$requireSpec !== void 0 ? _messages$requireSpec : '密码必须包含至少一个特殊字符');
|
|
59
79
|
}
|
|
60
80
|
return {
|
|
61
81
|
isValid: errors.length === 0,
|
|
@@ -105,6 +105,8 @@ export declare class SalesImpl extends BaseModule implements Module, SalesModule
|
|
|
105
105
|
private groupBookingsByResource;
|
|
106
106
|
private isBookingMatchedResource;
|
|
107
107
|
private sortMatchedBookings;
|
|
108
|
+
/** 已完成:按订单创建时间降序,避免实时追加和重新加载导致显示顺序不同。 */
|
|
109
|
+
private sortCompletedBookings;
|
|
108
110
|
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
109
111
|
private sortUnpaidBookings;
|
|
110
112
|
/**
|
|
@@ -760,6 +760,20 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
760
760
|
});
|
|
761
761
|
}
|
|
762
762
|
|
|
763
|
+
/** 已完成:按订单创建时间降序,避免实时追加和重新加载导致显示顺序不同。 */
|
|
764
|
+
}, {
|
|
765
|
+
key: "sortCompletedBookings",
|
|
766
|
+
value: function sortCompletedBookings(bookings) {
|
|
767
|
+
var createdAt = function createdAt(booking) {
|
|
768
|
+
var _booking$order3;
|
|
769
|
+
var timestamp = dayjs(((_booking$order3 = booking.order) === null || _booking$order3 === void 0 ? void 0 : _booking$order3.created_at) || '').valueOf();
|
|
770
|
+
return Number.isFinite(timestamp) ? timestamp : 0;
|
|
771
|
+
};
|
|
772
|
+
return _toConsumableArray(bookings).sort(function (left, right) {
|
|
773
|
+
return createdAt(right) - createdAt(left);
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
|
|
763
777
|
/** Unpaid:与 Current 重合的订单沿用 Current 顺序,其余欠款订单按开始时间降序追加。 */
|
|
764
778
|
}, {
|
|
765
779
|
key: "sortUnpaidBookings",
|
|
@@ -1260,7 +1274,7 @@ export var SalesImpl = /*#__PURE__*/function (_BaseModule) {
|
|
|
1260
1274
|
bookings = this.pickBookingsForCurrentPoint(current, this.normalizeResourceBookings(current, deviceCurrent, matchedBookingList), {
|
|
1261
1275
|
includeAllFuture: true
|
|
1262
1276
|
});
|
|
1263
|
-
completedBookings = completedBookingList.map(function (booking) {
|
|
1277
|
+
completedBookings = this.sortCompletedBookings(completedBookingList).map(function (booking) {
|
|
1264
1278
|
return _objectSpread(_objectSpread({}, booking), {}, {
|
|
1265
1279
|
status: 'compelete',
|
|
1266
1280
|
isTimeout: false,
|
|
@@ -304,10 +304,9 @@ function assertAvailabilityCatalogProductIds(productIds, context) {
|
|
|
304
304
|
});
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
|
-
function normalizeResourceType(
|
|
308
|
-
//
|
|
309
|
-
|
|
310
|
-
return 'single';
|
|
307
|
+
function normalizeResourceType(value) {
|
|
308
|
+
// 预约是否独占与每组选择几个资源是两个独立配置。
|
|
309
|
+
return value === 'multiple' || value === 'capacity' ? value : 'single';
|
|
311
310
|
}
|
|
312
311
|
function resolveProductKind(product) {
|
|
313
312
|
var _product$cartDetailVa, _product$_extend;
|
|
@@ -1540,7 +1540,7 @@ function buildSubmitPayload(params) {
|
|
|
1540
1540
|
shop_discount: tempOrder.shop_discount || '0.00',
|
|
1541
1541
|
surcharge_fee: tempOrder.surcharge_fee || '0.00',
|
|
1542
1542
|
note: tempOrder.note || '',
|
|
1543
|
-
delivery_type: tempOrder.delivery_type || '
|
|
1543
|
+
delivery_type: tempOrder.delivery_type || 'shop_service',
|
|
1544
1544
|
schedule_date: scheduleDate,
|
|
1545
1545
|
// created_at: tempOrder.created_at || formatDateTime(now), 和后端协定这个字段先不提交到接口
|
|
1546
1546
|
bookings: (tempOrder.bookings || []).filter(booking => (0, _pickupTiming.isFulfillmentTimingBooking)(booking) || Number(booking.parent_id) !== 0).map(booking => normalizeSubmitBooking(booking)),
|
|
@@ -412,7 +412,7 @@ function normalizeOccupancy(occupancy, coverage, timezoneName, fixedOffsetMinute
|
|
|
412
412
|
};
|
|
413
413
|
}
|
|
414
414
|
function normalizeRequirementGroup(product, requirementGroup) {
|
|
415
|
-
const resourceType = 'single';
|
|
415
|
+
const resourceType = requirementGroup.resourceType === 'multiple' || requirementGroup.resourceType === 'capacity' ? requirementGroup.resourceType : 'single';
|
|
416
416
|
const required = requirementGroup.required !== false;
|
|
417
417
|
const min = required ? 1 : 0;
|
|
418
418
|
return {
|
|
@@ -457,7 +457,7 @@ function normalizeProducts(products) {
|
|
|
457
457
|
function normalizeResources(resources) {
|
|
458
458
|
return resources.map(resource => ({
|
|
459
459
|
...resource,
|
|
460
|
-
resourceType: 'single',
|
|
460
|
+
resourceType: resource.resourceType === 'multiple' || resource.resourceType === 'capacity' ? resource.resourceType : 'single',
|
|
461
461
|
capacity: Math.max(1, Number(resource.capacity || 1) || 1),
|
|
462
462
|
windows: (resource.windows || []).map(window => ({
|
|
463
463
|
...window
|
|
@@ -573,7 +573,8 @@ function buildCells(projection) {
|
|
|
573
573
|
occupancy
|
|
574
574
|
}) => occupancy) : [];
|
|
575
575
|
const usedCapacity = segmentOccupancies.reduce((sum, occupancy) => sum + Math.max(1, Number(occupancy.pax || 1) || 1), 0);
|
|
576
|
-
|
|
576
|
+
// 预约模式来自商品资源组;v2 资源记录可能不包含 type。
|
|
577
|
+
const remainingCapacity = requirementGroup.resourceType === 'single' && segmentOccupancies.length > 0 ? 0 : Math.max(0, resource.capacity - usedCapacity);
|
|
577
578
|
const requiredCapacity = resolveRequiredCapacity(requirementGroup, product);
|
|
578
579
|
const reasonCodes = Array.from(new Set(segmentOccupancies.flatMap(occupancy => {
|
|
579
580
|
const source = occupancy.source || 'remote';
|
|
@@ -607,7 +608,7 @@ function buildCells(projection) {
|
|
|
607
608
|
requirementFormId: requirementGroup.formId,
|
|
608
609
|
resourceId: resource.id,
|
|
609
610
|
resourceName: resource.name,
|
|
610
|
-
resourceType:
|
|
611
|
+
resourceType: requirementGroup.resourceType,
|
|
611
612
|
startAt: formatDateTime(start, timezoneName, fixedOffsetMinutes),
|
|
612
613
|
endAt: formatDateTime(end, timezoneName, fixedOffsetMinutes),
|
|
613
614
|
date: formatDate(start, timezoneName),
|
|
@@ -615,7 +616,7 @@ function buildCells(projection) {
|
|
|
615
616
|
endTime: formatTime(end, timezoneName),
|
|
616
617
|
timezone: projection.meta.timezone,
|
|
617
618
|
status,
|
|
618
|
-
//
|
|
619
|
+
// capacity 表示人数;single 被占用时不再贡献可用容量。
|
|
619
620
|
remainingCapacity,
|
|
620
621
|
maxCapacity: resource.capacity,
|
|
621
622
|
reasonCodes: Array.from(new Set(reasonCodes)),
|
|
@@ -1500,7 +1501,7 @@ function evaluateCandidate(projection, candidate, request) {
|
|
|
1500
1501
|
resourceName: resource.name,
|
|
1501
1502
|
resourceFormId: resource.formId,
|
|
1502
1503
|
policyId: resource.raw?.policy_id,
|
|
1503
|
-
resourceType:
|
|
1504
|
+
resourceType: requirementGroup.resourceType,
|
|
1504
1505
|
status: isPast ? 'past' : 'unavailable',
|
|
1505
1506
|
maxPartySize: 0,
|
|
1506
1507
|
reasonCodes: isPast ? ['past'] : [...(isExcludedScheduleDate ? ['schedule_excluded_date'] : []), 'outside_resource_window']
|
|
@@ -1524,7 +1525,7 @@ function evaluateCandidate(projection, candidate, request) {
|
|
|
1524
1525
|
resourceName: resource.name,
|
|
1525
1526
|
resourceFormId: resource.formId,
|
|
1526
1527
|
policyId: resource.raw?.policy_id,
|
|
1527
|
-
resourceType:
|
|
1528
|
+
resourceType: requirementGroup.resourceType,
|
|
1528
1529
|
status,
|
|
1529
1530
|
remainingCapacity,
|
|
1530
1531
|
maxCapacity,
|
|
@@ -2008,7 +2009,8 @@ function validateAvailabilitySelection(projection, params, runtimeOptions = {})
|
|
|
2008
2009
|
const remainingCapacity = matchedCell?.remainingCapacity;
|
|
2009
2010
|
if (option && (option.status === 'available' || option.status === 'limited') && remainingCapacity !== undefined) {
|
|
2010
2011
|
const capacityPerBooking = normalizedPartySize ?? 1;
|
|
2011
|
-
const
|
|
2012
|
+
const capacityQuantity = Math.max(0, Math.floor(remainingCapacity / capacityPerBooking));
|
|
2013
|
+
const availableQuantity = matchedGroup.resourceType === 'single' ? Math.min(1, capacityQuantity) : capacityQuantity;
|
|
2012
2014
|
if (normalizedBookingCount > availableQuantity) {
|
|
2013
2015
|
conflicts.push({
|
|
2014
2016
|
code: 'resource_capacity_exceeded',
|
package/lib/server/test.json
CHANGED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type CustomerInvoiceLanguageCode = 'en' | 'zh_CN' | 'zh_HK' | 'ja' | 'pt' | 'cn_en';
|
|
2
|
+
export interface CustomerInvoiceLanguageOption {
|
|
3
|
+
code: CustomerInvoiceLanguageCode;
|
|
4
|
+
locales: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function normalizeCustomerInvoiceLanguage(value: string): CustomerInvoiceLanguageCode | undefined;
|
|
7
|
+
/** Preserve configured insertion order; a print count never repeats an option. */
|
|
8
|
+
export declare function resolveCustomerInvoiceLanguages(language: Record<string, unknown>, pageLocale: string): CustomerInvoiceLanguageOption[];
|