@pisell/private-materials 6.12.286 → 6.12.288

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +14 -14
  6. package/build/lowcode/view.js +14 -14
  7. package/es/components/HDLKiosk/ui/entry/Screen/assets/PHOSPHOR-LICENSE +21 -21
  8. package/es/plus/invoice/ReceiptRenderer.js +86 -42
  9. package/es/plus/invoice/VirtualCurrencyLines.js +21 -8
  10. package/es/plus/invoice/VirtualCurrencyReceiptRenderer.js +21 -10
  11. package/es/plus/invoice/invoiceVisibility.js +94 -0
  12. package/es/plus/invoice/receipt.js +4 -3
  13. package/es/plus/piPaymentUI/eftpos/logger.js +10 -7
  14. package/es/plus/piPaymentUI/sendWarningLog.js +33 -22
  15. package/es/plus/saasDevice/devicePasscodes/model.js +4 -4
  16. package/es/plus/saleDetail/actions/index.js +11 -4
  17. package/es/plus/saleDetail/serve.js +7 -8
  18. package/es/plus/saleDetail/tmpl/B/components/Invoice/VirtualCurrencyInvoice.js +1 -1
  19. package/es/plus/saleDetail/tmpl/B/components/Invoice/index.js +29 -5
  20. package/es/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.js +85 -43
  21. package/es/plus/salesSdk/context/SalesSdkCartContext.js +5 -1
  22. package/es/plus/salesSdk/context/SalesSdkProvider.js +3 -0
  23. package/es/plus/salesSdk/utils/receiptPrintWarning.js +16 -0
  24. package/es/plus/walletPassGallery/components/timelineSection/index.js +4 -4
  25. package/lib/components/HDLKiosk/ui/entry/Screen/assets/PHOSPHOR-LICENSE +21 -21
  26. package/lib/plus/invoice/ReceiptRenderer.js +86 -42
  27. package/lib/plus/invoice/VirtualCurrencyLines.js +21 -8
  28. package/lib/plus/invoice/VirtualCurrencyReceiptRenderer.js +21 -10
  29. package/lib/plus/invoice/invoiceVisibility.js +99 -0
  30. package/lib/plus/invoice/receipt.js +4 -3
  31. package/lib/plus/piPaymentUI/eftpos/logger.js +10 -7
  32. package/lib/plus/piPaymentUI/sendWarningLog.js +32 -20
  33. package/lib/plus/saleDetail/actions/index.js +11 -4
  34. package/lib/plus/saleDetail/serve.js +7 -8
  35. package/lib/plus/saleDetail/tmpl/B/components/Invoice/VirtualCurrencyInvoice.js +1 -1
  36. package/lib/plus/saleDetail/tmpl/B/components/Invoice/index.js +29 -5
  37. package/lib/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.js +85 -43
  38. package/lib/plus/salesSdk/context/SalesSdkCartContext.js +5 -1
  39. package/lib/plus/salesSdk/context/SalesSdkProvider.js +3 -0
  40. package/lib/plus/salesSdk/utils/receiptPrintWarning.js +16 -0
  41. package/package.json +3 -3
@@ -1,4 +1,6 @@
1
+ require("../../_virtual/_rolldown/runtime.js");
1
2
  const require_asyncToGenerator = require("../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js");
3
+ let _pisell_utils = require("@pisell/utils");
2
4
  //#region src/plus/piPaymentUI/sendWarningLog.ts
3
5
  /** 支付专用机器人完整 webhook URL(包含独立 key);留空时不上报。 */
4
6
  const piPaymentWebhook = {
@@ -8,26 +10,36 @@ const piPaymentWebhook = {
8
10
  /** PiPaymentUI 自己的飞书上报入口,不使用公共告警机器人。 */
9
11
  const sendWarningLog = function() {
10
12
  var _ref = require_asyncToGenerator._asyncToGenerator(function* ({ title, content }) {
11
- var _process;
12
- const apiUrl = ((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.NODE_ENV) === "development" ? piPaymentWebhook.test : piPaymentWebhook.prod;
13
- if (!apiUrl) return;
14
- return (yield fetch(apiUrl, {
15
- method: "POST",
16
- headers: { "Content-Type": "application/json" },
17
- body: JSON.stringify({
18
- msg_type: "post",
19
- content: { post: { zh_cn: {
20
- title,
21
- content: content.map(({ key, value }) => [{
22
- tag: "text",
23
- text: `${key}: `
24
- }, {
25
- tag: "text",
26
- text: value
27
- }])
28
- } } }
29
- })
30
- })).json();
13
+ let env;
14
+ try {
15
+ var _appHelper, _getPisellUtilsConfig;
16
+ const hostEnv = typeof window === "undefined" ? void 0 : (_appHelper = window.__appHelper) === null || _appHelper === void 0 || (_appHelper = _appHelper.constants) === null || _appHelper === void 0 ? void 0 : _appHelper.env;
17
+ env = hostEnv !== null && hostEnv !== void 0 ? hostEnv : (_getPisellUtilsConfig = (0, _pisell_utils.getPisellUtilsConfig)()) === null || _getPisellUtilsConfig === void 0 ? void 0 : _getPisellUtilsConfig.env;
18
+ const apiUrl = env === "dev" || env === "pre" || env === "release" ? piPaymentWebhook.test : piPaymentWebhook.prod;
19
+ return yield (yield fetch(apiUrl, {
20
+ method: "POST",
21
+ headers: { "Content-Type": "application/json" },
22
+ body: JSON.stringify({
23
+ msg_type: "post",
24
+ content: { post: { zh_cn: {
25
+ title,
26
+ content: content.map(({ key, value }) => [{
27
+ tag: "text",
28
+ text: `${key}: `
29
+ }, {
30
+ tag: "text",
31
+ text: `${value}`
32
+ }])
33
+ } } }
34
+ })
35
+ })).json();
36
+ } catch (error) {
37
+ console.warn("[PiPayment] 飞书上报失败", {
38
+ env,
39
+ error
40
+ });
41
+ return;
42
+ }
31
43
  });
32
44
  return function sendWarningLog(_x) {
33
45
  return _ref.apply(this, arguments);
@@ -13,6 +13,7 @@ const require_locales = require("../../../components/checkout/locales.js");
13
13
  const require_PaymentResultToastV2Provider = require("../../../components/checkout/components/PaymentResultToastV2/PaymentResultToastV2Provider.js");
14
14
  const require_index$4 = require("../../../components/booking/components/clearCartModal/index.js");
15
15
  const require_index$5 = require("../../../components/booking/components/customiseItemModal/index.js");
16
+ const require_receiptPrintWarning = require("../../salesSdk/utils/receiptPrintWarning.js");
16
17
  const require_fulfillmentTimingBooking = require("../../salesSdk/utils/fulfillmentTimingBooking.js");
17
18
  const require_SalesSdkGlobalScanActivityContext = require("../../salesSdk/context/SalesSdkGlobalScanActivityContext.js");
18
19
  const require_utils = require("../components/Client/utils.js");
@@ -750,12 +751,14 @@ function SaleOrderActionProvider({ actionConfigs, actionOverrides, children, con
750
751
  });
751
752
  const handleCashPaymentSuccess = (0, ahooks.useMemoizedFn)(function() {
752
753
  var _ref9 = require_asyncToGenerator._asyncToGenerator(function* (result) {
753
- var _result$syncResult$su, _result$syncResult, _result$payment;
754
+ var _result$syncResult$su, _result$syncResult, _result$syncResult$su2, _result$syncResult2, _result$payment;
754
755
  setShowCashPayment(false);
755
756
  setSelectedCashPaymentMethodId(void 0);
757
+ const receiptWarning = require_receiptPrintWarning.getReceiptPrintWarning((_result$syncResult$su = result === null || result === void 0 || (_result$syncResult = result.syncResult) === null || _result$syncResult === void 0 ? void 0 : _result$syncResult.submitResult) !== null && _result$syncResult$su !== void 0 ? _result$syncResult$su : result, _pisell_utils.locales.getLocale());
758
+ if (receiptWarning) Toast.info(receiptWarning);
756
759
  const externalRequestId = cashExternalRequestIdRef.current;
757
760
  cashExternalRequestIdRef.current = void 0;
758
- const orderId = require_utils$3.resolveSaleDetailOrderIdFromSalesResult(sales, (_result$syncResult$su = result === null || result === void 0 || (_result$syncResult = result.syncResult) === null || _result$syncResult === void 0 ? void 0 : _result$syncResult.submitResult) !== null && _result$syncResult$su !== void 0 ? _result$syncResult$su : result);
761
+ const orderId = require_utils$3.resolveSaleDetailOrderIdFromSalesResult(sales, (_result$syncResult$su2 = result === null || result === void 0 || (_result$syncResult2 = result.syncResult) === null || _result$syncResult2 === void 0 ? void 0 : _result$syncResult2.submitResult) !== null && _result$syncResult$su2 !== void 0 ? _result$syncResult$su2 : result);
759
762
  const changeGivenAmount = Number((result === null || result === void 0 || (_result$payment = result.payment) === null || _result$payment === void 0 || (_result$payment = _result$payment.metadata) === null || _result$payment === void 0 ? void 0 : _result$payment.change_given_amount) || 0);
760
763
  const outcome = require_state.resolveSaleOrderQuickPaymentOutcome(result);
761
764
  settleExternalPayment(externalRequestId, {
@@ -861,7 +864,7 @@ function SaleOrderActionProvider({ actionConfigs, actionOverrides, children, con
861
864
  };
862
865
  }();
863
866
  try {
864
- var _engineContext$appHel17, _engineContext$appHel18, _paymentRuntimeRef$cu, _result$syncResult$su2, _result$syncResult2;
867
+ var _engineContext$appHel17, _engineContext$appHel18, _paymentRuntimeRef$cu, _result$syncResult$su3, _result$syncResult3, _result$syncResult$su4, _result$syncResult4;
865
868
  const method = methodOverride || paymentMethods.find((item) => String(item.code || "").toUpperCase() === code);
866
869
  if (!method) throw new Error(`Payment method ${code} is unavailable.`);
867
870
  baseSales = sales.bookingTicket;
@@ -933,8 +936,10 @@ function SaleOrderActionProvider({ actionConfigs, actionOverrides, children, con
933
936
  serviceCharge: runtimeResult.serviceCharge,
934
937
  metadata: runtimeResult.metadata
935
938
  });
936
- const orderId = require_utils$3.resolveSaleDetailOrderIdFromSalesResult(sales, (_result$syncResult$su2 = result === null || result === void 0 || (_result$syncResult2 = result.syncResult) === null || _result$syncResult2 === void 0 ? void 0 : _result$syncResult2.submitResult) !== null && _result$syncResult$su2 !== void 0 ? _result$syncResult$su2 : result);
939
+ const orderId = require_utils$3.resolveSaleDetailOrderIdFromSalesResult(sales, (_result$syncResult$su3 = result === null || result === void 0 || (_result$syncResult3 = result.syncResult) === null || _result$syncResult3 === void 0 ? void 0 : _result$syncResult3.submitResult) !== null && _result$syncResult$su3 !== void 0 ? _result$syncResult$su3 : result);
937
940
  const outcome = require_state.resolveSaleOrderQuickPaymentOutcome(result);
941
+ const receiptWarning = require_receiptPrintWarning.getReceiptPrintWarning((_result$syncResult$su4 = result === null || result === void 0 || (_result$syncResult4 = result.syncResult) === null || _result$syncResult4 === void 0 ? void 0 : _result$syncResult4.submitResult) !== null && _result$syncResult$su4 !== void 0 ? _result$syncResult$su4 : result, _pisell_utils.locales.getLocale());
942
+ if (receiptWarning) Toast.info(receiptWarning);
938
943
  settleExternalPayment(externalRequestId, {
939
944
  status: "success",
940
945
  result
@@ -1016,6 +1021,8 @@ function SaleOrderActionProvider({ actionConfigs, actionOverrides, children, con
1016
1021
  };
1017
1022
  }
1018
1023
  const submitResult = result === null || result === void 0 ? void 0 : result.submitResult;
1024
+ const receiptWarning = require_receiptPrintWarning.getReceiptPrintWarning(submitResult, _pisell_utils.locales.getLocale());
1025
+ if (receiptWarning) Toast.info(receiptWarning);
1019
1026
  if (!require_utils$3.isSalesOrderSubmitSuccess(submitResult)) throw new Error(String((submitResult === null || submitResult === void 0 ? void 0 : submitResult.message) || (submitResult === null || submitResult === void 0 ? void 0 : submitResult.msg) || "Order confirmation failed"));
1020
1027
  const orderId = require_utils$3.resolveSaleDetailOrderIdFromSalesResult(sales, submitResult);
1021
1028
  require_presentBaseSalesPaymentResult.presentBaseSalesPaymentResult({
@@ -21,18 +21,14 @@ const getOrderSmallTicketData = function() {
21
21
  return _ref3.apply(this, arguments);
22
22
  };
23
23
  }();
24
- /**
25
- * 通过 PisellOS 按本地订单即时重建 Web Invoice 所需的小票快照。
26
- * 该接口只返回数据,不会派发打印任务。
27
- */
28
24
  const getLocalOrderReceiptSnapshot = function() {
29
- var _ref5 = require_asyncToGenerator._asyncToGenerator(function* (orderId, locales = []) {
25
+ var _ref5 = require_asyncToGenerator._asyncToGenerator(function* (orderId, locales = [], templateSettings) {
30
26
  var _ref4, _response$data$data2, _response$data2;
31
- const response = yield require_index.request.getRequest().post("/shop/local/order-receipt-snapshot", {
27
+ const response = yield require_index.request.getRequest().post("/shop/local/order-receipt-snapshot", require_objectSpread2._objectSpread2({
32
28
  order_id: orderId,
33
29
  lookup_order_from_db: 1,
34
30
  locales
35
- }, {
31
+ }, templateSettings ? { template_settings: { modules: templateSettings.module } } : {}), {
36
32
  fullResult: true,
37
33
  isShopApi: true,
38
34
  osServer: true,
@@ -40,7 +36,10 @@ const getLocalOrderReceiptSnapshot = function() {
40
36
  });
41
37
  const payload = (_ref4 = (_response$data$data2 = response === null || response === void 0 || (_response$data2 = response.data) === null || _response$data2 === void 0 ? void 0 : _response$data2.data) !== null && _response$data$data2 !== void 0 ? _response$data$data2 : response === null || response === void 0 ? void 0 : response.data) !== null && _ref4 !== void 0 ? _ref4 : response;
42
38
  const smallTicketData = payload === null || payload === void 0 ? void 0 : payload.small_ticket_data;
43
- return smallTicketData && typeof smallTicketData === "object" ? smallTicketData : null;
39
+ return smallTicketData && typeof smallTicketData === "object" && !Array.isArray(smallTicketData) ? require_objectSpread2._objectSpread2({
40
+ small_ticket_data: smallTicketData,
41
+ template_visibility_applied: payload.template_visibility_applied === true
42
+ }, payload.source && typeof payload.source === "object" && !Array.isArray(payload.source) ? { source: payload.source } : {}) : null;
44
43
  });
45
44
  return function getLocalOrderReceiptSnapshot(_x2) {
46
45
  return _ref5.apply(this, arguments);
@@ -4,9 +4,9 @@ const require_index$1 = require("../../../../../pisellSaleSummaryDetail/index.js
4
4
  const require_index$2 = require("../../../../components/Contact/index.js");
5
5
  const require_index$3 = require("../../../../components/DetailActions/index.js");
6
6
  const require_useSaleSummaryDetailSnapshot = require("../../../../components/Summary/useSaleSummaryDetailSnapshot.js");
7
+ const require_utils = require("./utils.js");
7
8
  const require_VirtualCurrencyLines = require("../../../../../invoice/VirtualCurrencyLines.js");
8
9
  const require_index$4 = require("../SummaryInfoBlocks/index.js");
9
- const require_utils = require("./utils.js");
10
10
  let react = require("react");
11
11
  react = require_runtime.__toESM(react);
12
12
  let _pisell_utils = require("@pisell/utils");
@@ -1,8 +1,9 @@
1
1
  const require_runtime = require("../../../../../../_virtual/_rolldown/runtime.js");
2
- const require_index = require("../../../../../multiCurrencySettlement/index.js");
2
+ const require_objectSpread2 = require("../../../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js");
3
3
  const require_receipt = require("../../../../../invoice/receipt.js");
4
4
  const require_ReceiptRenderer = require("../../../../../invoice/ReceiptRenderer.js");
5
5
  const require_InvoiceReceiptSkeleton = require("../../../../../invoice/InvoiceReceiptSkeleton.js");
6
+ const require_VirtualCurrencyReceiptRenderer = require("../../../../../invoice/VirtualCurrencyReceiptRenderer.js");
6
7
  const require_useInvoiceReceiptPreview = require("./useInvoiceReceiptPreview.js");
7
8
  const require_VirtualCurrencyInvoice = require("./VirtualCurrencyInvoice.js");
8
9
  let react = require("react");
@@ -11,24 +12,47 @@ let _pisell_utils = require("@pisell/utils");
11
12
  require("./index.less");
12
13
  //#region src/plus/saleDetail/tmpl/B/components/Invoice/index.tsx
13
14
  const PREFIX = "pisell-sale-detail-invoice";
14
- function InvoiceReceiptPreview({ context }) {
15
+ function applyVirtualHostVisibility(receipt, hidden) {
16
+ return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, receipt), {}, {
17
+ orderNote: hidden.includes("orderNote") ? void 0 : receipt.orderNote,
18
+ paymentNotice: hidden.includes("amountDetails") ? void 0 : receipt.paymentNotice,
19
+ secondary: receipt.secondary ? applyVirtualHostVisibility(receipt.secondary, hidden) : void 0
20
+ });
21
+ }
22
+ function InvoiceReceiptPreview(props) {
15
23
  var _locales$getLocale;
24
+ const { context, moduleConfig } = props;
16
25
  const receiptRef = (0, react.useRef)(null);
17
- const { error, loading, receipt, retry } = require_useInvoiceReceiptPreview.useInvoiceReceiptPreview(context);
26
+ const { error, loading, receipt, source, retry, useLegacyVirtualCurrencyInvoice, useVirtualCurrencyReceipt } = require_useInvoiceReceiptPreview.useInvoiceReceiptPreview(context);
18
27
  const appLocale = ((_locales$getLocale = _pisell_utils.locales.getLocale) === null || _locales$getLocale === void 0 ? void 0 : _locales$getLocale.call(_pisell_utils.locales)) || "en";
28
+ const hidden = (moduleConfig === null || moduleConfig === void 0 ? void 0 : moduleConfig.hidden) || [];
29
+ const moduleOverrides = {};
30
+ if (hidden.includes("customer")) moduleOverrides.customer = null;
31
+ if (hidden.includes("cartItems")) moduleOverrides.line_groups = null;
32
+ if (hidden.includes("amountDetails")) {
33
+ moduleOverrides.settlement = null;
34
+ moduleOverrides.payment = null;
35
+ moduleOverrides.total_savings = null;
36
+ }
37
+ if (!loading && useLegacyVirtualCurrencyInvoice) return /* @__PURE__ */ react.default.createElement(require_VirtualCurrencyInvoice.VirtualCurrencyInvoice, props);
19
38
  return /* @__PURE__ */ react.default.createElement("main", { className: "pisell-sale-detail-main pisell-sale-detail-invoice-main" }, /* @__PURE__ */ react.default.createElement("div", { className: "pisell-sale-detail-cart-scroll-panel" }, /* @__PURE__ */ react.default.createElement("div", { className: `${PREFIX}__receipt-stage` }, loading ? /* @__PURE__ */ react.default.createElement(require_InvoiceReceiptSkeleton.InvoiceReceiptSkeleton, null) : null, !loading && error ? /* @__PURE__ */ react.default.createElement("div", {
20
39
  className: `${PREFIX}__preview-state`,
21
40
  role: "alert"
22
41
  }, /* @__PURE__ */ react.default.createElement("span", null, require_receipt.getReceiptLabel(appLocale, "Receipt preview is unavailable.")), /* @__PURE__ */ react.default.createElement("button", {
23
42
  onClick: retry,
24
43
  type: "button"
25
- }, require_receipt.getReceiptLabel(appLocale, "Retry"))) : null, !loading && receipt ? /* @__PURE__ */ react.default.createElement(require_ReceiptRenderer.InvoiceReceiptRenderer, {
44
+ }, require_receipt.getReceiptLabel(appLocale, "Retry"))) : null, !loading && receipt ? useVirtualCurrencyReceipt && source ? /* @__PURE__ */ react.default.createElement(require_VirtualCurrencyReceiptRenderer.VirtualCurrencyReceiptRenderer, {
45
+ receipt: applyVirtualHostVisibility(receipt, hidden),
46
+ source,
47
+ moduleOverrides,
48
+ ref: receiptRef
49
+ }) : /* @__PURE__ */ react.default.createElement(require_ReceiptRenderer.InvoiceReceiptRenderer, {
26
50
  receipt,
27
51
  ref: receiptRef
28
52
  }) : null)));
29
53
  }
30
54
  function Invoice(props) {
31
- return require_index.isVirtualSettlementTempOrder(props.context.sales.tempOrder) ? /* @__PURE__ */ react.default.createElement(require_VirtualCurrencyInvoice.VirtualCurrencyInvoice, props) : /* @__PURE__ */ react.default.createElement(InvoiceReceiptPreview, props);
55
+ return /* @__PURE__ */ react.default.createElement(InvoiceReceiptPreview, props);
32
56
  }
33
57
  //#endregion
34
58
  exports.Invoice = Invoice;
@@ -3,10 +3,20 @@ const require_useEngineContext = require("../../../../../../hooks/useEngineConte
3
3
  const require_objectSpread2 = require("../../../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js");
4
4
  const require_asyncToGenerator = require("../../../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js");
5
5
  const require_useLocale = require("../../../../../../hooks/useLocale.js");
6
+ const require_index = require("../../../../../multiCurrencySettlement/index.js");
6
7
  const require_serve = require("../../../../serve.js");
8
+ const require_invoiceVisibility = require("../../../../../invoice/invoiceVisibility.js");
7
9
  const require_receipt = require("../../../../../invoice/receipt.js");
8
10
  let react = require("react");
9
11
  //#region src/plus/saleDetail/tmpl/B/components/Invoice/useInvoiceReceiptPreview.ts
12
+ const LOADING_STATE = {
13
+ error: null,
14
+ loading: true,
15
+ receipt: null,
16
+ source: null,
17
+ useLegacyVirtualCurrencyInvoice: false,
18
+ useVirtualCurrencyReceipt: false
19
+ };
10
20
  function getOrderId(context) {
11
21
  var _ref, _context$sales$salesD, _context$sales$salesD2, _context$sales$tempOr;
12
22
  return (_ref = (_context$sales$salesD = (_context$sales$salesD2 = context.sales.salesDetail) === null || _context$sales$salesD2 === void 0 || (_context$sales$salesD2 = _context$sales$salesD2.header) === null || _context$sales$salesD2 === void 0 ? void 0 : _context$sales$salesD2.order_id) !== null && _context$sales$salesD !== void 0 ? _context$sales$salesD : (_context$sales$tempOr = context.sales.tempOrder) === null || _context$sales$tempOr === void 0 ? void 0 : _context$sales$tempOr.order_id) !== null && _ref !== void 0 ? _ref : null;
@@ -36,86 +46,118 @@ function useInvoiceReceiptPreview(context) {
36
46
  const [revision, setRevision] = (0, react.useState)(0);
37
47
  const orderId = getOrderId(context);
38
48
  const previewCreatedAt = (0, react.useMemo)(() => /* @__PURE__ */ new Date(), [orderId, revision]);
39
- const [state, setState] = (0, react.useState)({
40
- error: null,
41
- loading: true,
42
- receipt: null
43
- });
44
49
  const salesDetail = context.sales.salesDetail;
45
50
  const tempOrder = context.sales.tempOrder;
46
51
  const salesModule = context.sales.salesModule;
52
+ const scope = (0, react.useMemo)(() => ({
53
+ appLocale,
54
+ engineContext,
55
+ orderId,
56
+ platform,
57
+ previewCreatedAt,
58
+ salesDetail,
59
+ salesModule,
60
+ tempOrder
61
+ }), [
62
+ appLocale,
63
+ engineContext,
64
+ orderId,
65
+ platform,
66
+ previewCreatedAt,
67
+ salesDetail,
68
+ salesModule,
69
+ tempOrder
70
+ ]);
71
+ const [state, setState] = (0, react.useState)(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, LOADING_STATE), {}, { scope: null }));
47
72
  (0, react.useEffect)(() => {
48
73
  let cancelled = false;
49
- setState({
50
- error: null,
51
- loading: true,
52
- receipt: null
53
- });
74
+ setState(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, LOADING_STATE), {}, { scope }));
54
75
  (function() {
55
76
  var _ref3 = require_asyncToGenerator._asyncToGenerator(function* () {
77
+ const { appLocale, engineContext, orderId, platform, previewCreatedAt, salesDetail, salesModule, tempOrder } = scope;
78
+ const layout = yield require_receipt.resolveInvoiceLayoutConfig(salesModule);
79
+ if (cancelled) return null;
80
+ const mustFilter = require_invoiceVisibility.requiresInvoiceDataFiltering(layout);
81
+ const useSharedConfig = require_invoiceVisibility.hasInvoiceDetailSettings(layout) || mustFilter;
82
+ const isVirtualOrder = require_index.isVirtualSettlementTempOrder(tempOrder) || require_index.isVirtualSettlementTempOrder(salesDetail === null || salesDetail === void 0 ? void 0 : salesDetail.raw);
83
+ const legacyVirtualResult = {
84
+ receipt: null,
85
+ source: null,
86
+ useLegacyVirtualCurrencyInvoice: true,
87
+ useVirtualCurrencyReceipt: false
88
+ };
89
+ if (isVirtualOrder && !useSharedConfig) return legacyVirtualResult;
90
+ const requiresSource = isVirtualOrder && useSharedConfig;
56
91
  const embeddedSnapshot = require_receipt.resolveSmallTicketData(salesDetail, tempOrder);
57
- const loadSnapshot = function() {
92
+ const { snapshot, source } = yield function() {
58
93
  var _ref2 = require_asyncToGenerator._asyncToGenerator(function* () {
59
94
  if (platform !== "h5" && orderId !== null && orderId !== void 0) try {
60
- const freshSnapshot = yield require_serve.getLocalOrderReceiptSnapshot(orderId, [appLocale]);
61
- if (require_receipt.isSmallTicketData(freshSnapshot)) return freshSnapshot;
95
+ const freshSnapshot = yield require_serve.getLocalOrderReceiptSnapshot(orderId, [appLocale], layout);
96
+ if (!freshSnapshot || !require_receipt.isSmallTicketData(freshSnapshot.small_ticket_data)) throw new Error("Receipt snapshot is unavailable");
97
+ if (mustFilter && freshSnapshot.template_visibility_applied !== true) throw new Error("Receipt snapshot does not support template filtering");
98
+ if (requiresSource && !freshSnapshot.source) throw new Error("Virtual currency receipt source is unavailable");
99
+ return {
100
+ snapshot: freshSnapshot.small_ticket_data,
101
+ source: freshSnapshot.source || null
102
+ };
62
103
  } catch (error) {
104
+ if (mustFilter || requiresSource) throw error;
63
105
  console.warn("[SaleDetail.Invoice] Failed to rebuild local receipt snapshot", error);
64
106
  }
65
- if (embeddedSnapshot) return embeddedSnapshot;
66
- return orderId !== null && orderId !== void 0 ? require_serve.getOrderSmallTicketData(orderId) : null;
107
+ if (mustFilter || requiresSource) throw new Error("A template-aware local receipt snapshot is required");
108
+ return {
109
+ snapshot: embeddedSnapshot || (orderId !== null && orderId !== void 0 ? yield require_serve.getOrderSmallTicketData(orderId) : null),
110
+ source: null
111
+ };
67
112
  });
68
113
  return function loadSnapshot() {
69
114
  return _ref2.apply(this, arguments);
70
115
  };
71
- }();
72
- const [snapshot, layout] = yield Promise.all([loadSnapshot(), require_receipt.resolveInvoiceLayoutConfig(salesModule)]);
116
+ }()();
73
117
  if (!snapshot) throw new Error("Receipt snapshot is unavailable");
118
+ const isVirtualSource = require_index.isVirtualSettlementTempOrder(source);
119
+ if (isVirtualSource && !useSharedConfig) return legacyVirtualResult;
74
120
  const shopInfo = getShopInfo(engineContext);
75
121
  const selected = require_receipt.selectSmallTicketLocale(snapshot, appLocale, shopInfo.primary_locale);
76
122
  if (!selected) throw new Error("Receipt language data is unavailable");
77
- return require_receipt.buildInvoiceReceiptViewModel({
78
- data: selected.data,
79
- layout,
80
- locale: selected.locale,
81
- previewTime: require_receipt.formatReceiptPreviewTime(previewCreatedAt, selected.locale),
82
- shopLogo: getShopLogo(shopInfo),
83
- taxNumberLabel: shopInfo.tax_number_title || (String(shopInfo.tax_country_code || "").toUpperCase() === "AU" ? "ABN" : void 0)
84
- });
123
+ return {
124
+ receipt: require_receipt.buildInvoiceReceiptViewModel({
125
+ data: selected.data,
126
+ layout,
127
+ locale: selected.locale,
128
+ previewTime: require_receipt.formatReceiptPreviewTime(previewCreatedAt, selected.locale),
129
+ shopLogo: getShopLogo(shopInfo),
130
+ taxNumberLabel: shopInfo.tax_number_title || (String(shopInfo.tax_country_code || "").toUpperCase() === "AU" ? "ABN" : void 0)
131
+ }),
132
+ source,
133
+ useLegacyVirtualCurrencyInvoice: false,
134
+ useVirtualCurrencyReceipt: useSharedConfig && isVirtualSource
135
+ };
85
136
  });
86
137
  return function load() {
87
138
  return _ref3.apply(this, arguments);
88
139
  };
89
- })()().then((receipt) => {
90
- if (!cancelled) setState({
140
+ })()().then((result) => {
141
+ if (!cancelled && result) setState(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, result), {}, {
91
142
  error: null,
92
143
  loading: false,
93
- receipt
94
- });
144
+ scope
145
+ }));
95
146
  }).catch((error) => {
96
147
  if (cancelled) return;
97
148
  const normalizedError = error instanceof Error ? error : new Error(String(error));
98
149
  console.warn("[SaleDetail.Invoice] Failed to load receipt preview", normalizedError);
99
- setState({
150
+ setState(require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, LOADING_STATE), {}, {
100
151
  error: normalizedError,
101
152
  loading: false,
102
- receipt: null
103
- });
153
+ scope
154
+ }));
104
155
  });
105
156
  return () => {
106
157
  cancelled = true;
107
158
  };
108
- }, [
109
- appLocale,
110
- engineContext,
111
- orderId,
112
- platform,
113
- previewCreatedAt,
114
- salesDetail,
115
- salesModule,
116
- tempOrder
117
- ]);
118
- return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state), {}, { retry: () => setRevision((value) => value + 1) });
159
+ }, [scope]);
160
+ return require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, state.scope === scope ? state : LOADING_STATE), {}, { retry: () => setRevision((value) => value + 1) });
119
161
  }
120
162
  //#endregion
121
163
  exports.useInvoiceReceiptPreview = useInvoiceReceiptPreview;
@@ -7,6 +7,7 @@ const require_SalesSdkContext = require("./SalesSdkContext.js");
7
7
  const require_enrichCartLineHolderDisplay = require("../utils/enrichCartLineHolderDisplay.js");
8
8
  const require_SalesSdkHolderContext = require("./SalesSdkHolderContext.js");
9
9
  const require_index = require("../../multiCurrencySettlement/index.js");
10
+ const require_receiptPrintWarning = require("../utils/receiptPrintWarning.js");
10
11
  const require_SalesSdkBusinessAvailabilityContext = require("./SalesSdkBusinessAvailabilityContext.js");
11
12
  const require_SalesSdkProductContext = require("./SalesSdkProductContext.js");
12
13
  const require_SalesSdkSummaryContext = require("./SalesSdkSummaryContext.js");
@@ -1873,7 +1874,10 @@ const SalesSdkCartProvider = ({ children, deferHolderAuthOnClose = false, enable
1873
1874
  }))) throw require_createHolderConfirmBridge.HOLDER_CONFIRM_CANCELLED;
1874
1875
  }
1875
1876
  if ((yield options === null || options === void 0 || (_options$beforeSubmit = options.beforeSubmit) === null || _options$beforeSubmit === void 0 ? void 0 : _options$beforeSubmit.call(options)) === false) throw require_createHolderConfirmBridge.HOLDER_CONFIRM_CANCELLED;
1876
- return bookingTicket.submitSalesOrder(params);
1877
+ const result = yield bookingTicket.submitSalesOrder(params);
1878
+ const receiptWarning = require_receiptPrintWarning.getReceiptPrintWarning(result, _pisell_utils.locales.getLocale());
1879
+ if (receiptWarning) Toast.info(receiptWarning);
1880
+ return result;
1877
1881
  });
1878
1882
  return function(_x45, _x46) {
1879
1883
  return _ref43.apply(this, arguments);
@@ -11,6 +11,7 @@ const require_SalesSdkHolderContext = require("./SalesSdkHolderContext.js");
11
11
  const require_locales = require("../../multiCurrencySettlement/locales.js");
12
12
  const require_index$1 = require("../../multiCurrencySettlement/index.js");
13
13
  const require_payment_modal_utils = require("../../../components/checkout/payment-modal-utils.js");
14
+ const require_receiptPrintWarning = require("../utils/receiptPrintWarning.js");
14
15
  const require_SalesSdkBusinessAvailabilityContext = require("./SalesSdkBusinessAvailabilityContext.js");
15
16
  const require_buildStrategyContext = require("../utils/buildStrategyContext.js");
16
17
  const require_buildDefaultLoadProductsParams = require("../utils/buildDefaultLoadProductsParams.js");
@@ -1076,6 +1077,8 @@ const SalesSdkProvider = ({ osKey, enableMultiCurrencySettlement = false, soluti
1076
1077
  var _options$beforeSubmit2, _summaryProviderRef$c3;
1077
1078
  if ((yield options === null || options === void 0 || (_options$beforeSubmit2 = options.beforeSubmit) === null || _options$beforeSubmit2 === void 0 ? void 0 : _options$beforeSubmit2.call(options)) === false) throw require_createHolderConfirmBridge.HOLDER_CONFIRM_CANCELLED;
1078
1079
  const result = yield bookingTicket.submitSalesOrder(params);
1080
+ const receiptWarning = require_receiptPrintWarning.getReceiptPrintWarning(result, _pisell_utils.locales.getLocale());
1081
+ if (receiptWarning) Toast.info(receiptWarning);
1079
1082
  if (options === null || options === void 0 ? void 0 : options.skipRemoteRefresh) refreshRootSnapshot();
1080
1083
  else yield refreshSalesDetail();
1081
1084
  (_summaryProviderRef$c3 = summaryProviderRef.current) === null || _summaryProviderRef$c3 === void 0 || _summaryProviderRef$c3.refreshSummary();
@@ -0,0 +1,16 @@
1
+ //#region src/plus/salesSdk/utils/receiptPrintWarning.ts
2
+ const PRINT_WARNINGS = {
3
+ en: "The order was saved, but the receipt could not be generated. Please retry printing from order details.",
4
+ "zh-cn": "订单已保存,但小票生成失败。请在订单详情中重试打印。",
5
+ "zh-hk": "訂單已儲存,但小票產生失敗。請在訂單詳情中重試列印。",
6
+ ja: "注文は保存されましたが、レシートを作成できませんでした。注文詳細から印刷を再試行してください。",
7
+ pt: "O pedido foi salvo, mas não foi possível gerar o recibo. Tente imprimir novamente nos detalhes do pedido."
8
+ };
9
+ /** Receipt failure must be visible without turning a saved sale into a failed checkout. */
10
+ function getReceiptPrintWarning(result, locale) {
11
+ if (!result || typeof result !== "object" || !result.receipt_print_error) return null;
12
+ const language = String(locale || "en").replace(/_/g, "-").toLowerCase();
13
+ return PRINT_WARNINGS[language] || PRINT_WARNINGS[language.split("-")[0]] || PRINT_WARNINGS.en;
14
+ }
15
+ //#endregion
16
+ exports.getReceiptPrintWarning = getReceiptPrintWarning;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/private-materials",
3
- "version": "6.12.286",
3
+ "version": "6.12.288",
4
4
  "main": "./lib/index.js",
5
5
  "module": "./es/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -71,11 +71,11 @@
71
71
  "react-zoom-pan-pinch": "^3.7.0",
72
72
  "styled-components": "^6.0.0-rc.3",
73
73
  "use-sync-external-store": "^1.6.0",
74
+ "@pisell/pi-payment-sdk": "0.0.3",
74
75
  "@pisell/utils": "3.0.7",
75
76
  "@pisell/materials": "6.12.75",
76
- "@pisell/date-picker": "3.0.12",
77
77
  "@pisell/icon": "0.0.11",
78
- "@pisell/pi-payment-sdk": "0.0.3"
78
+ "@pisell/date-picker": "3.0.12"
79
79
  },
80
80
  "peerDependencies": {
81
81
  "react": "^18.0.0",