@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
@@ -106,6 +106,22 @@
106
106
  label-placement="right"
107
107
  @update:model-value="updateOverridePax"
108
108
  ></FmSwitch>
109
+
110
+ <FmSwitch
111
+ :model-value="orderSetting?.dineInSettings?.autoCloseBill ?? false"
112
+ :label="t('order.autoCloseBill')"
113
+ :sublabel="t('order.autoCloseBillSublabel')"
114
+ label-placement="right"
115
+ @update:model-value="updateAutoCloseBill"
116
+ ></FmSwitch>
117
+
118
+ <FmSwitch
119
+ :model-value="orderSetting?.dineInSettings?.printReceiptAfterClose ?? false"
120
+ :label="t('order.printReceiptAfterClose')"
121
+ :sublabel="t('order.printReceiptAfterCloseSublabel')"
122
+ label-placement="right"
123
+ @update:model-value="updatePrintReceiptAfterClose"
124
+ ></FmSwitch>
109
125
  </div>
110
126
  <div class="p-[1.5rem] flex flex-col gap-2 m-5 w-2/3">
111
127
  <PaymentType
@@ -153,6 +169,8 @@ import { useSnackbarFunctions } from '@/components/snackbar'
153
169
 
154
170
  const { t } = useI18n()
155
171
 
172
+ type OrderDineInSettings = NonNullable<OrderSettingsDto['dineInSettings']>
173
+
156
174
  const { currentRestaurant } = useCoreStore()
157
175
  const restaurantStore = useRestaurantStore()
158
176
  const dineInSetting = ref<FdoRestaurantDineIn>(initDineInSetting())
@@ -208,27 +226,42 @@ function updateLastOrderMinutesBeforeClose(minutes: number) {
208
226
  }
209
227
  }
210
228
 
211
- function updatePrintChecklist(v: boolean) {
212
- if (orderSetting.value) {
213
- if (!orderSetting.value.dineInSettings) {
214
- orderSetting.value.dineInSettings = {
215
- overridePax: true,
216
- };
217
- }
218
- orderSetting.value.dineInSettings.printChecklist = v
229
+ function defaultOrderDineInSettings(
230
+ overrides: Partial<OrderDineInSettings> = {}
231
+ ): OrderDineInSettings {
232
+ return {
233
+ overridePax: true,
234
+ tableCartSyncMode: 'poll',
235
+ ...overrides
219
236
  }
220
237
  }
221
238
 
222
- function updateOverridePax(v: boolean) {
223
- if (orderSetting.value) {
224
- if (!orderSetting.value.dineInSettings) {
225
- orderSetting.value.dineInSettings = {
226
- overridePax: v,
227
- };
228
- } else {
229
- orderSetting.value.dineInSettings.overridePax = v
230
- }
239
+ function ensureOrderDineInSettings(): OrderDineInSettings | undefined {
240
+ if (!orderSetting.value) return undefined
241
+ if (!orderSetting.value.dineInSettings) {
242
+ orderSetting.value.dineInSettings = defaultOrderDineInSettings()
231
243
  }
244
+ return orderSetting.value.dineInSettings
245
+ }
246
+
247
+ function updatePrintChecklist(v: boolean) {
248
+ const dineInSettings = ensureOrderDineInSettings()
249
+ if (dineInSettings) dineInSettings.printChecklist = v
250
+ }
251
+
252
+ function updateOverridePax(v: boolean) {
253
+ const dineInSettings = ensureOrderDineInSettings()
254
+ if (dineInSettings) dineInSettings.overridePax = v
255
+ }
256
+
257
+ function updateAutoCloseBill(v: boolean) {
258
+ const dineInSettings = ensureOrderDineInSettings()
259
+ if (dineInSettings) dineInSettings.autoCloseBill = v
260
+ }
261
+
262
+ function updatePrintReceiptAfterClose(v: boolean) {
263
+ const dineInSettings = ensureOrderDineInSettings()
264
+ if (dineInSettings) dineInSettings.printReceiptAfterClose = v
232
265
  }
233
266
 
234
267
  // Threshold mirrors backend `posSupportsDineInRemarkMerge` — must be kept
@@ -259,12 +292,10 @@ const dineInRemarkMergeActionOptions = computed(() => [
259
292
  ])
260
293
 
261
294
  function ensureRemarkSettings() {
262
- if (!orderSetting.value) return
263
- if (!orderSetting.value.dineInSettings) {
264
- orderSetting.value.dineInSettings = { overridePax: true }
265
- }
266
- if (!orderSetting.value.dineInSettings.remark) {
267
- orderSetting.value.dineInSettings.remark = {
295
+ const dineInSettings = ensureOrderDineInSettings()
296
+ if (!dineInSettings) return
297
+ if (!dineInSettings.remark) {
298
+ dineInSettings.remark = {
268
299
  enabled: false,
269
300
  mergeAction: 'override'
270
301
  }
@@ -5,8 +5,7 @@ import OfflinePaymentTypeDialog from './OfflinePaymentTypeDialog.vue'
5
5
  import { useCoreStore, useI18n } from '@feedmepos/mf-common'
6
6
 
7
7
  const { t } = useI18n()
8
- const { currentRestaurant, namespace } = useCoreStore()
9
- const isDev = computed(() => namespace.value === 'dev')
8
+ const { currentRestaurant } = useCoreStore()
10
9
 
11
10
  const props = defineProps({
12
11
  paymentTypes: {
@@ -85,7 +84,7 @@ const checkboxChildren = computed(() => {
85
84
  }
86
85
  : undefined
87
86
  },
88
- ...(isDev.value ? [{
87
+ {
89
88
  label: t('order.credit'),
90
89
  value: 'credit',
91
90
  disable: !props.allowCredit,
@@ -95,7 +94,7 @@ const checkboxChildren = computed(() => {
95
94
  class: 'text-negative t-system'
96
95
  }
97
96
  : undefined
98
- }] : [])
97
+ }
99
98
  ]
100
99
  return options
101
100
  })
@@ -104,7 +103,7 @@ const initializeCheckboxes = () => {
104
103
  const initialValues: string[] = []
105
104
  if (allowOfflinePayment.value) initialValues.push('offline')
106
105
  if (allowEPayment.value) initialValues.push('e-payment')
107
- if (isDev.value && allowCreditPayment.value) initialValues.push('credit')
106
+ if (allowCreditPayment.value) initialValues.push('credit')
108
107
  nestedVal.value = initialValues
109
108
 
110
109
  let availableOptionsCount = 0
@@ -256,14 +255,12 @@ onMounted(() => {
256
255
  <slot name="e-payment-content"></slot>
257
256
  </div>
258
257
 
259
- <template v-if="isDev">
260
- <FmCheckbox v-if="allowCredit || showDisabledOptions" v-model="nestedVal" :label="checkboxChildren[2].label" :value="checkboxChildren[2].value"
261
- @update:model-value="handleChildUpdate" :disabled="checkboxChildren[2].disable" />
258
+ <FmCheckbox v-if="allowCredit || showDisabledOptions" v-model="nestedVal" :label="checkboxChildren[2].label" :value="checkboxChildren[2].value"
259
+ @update:model-value="handleChildUpdate" :disabled="checkboxChildren[2].disable" />
262
260
 
263
- <div class="text-fm-color-secondary-salmon fm-typo-en-body-sm-600 ml-7" v-if="checkboxChildren[2].suffix">
264
- {{ checkboxChildren?.[2]?.suffix?.text }}
265
- </div>
266
- </template>
261
+ <div class="text-fm-color-secondary-salmon fm-typo-en-body-sm-600 ml-7" v-if="checkboxChildren[2].suffix">
262
+ {{ checkboxChildren?.[2]?.suffix?.text }}
263
+ </div>
267
264
 
268
265
  </div>
269
266
  </template>
@@ -28,12 +28,21 @@
28
28
  <div class="mr-9 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-2 gap-5">
29
29
  <div class="min-w-0">
30
30
  <div class="bg-gray-50 p-3 rounded-lg border">
31
- <FmSwitch
32
- :model-value="!!orderSetting?.sequenceSettings?.autoReset?.resetTime"
33
- :label="t('order.autoResetOrderNumber')"
34
- @update:model-value="toggleResetTime"
35
- label-placement="right"
36
- ></FmSwitch>
31
+ <div class="flex items-center gap-2">
32
+ <FmSwitch
33
+ :model-value="!!orderSetting?.sequenceSettings?.autoReset?.resetTime"
34
+ :label="t('order.autoResetOrderNumber')"
35
+ @update:model-value="toggleResetTime"
36
+ label-placement="right"
37
+ ></FmSwitch>
38
+ <FmTooltip :content="t('order.autoResetOrderNumberTooltip')" :zIndex="1000">
39
+ <FmIcon
40
+ name="info"
41
+ size="sm"
42
+ class="cursor-help text-fm-color-neutral-gray-400"
43
+ />
44
+ </FmTooltip>
45
+ </div>
37
46
  <FmTimePicker
38
47
  v-if="!!orderSetting?.sequenceSettings?.autoReset?.resetTime"
39
48
  :model-value="orderSetting?.sequenceSettings?.autoReset?.resetTime"
@@ -1,7 +1,12 @@
1
1
  <template>
2
2
  <FmSideSheet :header="t('order.updatePickupSetting')" dismiss-away class="w-full fm-typo-en-title-md-600" :maxWidth="600"
3
3
  :model-value="props.showPickupDialog" @update:model-value="togglePickupDialog">
4
- <PickUpSettingDialogContent @update-pickup="updatePickupSetting" :pickup="pickupSetting" />
4
+ <PickUpSettingDialogContent
5
+ @update-pickup="updatePickupSetting"
6
+ @update-order-settings="updateOrderPickupSettings"
7
+ :pickup="pickupSetting"
8
+ :order-pickup-settings="orderPickupSettings"
9
+ />
5
10
  <template #side-sheet-footer>
6
11
  <div class="flex gap-8 items-center justify-start">
7
12
  <FmButton variant="primary" :label="t('order.apply')" size="lg" @click="onSave" />
@@ -21,6 +26,8 @@ import { useRestaurantStore } from '@/stores/restaurant'
21
26
  import { useSnackbarFunctions } from '@/components/snackbar'
22
27
  import { F_ORDER_PAYMENT_TYPE, FdoRestaurantPickup } from '@feedmepos/core/entity'
23
28
  import { useI18n } from '@feedmepos/mf-common'
29
+ import { OrderSettingApi } from '@/api/order-setting'
30
+ import type { OrderPickupSettingsDto, OrderSettingsDto } from '@entity'
24
31
 
25
32
  const { t } = useI18n()
26
33
 
@@ -30,6 +37,10 @@ const restaurantStore = useRestaurantStore()
30
37
  const { showSuccess, showError } = useSnackbarFunctions()
31
38
 
32
39
  const pickupSetting = ref<FdoRestaurantPickup>(initDefaultPickupSetting())
40
+ // `orderSetting.pickupSettings` (bill auto-close / receipt-print) is a separate doc
41
+ // from the restaurant-level pickup setting; loaded/saved alongside it here.
42
+ const orderSetting = ref<OrderSettingsDto | undefined>(undefined)
43
+ const orderPickupSettings = ref<OrderPickupSettingsDto>({})
33
44
  const props = defineProps({
34
45
  showPickupDialog: {
35
46
  type: Boolean,
@@ -58,12 +69,16 @@ function updatePickupSetting(value: FdoRestaurantPickup) {
58
69
  pickupSetting.value = value
59
70
  }
60
71
 
72
+ function updateOrderPickupSettings(value: OrderPickupSettingsDto) {
73
+ orderPickupSettings.value = value
74
+ }
75
+
61
76
  async function onSave() {
62
77
  const pickupTime = pickupSetting.value.pickupTime
63
78
  if (pickupTime) {
64
79
  const { min, max } = pickupTime.day
65
80
  if (max <= min || max - min > MAX_PREORDER_DAYS) {
66
- showError(t('order.preOrderMax7DaysError'))
81
+ showError(t('order.preOrderMaxDaysError', { days: MAX_PREORDER_DAYS }))
67
82
  return
68
83
  }
69
84
  }
@@ -73,6 +88,12 @@ async function onSave() {
73
88
  if (currentRestaurant.value) {
74
89
  currentRestaurant.value.pickup = pickupSetting.value
75
90
  }
91
+ if (orderSetting.value) {
92
+ orderSetting.value = await OrderSettingApi.updateOrderSetting({
93
+ ...orderSetting.value,
94
+ pickupSettings: orderPickupSettings.value
95
+ })
96
+ }
76
97
  showSuccess('Pickup setting updated. ')
77
98
  })
78
99
  await emits('close-side-sheet', true)
@@ -81,10 +102,17 @@ async function onSave() {
81
102
 
82
103
  watch(
83
104
  () => props.showPickupDialog,
84
- () => {
105
+ async (show) => {
85
106
  if (currentRestaurant.value) {
86
107
  pickupSetting.value = currentRestaurant.value.pickup ?? initDefaultPickupSetting()
87
108
  }
109
+ if (show && currentRestaurant.value) {
110
+ await startAsyncCallWithErr(async () => {
111
+ const setting = await OrderSettingApi.getOrderSetting()
112
+ orderSetting.value = setting
113
+ orderPickupSettings.value = setting.pickupSettings ?? {}
114
+ })
115
+ }
88
116
  }
89
117
  )
90
118
  </script>
@@ -8,6 +8,24 @@
8
8
  label-placement="right"
9
9
  @update:model-value="updateIgnoreStock"
10
10
  />
11
+ <FmSwitch
12
+ class="mt-5"
13
+ :model-value="orderPickupSettings.autoCloseBill ?? false"
14
+ value="autoCloseBill"
15
+ :label="t('order.autoCloseBill')"
16
+ :sublabel="t('order.autoCloseBillSublabel')"
17
+ label-placement="right"
18
+ @update:model-value="updateAutoCloseBill"
19
+ />
20
+ <FmSwitch
21
+ class="mt-5"
22
+ :model-value="orderPickupSettings.printReceiptAfterClose ?? false"
23
+ value="printReceiptAfterClose"
24
+ :label="t('order.printReceiptAfterClose')"
25
+ :sublabel="t('order.printReceiptAfterCloseSublabel')"
26
+ label-placement="right"
27
+ @update:model-value="updatePrintReceiptAfterClose"
28
+ />
11
29
  <FmCard variant="outlined" class="p-5 mt-10">
12
30
  <Preorder :model-value="pickupData" @update:model-value="updatePickupSetting" />
13
31
  </FmCard>
@@ -60,6 +78,7 @@ import {
60
78
  FdoPickupPoint,
61
79
  FdoRestaurantPickup
62
80
  } from '@feedmepos/core/entity'
81
+ import type { OrderPickupSettingsDto } from '@entity'
63
82
 
64
83
  import { computed, ref, watch, type PropType } from 'vue'
65
84
  import PickUpPointDialog from './PickUpPointDialog.vue'
@@ -82,14 +101,29 @@ const restaurantStore = useRestaurantStore()
82
101
 
83
102
  const emits = defineEmits<{
84
103
  (event: 'update-pickup', v: FdoRestaurantPickup): void
104
+ (event: 'update-order-settings', v: OrderPickupSettingsDto): void
85
105
  }>()
86
106
 
87
107
  const props = defineProps({
88
108
  pickup: {
89
109
  type: Object as PropType<FdoRestaurantPickup>,
90
110
  required: true
111
+ },
112
+ // Bill auto-close / receipt-print preferences live on `orderSetting.pickupSettings`,
113
+ // a separate doc from the restaurant-level pickup setting above.
114
+ orderPickupSettings: {
115
+ type: Object as PropType<OrderPickupSettingsDto>,
116
+ default: () => ({})
91
117
  }
92
118
  })
119
+
120
+ function updateAutoCloseBill(autoCloseBill: boolean) {
121
+ emits('update-order-settings', { ...props.orderPickupSettings, autoCloseBill })
122
+ }
123
+
124
+ function updatePrintReceiptAfterClose(printReceiptAfterClose: boolean) {
125
+ emits('update-order-settings', { ...props.orderPickupSettings, printReceiptAfterClose })
126
+ }
93
127
  const pickupSetting = ref<FdoRestaurantPickup>(defaultPickupSetting())
94
128
  const pickupData = computed<PreorderData | null>(() => {
95
129
  if (!pickupSetting.value.pickupTime) {
@@ -1,5 +1,14 @@
1
1
  <script lang="ts">
2
- export const MAX_PREORDER_DAYS = 7
2
+ export const MAX_PREORDER_DAYS = 30
3
+
4
+ export interface PreorderData {
5
+ day: {
6
+ min: number
7
+ max: number
8
+ }
9
+ }
10
+
11
+ export type InputModel = string | number | boolean | null
3
12
  </script>
4
13
 
5
14
  <script setup lang="ts">
@@ -9,13 +18,6 @@ import { useI18n } from '@feedmepos/mf-common'
9
18
 
10
19
  const { t } = useI18n()
11
20
 
12
- interface PreorderData {
13
- day: {
14
- min: number
15
- max: number
16
- }
17
- }
18
-
19
21
  enum PICKUP_TYPE {
20
22
  asap = 'asap',
21
23
  preorder = 'preorder'
@@ -72,8 +74,6 @@ function updatePickupTime(v: { min?: number; max?: number }) {
72
74
  emits('update:model-value', res)
73
75
  }
74
76
 
75
- type InputModel = string | number | boolean | null
76
-
77
77
  function getValue<T>(value: InputModel, type: 'string' | 'number'): T {
78
78
  let result = value
79
79
  switch (type) {
@@ -100,7 +100,8 @@ function updateEndTime(v: InputModel) {
100
100
 
101
101
  const validationError = computed<string | null>(() => {
102
102
  if (max.value < min.value) return t('order.preOrderInvalidRange')
103
- if (max.value - min.value + 1 > MAX_PREORDER_DAYS) return t('order.preOrderMax7DaysError')
103
+ if (max.value - min.value + 1 > MAX_PREORDER_DAYS)
104
+ return t('order.preOrderMaxDaysError', { days: MAX_PREORDER_DAYS })
104
105
  return null
105
106
  })
106
107
  </script>
@@ -126,6 +127,6 @@ const validationError = computed<string | null>(() => {
126
127
  {{ validationError }}
127
128
  </div>
128
129
  <div v-if="pickupType === 'preorder'" class="text-fm-color-overlay-background fm-typo-en-body-sm-400 mt-3">
129
- {{ t('order.preOrderHint', {today: preorderHint.today, start: preorderHint.start, end:preorderHint.end}) }}
130
+ {{ t('order.preOrderHint', {today: preorderHint.today, start: preorderHint.start, end:preorderHint.end, maxDays: MAX_PREORDER_DAYS}) }}
130
131
  </div>
131
132
  </template>
@@ -25,6 +25,7 @@ const orderSettingDefault = ref<FdoOrderSettings | undefined>(undefined)
25
25
  const queueSettings = ref<FdoOrderQueueSettings>({ ...defaultQueueSetting })
26
26
  const restaurantSetting = ref<RestaurantSettingDoc | undefined>(undefined)
27
27
  const presetRemarks = ref<string[]>([])
28
+ const allowOverrideQueueCode = ref<boolean>(false)
28
29
 
29
30
  const Dialog = useDialog()
30
31
 
@@ -77,6 +78,7 @@ async function init() {
77
78
  )
78
79
  const queueQrSetting = restaurantSetting.value?.queueQrSetting
79
80
  presetRemarks.value = queueQrSetting?.presetRemarks ?? []
81
+ allowOverrideQueueCode.value = queueQrSetting?.allowOverrideQueueCode ?? false
80
82
  })
81
83
  }
82
84
  }
@@ -151,7 +153,10 @@ async function savePresetRemarks(remarks: string[]) {
151
153
  const result = await restaurantApi.updateQueueSetting(currentRestaurant.value._id, {
152
154
  printerIds: queueQrSetting?.printerIds ?? [],
153
155
  promptConfirmationDialog: queueQrSetting?.promptConfirmationDialog,
154
- presetRemarks: remarks
156
+ presetRemarks: remarks,
157
+ // Preserve the override-code toggle — the backend replaces the whole
158
+ // queueQrSetting object, so omitting this would wipe it.
159
+ allowOverrideQueueCode: allowOverrideQueueCode.value
155
160
  })
156
161
 
157
162
  restaurantSetting.value = result
@@ -160,6 +165,23 @@ async function savePresetRemarks(remarks: string[]) {
160
165
  }
161
166
  })
162
167
  }
168
+
169
+ async function saveAllowOverrideQueueCode(value: boolean) {
170
+ allowOverrideQueueCode.value = value
171
+ await startAsyncCallWithErr(async () => {
172
+ if (currentRestaurant.value && restaurantSetting.value) {
173
+ const queueQrSetting = restaurantSetting.value.queueQrSetting
174
+ const result = await restaurantApi.updateQueueSetting(currentRestaurant.value._id, {
175
+ printerIds: queueQrSetting?.printerIds ?? [],
176
+ promptConfirmationDialog: queueQrSetting?.promptConfirmationDialog,
177
+ presetRemarks: queueQrSetting?.presetRemarks ?? presetRemarks.value,
178
+ allowOverrideQueueCode: value
179
+ })
180
+ restaurantSetting.value = result
181
+ }
182
+ })
183
+ showSuccess(t('order.settingUpdated'))
184
+ }
163
185
  </script>
164
186
 
165
187
  <template>
@@ -200,6 +222,13 @@ async function savePresetRemarks(remarks: string[]) {
200
222
  label-placement="right"
201
223
  />
202
224
 
225
+ <FmSwitch
226
+ :model-value="allowOverrideQueueCode"
227
+ @update:model-value="(v: boolean) => saveAllowOverrideQueueCode(v)"
228
+ :label="t('order.allowOverrideQueueCode')"
229
+ label-placement="right"
230
+ />
231
+
203
232
  <FmSwitch
204
233
  :model-value="queueSettings.disableSMS ?? false"
205
234
  @update:model-value="(v: boolean) => updateQueueSetting('disableSMS', v)"
@@ -1,12 +1,10 @@
1
1
  <template>
2
2
  <FmTextField
3
- :model-value="rate"
4
- :label="t('order.rate')"
5
- append-icon="percent"
6
- :rules="[
7
- (val) => (val >= 0 && val <= 100) || 'Invalid rate (0% - 100%)',
8
- ]"
9
3
  type="number"
4
+ append-icon="percent"
5
+ :model-value="rate"
6
+ :label="props.label ?? t('order.rate')"
7
+ :rules="[(val) => (val >= 0 && val <= 100) || 'Invalid rate (0% - 100%)']"
10
8
  @update:model-value="handleInputChange"
11
9
  />
12
10
  </template>
@@ -23,6 +21,10 @@ const props = defineProps({
23
21
  modelValue: {
24
22
  type: Object as PropType<AdjustmentAmount>,
25
23
  required: true
24
+ },
25
+ label: {
26
+ type: String,
27
+ required: false
26
28
  }
27
29
  })
28
30
 
@@ -35,7 +37,7 @@ const rate = computed(() => {
35
37
  })
36
38
 
37
39
  function handleInputChange(value: string) {
38
- const numberValue = parseFloat(value);
40
+ const numberValue = parseFloat(value)
39
41
  emits('update:model-value', percentToAdjustment(numberValue))
40
42
  }
41
43
  </script>
package/vite.config.ts CHANGED
@@ -1,12 +1,11 @@
1
1
  import { fileURLToPath, URL } from 'node:url'
2
2
  import { defineConfig, loadEnv } from 'vite'
3
3
  import vue from '@vitejs/plugin-vue'
4
- import { fmmfVitePresent } from "@feedmepos/mf-common/vite-preset";
5
-
4
+ import { fmmfVitePresent } from '@feedmepos/mf-common/vite-preset'
6
5
 
7
6
  // https://vitejs.dev/config/
8
7
  export default defineConfig((env) => {
9
- process.env = { ...process.env, ...loadEnv(env.mode, process.cwd(), "") }
8
+ process.env = { ...process.env, ...loadEnv(env.mode, process.cwd(), '') }
10
9
  const config = {
11
10
  plugins: [vue()],
12
11
  resolve: {
@@ -19,8 +18,7 @@ export default defineConfig((env) => {
19
18
  }
20
19
  },
21
20
  define: {
22
- devInfo: JSON.stringify({
23
- }),
21
+ devInfo: JSON.stringify({}),
24
22
  appApi: JSON.stringify({
25
23
  googleMap: process.env.VITE_GOOGLE_MAP_API_KEY,
26
24
  firebase: {
@@ -31,7 +29,7 @@ export default defineConfig((env) => {
31
29
  storageBucket: process.env.FIREBASE_STORAGE_BUCKET,
32
30
  messagingSenderId: process.env.FIREBASE_MESSAGING_SENDER_ID,
33
31
  appId: process.env.FIREBASE_APP_ID,
34
- measurementId: process.env.FIREBASE_MEASUREMENT_ID,
32
+ measurementId: process.env.FIREBASE_MEASUREMENT_ID
35
33
  },
36
34
  assetBucketUrl: process.env.ASSET_STORAGE_BUCKET,
37
35
  feedMeClientId: process.env.FEEDME_CLIENT_ID,
@@ -41,20 +39,22 @@ export default defineConfig((env) => {
41
39
  serverUrl: process.env.GTM_SERVER_URL,
42
40
  env: process.env.GTM_ENV,
43
41
  serverMeasurementId: process.env.GTM_SERVER_MEASUREMENT_ID,
44
- debug: process.env.GTM_DEBUG === 'true',
42
+ debug: process.env.GTM_DEBUG === 'true'
45
43
  },
46
- r2: process.env.R2_ENDPOINT ? {
47
- endPoint: process.env.R2_ENDPOINT,
48
- bucketName: process.env.R2_BUCKET_NAME,
49
- accessKeyId: process.env.R2_ACCESS_KEY || '',
50
- secretAccessKey: process.env.R2_ACCESS_SECRET || '',
51
- } : null,
44
+ r2: process.env.R2_ENDPOINT
45
+ ? {
46
+ endPoint: process.env.R2_ENDPOINT,
47
+ bucketName: process.env.R2_BUCKET_NAME,
48
+ accessKeyId: process.env.R2_ACCESS_KEY || '',
49
+ secretAccessKey: process.env.R2_ACCESS_SECRET || ''
50
+ }
51
+ : null
52
52
  }),
53
53
  appEndpoint: JSON.stringify({
54
- customerV3App: process.env.CUSTOMER_V3_APP_URL,
54
+ customerV3App: process.env.CUSTOMER_V3_APP_URL
55
55
  }),
56
- 'process.env': JSON.stringify(process.env),
57
- },
56
+ 'process.env': JSON.stringify(process.env)
57
+ }
58
58
  }
59
59
 
60
60
  // return config