@pisell/private-materials 6.11.803 → 6.11.804

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.
@@ -25,28 +25,45 @@ function submitData(submitResult) {
25
25
  var _submitResult$data;
26
26
  return (submitResult === null || submitResult === void 0 || (_submitResult$data = submitResult.data) === null || _submitResult$data === void 0 ? void 0 : _submitResult$data.data) || (submitResult === null || submitResult === void 0 ? void 0 : submitResult.data) || submitResult;
27
27
  }
28
- /** An approved terminal response is insufficient: require the submitted order too. */
29
- function inspectPaymentCompletion(baseSales, result) {
30
- var _sync$isOrderFullyPai, _ref3, _data$order_id, _baseSales$getTempOrd2;
28
+ /** Sale numbers survive local-to-remote id changes; never settle onto another cart. */
29
+ function capturePaymentOrder(baseSales) {
30
+ var _baseSales$getTempOrd2, _order$order_id;
31
+ const order = (_baseSales$getTempOrd2 = baseSales.getTempOrder) === null || _baseSales$getTempOrd2 === void 0 ? void 0 : _baseSales$getTempOrd2.call(baseSales);
32
+ const saleNumber = String((order === null || order === void 0 ? void 0 : order.external_sale_number) || "").trim();
33
+ const orderId = String((_order$order_id = order === null || order === void 0 ? void 0 : order.order_id) !== null && _order$order_id !== void 0 ? _order$order_id : "").trim();
34
+ return () => {
35
+ var _baseSales$getTempOrd3, _current$order_id;
36
+ const current = (_baseSales$getTempOrd3 = baseSales.getTempOrder) === null || _baseSales$getTempOrd3 === void 0 ? void 0 : _baseSales$getTempOrd3.call(baseSales);
37
+ return saleNumber ? String((current === null || current === void 0 ? void 0 : current.external_sale_number) || "").trim() === saleNumber : orderId ? String((_current$order_id = current === null || current === void 0 ? void 0 : current.order_id) !== null && _current$order_id !== void 0 ? _current$order_id : "").trim() === orderId : Boolean(order) && current === order;
38
+ };
39
+ }
40
+ /**
41
+ * Require a successful order submission as well as payment completion.
42
+ * Main-screen POS checkout persists paid orders locally before background sync;
43
+ * device payments still require a cloud-confirmed order before fulfillment.
44
+ */
45
+ function inspectPaymentCompletion(baseSales, result, submissionSource = "kiosk") {
46
+ var _sync$isOrderFullyPai, _ref3, _ref4, _data$order_id, _baseSales$getTempOrd4;
47
+ const isMainScreen = submissionSource === "main-screen";
31
48
  const sync = (result === null || result === void 0 ? void 0 : result.syncResult) || result;
32
49
  const submitted = sync === null || sync === void 0 ? void 0 : sync.submitResult;
33
50
  const data = submitData(submitted);
34
- const amount = readPaymentAmount(baseSales);
51
+ const amount = isMainScreen ? void 0 : readPaymentAmount(baseSales);
35
52
  const fullyPaid = (_sync$isOrderFullyPai = sync === null || sync === void 0 ? void 0 : sync.isOrderFullyPaid) !== null && _sync$isOrderFullyPai !== void 0 ? _sync$isOrderFullyPai : sync === null || sync === void 0 ? void 0 : sync.isFullyPaid;
36
- if ([
53
+ if (!isMainScreen && [
37
54
  data === null || data === void 0 ? void 0 : data.need_sync,
38
55
  submitted === null || submitted === void 0 ? void 0 : submitted.need_sync,
39
56
  sync === null || sync === void 0 ? void 0 : sync.need_sync
40
57
  ].some((value) => Number(value) === 1)) throw new Error("Order sync is not complete.");
41
58
  if (!require_utils$1.isSalesOrderSubmitSuccess(submitted)) throw new Error((data === null || data === void 0 ? void 0 : data.message) || (submitted === null || submitted === void 0 ? void 0 : submitted.message) || "Order sync is not complete.");
42
- const orderId = (_ref3 = (_data$order_id = data === null || data === void 0 ? void 0 : data.order_id) !== null && _data$order_id !== void 0 ? _data$order_id : data === null || data === void 0 ? void 0 : data.orderId) !== null && _ref3 !== void 0 ? _ref3 : baseSales === null || baseSales === void 0 || (_baseSales$getTempOrd2 = baseSales.getTempOrder) === null || _baseSales$getTempOrd2 === void 0 || (_baseSales$getTempOrd2 = _baseSales$getTempOrd2.call(baseSales)) === null || _baseSales$getTempOrd2 === void 0 ? void 0 : _baseSales$getTempOrd2.order_id;
59
+ const orderId = (_ref3 = (_ref4 = (_data$order_id = data === null || data === void 0 ? void 0 : data.order_id) !== null && _data$order_id !== void 0 ? _data$order_id : data === null || data === void 0 ? void 0 : data.orderId) !== null && _ref4 !== void 0 ? _ref4 : isMainScreen ? data === null || data === void 0 ? void 0 : data.external_sale_number : void 0) !== null && _ref3 !== void 0 ? _ref3 : baseSales === null || baseSales === void 0 || (_baseSales$getTempOrd4 = baseSales.getTempOrder) === null || _baseSales$getTempOrd4 === void 0 || (_baseSales$getTempOrd4 = _baseSales$getTempOrd4.call(baseSales)) === null || _baseSales$getTempOrd4 === void 0 ? void 0 : _baseSales$getTempOrd4.order_id;
43
60
  const orderStatus = String((data === null || data === void 0 ? void 0 : data.payment_status) || "").toLowerCase();
44
- if (orderId === void 0 || orderId === null || String(orderId).trim() === "" || /^local[_-]/i.test(String(orderId))) throw new Error("The submitted order has no remote order id.");
45
- if (fullyPaid === false && amount !== void 0 && amount > 0) return {
61
+ if (orderId === void 0 || orderId === null || String(orderId).trim() === "" || !isMainScreen && /^local[_-]/i.test(String(orderId))) throw new Error("The submitted order has no valid order id.");
62
+ if (fullyPaid === false && (isMainScreen || amount !== void 0 && amount > 0)) return {
46
63
  kind: "partial",
47
64
  orderId
48
65
  };
49
- if (orderStatus && orderStatus !== "paid" || (data === null || data === void 0 ? void 0 : data.order_wait_pay_amount) !== void 0 && Number(data.order_wait_pay_amount) !== 0 || fullyPaid === false || fullyPaid !== true && amount !== 0) throw new Error("The submitted order has not been confirmed as fully paid.");
66
+ if (orderStatus && orderStatus !== "paid" || (data === null || data === void 0 ? void 0 : data.order_wait_pay_amount) !== void 0 && Number(data.order_wait_pay_amount) !== 0 || fullyPaid === false || fullyPaid !== true && (isMainScreen ? orderStatus !== "paid" : amount !== 0)) throw new Error("The submitted order has not been confirmed as fully paid.");
50
67
  return {
51
68
  kind: "paid",
52
69
  orderId,
@@ -57,18 +74,21 @@ function syncConfirmedPayments(_x) {
57
74
  return _syncConfirmedPayments.apply(this, arguments);
58
75
  }
59
76
  function _syncConfirmedPayments() {
60
- _syncConfirmedPayments = require_asyncToGenerator._asyncToGenerator(function* (baseSales) {
61
- const retry = () => syncConfirmedPayments(baseSales);
77
+ _syncConfirmedPayments = require_asyncToGenerator._asyncToGenerator(function* (baseSales, isCurrentOrder = capturePaymentOrder(baseSales)) {
78
+ const retry = () => syncConfirmedPayments(baseSales, isCurrentOrder);
79
+ if (!isCurrentOrder()) return { kind: "uncertain" };
62
80
  try {
63
81
  var _baseSales$getOrderPa3;
64
82
  if (!(baseSales === null || baseSales === void 0 ? void 0 : baseSales.syncPaymentsToOrder)) throw new Error("Order sync is unavailable.");
65
- return inspectPaymentCompletion(baseSales, yield baseSales.syncPaymentsToOrder({
83
+ const result = yield baseSales.syncPaymentsToOrder({
66
84
  payments: ((_baseSales$getOrderPa3 = baseSales.getOrderPayments) === null || _baseSales$getOrderPa3 === void 0 ? void 0 : _baseSales$getOrderPa3.call(baseSales)) || [],
67
85
  paymentStatus: "paid",
68
86
  submitWhenPaid: true,
69
87
  smallTicketDataFlag: 1,
70
88
  confirmPendingVoucherPayments: true
71
- }));
89
+ });
90
+ if (!isCurrentOrder()) return { kind: "uncertain" };
91
+ return inspectPaymentCompletion(baseSales, result);
72
92
  } catch (error) {
73
93
  return {
74
94
  kind: "sync-failed",
@@ -86,14 +106,15 @@ function messageOf(error) {
86
106
  * A retry resumes this same confirmed payment; it never invokes a provider again.
87
107
  * Pending insertion avoids addOrderPayment's fire-and-forget paid synchronization.
88
108
  */
89
- function createFinalizer({ baseSales, method, confirmed, preparedPaymentNumber }) {
109
+ function createFinalizer({ baseSales, method, confirmed, preparedPaymentNumber, isCurrentOrder }) {
90
110
  var _confirmed$metadata;
91
111
  let paymentNumber = preparedPaymentNumber;
92
112
  const transactionNumber = (_confirmed$metadata = confirmed.metadata) === null || _confirmed$metadata === void 0 ? void 0 : _confirmed$metadata.unique_payment_number;
93
113
  const attemptId = `kiosk-${Date.now()}-${Math.random().toString(36).slice(2)}`;
94
114
  const metadata = require_objectSpread2._objectSpread2(require_objectSpread2._objectSpread2({}, confirmed.metadata), {}, { unique_payment_number: transactionNumber || attemptId });
95
115
  return function() {
96
- var _ref4 = require_asyncToGenerator._asyncToGenerator(function* () {
116
+ var _ref5 = require_asyncToGenerator._asyncToGenerator(function* () {
117
+ if (!isCurrentOrder()) return { kind: "uncertain" };
97
118
  try {
98
119
  var _baseSales$getOrderPa4;
99
120
  let payments = ((_baseSales$getOrderPa4 = baseSales.getOrderPayments) === null || _baseSales$getOrderPa4 === void 0 ? void 0 : _baseSales$getOrderPa4.call(baseSales)) || [];
@@ -123,10 +144,11 @@ function createFinalizer({ baseSales, method, confirmed, preparedPaymentNumber }
123
144
  return ((_item$metadata2 = item.metadata) === null || _item$metadata2 === void 0 ? void 0 : _item$metadata2.unique_payment_number) === metadata.unique_payment_number;
124
145
  });
125
146
  }
147
+ if (!isCurrentOrder()) return { kind: "uncertain" };
126
148
  paymentNumber = String((payment === null || payment === void 0 ? void 0 : payment.payment_number) || "").trim();
127
149
  if (!paymentNumber) throw new Error("The recorded payment has no payment number.");
128
- if (payment.status === "paid") return syncConfirmedPayments(baseSales);
129
- return inspectPaymentCompletion(baseSales, preparedPaymentNumber ? yield require_pendingEftposLifecycle.completePendingEftposPayment({
150
+ if (payment.status === "paid") return syncConfirmedPayments(baseSales, isCurrentOrder);
151
+ const result = preparedPaymentNumber ? yield require_pendingEftposLifecycle.completePendingEftposPayment({
130
152
  baseSales,
131
153
  paymentNumber,
132
154
  amount: confirmed.amount,
@@ -142,7 +164,9 @@ function createFinalizer({ baseSales, method, confirmed, preparedPaymentNumber }
142
164
  }, {
143
165
  persistDraft: true,
144
166
  submitWhenPaid: true
145
- }));
167
+ });
168
+ if (!isCurrentOrder()) return { kind: "uncertain" };
169
+ return inspectPaymentCompletion(baseSales, result);
146
170
  } catch (error) {
147
171
  return {
148
172
  kind: "sync-failed",
@@ -152,7 +176,7 @@ function createFinalizer({ baseSales, method, confirmed, preparedPaymentNumber }
152
176
  }
153
177
  });
154
178
  return function finalize() {
155
- return _ref4.apply(this, arguments);
179
+ return _ref5.apply(this, arguments);
156
180
  };
157
181
  }();
158
182
  }
@@ -165,6 +189,7 @@ function _executeKioskPayment() {
165
189
  const terminal = require_constants.CHECKOUT_VISIBLE_PAYMENT_CODES.includes(code);
166
190
  let prepared;
167
191
  let dispatched = false;
192
+ const isCurrentOrder = capturePaymentOrder(baseSales);
168
193
  try {
169
194
  var _confirmed$metadata2;
170
195
  assertCurrent();
@@ -176,6 +201,7 @@ function _executeKioskPayment() {
176
201
  method,
177
202
  amount
178
203
  });
204
+ if (!isCurrentOrder()) return { kind: "uncertain" };
179
205
  assertCurrent();
180
206
  dispatched = terminal;
181
207
  const confirmed = terminal ? yield runtime.execute({
@@ -195,6 +221,7 @@ function _executeKioskPayment() {
195
221
  percentage: method.percentage
196
222
  } : null
197
223
  };
224
+ if (!isCurrentOrder()) return { kind: "uncertain" };
198
225
  if (confirmed.status !== "success") {
199
226
  if (confirmed.preservePendingPayment) return {
200
227
  kind: "uncertain",
@@ -219,20 +246,24 @@ function _executeKioskPayment() {
219
246
  baseSales,
220
247
  method,
221
248
  confirmed,
222
- preparedPaymentNumber: prepared === null || prepared === void 0 ? void 0 : prepared.paymentNumber
249
+ preparedPaymentNumber: prepared === null || prepared === void 0 ? void 0 : prepared.paymentNumber,
250
+ isCurrentOrder
223
251
  })();
224
252
  } catch (error) {
225
253
  if (dispatched) return {
226
254
  kind: "uncertain",
227
255
  message: messageOf(error)
228
256
  };
229
- if (prepared) try {
230
- yield require_pendingEftposLifecycle.discardPendingEftposPayment(baseSales, prepared.paymentNumber);
231
- } catch (rollbackError) {
232
- return {
233
- kind: "uncertain",
234
- message: messageOf(rollbackError)
235
- };
257
+ if (prepared) {
258
+ if (!isCurrentOrder()) return { kind: "uncertain" };
259
+ try {
260
+ yield require_pendingEftposLifecycle.discardPendingEftposPayment(baseSales, prepared.paymentNumber);
261
+ } catch (rollbackError) {
262
+ return {
263
+ kind: "uncertain",
264
+ message: messageOf(rollbackError)
265
+ };
266
+ }
236
267
  }
237
268
  return {
238
269
  kind: "failed",
@@ -472,7 +472,7 @@ const PaymentContent = (0, react.forwardRef)(({ cartData, orderInfo, isModalOpen
472
472
  const [showCashPayment, setShowCashPayment] = (0, react.useState)(false);
473
473
  const [paymentOptionsTitle, setPaymentOptionsTitle] = (0, react.useState)(_pisell_utils.locales.getText("cards.and.digitals") || "Cards & Digitals");
474
474
  require_OsKeyContext.useOsKey();
475
- const paymentChannel = (0, react.useMemo)(() => String((getData === null || getData === void 0 ? void 0 : getData("channel")) || "pos").trim().toLowerCase(), [getData]);
475
+ const paymentChannel = (0, react.useMemo)(() => String((getData === null || getData === void 0 ? void 0 : getData("channel")) || "").trim().toLowerCase(), [getData]);
476
476
  const paymentScanActivity = require_useCheckoutPaymentScanActivity.default(paymentChannel === "kiosk");
477
477
  const activeKioskPaymentActivityRef = (0, react.useRef)();
478
478
  const paymentOptionList = (0, react.useMemo)(() => {
@@ -1739,7 +1739,7 @@ const PaymentContent = (0, react.forwardRef)(({ cartData, orderInfo, isModalOpen
1739
1739
  style: { marginTop: "10px" }
1740
1740
  }, _pisell_utils.locales.getText("order.start-new-order")) } } : {}), {}, {
1741
1741
  platform: paymentChannel || "pos",
1742
- usageScene: paymentChannel === "kiosk" ? "user" : "merchant",
1742
+ usageScene: require_constants.MERCHANT_CHANNELS.includes(paymentChannel) ? "merchant" : "user",
1743
1743
  onChange: function() {
1744
1744
  var _ref29 = require_asyncToGenerator._asyncToGenerator(function* (event) {
1745
1745
  const isTerminalEvent = event.type === "success" || event.type === "closed" || event.type === "printOnTimeout";
@@ -108,13 +108,13 @@ const PaymentMethodItem = ({ appearance = "default", method, amountSymbol, custo
108
108
  if (finishPaymentActivity && !finishPaymentActivity.isActive()) return;
109
109
  const authorizationResult = yield Promise.resolve((_window = window) === null || _window === void 0 || (_window = _window.app) === null || _window === void 0 ? void 0 : _window.applicationManager.get("global").runFunction("authorizeAction", {
110
110
  onClose: finishPaymentActivity,
111
- params: {
111
+ params: require_objectSpread2._objectSpread2({
112
112
  action: "pay",
113
113
  business_code: otherParams.businessCode || otherParams.business_code,
114
114
  paymentMethodCode: method.code,
115
115
  paymentMethodType: method.type,
116
116
  amount: customAmount
117
- }
117
+ }, (finishPaymentActivity === null || finishPaymentActivity === void 0 ? void 0 : finishPaymentActivity.paymentRequestId) ? { paymentRequestId: finishPaymentActivity.paymentRequestId } : {})
118
118
  }));
119
119
  if (String((authorizationResult === null || authorizationResult === void 0 ? void 0 : authorizationResult.status) || "").toLowerCase() !== "success") finishPaymentActivity === null || finishPaymentActivity === void 0 || finishPaymentActivity();
120
120
  } catch (error) {
@@ -9,6 +9,8 @@ const WALLET_PASS_CODE_MAP = {
9
9
  "gift_card": "GIFTCARD",
10
10
  "point_card": "POINTCARD"
11
11
  };
12
+ /** 仅明确的商户渠道可使用人工确认等商户支付操作。 */
13
+ const MERCHANT_CHANNELS = ["pos"];
12
14
  const SCI_PAYMENT_CODES = [
13
15
  "EFTPOS_LINKLY",
14
16
  "EFTPOS_TYRO",
@@ -48,6 +50,7 @@ const PI_PAYMENT_PROVIDER_MAP = {
48
50
  const resolvePiPaymentProvider = (code, enabled) => enabled ? PI_PAYMENT_PROVIDER_MAP[code] : void 0;
49
51
  //#endregion
50
52
  exports.CHECKOUT_VISIBLE_PAYMENT_CODES = CHECKOUT_VISIBLE_PAYMENT_CODES;
53
+ exports.MERCHANT_CHANNELS = MERCHANT_CHANNELS;
51
54
  exports.SCI_PAYMENT_CODES = SCI_PAYMENT_CODES;
52
55
  exports.SCI_PAYMENT_CODE_TO_READER_TYPE = SCI_PAYMENT_CODE_TO_READER_TYPE;
53
56
  exports.SPI_PAYMENT_CODES = SPI_PAYMENT_CODES;
@@ -62,7 +62,7 @@ const PaymentMethodRuntime = (0, react.forwardRef)(function PaymentMethodRuntime
62
62
  const paymentMethodsRef = (0, react.useRef)(null);
63
63
  const piPaymentRef = (0, react.useRef)(null);
64
64
  const { getData } = context.appHelper.utils || {};
65
- const paymentChannel = (0, react.useMemo)(() => String((getData === null || getData === void 0 ? void 0 : getData("channel")) || "pos").trim().toLowerCase(), [getData]);
65
+ const paymentChannel = (0, react.useMemo)(() => String((getData === null || getData === void 0 ? void 0 : getData("channel")) || "").trim().toLowerCase(), [getData]);
66
66
  const calculateSurcharge = (surchargeConfig, amount) => {
67
67
  if (!(surchargeConfig === null || surchargeConfig === void 0 ? void 0 : surchargeConfig.is_surcharge)) return 0;
68
68
  const baseAmount = Number(amount) || 0;
@@ -244,7 +244,7 @@ const PaymentMethodRuntime = (0, react.forwardRef)(function PaymentMethodRuntime
244
244
  type: "shop"
245
245
  },
246
246
  platform: paymentChannel || "pos",
247
- usageScene: paymentChannel === "kiosk" ? "user" : "merchant",
247
+ usageScene: require_constants.MERCHANT_CHANNELS.includes(paymentChannel) ? "merchant" : "user",
248
248
  onChange: (event) => {
249
249
  var _compatibleEvent$para, _compatibleEvent$para2;
250
250
  if (settled) return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/private-materials",
3
- "version": "6.11.803",
3
+ "version": "6.11.804",
4
4
  "main": "./lib/index.js",
5
5
  "module": "./es/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -72,10 +72,10 @@
72
72
  "styled-components": "^6.0.0-rc.3",
73
73
  "use-sync-external-store": "^1.6.0",
74
74
  "@pisell/pi-payment-sdk": "0.0.3",
75
- "@pisell/icon": "0.0.11",
75
+ "@pisell/utils": "3.0.7",
76
76
  "@pisell/materials": "6.11.802",
77
77
  "@pisell/date-picker": "3.0.12",
78
- "@pisell/utils": "3.0.7"
78
+ "@pisell/icon": "0.0.11"
79
79
  },
80
80
  "peerDependencies": {
81
81
  "react": "^18.0.0",