@pisell/private-materials 6.12.336 → 6.12.337

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.
@@ -13,11 +13,12 @@ import { useSalesSdkProducts } from "../../salesSdk/hooks/useSalesSdkProducts.js
13
13
  import { shouldCloseDialogAfterCheckout } from "../components/DetailActions/utils.js";
14
14
  import { AdjustTimeModal } from "../../salesSdk/adjustTime/AdjustTimeModal.js";
15
15
  import SelectBookingsModal from "../../salesSdk/adjustTime/components/SelectBookingsModal.js";
16
- import { getResourceEndTimeFromOrigin, mapSaleDetailAdjustTimeBooking, mapSaleDetailAdjustTimeProducts } from "../utils/adjustTimeAdapter.js";
16
+ import { getResourceEndTimeFromOrigin, isSaleDetailAddTimeProductUsableForBookings, mapSaleDetailAdjustTimeBooking, mapSaleDetailAdjustTimeProducts, mapSaleDetailAdjustTimeProductsForBookings } from "../utils/adjustTimeAdapter.js";
17
17
  import { resolveAdjustTimeOrderAmounts } from "../utils/adjustTimeOrderAmounts.js";
18
18
  import dayjs from "dayjs";
19
19
  import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
20
20
  import { message } from "antd";
21
+ import { locales } from "@pisell/utils";
21
22
  import Decimal from "decimal.js";
22
23
  import { cloneDeep } from "lodash";
23
24
  import { useMemoizedFn } from "ahooks";
@@ -339,6 +340,19 @@ function useAdjustTimeModal(options) {
339
340
  return acc;
340
341
  }, []);
341
342
  }, []);
343
+ /** 在任何逐票写入前整组校验,也阻止重新选票前的旧结果被提交。 */
344
+ const assertAddTimeProductsUsable = useMemoizedFn((result) => {
345
+ if (result.actionType === "restart" || result.actionType === "changeTime") return;
346
+ const cacheItems = selectedBookings.map(resolveCacheItem);
347
+ const usableProductIds = new Set(products.filter((product) => isSaleDetailAddTimeProductUsableForBookings(product._originalProduct, cacheItems)).map((product) => String(product.id)));
348
+ const lines = buildPreviewAddTimeLines(result);
349
+ const invalidSelectedProduct = result.actionType === "product" && (result.selectedProductId == null || !usableProductIds.has(String(result.selectedProductId)));
350
+ const invalidLines = lines.length !== (result.autoPricing.lines || []).length || lines.some((line) => {
351
+ var _line$product$id;
352
+ return !usableProductIds.has(String((_line$product$id = line.product.id) !== null && _line$product$id !== void 0 ? _line$product$id : line.product.product_id)) || !isSaleDetailAddTimeProductUsableForBookings(line.product, cacheItems);
353
+ });
354
+ if (invalidSelectedProduct || invalidLines) throw new Error(locales.getText("pisell2.sale-detail.add-time-products-not-applicable"));
355
+ });
342
356
  const buildChangeTimePreviewQueries = useMemoizedFn((result) => {
343
357
  var _bookingTicket$getTem, _bookingTicket$getTem2;
344
358
  const bookingTicket = sales === null || sales === void 0 ? void 0 : sales.bookingTicket;
@@ -420,6 +434,7 @@ function useAdjustTimeModal(options) {
420
434
  return;
421
435
  }
422
436
  const addTimeLines = buildPreviewAddTimeLines(result);
437
+ assertAddTimeProductsUsable(result);
423
438
  if (!addTimeLines.length) return;
424
439
  for (const selectedBooking of selectedBookings) yield salesSdkCart.addAddTimeProducts({
425
440
  booking: selectedBooking,
@@ -520,7 +535,7 @@ function useAdjustTimeModal(options) {
520
535
  yield ensureAdjustTimeResourcesReady(sales, primaryItem);
521
536
  const cacheItem = resolveCacheItem(primaryItem);
522
537
  const quotationSchedule = resolveBookingQuotationSchedule(primaryItem, cacheItem);
523
- const mappedProducts = mapSaleDetailAdjustTimeProducts((quotationSchedule.schedule_date ? yield getAddTimeProductsWithCache(quotationSchedule) : rawAddTimeProducts) || [], cacheItem);
538
+ const mappedProducts = mapSaleDetailAdjustTimeProductsForBookings((quotationSchedule.schedule_date ? yield getAddTimeProductsWithCache(quotationSchedule) : rawAddTimeProducts) || [], items.map(resolveCacheItem));
524
539
  const relationId = (_ref17 = (_cacheItem$_extend$re = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend3 = cacheItem._extend) === null || _cacheItem$_extend3 === void 0 ? void 0 : _cacheItem$_extend3.relation_id) !== null && _cacheItem$_extend$re !== void 0 ? _cacheItem$_extend$re : (_primaryItem$resource = primaryItem.resources) === null || _primaryItem$resource === void 0 || (_primaryItem$resource = _primaryItem$resource[0]) === null || _primaryItem$resource === void 0 ? void 0 : _primaryItem$resource.relation_id) !== null && _ref17 !== void 0 ? _ref17 : primaryItem.relation_id;
525
540
  const resourcesOrigin = (booking === null || booking === void 0 || (_booking$getResources = booking.getResourcesOrigin) === null || _booking$getResources === void 0 ? void 0 : _booking$getResources.call(booking)) || [];
526
541
  const nextSnapshot = combineBookingSnapshots(items.map((item) => mapSaleDetailAdjustTimeBooking(item, resolveCacheItem(item))));
@@ -653,14 +668,15 @@ function useAdjustTimeModal(options) {
653
668
  * await submitAdjustTimeResult(result, 'save');
654
669
  */
655
670
  const submitAdjustTimeResult = useMemoizedFn(function() {
656
- var _ref24 = _asyncToGenerator(function* (_result, mode) {
671
+ var _ref24 = _asyncToGenerator(function* (result, mode) {
657
672
  if (!selectedBookings.length) return;
658
673
  try {
674
+ yield previewQueueRef.current;
675
+ yield salesSdkCart.waitForCartConsistency();
676
+ assertAddTimeProductsUsable(result);
659
677
  if (yield function() {
660
678
  var _ref23 = _asyncToGenerator(function* () {
661
679
  if (mode === "checkout") {
662
- yield previewQueueRef.current;
663
- yield salesSdkCart.waitForCartConsistency();
664
680
  const checkoutResult = yield sales === null || sales === void 0 ? void 0 : sales.openCheckout();
665
681
  const isBackWithPaymentChanged = (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.reason) === "back" && (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.isChangePaymentNotIncludeVoucher) === true;
666
682
  const isBackWithoutPayment = (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.reason) === "back" && !isBackWithPaymentChanged;
@@ -1,6 +1,7 @@
1
1
  //#region src/plus/saleDetail/locales.ts
2
2
  var locales_default = {
3
3
  en: {
4
+ "pisell2.sale-detail.add-time-products-not-applicable": "These time extension products are not available for all selected tickets. Please select tickets again.",
4
5
  "pisell2.text.checkout": "Checkout",
5
6
  "pisell2.text.add-order-notes": "Add Order Note",
6
7
  "pisell1.text.edit-status-success": "Edit status successfully",
@@ -396,6 +397,7 @@ var locales_default = {
396
397
  "pisell2.sale-detail.order-saved-success": "Order saved. You can find it in Order List."
397
398
  },
398
399
  "zh-CN": {
400
+ "pisell2.sale-detail.add-time-products-not-applicable": "加时商品不适用于全部已选票,请重新选票。",
399
401
  "pisell2.text.checkout": "结账",
400
402
  "pisell2.text.add-order-notes": "添加订单备注",
401
403
  "pisell1.text.edit-status-success": "编辑状态成功",
@@ -791,6 +793,7 @@ var locales_default = {
791
793
  "pisell2.sale-detail.order-saved-success": "订单已保存。您可以在订单列表中找到它。"
792
794
  },
793
795
  "zh-HK": {
796
+ "pisell2.sale-detail.add-time-products-not-applicable": "加時商品不適用於全部已選票,請重新選票。",
794
797
  "pisell2.text.checkout": "結賬",
795
798
  "pisell2.text.add-order-notes": "添加訂單備注",
796
799
  "pisell1.text.edit-status-success": "編輯狀態成功",
@@ -1186,6 +1189,7 @@ var locales_default = {
1186
1189
  "pisell2.sale-detail.order-saved-success": "訂單已保存。 您可以在訂單清單中找到它。"
1187
1190
  },
1188
1191
  ja: {
1192
+ "pisell2.sale-detail.add-time-products-not-applicable": "選択したすべてのチケットに適用できない延長商品があります。チケットを選択し直してください。",
1189
1193
  "pisell2.text.checkout": "チェックアウト",
1190
1194
  "pisell2.text.add-order-notes": "注文メモを追加",
1191
1195
  "pisell1.text.edit-status-success": "ステータスの編集に成功",
@@ -1581,6 +1585,7 @@ var locales_default = {
1581
1585
  "pisell2.sale-detail.order-saved-success": "注文が保存されました。注文リストで確認できます。"
1582
1586
  },
1583
1587
  pt: {
1588
+ "pisell2.sale-detail.add-time-products-not-applicable": "Estes produtos de extensão de tempo não se aplicam a todos os bilhetes selecionados. Selecione os bilhetes novamente.",
1584
1589
  "pisell2.text.checkout": "Checkout",
1585
1590
  "pisell2.text.add-order-notes": "Adicionar Nota do Pedido",
1586
1591
  "pisell1.text.edit-status-success": "Status editado com sucesso",
@@ -73,9 +73,13 @@ function buildAddTimeMatchingCacheItem(cacheItem) {
73
73
  collection
74
74
  });
75
75
  }
76
- const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => {
77
- const matchingCacheItem = buildAddTimeMatchingCacheItem(cacheItem);
78
- return (rawProducts || []).filter((item) => isUsableProduct(item.add_time, matchingCacheItem)).map((item) => {
76
+ const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => mapSaleDetailAdjustTimeProductsForBookings(rawProducts, [cacheItem]);
77
+ /** 批量加时商品必须适用于每张票,不能用第一张票代表整组。 */
78
+ const isSaleDetailAddTimeProductUsableForBookings = (product, cacheItems) => {
79
+ return cacheItems.length > 0 && Boolean(product === null || product === void 0 ? void 0 : product.add_time) && cacheItems.every((cacheItem) => Boolean(cacheItem) && isUsableProduct(product.add_time, buildAddTimeMatchingCacheItem(cacheItem)));
80
+ };
81
+ const mapSaleDetailAdjustTimeProductsForBookings = (rawProducts, cacheItems) => {
82
+ return (rawProducts || []).filter((item) => isSaleDetailAddTimeProductUsableForBookings(item, cacheItems)).map((item) => {
79
83
  var _item$add_time, _item$add_time2, _item$add_time3, _item$add_time4, _item$add_time5, _item$add_time6;
80
84
  return {
81
85
  id: item.id,
@@ -90,4 +94,4 @@ const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => {
90
94
  });
91
95
  };
92
96
  //#endregion
93
- export { getResourceEndTimeFromOrigin, mapSaleDetailAdjustTimeBooking, mapSaleDetailAdjustTimeProducts };
97
+ export { getResourceEndTimeFromOrigin, isSaleDetailAddTimeProductUsableForBookings, mapSaleDetailAdjustTimeBooking, mapSaleDetailAdjustTimeProducts, mapSaleDetailAdjustTimeProductsForBookings };
@@ -21,6 +21,7 @@ dayjs = require_runtime.__toESM(dayjs);
21
21
  let react = require("react");
22
22
  react = require_runtime.__toESM(react);
23
23
  let antd = require("antd");
24
+ let _pisell_utils = require("@pisell/utils");
24
25
  let decimal_js = require("decimal.js");
25
26
  decimal_js = require_runtime.__toESM(decimal_js);
26
27
  let lodash = require("lodash");
@@ -343,6 +344,19 @@ function useAdjustTimeModal(options) {
343
344
  return acc;
344
345
  }, []);
345
346
  }, []);
347
+ /** 在任何逐票写入前整组校验,也阻止重新选票前的旧结果被提交。 */
348
+ const assertAddTimeProductsUsable = (0, ahooks.useMemoizedFn)((result) => {
349
+ if (result.actionType === "restart" || result.actionType === "changeTime") return;
350
+ const cacheItems = selectedBookings.map(resolveCacheItem);
351
+ const usableProductIds = new Set(products.filter((product) => require_adjustTimeAdapter.isSaleDetailAddTimeProductUsableForBookings(product._originalProduct, cacheItems)).map((product) => String(product.id)));
352
+ const lines = buildPreviewAddTimeLines(result);
353
+ const invalidSelectedProduct = result.actionType === "product" && (result.selectedProductId == null || !usableProductIds.has(String(result.selectedProductId)));
354
+ const invalidLines = lines.length !== (result.autoPricing.lines || []).length || lines.some((line) => {
355
+ var _line$product$id;
356
+ return !usableProductIds.has(String((_line$product$id = line.product.id) !== null && _line$product$id !== void 0 ? _line$product$id : line.product.product_id)) || !require_adjustTimeAdapter.isSaleDetailAddTimeProductUsableForBookings(line.product, cacheItems);
357
+ });
358
+ if (invalidSelectedProduct || invalidLines) throw new Error(_pisell_utils.locales.getText("pisell2.sale-detail.add-time-products-not-applicable"));
359
+ });
346
360
  const buildChangeTimePreviewQueries = (0, ahooks.useMemoizedFn)((result) => {
347
361
  var _bookingTicket$getTem, _bookingTicket$getTem2;
348
362
  const bookingTicket = sales === null || sales === void 0 ? void 0 : sales.bookingTicket;
@@ -424,6 +438,7 @@ function useAdjustTimeModal(options) {
424
438
  return;
425
439
  }
426
440
  const addTimeLines = buildPreviewAddTimeLines(result);
441
+ assertAddTimeProductsUsable(result);
427
442
  if (!addTimeLines.length) return;
428
443
  for (const selectedBooking of selectedBookings) yield salesSdkCart.addAddTimeProducts({
429
444
  booking: selectedBooking,
@@ -524,7 +539,7 @@ function useAdjustTimeModal(options) {
524
539
  yield ensureAdjustTimeResourcesReady(sales, primaryItem);
525
540
  const cacheItem = resolveCacheItem(primaryItem);
526
541
  const quotationSchedule = resolveBookingQuotationSchedule(primaryItem, cacheItem);
527
- const mappedProducts = require_adjustTimeAdapter.mapSaleDetailAdjustTimeProducts((quotationSchedule.schedule_date ? yield getAddTimeProductsWithCache(quotationSchedule) : rawAddTimeProducts) || [], cacheItem);
542
+ const mappedProducts = require_adjustTimeAdapter.mapSaleDetailAdjustTimeProductsForBookings((quotationSchedule.schedule_date ? yield getAddTimeProductsWithCache(quotationSchedule) : rawAddTimeProducts) || [], items.map(resolveCacheItem));
528
543
  const relationId = (_ref17 = (_cacheItem$_extend$re = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend3 = cacheItem._extend) === null || _cacheItem$_extend3 === void 0 ? void 0 : _cacheItem$_extend3.relation_id) !== null && _cacheItem$_extend$re !== void 0 ? _cacheItem$_extend$re : (_primaryItem$resource = primaryItem.resources) === null || _primaryItem$resource === void 0 || (_primaryItem$resource = _primaryItem$resource[0]) === null || _primaryItem$resource === void 0 ? void 0 : _primaryItem$resource.relation_id) !== null && _ref17 !== void 0 ? _ref17 : primaryItem.relation_id;
529
544
  const resourcesOrigin = (booking === null || booking === void 0 || (_booking$getResources = booking.getResourcesOrigin) === null || _booking$getResources === void 0 ? void 0 : _booking$getResources.call(booking)) || [];
530
545
  const nextSnapshot = combineBookingSnapshots(items.map((item) => require_adjustTimeAdapter.mapSaleDetailAdjustTimeBooking(item, resolveCacheItem(item))));
@@ -657,14 +672,15 @@ function useAdjustTimeModal(options) {
657
672
  * await submitAdjustTimeResult(result, 'save');
658
673
  */
659
674
  const submitAdjustTimeResult = (0, ahooks.useMemoizedFn)(function() {
660
- var _ref24 = require_asyncToGenerator._asyncToGenerator(function* (_result, mode) {
675
+ var _ref24 = require_asyncToGenerator._asyncToGenerator(function* (result, mode) {
661
676
  if (!selectedBookings.length) return;
662
677
  try {
678
+ yield previewQueueRef.current;
679
+ yield salesSdkCart.waitForCartConsistency();
680
+ assertAddTimeProductsUsable(result);
663
681
  if (yield function() {
664
682
  var _ref23 = require_asyncToGenerator._asyncToGenerator(function* () {
665
683
  if (mode === "checkout") {
666
- yield previewQueueRef.current;
667
- yield salesSdkCart.waitForCartConsistency();
668
684
  const checkoutResult = yield sales === null || sales === void 0 ? void 0 : sales.openCheckout();
669
685
  const isBackWithPaymentChanged = (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.reason) === "back" && (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.isChangePaymentNotIncludeVoucher) === true;
670
686
  const isBackWithoutPayment = (checkoutResult === null || checkoutResult === void 0 ? void 0 : checkoutResult.reason) === "back" && !isBackWithPaymentChanged;
@@ -1,6 +1,7 @@
1
1
  //#region src/plus/saleDetail/locales.ts
2
2
  var locales_default = {
3
3
  en: {
4
+ "pisell2.sale-detail.add-time-products-not-applicable": "These time extension products are not available for all selected tickets. Please select tickets again.",
4
5
  "pisell2.text.checkout": "Checkout",
5
6
  "pisell2.text.add-order-notes": "Add Order Note",
6
7
  "pisell1.text.edit-status-success": "Edit status successfully",
@@ -396,6 +397,7 @@ var locales_default = {
396
397
  "pisell2.sale-detail.order-saved-success": "Order saved. You can find it in Order List."
397
398
  },
398
399
  "zh-CN": {
400
+ "pisell2.sale-detail.add-time-products-not-applicable": "加时商品不适用于全部已选票,请重新选票。",
399
401
  "pisell2.text.checkout": "结账",
400
402
  "pisell2.text.add-order-notes": "添加订单备注",
401
403
  "pisell1.text.edit-status-success": "编辑状态成功",
@@ -791,6 +793,7 @@ var locales_default = {
791
793
  "pisell2.sale-detail.order-saved-success": "订单已保存。您可以在订单列表中找到它。"
792
794
  },
793
795
  "zh-HK": {
796
+ "pisell2.sale-detail.add-time-products-not-applicable": "加時商品不適用於全部已選票,請重新選票。",
794
797
  "pisell2.text.checkout": "結賬",
795
798
  "pisell2.text.add-order-notes": "添加訂單備注",
796
799
  "pisell1.text.edit-status-success": "編輯狀態成功",
@@ -1186,6 +1189,7 @@ var locales_default = {
1186
1189
  "pisell2.sale-detail.order-saved-success": "訂單已保存。 您可以在訂單清單中找到它。"
1187
1190
  },
1188
1191
  ja: {
1192
+ "pisell2.sale-detail.add-time-products-not-applicable": "選択したすべてのチケットに適用できない延長商品があります。チケットを選択し直してください。",
1189
1193
  "pisell2.text.checkout": "チェックアウト",
1190
1194
  "pisell2.text.add-order-notes": "注文メモを追加",
1191
1195
  "pisell1.text.edit-status-success": "ステータスの編集に成功",
@@ -1581,6 +1585,7 @@ var locales_default = {
1581
1585
  "pisell2.sale-detail.order-saved-success": "注文が保存されました。注文リストで確認できます。"
1582
1586
  },
1583
1587
  pt: {
1588
+ "pisell2.sale-detail.add-time-products-not-applicable": "Estes produtos de extensão de tempo não se aplicam a todos os bilhetes selecionados. Selecione os bilhetes novamente.",
1584
1589
  "pisell2.text.checkout": "Checkout",
1585
1590
  "pisell2.text.add-order-notes": "Adicionar Nota do Pedido",
1586
1591
  "pisell1.text.edit-status-success": "Status editado com sucesso",
@@ -75,9 +75,13 @@ function buildAddTimeMatchingCacheItem(cacheItem) {
75
75
  collection
76
76
  });
77
77
  }
78
- const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => {
79
- const matchingCacheItem = buildAddTimeMatchingCacheItem(cacheItem);
80
- return (rawProducts || []).filter((item) => require_utils.isUsableProduct(item.add_time, matchingCacheItem)).map((item) => {
78
+ const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => mapSaleDetailAdjustTimeProductsForBookings(rawProducts, [cacheItem]);
79
+ /** 批量加时商品必须适用于每张票,不能用第一张票代表整组。 */
80
+ const isSaleDetailAddTimeProductUsableForBookings = (product, cacheItems) => {
81
+ return cacheItems.length > 0 && Boolean(product === null || product === void 0 ? void 0 : product.add_time) && cacheItems.every((cacheItem) => Boolean(cacheItem) && require_utils.isUsableProduct(product.add_time, buildAddTimeMatchingCacheItem(cacheItem)));
82
+ };
83
+ const mapSaleDetailAdjustTimeProductsForBookings = (rawProducts, cacheItems) => {
84
+ return (rawProducts || []).filter((item) => isSaleDetailAddTimeProductUsableForBookings(item, cacheItems)).map((item) => {
81
85
  var _item$add_time, _item$add_time2, _item$add_time3, _item$add_time4, _item$add_time5, _item$add_time6;
82
86
  return {
83
87
  id: item.id,
@@ -93,5 +97,7 @@ const mapSaleDetailAdjustTimeProducts = (rawProducts, cacheItem) => {
93
97
  };
94
98
  //#endregion
95
99
  exports.getResourceEndTimeFromOrigin = getResourceEndTimeFromOrigin;
100
+ exports.isSaleDetailAddTimeProductUsableForBookings = isSaleDetailAddTimeProductUsableForBookings;
96
101
  exports.mapSaleDetailAdjustTimeBooking = mapSaleDetailAdjustTimeBooking;
97
102
  exports.mapSaleDetailAdjustTimeProducts = mapSaleDetailAdjustTimeProducts;
103
+ exports.mapSaleDetailAdjustTimeProductsForBookings = mapSaleDetailAdjustTimeProductsForBookings;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pisell/private-materials",
3
- "version": "6.12.336",
3
+ "version": "6.12.337",
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/utils": "3.0.7",
76
- "@pisell/icon": "0.0.11",
77
75
  "@pisell/materials": "6.12.81",
78
- "@pisell/date-picker": "3.0.12"
76
+ "@pisell/utils": "3.0.7",
77
+ "@pisell/date-picker": "3.0.12",
78
+ "@pisell/icon": "0.0.11"
79
79
  },
80
80
  "peerDependencies": {
81
81
  "react": "^18.0.0",