@pisell/pisellos 2.3.138 → 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.
@@ -326,7 +326,7 @@ export declare class BookingByStepImpl extends BaseModule implements Module {
326
326
  date: string;
327
327
  status: string;
328
328
  week: string;
329
- weekNum: 0 | 2 | 1 | 3 | 4 | 5 | 6;
329
+ weekNum: 0 | 2 | 1 | 6 | 4 | 5 | 3;
330
330
  }[]>;
331
331
  submitTimeSlot(timeSlots: TimeSliceItem): void;
332
332
  private getScheduleDataByIds;
@@ -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 { loadCustomerInvoiceLayout } from "../../shared/receipt/loadCustomerInvoiceLayout";
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, input.locale]);
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, layout, source, getData, coreData, shop, requestedLocale, locale, result;
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), loadCustomerInvoiceLayout(_this3.request, 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
- layout = _yield$Promise$all2[2];
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
- requestedLocale = input.locale.toLowerCase().replace(/_/g, '-');
210
- locale = requestedLocale.startsWith('zh-tw') || requestedLocale.startsWith('zh-hk') ? 'zh_HK' : requestedLocale.startsWith('zh') ? 'zh_CN' : requestedLocale.startsWith('ja') ? 'ja' : requestedLocale.startsWith('pt') ? 'pt' : 'en';
211
- result = {
212
- identity: key,
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: [locale]
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 20:
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() {
@@ -1,46 +1 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- Object.defineProperty(exports, "BUY_X_GET_Y_FREE_STRATEGY", {
7
- enumerable: true,
8
- get: function () {
9
- return _examples.BUY_X_GET_Y_FREE_STRATEGY;
10
- }
11
- });
12
- Object.defineProperty(exports, "ITEM_REWARD_STRATEGY", {
13
- enumerable: true,
14
- get: function () {
15
- return _examples.ITEM_REWARD_STRATEGY;
16
- }
17
- });
18
- Object.defineProperty(exports, "PromotionAdapter", {
19
- enumerable: true,
20
- get: function () {
21
- return _adapter.PromotionAdapter;
22
- }
23
- });
24
- Object.defineProperty(exports, "PromotionEvaluator", {
25
- enumerable: true,
26
- get: function () {
27
- return _evaluator.PromotionEvaluator;
28
- }
29
- });
30
- Object.defineProperty(exports, "X_ITEMS_FOR_Y_PRICE_STRATEGY", {
31
- enumerable: true,
32
- get: function () {
33
- return _examples.X_ITEMS_FOR_Y_PRICE_STRATEGY;
34
- }
35
- });
36
- Object.defineProperty(exports, "default", {
37
- enumerable: true,
38
- get: function () {
39
- return _adapter.default;
40
- }
41
- });
42
- var _evaluator = require("./evaluator");
43
- var _adapter = _interopRequireWildcard(require("./adapter"));
44
- var _examples = require("./examples");
45
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
46
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
1
+ "use strict";
@@ -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 || 'nil',
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)),
@@ -132,7 +132,7 @@
132
132
  "contacts_info": null,
133
133
  "holder": null,
134
134
  "metadata": {},
135
- "delivery_type": "nil",
135
+ "delivery_type": "shop_service",
136
136
  "small_ticket_data_flag": 1,
137
137
  "need_sync": 1,
138
138
  "payment_info": {
@@ -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[];
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.normalizeCustomerInvoiceLanguage = normalizeCustomerInvoiceLanguage;
7
+ exports.resolveCustomerInvoiceLanguages = resolveCustomerInvoiceLanguages;
8
+ const aliases = {
9
+ en: 'en',
10
+ en_us: 'en',
11
+ en_gb: 'en',
12
+ en_au: 'en',
13
+ cn: 'zh_CN',
14
+ zh: 'zh_CN',
15
+ zh_cn: 'zh_CN',
16
+ zh_hans: 'zh_CN',
17
+ zh_sg: 'zh_CN',
18
+ hk: 'zh_HK',
19
+ zh_hk: 'zh_HK',
20
+ zh_tw: 'zh_HK',
21
+ zh_hant: 'zh_HK',
22
+ ja: 'ja',
23
+ ja_jp: 'ja',
24
+ jp: 'ja',
25
+ pt: 'pt',
26
+ pt_br: 'pt',
27
+ pt_pt: 'pt',
28
+ cn_en: 'cn_en',
29
+ en_cn: 'cn_en'
30
+ };
31
+ function normalizeCustomerInvoiceLanguage(value) {
32
+ return aliases[value.trim().toLowerCase().replace(/-/g, '_')];
33
+ }
34
+ function option(code) {
35
+ return {
36
+ code,
37
+ locales: code === 'cn_en' ? ['en', 'zh_CN'] : [code]
38
+ };
39
+ }
40
+
41
+ /** Preserve configured insertion order; a print count never repeats an option. */
42
+ function resolveCustomerInvoiceLanguages(language, pageLocale) {
43
+ const options = [];
44
+ const seen = new Set();
45
+ Object.entries(language).forEach(([key, count]) => {
46
+ if (typeof count !== 'number' || !Number.isFinite(count) || count <= 0) return;
47
+ const code = normalizeCustomerInvoiceLanguage(key);
48
+ if (!code || seen.has(code)) return;
49
+ seen.add(code);
50
+ options.push(option(code));
51
+ });
52
+ if (options.length) return options;
53
+ const normalized = normalizeCustomerInvoiceLanguage(pageLocale);
54
+ // A page locale is a single language, never a bilingual printer mode.
55
+ const requested = pageLocale.toLowerCase().replace(/_/g, '-');
56
+ const fallback = normalized && normalized !== 'cn_en' ? normalized : requested.startsWith('zh-tw') || requested.startsWith('zh-hk') ? 'zh_HK' : requested.startsWith('zh') ? 'zh_CN' : requested.startsWith('ja') ? 'ja' : requested.startsWith('pt') ? 'pt' : 'en';
57
+ return [option(fallback)];
58
+ }
@@ -11,6 +11,10 @@ export interface PublicInvoiceDocumentResponse {
11
11
  } | null;
12
12
  } | null;
13
13
  }
14
+ export interface CustomerInvoiceTemplate {
15
+ layout: InvoiceLayoutConfig;
16
+ language: Record<string, unknown>;
17
+ }
14
18
  interface TemplateScope {
15
19
  tenantId: string | number;
16
20
  shopId: string | number;
@@ -18,5 +22,6 @@ interface TemplateScope {
18
22
  businessCode: string;
19
23
  channel: string;
20
24
  }
25
+ export declare function loadCustomerInvoiceTemplate(request: RequestPlugin, scope: TemplateScope): Promise<CustomerInvoiceTemplate>;
21
26
  export declare function loadCustomerInvoiceLayout(request: RequestPlugin, scope: TemplateScope): Promise<InvoiceLayoutConfig>;
22
27
  export {};
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.loadCustomerInvoiceLayout = loadCustomerInvoiceLayout;
7
+ exports.loadCustomerInvoiceTemplate = loadCustomerInvoiceTemplate;
7
8
  var _OpenData = require("../../modules/OpenData");
8
9
  // Page-runtime caches: also retain DEFAULT on failure, without automatic retries.
9
10
  const caches = new WeakMap();
@@ -15,7 +16,7 @@ function documentId(value) {
15
16
  const id = Number(text);
16
17
  return Number.isSafeInteger(id) && id > 0 ? String(id) : null;
17
18
  }
18
- function loadCustomerInvoiceLayout(request, scope) {
19
+ function loadCustomerInvoiceTemplate(request, scope) {
19
20
  let cache = caches.get(request);
20
21
  if (!cache) {
21
22
  cache = {
@@ -51,7 +52,10 @@ function loadCustomerInvoiceLayout(request, scope) {
51
52
  if (!id) {
52
53
  // Preserve the existing non-numeric legacy template / invoice_edit contract.
53
54
  const numericLike = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;
54
- return typeof raw === 'string' && raw.trim() && !numericLike.test(raw.trim()) ? (0, _OpenData.normalizeInvoiceLayoutFromTemplateSettings)((0, _OpenData.normalizeInvoiceTemplateSettings)(config)) : (0, _OpenData.getDefaultInvoiceLayoutConfig)();
55
+ return typeof raw === 'string' && raw.trim() && !numericLike.test(raw.trim()) ? {
56
+ layout: (0, _OpenData.normalizeInvoiceLayoutFromTemplateSettings)((0, _OpenData.normalizeInvoiceTemplateSettings)(config)),
57
+ language: readLanguage(config['documents.invoice_edit'])
58
+ } : defaultTemplate();
55
59
  }
56
60
  const docKey = JSON.stringify([key, id]);
57
61
  let pending = cache.documents.get(docKey);
@@ -67,7 +71,10 @@ function loadCustomerInvoiceLayout(request, scope) {
67
71
  if (!isRecord(doc.data) || !isRecord(doc.data.template_settings)) throw new Error('Invoice Document has no template_settings');
68
72
  const settings = (0, _OpenData.normalizeRawInvoiceTemplateSettings)(doc.data.template_settings);
69
73
  if (settings.modules.length === 0) throw new Error('Invoice Document has no usable template modules');
70
- return (0, _OpenData.normalizeInvoiceLayoutFromTemplateSettings)(settings);
74
+ return {
75
+ layout: (0, _OpenData.normalizeInvoiceLayoutFromTemplateSettings)(settings),
76
+ language: readLanguage(doc.data.template_settings)
77
+ };
71
78
  })().catch(error => fallback(error, target, expectedId));
72
79
  cache.documents.set(docKey, pending);
73
80
  }
@@ -82,5 +89,36 @@ function fallback(error, target, id) {
82
89
  documentId: id,
83
90
  message: error instanceof Error ? error.message : 'Template request failed'
84
91
  });
85
- return (0, _OpenData.getDefaultInvoiceLayoutConfig)();
92
+ return defaultTemplate();
93
+ }
94
+
95
+ // Keep the existing layout-only API and its in-flight promise identity intact.
96
+ const layoutPromises = new WeakMap();
97
+ function loadCustomerInvoiceLayout(request, scope) {
98
+ const template = loadCustomerInvoiceTemplate(request, scope);
99
+ let layout = layoutPromises.get(template);
100
+ if (!layout) {
101
+ layout = template.then(value => value.layout);
102
+ layoutPromises.set(template, layout);
103
+ }
104
+ return layout;
105
+ }
106
+ function defaultTemplate() {
107
+ return {
108
+ layout: (0, _OpenData.getDefaultInvoiceLayoutConfig)(),
109
+ language: {}
110
+ };
111
+ }
112
+ function readLanguage(value) {
113
+ let settings = value;
114
+ if (typeof settings === 'string') {
115
+ try {
116
+ settings = JSON.parse(settings);
117
+ } catch {
118
+ return {};
119
+ }
120
+ }
121
+ return isRecord(settings) && isRecord(settings.language) ? {
122
+ ...settings.language
123
+ } : {};
86
124
  }
@@ -22,8 +22,13 @@ export interface BuildSmallTicketDataParams {
22
22
  shopInfo?: SmallTicketShopInfo | null;
23
23
  locales?: string[];
24
24
  productMap?: Record<string | number, Record<string, any>>;
25
+ /** Customer preview only: stable source identities for bilingual rows. */
26
+ includeReceiptKeys?: boolean;
25
27
  }
26
28
  export interface SmallTicketItem {
29
+ receipt_key?: string;
30
+ receipt_value_kind?: 'shared' | 'text';
31
+ receipt_item_kind?: 'shared';
27
32
  item: string;
28
33
  value: string;
29
34
  size?: number;
@@ -32,6 +37,8 @@ export interface SmallTicketItem {
32
37
  booking_uid?: string | number;
33
38
  }
34
39
  export interface SmallTicketProduct {
40
+ receipt_key?: string;
41
+ receipt_source_index?: number;
35
42
  product_title: string;
36
43
  product_quantity: number;
37
44
  selling_price: string;
@@ -47,6 +54,8 @@ export interface SmallTicketProduct {
47
54
  product_note?: string;
48
55
  allergy?: string;
49
56
  options?: Array<{
57
+ receipt_key?: string;
58
+ receipt_source_index?: number;
50
59
  name: string;
51
60
  num?: number;
52
61
  price?: string;