@pisell/pisellos 2.3.138 → 2.3.140
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 +0 -9
- package/dist/modules/Order/utils.js +1 -1
- package/dist/server/modules/floor-plan/index.js +34 -3
- 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/lib/model/strategy/adapter/promotion/index.js +1 -46
- package/lib/modules/Order/utils.js +1 -1
- package/lib/server/modules/floor-plan/index.js +29 -1
- 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/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() {
|
|
@@ -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 || '
|
|
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)),
|
|
@@ -9,6 +9,30 @@ var _types = require("./types");
|
|
|
9
9
|
const FLOOR_PLAN_SYNC_DEBOUNCE_MS = 3000;
|
|
10
10
|
const FLOOR_PLAN_STORE_NAME = 'floor_plans';
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Request failures can be plain response objects (rather than Error instances).
|
|
14
|
+
* Keep diagnostics useful without allowing the UI bridge to stringify them as
|
|
15
|
+
* "[object Object]".
|
|
16
|
+
*/
|
|
17
|
+
function getRequestErrorInfo(error) {
|
|
18
|
+
if (error instanceof Error && error.message) return {
|
|
19
|
+
message: error.message
|
|
20
|
+
};
|
|
21
|
+
if (typeof error === 'string' && error) return {
|
|
22
|
+
message: error
|
|
23
|
+
};
|
|
24
|
+
const value = error;
|
|
25
|
+
const response = value?.resData?.res ?? value?.response?.data ?? value?.data ?? value;
|
|
26
|
+
const candidates = [value?.message, value?.error, response?.message, response?.error];
|
|
27
|
+
const message = candidates.find(candidate => typeof candidate === 'string' && candidate.trim() !== '');
|
|
28
|
+
return {
|
|
29
|
+
message: message || '平面图加载失败(未提供错误详情)',
|
|
30
|
+
code: response?.code ?? value?.code,
|
|
31
|
+
status: response?.status ?? value?.status,
|
|
32
|
+
httpStatus: value?.response?.status
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
12
36
|
/**
|
|
13
37
|
* 平面图模块:预加载列表、pubsub 同步、供 OS Server 路由读本地 store
|
|
14
38
|
*/
|
|
@@ -144,8 +168,12 @@ class FloorPlanModule extends _BaseModule.BaseModule {
|
|
|
144
168
|
const list = Array.isArray(raw) ? raw : [];
|
|
145
169
|
return list;
|
|
146
170
|
} catch (e) {
|
|
171
|
+
const errorInfo = getRequestErrorInfo(e);
|
|
147
172
|
this.logWarning('loadListFromServer 失败', {
|
|
148
|
-
error:
|
|
173
|
+
error: errorInfo.message,
|
|
174
|
+
code: errorInfo.code,
|
|
175
|
+
status: errorInfo.status,
|
|
176
|
+
httpStatus: errorInfo.httpStatus
|
|
149
177
|
});
|
|
150
178
|
return [];
|
|
151
179
|
}
|
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[];
|
|
@@ -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
|
|
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()) ?
|
|
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
|
|
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 (
|
|
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;
|