@pisell/pisellos 2.3.149 → 2.3.151

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 (42) hide show
  1. package/dist/model/strategy/adapter/itemRule/adapter.d.ts +3 -1
  2. package/dist/model/strategy/adapter/itemRule/adapter.js +74 -7
  3. package/dist/model/strategy/adapter/itemRule/evaluator.d.ts +3 -1
  4. package/dist/model/strategy/adapter/itemRule/evaluator.js +13 -0
  5. package/dist/model/strategy/adapter/itemRule/type.d.ts +40 -1
  6. package/dist/model/strategy/adapter/itemRule/type.js +10 -0
  7. package/dist/modules/OpenData/types.d.ts +2 -0
  8. package/dist/modules/Order/index.d.ts +4 -2
  9. package/dist/modules/Order/index.js +115 -67
  10. package/dist/modules/Order/types.d.ts +7 -1
  11. package/dist/modules/Rules/index.js +75 -54
  12. package/dist/solution/BaseSales/fulfillmentItemRules.d.ts +27 -0
  13. package/dist/solution/BaseSales/fulfillmentItemRules.js +750 -0
  14. package/dist/solution/BaseSales/index.d.ts +5 -1
  15. package/dist/solution/BaseSales/index.js +1116 -1021
  16. package/dist/solution/BaseSales/pickupTiming.d.ts +2 -0
  17. package/dist/solution/BaseSales/pickupTiming.js +16 -5
  18. package/dist/solution/BookingByStep/index.d.ts +1 -1
  19. package/dist/solution/BookingTicket/index.d.ts +1 -0
  20. package/dist/solution/BookingTicket/index.js +444 -425
  21. package/lib/model/strategy/adapter/itemRule/adapter.d.ts +3 -1
  22. package/lib/model/strategy/adapter/itemRule/adapter.js +54 -4
  23. package/lib/model/strategy/adapter/itemRule/evaluator.d.ts +3 -1
  24. package/lib/model/strategy/adapter/itemRule/evaluator.js +9 -0
  25. package/lib/model/strategy/adapter/itemRule/type.d.ts +40 -1
  26. package/lib/model/strategy/adapter/itemRule/type.js +10 -0
  27. package/lib/model/strategy/adapter/promotion/index.js +46 -1
  28. package/lib/modules/OpenData/types.d.ts +2 -0
  29. package/lib/modules/Order/index.d.ts +4 -2
  30. package/lib/modules/Order/index.js +33 -14
  31. package/lib/modules/Order/types.d.ts +7 -1
  32. package/lib/modules/Rules/index.js +22 -3
  33. package/lib/solution/BaseSales/fulfillmentItemRules.d.ts +27 -0
  34. package/lib/solution/BaseSales/fulfillmentItemRules.js +259 -0
  35. package/lib/solution/BaseSales/index.d.ts +5 -1
  36. package/lib/solution/BaseSales/index.js +38 -2
  37. package/lib/solution/BaseSales/pickupTiming.d.ts +2 -0
  38. package/lib/solution/BaseSales/pickupTiming.js +5 -1
  39. package/lib/solution/BookingByStep/index.d.ts +1 -1
  40. package/lib/solution/BookingTicket/index.d.ts +1 -0
  41. package/lib/solution/BookingTicket/index.js +3 -0
  42. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  import type { EvaluationResult, RuntimeContext, ActionEffect } from '../../type';
2
2
  import type { BusinessAdapter } from '../type';
3
- import { type ItemRuleBusinessData, type QuantityCheckResult, type PrefillItemResult, type QuantityLimitResult, type AllergyRequirement } from './type';
3
+ import { type ItemRuleBusinessData, type ItemRuleCartAction, type QuantityCheckResult, type PrefillItemResult, type QuantityLimitResult, type AllergyRequirement } from './type';
4
4
  /**
5
5
  * ItemRule 适配器
6
6
  *
@@ -14,6 +14,7 @@ export declare class ItemRuleAdapter implements BusinessAdapter {
14
14
  transformResult(result: EvaluationResult, businessData?: ItemRuleBusinessData): {
15
15
  quantityChecks: QuantityCheckResult[];
16
16
  prefillItems: PrefillItemResult[];
17
+ cartActions: ItemRuleCartAction[];
17
18
  allergyRequirements: AllergyRequirement[];
18
19
  };
19
20
  private processAllergyCheck;
@@ -66,5 +67,6 @@ export declare class ItemRuleAdapter implements BusinessAdapter {
66
67
  * 根据 quantityFrom 计算预填数量
67
68
  */
68
69
  private resolvePrefillQuantity;
70
+ private processDeleteProduct;
69
71
  }
70
72
  export default ItemRuleAdapter;
@@ -73,11 +73,13 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
73
73
  value: function transformResult(result, businessData) {
74
74
  var quantityChecks = [];
75
75
  var prefillItems = [];
76
+ var cartActions = [];
76
77
  var allergyRequirements = [];
77
78
  if (!result.applicable || !businessData) {
78
79
  return {
79
80
  quantityChecks: quantityChecks,
80
81
  prefillItems: prefillItems,
82
+ cartActions: cartActions,
81
83
  allergyRequirements: allergyRequirements
82
84
  };
83
85
  }
@@ -93,7 +95,31 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
93
95
  }
94
96
  } else if (action.type === ITEM_RULE_ACTION_TYPES.PREFILL_CART) {
95
97
  var items = this.processPrefillCart(action, businessData);
96
- prefillItems.push.apply(prefillItems, _toConsumableArray(items));
98
+ prefillItems.push.apply(prefillItems, _toConsumableArray(items.filter(function (item) {
99
+ return item.quantity > 0;
100
+ })));
101
+ if (items.length) {
102
+ var _action$priority;
103
+ cartActions.push({
104
+ type: ITEM_RULE_ACTION_TYPES.PREFILL_CART,
105
+ strategyId: result.config.metadata.id,
106
+ ruleId: action.id,
107
+ priority: (_action$priority = action.priority) !== null && _action$priority !== void 0 ? _action$priority : 0,
108
+ products: items
109
+ });
110
+ }
111
+ } else if (action.type === ITEM_RULE_ACTION_TYPES.DELETE_PRODUCT) {
112
+ var products = this.processDeleteProduct(action, businessData);
113
+ if (products.length) {
114
+ var _action$priority2;
115
+ cartActions.push({
116
+ type: ITEM_RULE_ACTION_TYPES.DELETE_PRODUCT,
117
+ strategyId: result.config.metadata.id,
118
+ ruleId: action.id,
119
+ priority: (_action$priority2 = action.priority) !== null && _action$priority2 !== void 0 ? _action$priority2 : 0,
120
+ products: products
121
+ });
122
+ }
97
123
  } else if (action.type === ITEM_RULE_ACTION_TYPES.ALLERGY_CHECK) {
98
124
  var requirement = this.processAllergyCheck(action, result, businessData);
99
125
  if (requirement) allergyRequirements.push(requirement);
@@ -107,6 +133,7 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
107
133
  return {
108
134
  quantityChecks: quantityChecks,
109
135
  prefillItems: prefillItems,
136
+ cartActions: cartActions,
110
137
  allergyRequirements: allergyRequirements
111
138
  };
112
139
  }
@@ -117,7 +144,7 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
117
144
  }, {
118
145
  key: "processAllergyCheck",
119
146
  value: function processAllergyCheck(action, result, businessData) {
120
- var _currentProduct$produ, _productTargets$find, _target$dataSource, _action$priority, _target$product_varia;
147
+ var _currentProduct$produ, _productTargets$find, _target$dataSource, _action$priority3, _target$product_varia;
121
148
  var config = action.config;
122
149
  var currentProduct = businessData.currentProduct;
123
150
  if (!config || config.targetType !== 'product' || config.promptScope !== 'once_per_order_product' || !Array.isArray(config.targets) || !currentProduct) {
@@ -142,7 +169,7 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
142
169
  return _objectSpread(_objectSpread({
143
170
  strategyId: result.config.metadata.id,
144
171
  ruleId: action.id,
145
- priority: (_action$priority = action.priority) !== null && _action$priority !== void 0 ? _action$priority : 0,
172
+ priority: (_action$priority3 = action.priority) !== null && _action$priority3 !== void 0 ? _action$priority3 : 0,
146
173
  targetType: 'product',
147
174
  product_id: currentProductId
148
175
  }, Number((_target$product_varia = target.product_variant_id) !== null && _target$product_varia !== void 0 ? _target$product_varia : 0) > 0 ? {
@@ -536,7 +563,9 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
536
563
  key: "processPrefillCart",
537
564
  value: function processPrefillCart(action, businessData) {
538
565
  var config = action.config;
539
- if (!(config !== null && config !== void 0 && config.products)) return [];
566
+ if (!Array.isArray(config === null || config === void 0 ? void 0 : config.products)) return [];
567
+ if (config.scope !== businessData.executionScope) return [];
568
+ if (config.scope === 'set_handover' && action.target !== 'cart') return [];
540
569
  var results = [];
541
570
  var _iterator7 = _createForOfIteratorHelper(config.products),
542
571
  _step7;
@@ -544,13 +573,18 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
544
573
  for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
545
574
  var prefillProduct = _step7.value;
546
575
  var quantity = this.resolvePrefillQuantity(prefillProduct.quantityFrom, prefillProduct.quantity, businessData);
547
- if (quantity <= 0) continue;
548
- results.push({
576
+ var shouldSyncZero = config.scope === 'set_handover' && prefillProduct.repeat_skip === true;
577
+ if (!Number.isFinite(quantity) || quantity < 0 || quantity === 0 && !shouldSyncZero) {
578
+ continue;
579
+ }
580
+ results.push(_objectSpread({
549
581
  ruleId: action.id,
550
582
  product_id: prefillProduct.product_id,
551
583
  product_variant_id: prefillProduct.product_variant_id,
552
584
  quantity: quantity
553
- });
585
+ }, prefillProduct.repeat_skip !== undefined ? {
586
+ repeat_skip: prefillProduct.repeat_skip === true
587
+ } : {}));
554
588
  }
555
589
  } catch (err) {
556
590
  _iterator7.e(err);
@@ -573,10 +607,43 @@ export var ItemRuleAdapter = /*#__PURE__*/function () {
573
607
  return businessData.pax.adult;
574
608
  case 'fixed':
575
609
  return fixedValue !== null && fixedValue !== void 0 ? fixedValue : 0;
610
+ case 'main_product_number':
611
+ {
612
+ var _businessData$mainPro;
613
+ var mainProductNumber = (_businessData$mainPro = businessData.mainProductNumber) !== null && _businessData$mainPro !== void 0 ? _businessData$mainPro : 0;
614
+ return Number.isFinite(mainProductNumber) ? Math.max(0, mainProductNumber) : 0;
615
+ }
576
616
  default:
577
617
  return fixedValue !== null && fixedValue !== void 0 ? fixedValue : 0;
578
618
  }
579
619
  }
620
+ }, {
621
+ key: "processDeleteProduct",
622
+ value: function processDeleteProduct(action, businessData) {
623
+ var config = action.config;
624
+ if (action.target !== 'cart' || (config === null || config === void 0 ? void 0 : config.scope) !== 'set_handover' || config.scope !== businessData.executionScope || !Array.isArray(config.products)) {
625
+ return [];
626
+ }
627
+ var productIds = new Set();
628
+ var _iterator8 = _createForOfIteratorHelper(config.products),
629
+ _step8;
630
+ try {
631
+ for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
632
+ var product = _step8.value;
633
+ var productId = Number(product === null || product === void 0 ? void 0 : product.product_id);
634
+ if (Number.isInteger(productId) && productId > 0) productIds.add(productId);
635
+ }
636
+ } catch (err) {
637
+ _iterator8.e(err);
638
+ } finally {
639
+ _iterator8.f();
640
+ }
641
+ return Array.from(productIds, function (product_id) {
642
+ return {
643
+ product_id: product_id
644
+ };
645
+ });
646
+ }
580
647
  }]);
581
648
  return ItemRuleAdapter;
582
649
  }();
@@ -1,5 +1,5 @@
1
1
  import type { StrategyConfig } from '../../type';
2
- import { type ItemRuleBusinessData, type ItemRuleEvaluationResult, type QuantityCheckResult, type QuantityLimitResult, type PrefillItemResult, type AllergyRequirement } from './type';
2
+ import { type ItemRuleBusinessData, type ItemRuleEvaluationResult, type QuantityCheckResult, type QuantityLimitResult, type PrefillItemResult, type ItemRuleCartAction, type AllergyRequirement } from './type';
3
3
  /**
4
4
  * ItemRule 评估器
5
5
  *
@@ -47,4 +47,6 @@ export declare class ItemRuleEvaluator {
47
47
  * 便捷方法:仅获取需要预填到购物车的商品
48
48
  */
49
49
  getPrefillItems(businessData: ItemRuleBusinessData): PrefillItemResult[];
50
+ /** 获取按优先级排序的购物车动作,交由销售业务层执行。 */
51
+ getCartActions(businessData: ItemRuleBusinessData): ItemRuleCartAction[];
50
52
  }
@@ -63,6 +63,7 @@ export var ItemRuleEvaluator = /*#__PURE__*/function () {
63
63
  }) : this.strategyConfigs;
64
64
  var allQuantityChecks = [];
65
65
  var allPrefillItems = [];
66
+ var allCartActions = [];
66
67
  var allAllergyRequirements = [];
67
68
  var rawResults = [];
68
69
  var context = this.adapter.prepareContext(businessData);
@@ -76,9 +77,11 @@ export var ItemRuleEvaluator = /*#__PURE__*/function () {
76
77
  var _this$adapter$transfo = this.adapter.transformResult(evalResult, businessData),
77
78
  quantityChecks = _this$adapter$transfo.quantityChecks,
78
79
  prefillItems = _this$adapter$transfo.prefillItems,
80
+ cartActions = _this$adapter$transfo.cartActions,
79
81
  allergyRequirements = _this$adapter$transfo.allergyRequirements;
80
82
  allQuantityChecks.push.apply(allQuantityChecks, _toConsumableArray(quantityChecks));
81
83
  allPrefillItems.push.apply(allPrefillItems, _toConsumableArray(prefillItems));
84
+ allCartActions.push.apply(allCartActions, _toConsumableArray(cartActions));
82
85
  allAllergyRequirements.push.apply(allAllergyRequirements, _toConsumableArray(allergyRequirements));
83
86
  }
84
87
  } catch (err) {
@@ -92,6 +95,9 @@ export var ItemRuleEvaluator = /*#__PURE__*/function () {
92
95
  return {
93
96
  quantityChecks: allQuantityChecks,
94
97
  prefillItems: allPrefillItems,
98
+ cartActions: allCartActions.sort(function (left, right) {
99
+ return right.priority - left.priority;
100
+ }),
95
101
  allergyRequirements: allAllergyRequirements,
96
102
  allPassed: failedChecks.length === 0,
97
103
  failedChecks: failedChecks,
@@ -188,6 +194,13 @@ export var ItemRuleEvaluator = /*#__PURE__*/function () {
188
194
  var result = this.evaluate(businessData);
189
195
  return result.prefillItems;
190
196
  }
197
+
198
+ /** 获取按优先级排序的购物车动作,交由销售业务层执行。 */
199
+ }, {
200
+ key: "getCartActions",
201
+ value: function getCartActions(businessData) {
202
+ return this.evaluate(businessData).cartActions;
203
+ }
191
204
  }]);
192
205
  return ItemRuleEvaluator;
193
206
  }();
@@ -4,6 +4,8 @@ export declare const ITEM_RULE_ACTION_TYPES: {
4
4
  readonly QUANTITY_CHECK: "QUANTITY_CHECK";
5
5
  /** 预填购物车 */
6
6
  readonly PREFILL_CART: "PREFILL_CART";
7
+ /** 按商品 ID 删除购物车商品 */
8
+ readonly DELETE_PRODUCT: "DELETE_PRODUCT";
7
9
  /** 加购前过敏信息确认 */
8
10
  readonly ALLERGY_CHECK: "ALLERGY_CHECK";
9
11
  };
@@ -101,6 +103,10 @@ export interface AllergyRequirement {
101
103
  promptScope: AllergyPromptScope;
102
104
  allowNote: boolean;
103
105
  }
106
+ /** 购物车动作触发时机,与数量校验的提交范围相互独立。 */
107
+ export type ItemRuleExecutionScope = 'set_handover';
108
+ /** 预填数量来源;主商品数量不扩展到 QUANTITY_CHECK。 */
109
+ export type PrefillQuantitySource = QuantitySource | 'main_product_number';
104
110
  /**
105
111
  * 预填商品项
106
112
  */
@@ -110,9 +116,11 @@ export interface PrefillProduct {
110
116
  /** 变体 ID(可选,0 或不填表示无变体/默认) */
111
117
  product_variant_id?: number;
112
118
  /** 数量来源 */
113
- quantityFrom: QuantitySource;
119
+ quantityFrom: PrefillQuantitySource;
114
120
  /** 固定数量(当 quantityFrom 为 'fixed' 时使用) */
115
121
  quantity?: number;
122
+ /** 设置取餐方式时同步自动附加行的数量,重复执行不累加。 */
123
+ repeat_skip?: boolean;
116
124
  }
117
125
  /**
118
126
  * Prefill Cart Action 的详细配置
@@ -120,9 +128,18 @@ export interface PrefillProduct {
120
128
  * 存储在 ActionEffect.config 中
121
129
  */
122
130
  export interface PrefillCartConfig {
131
+ /** 不填时保持原有预填时机;set_handover 仅在设置取餐方式时执行。 */
132
+ scope?: ItemRuleExecutionScope;
123
133
  /** 要预填的商品列表 */
124
134
  products: PrefillProduct[];
125
135
  }
136
+ /** 删除指定商品的全部购物车行,不区分变体或是否为自动添加。 */
137
+ export interface DeleteProductConfig {
138
+ scope: ItemRuleExecutionScope;
139
+ products: Array<{
140
+ product_id: number;
141
+ }>;
142
+ }
126
143
  /**
127
144
  * 购物车商品摘要
128
145
  */
@@ -157,6 +174,10 @@ export interface ItemRuleBusinessData {
157
174
  historicalItems?: CartItemSummary[];
158
175
  /** 服务类型(如 'dine-in', 'takeaway') */
159
176
  serviceType?: string;
177
+ /** 当前购物车动作触发时机;未填时不评估 set_handover 动作。 */
178
+ executionScope?: ItemRuleExecutionScope;
179
+ /** 由销售业务层提供的主商品总数量,不包含附加费用商品。 */
180
+ mainProductNumber?: number;
160
181
  /** 当前业务渠道(如 'kiosk', 'pos', 'online_store') */
161
182
  channel?: string;
162
183
  /** 当前正在加入购物车的商品;ALLERGY_CHECK 只读取该商品的 Target。 */
@@ -209,7 +230,23 @@ export interface PrefillItemResult {
209
230
  product_variant_id?: number;
210
231
  /** 应添加的数量 */
211
232
  quantity: number;
233
+ /** true 时执行器同步自动附加行数量;quantity=0 表示移除该自动行。 */
234
+ repeat_skip?: boolean;
212
235
  }
236
+ /** 保留不同购物车动作之间的优先级与执行顺序。 */
237
+ export type ItemRuleCartAction = {
238
+ strategyId: string;
239
+ ruleId: string;
240
+ priority: number;
241
+ } & ({
242
+ type: 'PREFILL_CART';
243
+ products: PrefillItemResult[];
244
+ } | {
245
+ type: 'DELETE_PRODUCT';
246
+ products: Array<{
247
+ product_id: number;
248
+ }>;
249
+ });
213
250
  /**
214
251
  * 单条规则的数量限制(不含校验结果,仅描述配置中的约束)
215
252
  */
@@ -258,6 +295,8 @@ export interface ItemRuleEvaluationResult {
258
295
  quantityChecks: QuantityCheckResult[];
259
296
  /** 需要预填的商品列表 */
260
297
  prefillItems: PrefillItemResult[];
298
+ /** 按 priority 降序排列的购物车动作;同优先级保持策略与动作顺序。 */
299
+ cartActions: ItemRuleCartAction[];
261
300
  /** 当前商品命中的过敏门禁要求;不同 Action/商品不会合并。 */
262
301
  allergyRequirements: AllergyRequirement[];
263
302
  /** 所有校验是否全部通过 */
@@ -7,6 +7,8 @@ export var ITEM_RULE_ACTION_TYPES = {
7
7
  QUANTITY_CHECK: 'QUANTITY_CHECK',
8
8
  /** 预填购物车 */
9
9
  PREFILL_CART: 'PREFILL_CART',
10
+ /** 按商品 ID 删除购物车商品 */
11
+ DELETE_PRODUCT: 'DELETE_PRODUCT',
10
12
  /** 加购前过敏信息确认 */
11
13
  ALLERGY_CHECK: 'ALLERGY_CHECK'
12
14
  };
@@ -72,6 +74,10 @@ export var ITEM_RULE_TEMPLATES = {
72
74
  // Prefill Cart 相关类型
73
75
  // ============================================
74
76
 
77
+ /** 购物车动作触发时机,与数量校验的提交范围相互独立。 */
78
+
79
+ /** 预填数量来源;主商品数量不扩展到 QUANTITY_CHECK。 */
80
+
75
81
  /**
76
82
  * 预填商品项
77
83
  */
@@ -82,6 +88,8 @@ export var ITEM_RULE_TEMPLATES = {
82
88
  * 存储在 ActionEffect.config 中
83
89
  */
84
90
 
91
+ /** 删除指定商品的全部购物车行,不区分变体或是否为自动添加。 */
92
+
85
93
  // ============================================
86
94
  // 业务数据类型(Evaluator 输入)
87
95
  // ============================================
@@ -110,6 +118,8 @@ export var ITEM_RULE_TEMPLATES = {
110
118
  * 单个 Prefill Cart 的预填结果
111
119
  */
112
120
 
121
+ /** 保留不同购物车动作之间的优先级与执行顺序。 */
122
+
113
123
  /**
114
124
  * 单条规则的数量限制(不含校验结果,仅描述配置中的约束)
115
125
  */
@@ -82,6 +82,8 @@ export interface OpenDataConfig {
82
82
  'sale.enabled_item_rules'?: number[];
83
83
  'fulfillment.enable_pickup'?: boolean;
84
84
  'fulfillment.handover_mode'?: string[];
85
+ 'fulfillment.takeaway_fees_rules'?: number[];
86
+ 'fulfillment.dine_in_fees_rules'?: number[];
85
87
  'fulfillment.pickup.timing_mode'?: 'asap_only' | 'scheduled_only' | 'asap_and_scheduled';
86
88
  'fulfillment.pickup.schedule'?: number[];
87
89
  'fulfillment.pickup.advance_days'?: number;
@@ -509,7 +509,9 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
509
509
  private applyOrderProductUpdateToTempOrder;
510
510
  updateOrderProduct(params: UpdateOrderProductParams): Promise<OrderProduct[]>;
511
511
  updateOrderProducts(paramsList: UpdateOrderProductParams[]): Promise<OrderProduct[]>;
512
- updateOrderProductQuantity(params: UpdateOrderProductQuantityParams): Promise<OrderProduct[]>;
512
+ updateOrderProductQuantity(params: UpdateOrderProductQuantityParams, options?: {
513
+ isCurrentOrder?: () => boolean;
514
+ }): Promise<OrderProduct[]>;
513
515
  updateOrderBooking(params: UpdateOrderBookingParams): any[];
514
516
  /**
515
517
  * 商品行写路径收尾:促销 → 折扣 → 清洗 → summary → 持久化。
@@ -593,7 +595,7 @@ export declare class OrderModule extends BaseModule implements Module, OrderModu
593
595
  generateIdempotencyToken(): string;
594
596
  syncPaymentsToOrder<T = any>(params: SyncPaymentsToOrderParams): Promise<SyncPaymentsToOrderResult<T>>;
595
597
  createOrder(params: CommitOrderParams['query']): {
596
- type: "appointment_booking" | "virtual";
598
+ type: "virtual" | "appointment_booking";
597
599
  platform: string;
598
600
  sales_channel: string;
599
601
  order_sales_channel: string;