@feedmepos/mf-order-setting 0.0.72-test.1 → 0.0.73-dev

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 (168) hide show
  1. package/.env +1 -1
  2. package/README.md +7 -23
  3. package/dist/{KioskDevicesView-CP_cGMXE.js → KioskDevicesView-Dztw-Q35.js} +1 -1
  4. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-CiNLqFw6.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-Ol419NZh.js} +3 -3
  5. package/dist/{KioskSettingView-BiKYEjfe.js → KioskSettingView-BUHmoxyO.js} +183 -202
  6. package/dist/{KioskView-BYxPrI7N.js → KioskView-B8j77zMA.js} +4 -4
  7. package/dist/OrderSettingsView-C5PK8CKZ.js +60009 -0
  8. package/dist/{app-BN02cB5o.js → app-C2_s0fkK.js} +4921 -4797
  9. package/dist/app.js +1 -1
  10. package/dist/{dayjs.min-Bml-FvS7.js → dayjs.min-B3nOmXcs.js} +1 -1
  11. package/dist/frontend/mf-order/src/api/menu/index.d.ts +1 -1
  12. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +10 -3
  13. package/dist/frontend/mf-order/src/app.d.ts +44 -8
  14. package/dist/frontend/mf-order/src/components/GoogleMap.vue.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/composables/useQrOrderingEnabled.d.ts +2 -0
  16. package/dist/frontend/mf-order/src/helpers/menu.d.ts +1 -1
  17. package/dist/frontend/mf-order/src/main.d.ts +44 -8
  18. package/dist/frontend/mf-order/src/stores/kiosk/index.d.ts +21 -21
  19. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +906 -1044
  20. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +36 -3
  21. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +5 -2
  22. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +2 -2
  23. package/dist/frontend/mf-order/src/views/order-settings/delivery/components/TaxInput.vue.d.ts +3 -8
  24. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +3 -1
  25. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +5 -1
  26. package/dist/frontend/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +21 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +2 -2
  28. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue.d.ts +1 -1
  29. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue.d.ts +28 -2
  30. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue.d.ts +46 -0
  31. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue.d.ts +57 -0
  32. package/dist/frontend/mf-order/src/views/order-settings/pickup/PickUpSettingDialogContent.vue.d.ts +23 -1
  33. package/dist/frontend/mf-order/src/views/order-settings/pickup/Preorder.vue.d.ts +27 -0
  34. package/dist/frontend/mf-order/src/views/order-settings/servicecharge/RateInput.vue.d.ts +8 -0
  35. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  36. package/dist/index-6PQJ07gD.js +665 -0
  37. package/dist/{index-BlKeAWPk.js → index-B4XxBqiV.js} +1 -1
  38. package/dist/lineman-settings.dto-DcYJFu0U.js +60394 -0
  39. package/dist/package/entity/_type-assert.d.ts +7 -0
  40. package/dist/package/entity/booking/booking.dto.d.ts +24 -24
  41. package/dist/package/entity/delivery/delivery.dto.d.ts +8 -8
  42. package/dist/package/entity/delivery/delivery.enum.d.ts +12 -0
  43. package/dist/package/entity/delivery/gateway/grab.dto.d.ts +2 -2
  44. package/dist/package/entity/delivery/gateway/kosmo.dto.d.ts +16 -16
  45. package/dist/package/entity/delivery/gateway/pandago.dto.d.ts +4 -4
  46. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +282 -4591
  47. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +32 -24
  48. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +23 -11719
  49. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +2 -2
  50. package/dist/package/entity/index.d.ts +12 -0
  51. package/dist/package/entity/kiosk/kiosk.do.d.ts +140 -140
  52. package/dist/package/entity/kiosk/kiosk.dto.d.ts +168 -168
  53. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +63 -7
  54. package/dist/package/entity/marketing/marketing.dto.d.ts +4 -4
  55. package/dist/package/entity/member/member.dto.d.ts +6 -0
  56. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +8 -8
  57. package/dist/package/entity/order/effects/effect.dto.d.ts +68 -16
  58. package/dist/package/entity/order/menu/menu.dto.d.ts +45 -8
  59. package/dist/package/entity/order/order-item/order-item.dto.d.ts +358 -3853
  60. package/dist/package/entity/order/order.do.d.ts +239 -42
  61. package/dist/package/entity/order/order.dto.d.ts +6497 -2236
  62. package/dist/package/entity/order/payment/payment.dto.d.ts +52 -12
  63. package/dist/package/entity/order-platform/base-integration.do.d.ts +8 -0
  64. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +2 -2
  65. package/dist/package/entity/order-platform/deliveroo/deliveroo-order.do.d.ts +524 -524
  66. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +2 -2
  67. package/dist/package/entity/order-platform/deliveroo/deliveroo.menu.dto.d.ts +58 -58
  68. package/dist/package/entity/order-platform/external/menu/external-master-menu.do.d.ts +212 -284
  69. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +331 -589
  70. package/dist/package/entity/order-platform/external/menu/external-menu.dto.d.ts +1 -1
  71. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  72. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +275 -275
  73. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +3 -3
  74. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +3 -3
  75. package/dist/package/entity/order-platform/foodpanda/foodpanda-menu.dto.d.ts +284 -284
  76. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +40 -40
  77. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +16 -16
  78. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +2 -2
  79. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +2 -2
  80. package/dist/package/entity/order-platform/gofood/gofood-order.do.d.ts +18 -18
  81. package/dist/package/entity/order-platform/gofood/gofood-settings.do.d.ts +2 -2
  82. package/dist/package/entity/order-platform/gofood/gofood-settings.dto.d.ts +2 -2
  83. package/dist/package/entity/order-platform/gofood/gofood.dto.d.ts +32 -32
  84. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +12 -12
  85. package/dist/package/entity/order-platform/grabfood/grabfood-omni.do.d.ts +134 -115
  86. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +187 -165
  87. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +8 -2
  88. package/dist/package/entity/order-platform/grabfood/grabfood-webhook.dto.d.ts +49 -42
  89. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +67 -54
  90. package/dist/package/entity/order-platform/grabfood/grabfood.enum.d.ts +1 -1
  91. package/dist/package/entity/order-platform/lineman/lineman-settings.do.d.ts +37 -0
  92. package/dist/package/entity/order-platform/lineman/lineman-settings.dto.d.ts +40 -0
  93. package/dist/package/entity/order-platform/menu.dto.d.ts +716 -13887
  94. package/dist/package/entity/order-platform/order-platform.dto.d.ts +136 -2
  95. package/dist/package/entity/order-platform/order-platform.enum.d.ts +1 -1
  96. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +176 -176
  97. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.dto.d.ts +62 -62
  98. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +8 -2
  99. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +8 -2
  100. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +1061 -0
  101. package/dist/package/entity/order-platform/tng/tng-order.do.d.ts +1915 -0
  102. package/dist/package/entity/order-platform/tng/tng-settings.do.d.ts +379 -0
  103. package/dist/package/entity/order-platform/tng/tng-settings.dto.d.ts +301 -0
  104. package/dist/package/entity/order-platform/tng/tng.dto.d.ts +1162 -0
  105. package/dist/package/entity/order-platform/tng/tng.enum.d.ts +29 -0
  106. package/dist/package/entity/order-setting/delivery/inhouse-delivery.do.d.ts +12 -0
  107. package/dist/package/entity/order-setting/delivery/inhouse-delivery.dto.d.ts +12 -0
  108. package/dist/package/entity/order-setting/dine-in/dine-in.do.d.ts +11 -0
  109. package/dist/package/entity/order-setting/dine-in/dine-in.dto.d.ts +9 -0
  110. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +2 -2
  111. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +2 -2
  112. package/dist/package/entity/order-setting/order-setting.do.d.ts +55 -4
  113. package/dist/package/entity/order-setting/order-setting.dto.d.ts +110 -8
  114. package/dist/package/entity/order-setting/pickup/pickup.do.d.ts +12 -0
  115. package/dist/package/entity/order-setting/pickup/pickup.dto.d.ts +12 -0
  116. package/dist/package/entity/payment/transaction.d.ts +80 -8
  117. package/dist/package/entity/printer/printer.do.d.ts +14 -14
  118. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +1 -1
  119. package/dist/package/entity/queue/queue.do.d.ts +236 -1901
  120. package/dist/package/entity/queue/queue.dto.d.ts +743 -445
  121. package/dist/package/entity/restaurant/restaurant.dto.d.ts +27 -4
  122. package/dist/package/entity/websocket/websocket.dto.d.ts +10 -10
  123. package/dist/style.css +1 -0
  124. package/golar.config.ts +20 -0
  125. package/package.json +9 -3
  126. package/src/Entry.vue +2 -10
  127. package/src/api/menu/index.ts +1 -1
  128. package/src/api/remoteOrder/index.ts +176 -110
  129. package/src/composables/useQrOrderingEnabled.ts +66 -0
  130. package/src/helpers/menu.ts +1 -1
  131. package/src/locales/en-US.json +421 -412
  132. package/src/locales/ja-JP.json +1769 -1760
  133. package/src/locales/th-TH.json +409 -400
  134. package/src/locales/zh-CN.json +417 -408
  135. package/src/main.ts +4 -44
  136. package/src/router/index.ts +2 -2
  137. package/src/stores/menu/menu.ts +48 -27
  138. package/src/stores/restaurant/index.ts +24 -9
  139. package/src/utils/firebase-storage.ts +3 -13
  140. package/src/views/kiosk/settings/KioskSettingView.vue +3 -2
  141. package/src/views/order-settings/OrderSettingsView.vue +31 -11
  142. package/src/views/order-settings/delivery/DeliverySetting.vue +223 -11
  143. package/src/views/order-settings/delivery/components/TaxInput.vue +1 -1
  144. package/src/views/order-settings/delivery/delivery.data.ts +31 -10
  145. package/src/views/order-settings/delivery/delivery.ts +60 -28
  146. package/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue +40 -1
  147. package/src/views/order-settings/delivery/integrated-delivery/DeliverooSetting.vue +1 -1
  148. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +15 -7
  149. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +83 -27
  150. package/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue +79 -0
  151. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +2 -0
  152. package/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue +749 -0
  153. package/src/views/order-settings/dine-in/DineInSetting.vue +54 -23
  154. package/src/views/order-settings/dine-in/PaymentType.vue +9 -12
  155. package/src/views/order-settings/general/GeneralSetting.vue +15 -6
  156. package/src/views/order-settings/pickup/PickUpSettingDialog.vue +31 -3
  157. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +34 -0
  158. package/src/views/order-settings/pickup/Preorder.vue +13 -12
  159. package/src/views/order-settings/queue/QueueSetting.vue +30 -1
  160. package/src/views/order-settings/servicecharge/RateInput.vue +9 -7
  161. package/vite.config.ts +16 -16
  162. package/dist/OrderSettingsView-C7Y-_y5U.js +0 -32222
  163. package/dist/frontend/mf-order/src/api/auth/index.d.ts +0 -7
  164. package/dist/frontend/mf-order/src/stores/iframe/index.d.ts +0 -14
  165. package/dist/index-DZA8A0m4.js +0 -630
  166. package/dist/queue-transfer.dto-C7nRZOZH.js +0 -45618
  167. package/src/api/auth/index.ts +0 -20
  168. package/src/stores/iframe/index.ts +0 -23
@@ -1,77 +1,109 @@
1
- import { F_PAYMENT_NAME, FdoLinkedDelivery, F_COUNTRY } from "@feedmepos/core/entity";
2
- import { useCoreStore } from '@feedmepos/mf-common';
1
+ import { F_PAYMENT_NAME, FdoLinkedDelivery, F_COUNTRY } from '@feedmepos/core/entity'
2
+ import { useCoreStore } from '@feedmepos/mf-common'
3
3
 
4
- export type LinkedDeliveryDoc = FdoLinkedDelivery & { _rev: string };
4
+ export type LinkedDeliveryDoc = FdoLinkedDelivery & { _rev: string }
5
5
 
6
6
  export enum AUTO_INTEGRATION_CLIENT {
7
7
  foodpanda = 'foodpanda',
8
8
  grabfood = 'grabfood',
9
+ lineman = 'lineman',
9
10
  shopeefood = 'shopeefood',
10
11
  deliveroo = 'deliveroo',
12
+ tng = 'tng',
11
13
  gofood = 'gofood',
12
14
  external = 'external'
13
15
  }
14
16
 
15
17
  export interface DeliveryCompany {
16
- id: string;
17
- name: string;
18
- slotPrefix: string;
19
- paymentTypeKey: string;
20
- key: string;
18
+ id: string
19
+ name: string
20
+ slotPrefix: string
21
+ paymentTypeKey: string
22
+ key: string
21
23
  }
22
24
 
23
25
  function formatDeliveryCompanyKey(key: string) {
24
- return key.toLowerCase().replace('_', '').toLowerCase();
26
+ return key.toLowerCase().replace('_', '').toLowerCase()
25
27
  }
26
28
 
27
29
  export function useDelivery() {
28
30
  function getLinkedDeliveryDoc(docs: LinkedDeliveryDoc[], key: string) {
29
- return docs.find((doc) => formatDeliveryCompanyKey(doc.key) === formatDeliveryCompanyKey(key));
31
+ return docs.find((doc) => formatDeliveryCompanyKey(doc.key) === formatDeliveryCompanyKey(key))
30
32
  }
31
33
 
32
34
  function filterLocalDeliveryCompanies(companies: DeliveryCompany[]) {
33
- return companies.filter(({ key }) => !Object.keys(AUTO_INTEGRATION_CLIENT).includes(formatDeliveryCompanyKey(key)));
35
+ return companies.filter(
36
+ ({ key }) => !Object.keys(AUTO_INTEGRATION_CLIENT).includes(formatDeliveryCompanyKey(key))
37
+ )
34
38
  }
35
39
 
36
40
  function getPaymentType(paymentTypeKey?: string) {
37
- return paymentTypeKey === F_PAYMENT_NAME.enum.CASH ? 'Cash' : 'Default';
41
+ return paymentTypeKey === F_PAYMENT_NAME.enum.CASH ? 'Cash' : 'Default'
38
42
  }
39
43
 
40
44
  function equalKey(key: string, targetKey: string) {
41
- return formatDeliveryCompanyKey(key) === formatDeliveryCompanyKey(targetKey);
45
+ return formatDeliveryCompanyKey(key) === formatDeliveryCompanyKey(targetKey)
42
46
  }
43
47
 
44
- function isIntegratedPlatformSupported(platform: AUTO_INTEGRATION_CLIENT, country?: F_COUNTRY | null): boolean {
48
+ function isIntegratedPlatformSupported(
49
+ platform: AUTO_INTEGRATION_CLIENT,
50
+ country?: F_COUNTRY | null
51
+ ): boolean {
45
52
  country = country || useCoreStore().currentCountry.value || F_COUNTRY.enum.MY
46
- const mySupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.shopeefood, AUTO_INTEGRATION_CLIENT.external];
47
- const sgSupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.deliveroo];
48
- const thSupported = [AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.external];
49
- const pkSupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.external];
50
- const idSupported = [AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.gofood, AUTO_INTEGRATION_CLIENT.external];
53
+ const mySupported = [
54
+ AUTO_INTEGRATION_CLIENT.foodpanda,
55
+ AUTO_INTEGRATION_CLIENT.grabfood,
56
+ AUTO_INTEGRATION_CLIENT.shopeefood,
57
+ AUTO_INTEGRATION_CLIENT.tng,
58
+ AUTO_INTEGRATION_CLIENT.external
59
+ ]
60
+ const sgSupported = [
61
+ AUTO_INTEGRATION_CLIENT.foodpanda,
62
+ AUTO_INTEGRATION_CLIENT.grabfood,
63
+ AUTO_INTEGRATION_CLIENT.deliveroo,
64
+ AUTO_INTEGRATION_CLIENT.external
65
+ ]
66
+ const thSupported = [
67
+ AUTO_INTEGRATION_CLIENT.grabfood,
68
+ AUTO_INTEGRATION_CLIENT.external,
69
+ AUTO_INTEGRATION_CLIENT.lineman
70
+ ]
71
+ const pkSupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.external]
72
+ const idSupported = [
73
+ AUTO_INTEGRATION_CLIENT.grabfood,
74
+ AUTO_INTEGRATION_CLIENT.gofood,
75
+ AUTO_INTEGRATION_CLIENT.external
76
+ ]
51
77
 
52
- let supportedPlatforms: AUTO_INTEGRATION_CLIENT[] = [];
78
+ let supportedPlatforms: AUTO_INTEGRATION_CLIENT[] = []
53
79
  switch (country) {
54
80
  case F_COUNTRY.enum.MY:
55
81
  supportedPlatforms = mySupported
56
- break;
82
+ break
57
83
  case F_COUNTRY.enum.SG:
58
84
  supportedPlatforms = sgSupported
59
- break;
85
+ break
60
86
  case F_COUNTRY.enum.TH:
61
87
  supportedPlatforms = thSupported
62
- break;
88
+ break
63
89
  case F_COUNTRY.enum.PK:
64
90
  supportedPlatforms = pkSupported
65
- break;
91
+ break
66
92
  case F_COUNTRY.enum.ID:
67
93
  supportedPlatforms = idSupported
68
- break;
94
+ break
69
95
  default:
70
- break;
96
+ break
71
97
  }
72
98
 
73
99
  return supportedPlatforms.includes(platform)
74
100
  }
75
101
 
76
- return { getLinkedDeliveryDoc, filterLocalDeliveryCompanies, getPaymentType, equalKey, isIntegratedPlatformSupported };
77
- }
102
+ return {
103
+ getLinkedDeliveryDoc,
104
+ filterLocalDeliveryCompanies,
105
+ getPaymentType,
106
+ equalKey,
107
+ isIntegratedPlatformSupported
108
+ }
109
+ }
@@ -9,8 +9,9 @@ import type {
9
9
  FdoOfflinePaymentMethod,
10
10
  FdoRestaurantInHouseDelivery
11
11
  } from '@feedmepos/core/entity'
12
+ import type { OrderInhouseDeliverySettingsDto } from '@entity'
12
13
  import { F_FEATURE } from '@feedmepos/core/entity'
13
- import { FdoProductTaxSetting } from '@feedmepos/menu/entity'
14
+ import { FdoProductTaxSetting } from '@feedmepos/entity'
14
15
  import { computed, reactive, watch, type PropType } from 'vue'
15
16
  import Preorder from '../../pickup/Preorder.vue'
16
17
  import DeliveryTime from './DeliveryTime.vue'
@@ -73,9 +74,24 @@ const props = defineProps({
73
74
  address: {
74
75
  type: Object as PropType<Address | undefined>,
75
76
  required: true
77
+ },
78
+ // Bill auto-close / receipt-print preferences live on
79
+ // `orderSetting.inhouseDeliverySettings`, a separate doc from the
80
+ // restaurant-level in-house delivery setting bound to `inhouse` below.
81
+ orderInhouseDeliverySettings: {
82
+ type: Object as PropType<OrderInhouseDeliverySettingsDto>,
83
+ default: () => ({})
76
84
  }
77
85
  })
78
86
 
87
+ function updateAutoCloseBill(autoCloseBill: boolean) {
88
+ emits('update:order-settings', { ...props.orderInhouseDeliverySettings, autoCloseBill })
89
+ }
90
+
91
+ function updatePrintReceiptAfterClose(printReceiptAfterClose: boolean) {
92
+ emits('update:order-settings', { ...props.orderInhouseDeliverySettings, printReceiptAfterClose })
93
+ }
94
+
79
95
  const inhouse = reactive<InhouseDialogData>(
80
96
  props.initialValue
81
97
  ? clone(props.initialValue)
@@ -161,6 +177,7 @@ function updateTaxInclusive(taxOption: TaxOption): void {
161
177
 
162
178
  const emits = defineEmits<{
163
179
  (event: 'update:model-value', v: FdoRestaurantInHouseDelivery): void
180
+ (event: 'update:order-settings', v: OrderInhouseDeliverySettingsDto): void
164
181
  }>()
165
182
 
166
183
  function emitUpdatedValue() {
@@ -252,6 +269,28 @@ const actualDeliveryTime = computed({
252
269
  />
253
270
  </div>
254
271
 
272
+ <div class="mb-5">
273
+ <FmSwitch
274
+ :model-value="orderInhouseDeliverySettings.autoCloseBill ?? false"
275
+ value="autoCloseBill"
276
+ :label="t('order.autoCloseBill')"
277
+ :sublabel="t('order.autoCloseBillSublabel')"
278
+ label-placement="right"
279
+ @update:model-value="updateAutoCloseBill"
280
+ />
281
+ </div>
282
+
283
+ <div class="mb-5">
284
+ <FmSwitch
285
+ :model-value="orderInhouseDeliverySettings.printReceiptAfterClose ?? false"
286
+ value="printReceiptAfterClose"
287
+ :label="t('order.printReceiptAfterClose')"
288
+ :sublabel="t('order.printReceiptAfterCloseSublabel')"
289
+ label-placement="right"
290
+ @update:model-value="updatePrintReceiptAfterClose"
291
+ />
292
+ </div>
293
+
255
294
  <div class="mb-5">
256
295
  <FmSelect
257
296
  :model-value="inhouse.catalogId"
@@ -78,7 +78,7 @@ async function syncMenu() {
78
78
  const restaurantId = currentRestaurant.value?._id ?? ''
79
79
  await startAsyncCallWithErr(async () => {
80
80
  try {
81
- const res = await remoteOrderApi.integratedDelivery.syncDeliverooMernu(restaurantId)
81
+ const res = await remoteOrderApi.integratedDelivery.syncDeliverooMenu(restaurantId)
82
82
  const temp = {
83
83
  ...modelValue.value.auto,
84
84
  lastSynchronize: res?.lastSynchronize || modelValue.value.auto.lastSynchronize
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, type PropType, reactive } from 'vue'
3
3
 
4
- import type { FdoLinkedDelivery } from '@feedmepos/core/entity'
4
+ import { F_COUNTRY, type FdoLinkedDelivery } from '@feedmepos/core/entity'
5
5
  import { FdoGrabfoodSettings } from '@entity'
6
6
  import type { DeliveryCompany } from '../delivery'
7
7
  import type { IntegratedDeliverySettingData } from './IntegratedDelivery.vue'
@@ -16,6 +16,12 @@ export interface GrabfoodDeliveryData {
16
16
  integrated: FdoGrabfoodSettings
17
17
  }
18
18
  const { t } = useI18n()
19
+ const GRABFOOD_LEARN_MORE_URL_DEFAULT =
20
+ 'https://scribehow.com/o/5CPW6fuHTOe954ExNOUUvw/viewer/How_To_Activate_GrabFood_Auto_Integration_For_Your_Restaurant__Premium_POS__-pyKp4jcTKGDihKX7pfFWg'
21
+ const GRABFOOD_LEARN_MORE_URL_BY_COUNTRY: Partial<Record<F_COUNTRY, string>> = {
22
+ [F_COUNTRY.enum.TH]:
23
+ 'https://scribehow.com/o/5CPW6fuHTOe954ExNOUUvw/page/__Grab__FeedMe_POS__kLI64nZATuq4G_v0Z3ziKQ'
24
+ }
19
25
 
20
26
  const props = defineProps({
21
27
  initialValue: {
@@ -41,10 +47,12 @@ const modelValue = computed<IntegratedDeliverySettingData>(() => {
41
47
  enable: auto.enable,
42
48
  integrationId: auto.merchantID,
43
49
  autoCloseBill: auto.autoCloseBill || false,
50
+ autoCloseOnDelivered: auto.autoCloseOnDelivered ?? false,
44
51
  catalogId: auto?.catalogId || null,
45
52
  commissionRate: auto.commissionRate,
46
53
  printReceiptAfterClose: auto.printReceiptAfterClose ?? true,
47
54
  lastSynchronize: auto.lastSynchronize,
55
+ ignoreDiscount: auto.ignoreDiscount ?? false,
48
56
  status: auto.status,
49
57
  updatedAt: auto.updatedAt,
50
58
  menuSyncError: auto.menuSyncError
@@ -52,7 +60,11 @@ const modelValue = computed<IntegratedDeliverySettingData>(() => {
52
60
  }
53
61
  })
54
62
 
55
- const { currentRestaurant } = useCoreStore()
63
+ const { currentRestaurant, currentCountry } = useCoreStore()
64
+ const learnMoreUrl = computed(() => {
65
+ const country = (currentCountry.value || F_COUNTRY.enum.MY) as F_COUNTRY
66
+ return GRABFOOD_LEARN_MORE_URL_BY_COUNTRY[country] || GRABFOOD_LEARN_MORE_URL_DEFAULT
67
+ })
56
68
 
57
69
  function updateData({ manual, auto }: IntegratedDeliverySettingData) {
58
70
  data.manual = manual
@@ -150,11 +162,7 @@ async function startSelfServeFlow() {
150
162
  </div>
151
163
  <div>
152
164
  {{ t('order.selfServeActivation.subTitle') }}
153
- <a
154
- href="https://doc.clickup.com/25608366/d/h/rdg5e-52596/7d44e2bd89752e0"
155
- target="_blank"
156
- style="color: blue; text-decoration: underline"
157
- >
165
+ <a :href="learnMoreUrl" target="_blank" style="color: blue; text-decoration: underline">
158
166
  {{ t('order.selfServeActivation.learnMore') }}</a
159
167
  >.
160
168
  </div>
@@ -17,6 +17,8 @@ export interface AutoIntegrateData {
17
17
  catalogId: string | null
18
18
  autoAccept?: boolean | null
19
19
  autoCloseBill: boolean
20
+ autoCloseOnDelivered?: boolean | null
21
+ canRemark?: boolean | null
20
22
  commissionRate: number
21
23
  lastSynchronize?: string | null
22
24
  ignoreDiscount?: boolean
@@ -48,6 +50,10 @@ const props = defineProps({
48
50
  alwaysShowMenuSyncError: {
49
51
  type: Boolean,
50
52
  default: false
53
+ },
54
+ showTestOrderActions: {
55
+ type: Boolean,
56
+ default: true
51
57
  }
52
58
  })
53
59
 
@@ -62,10 +68,15 @@ const menuStore = useMenuStore()
62
68
  const CoreStore = useCoreStore()
63
69
  const taxSystemCode = computed(() => ItemTax.taxSetting().systemCode)
64
70
 
65
- // const canEdit = computed(() => CoreStore.sessionUser.value?.role.isAdmin ?? false)
66
71
  // For now, allow all users to edit, but added detail logging in backend
67
72
  const canEdit = computed(() => true)
68
73
 
74
+ // FeedMe-internal (staff/admin) only. Merchants/business owners must not edit
75
+ // the platform integration id or place test orders; both gated on this below.
76
+ const isInternal = computed(
77
+ () => (CoreStore.sessionUser.value?.role?.isStaff || CoreStore.sessionUser.value?.role?.isAdmin) ?? false
78
+ )
79
+
69
80
  function updateManual(manual: FdoLinkedDelivery | null) {
70
81
  emits('update:model-value', {
71
82
  ...props.modelValue,
@@ -95,10 +106,11 @@ function getValue<T>(value: InputModel, type: 'string' | 'number'): T {
95
106
  case 'string':
96
107
  result = (value || '').toString()
97
108
  break
98
- case 'number':
109
+ case 'number': {
99
110
  const v = Number.parseFloat((value || '').toString())
100
111
  result = Number.isNaN(v) ? 0 : v
101
112
  break
113
+ }
102
114
  }
103
115
  return result as unknown as T
104
116
  }
@@ -127,14 +139,23 @@ function updateMenuCatalog(catalogId: string | null) {
127
139
  type OrderSettingKey =
128
140
  | 'autoAcceptOrder'
129
141
  | 'autoCloseBill'
142
+ | 'autoCloseOnDelivered'
130
143
  | 'ignoreDiscount'
131
144
  | 'sstInclusive'
132
145
  | 'printReceiptAfterClose'
133
146
  const orderSettingValue = computed(() => {
134
- const { autoAccept, autoCloseBill, ignoreDiscount, sstInclusive, printReceiptAfterClose } =
135
- props.modelValue.auto
147
+ const {
148
+ autoAccept,
149
+ autoCloseBill,
150
+ autoCloseOnDelivered,
151
+ ignoreDiscount,
152
+ sstInclusive,
153
+ printReceiptAfterClose
154
+ } = props.modelValue.auto
136
155
  const value: OrderSettingKey[] = []
156
+ if (autoAccept !== undefined && autoAccept) value.push('autoAcceptOrder')
137
157
  if (autoCloseBill) value.push('autoCloseBill')
158
+ if (autoCloseOnDelivered) value.push('autoCloseOnDelivered')
138
159
  if (ignoreDiscount) value.push('ignoreDiscount')
139
160
  if (sstInclusive) value.push('sstInclusive')
140
161
  if (printReceiptAfterClose) value.push('printReceiptAfterClose')
@@ -151,6 +172,10 @@ const orderSettingOptions = computed<
151
172
  label: string
152
173
  value: OrderSettingKey
153
174
  }[] = [
175
+ {
176
+ label: t('order.allowedAutoAcceptOrder'),
177
+ value: 'autoAcceptOrder'
178
+ },
154
179
  {
155
180
  label: t('order.allowedAutoCloseBill'),
156
181
  value: 'autoCloseBill'
@@ -160,7 +185,10 @@ const orderSettingOptions = computed<
160
185
  value: 'printReceiptAfterClose'
161
186
  }
162
187
  ]
163
- if (props.modelValue.auto.autoAccept !== undefined) {
188
+ if (props.modelValue.auto.autoAccept === undefined) {
189
+ options.splice(0, 1)
190
+ }
191
+ if (props.modelValue.auto.ignoreDiscount !== undefined) {
164
192
  options.push({
165
193
  label: t('order.ignoreDiscount'),
166
194
  value: 'ignoreDiscount'
@@ -172,14 +200,27 @@ const orderSettingOptions = computed<
172
200
  value: 'sstInclusive'
173
201
  })
174
202
  }
203
+ // GrabFood/ShopeeFood only — presence-gated like the options above so it
204
+ // doesn't render for platforms whose mapper never sets the field.
205
+ if (props.modelValue.auto.autoCloseOnDelivered !== undefined) {
206
+ options.push({
207
+ label: t('order.allowedAutoCloseOnDelivered'),
208
+ value: 'autoCloseOnDelivered'
209
+ })
210
+ }
175
211
  return options
176
212
  })
177
213
 
178
214
  function updateOrderSettings(orderSettingKeys: OrderSettingKey[]) {
179
215
  updateAuto((oldV) => ({
180
216
  ...oldV,
181
- autoAccept: oldV.autoAccept ?? true,
217
+ autoAccept:
218
+ oldV.autoAccept === undefined ? undefined : orderSettingKeys.includes('autoAcceptOrder'),
182
219
  autoCloseBill: orderSettingKeys.includes('autoCloseBill'),
220
+ autoCloseOnDelivered:
221
+ oldV.autoCloseOnDelivered === undefined
222
+ ? undefined
223
+ : orderSettingKeys.includes('autoCloseOnDelivered'),
183
224
  printReceiptAfterClose: orderSettingKeys.includes('printReceiptAfterClose'),
184
225
  ignoreDiscount: orderSettingKeys.includes('ignoreDiscount'),
185
226
  sstInclusive: orderSettingKeys.includes('sstInclusive')
@@ -228,7 +269,7 @@ const formattedMenuSyncError = computed(() => {
228
269
  :catalog-options="menuStore.catalogOptions"
229
270
  @update:model-value="updateManual"
230
271
  /> -->
231
- <div v-if="canUseAutoDeliveryIntegration === true" class="mt-10">
272
+ <div v-if="canUseAutoDeliveryIntegration === true" class="my-10">
232
273
  <FmSwitch
233
274
  :disabled="!canEdit"
234
275
  :model-value="modelValue.auto.enable"
@@ -240,17 +281,17 @@ const formattedMenuSyncError = computed(() => {
240
281
  <div v-if="modelValue.auto.enable">
241
282
  <FmCard variant="outlined" class="mt-10 p-5">
242
283
  <FmTextField
243
- :disabled="!canEdit"
284
+ :disabled="!isInternal"
244
285
  :model-value="modelValue.auto.integrationId"
245
- :label="t('order.remoteId')"
286
+ :label="t('order.integrationId')"
246
287
  @update:model-value="updateIntegrateId"
247
288
  />
248
- <div class="mb-5">
289
+ <div>
249
290
  <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-7">
250
291
  {{ t('order.orderSetting') }}
251
292
  </div>
252
293
 
253
- <div v-for="(item, index) in orderSettingOptions" :key="index" class="flex flex-col">
294
+ <div v-for="(item, index) in orderSettingOptions" :key="index" class="flex-1 flex-col">
254
295
  <FmCheckbox
255
296
  :model-value="orderSettingValue"
256
297
  :label="item.label"
@@ -259,6 +300,8 @@ const formattedMenuSyncError = computed(() => {
259
300
  :disabled="!canEdit"
260
301
  />
261
302
  </div>
303
+
304
+ <slot name="order-setting" :editable="!canEdit" />
262
305
  </div>
263
306
 
264
307
  <!-- Commision rate not used yet -->
@@ -272,17 +315,25 @@ const formattedMenuSyncError = computed(() => {
272
315
  <template #append>%</template>
273
316
  </FmTextField>
274
317
  </div> -->
275
- <div class="mb-3">
276
- <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-7">{{ t('order.syncMenu') }}</div>
277
- <FmSelect
278
- :placeholder="t('order.selectItem')"
279
- :model-value="modelValue.auto.catalogId"
280
- :label="t('order.catalog')"
281
- :items="menuStore.catalogOptions"
282
- @update:model-value="updateMenuCatalog"
283
- :disabled="!canEdit"
284
- />
285
- </div>
318
+ <slot
319
+ name="sync-menu"
320
+ :editable="!canEdit"
321
+ :catalog-options="menuStore.catalogOptions"
322
+ :catalog-id="modelValue.auto.catalogId"
323
+ :update-catalog="updateMenuCatalog"
324
+ >
325
+ <div class="mb-3">
326
+ <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-7">{{ t('order.syncMenu') }}</div>
327
+ <FmSelect
328
+ :placeholder="t('order.selectItem')"
329
+ :model-value="modelValue.auto.catalogId"
330
+ :label="t('order.catalog')"
331
+ :items="menuStore.catalogOptions"
332
+ @update:model-value="updateMenuCatalog"
333
+ :disabled="!canEdit"
334
+ />
335
+ </div>
336
+ </slot>
286
337
 
287
338
  <div class="text-fm-color-neutral-gray-400 fm-typo-cn-body-md-400 mb-5 mt-5">
288
339
  <div class="flex flex-row">
@@ -290,7 +341,10 @@ const formattedMenuSyncError = computed(() => {
290
341
  {{ t('order.status') }}: {{ convertStatusI18n(modelValue.auto.status) }}
291
342
  </div>
292
343
  <FmTooltip
293
- v-if="(modelValue.auto.status === 'FAILED' || alwaysShowMenuSyncError) && formattedMenuSyncError !== null"
344
+ v-if="
345
+ (modelValue.auto.status === 'FAILED' || alwaysShowMenuSyncError) &&
346
+ formattedMenuSyncError !== null
347
+ "
294
348
  :content="formattedMenuSyncError"
295
349
  :zIndex="1000"
296
350
  >
@@ -319,7 +373,6 @@ const formattedMenuSyncError = computed(() => {
319
373
  {{ Day(modelValue.auto.lastSynchronize).format('DD/MM/YYYY hh:mm a') }}
320
374
  </div>
321
375
  </div>
322
-
323
376
  <slot :editable="!canEdit" />
324
377
  </FmCard>
325
378
  </div>
@@ -331,8 +384,12 @@ const formattedMenuSyncError = computed(() => {
331
384
  variant="warning"
332
385
  />
333
386
  </div>
334
- <!-- Hidden: merchants were creating mock orders here, then asking support to void the resulting bills. Platform-side simulator covers this need. Un-comment the entire block to restore for internal QA.
335
- <div class="flex flex-row mt-5" v-if="canUseAutoDeliveryIntegration === true && canEdit">
387
+ <!-- Test order (mock order POS) for sales demo / training. FeedMe-internal only
388
+ (isInternal) so merchants can't self-serve mock orders that leave bills to void. -->
389
+ <div
390
+ class="flex flex-row mt-5"
391
+ v-if="canUseAutoDeliveryIntegration === true && isInternal && showTestOrderActions"
392
+ >
336
393
  <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-5">{{ t('order.createTestOrder') }}</div>
337
394
  <FmButton
338
395
  variant="primary"
@@ -347,5 +404,4 @@ const formattedMenuSyncError = computed(() => {
347
404
  class="m-1"
348
405
  />
349
406
  </div>
350
- -->
351
407
  </template>
@@ -0,0 +1,79 @@
1
+ <script setup lang="ts">
2
+ import { computed, type PropType, reactive } from 'vue'
3
+
4
+ import type { FdoLinkedDelivery } from '@feedmepos/core/entity'
5
+ import { type FdoLinemanSettings } from '@entity'
6
+ import type { DeliveryCompany } from '../delivery'
7
+ import type { IntegratedDeliverySettingData } from './IntegratedDelivery.vue'
8
+ import IntegratedDelivery from './IntegratedDelivery.vue'
9
+ import { clone } from '@/helpers/object'
10
+
11
+ export interface LinemanDeliveryData {
12
+ manual: FdoLinkedDelivery | null
13
+ integrated: FdoLinemanSettings
14
+ }
15
+
16
+ const props = defineProps({
17
+ initialValue: {
18
+ type: Object as PropType<LinemanDeliveryData>,
19
+ required: true
20
+ },
21
+ company: {
22
+ type: Object as PropType<DeliveryCompany>,
23
+ required: true
24
+ },
25
+ canUseAutoDeliveryIntegration: {
26
+ type: [String, Boolean],
27
+ required: true
28
+ }
29
+ })
30
+
31
+ const data = reactive(clone(props.initialValue))
32
+ const modelValue = computed<IntegratedDeliverySettingData>(() => {
33
+ const auto = data.integrated
34
+ return {
35
+ manual: data.manual,
36
+ auto: {
37
+ enable: auto.enable,
38
+ integrationId: auto.partnerID,
39
+ autoCloseBill: auto.autoCloseBill || false,
40
+ catalogId: auto?.catalogId || null,
41
+ commissionRate: 0,
42
+ printReceiptAfterClose: auto.printReceiptAfterClose ?? true
43
+ }
44
+ }
45
+ })
46
+
47
+ function updateData({ manual, auto }: IntegratedDeliverySettingData) {
48
+ data.manual = manual
49
+ data.integrated = {
50
+ ...data.integrated,
51
+ enable: auto.enable,
52
+ autoCloseBill: auto.autoCloseBill,
53
+ catalogId: auto.catalogId,
54
+ printReceiptAfterClose: auto.printReceiptAfterClose,
55
+ partnerID: auto.integrationId
56
+ }
57
+ return { manual: data.manual, integrated: data.integrated }
58
+ }
59
+
60
+ const emits = defineEmits<{
61
+ (e: 'update:model-value', payload: { manual: any; auto: any }): void
62
+ }>()
63
+
64
+ function updateDataPass({ manual, auto }: IntegratedDeliverySettingData) {
65
+ const updatedData = updateData({ manual, auto })
66
+ emits('update:model-value', { manual: updatedData.manual, auto: updatedData.integrated })
67
+ }
68
+ </script>
69
+
70
+ <template>
71
+ <IntegratedDelivery
72
+ :model-value="modelValue"
73
+ :company="company"
74
+ :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration"
75
+ :show-menu-sync-actions="false"
76
+ :show-test-order-actions="false"
77
+ @update:model-value="updateDataPass"
78
+ />
79
+ </template>
@@ -42,10 +42,12 @@ const modelValue = computed<IntegratedDeliverySettingData>(() => {
42
42
  enable: auto.enable,
43
43
  integrationId: auto.storeID,
44
44
  autoCloseBill: auto.autoCloseBill || false,
45
+ autoCloseOnDelivered: auto.autoCloseOnDelivered ?? false,
45
46
  catalogId: auto?.catalogId || null,
46
47
  printReceiptAfterClose: auto.printReceiptAfterClose ?? true,
47
48
  commissionRate: auto.reportConfig?.commissionRate || 0,
48
49
  lastSynchronize: auto.lastSynchronize,
50
+ ignoreDiscount: auto.ignoreDiscount ?? false,
49
51
  status: auto.status,
50
52
  updatedAt: auto.updatedAt,
51
53
  menuSyncError: auto.menuSyncError