@feedmepos/mf-order-setting 0.0.72-test.1 → 0.0.74-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 (186) hide show
  1. package/.env +1 -1
  2. package/README.md +7 -23
  3. package/dist/{KioskDevicesView-CP_cGMXE.js → KioskDevicesView-CW7nDXi2.js} +1 -1
  4. package/dist/KioskDevicesView.vue_vue_type_script_setup_true_lang-CPDkls2i.js +762 -0
  5. package/dist/{KioskSettingView-BiKYEjfe.js → KioskSettingView-DErXeFIt.js} +183 -202
  6. package/dist/KioskView-d1YjttbD.js +362 -0
  7. package/dist/OrderSettingsView-asfw4cYT.js +60012 -0
  8. package/dist/app-DrWO2wkv.js +20750 -0
  9. package/dist/app.js +3 -3
  10. package/dist/{dayjs.min-Bml-FvS7.js → dayjs.min-Fu6ejRAr.js} +1 -1
  11. package/dist/frontend/mf-order/src/api/index.d.ts +3 -1
  12. package/dist/frontend/mf-order/src/api/menu/index.d.ts +1 -1
  13. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +10 -3
  14. package/dist/frontend/mf-order/src/app.d.ts +194 -150
  15. package/dist/frontend/mf-order/src/components/GoogleMap.vue.d.ts +1 -1
  16. package/dist/frontend/mf-order/src/composables/useKioskPermission.d.ts +11 -0
  17. package/dist/frontend/mf-order/src/composables/useOrderSettingPermission.d.ts +13 -0
  18. package/dist/frontend/mf-order/src/composables/useQrOrderingEnabled.d.ts +2 -0
  19. package/dist/frontend/mf-order/src/helpers/menu.d.ts +1 -1
  20. package/dist/frontend/mf-order/src/main.d.ts +194 -150
  21. package/dist/frontend/mf-order/src/stores/kiosk/index.d.ts +21 -21
  22. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +906 -1044
  23. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +39 -6
  24. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +5 -2
  25. package/dist/frontend/mf-order/src/views/kiosk/KioskStatePanel.vue.d.ts +19 -0
  26. package/dist/frontend/mf-order/src/views/kiosk/devices/KioskDevicesView.vue.d.ts +7 -1
  27. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +2 -2
  28. package/dist/frontend/mf-order/src/views/order-settings/delivery/components/TaxInput.vue.d.ts +3 -8
  29. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +3 -1
  30. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +5 -1
  31. package/dist/frontend/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +21 -0
  32. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +2 -2
  33. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue.d.ts +1 -1
  34. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue.d.ts +28 -2
  35. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue.d.ts +46 -0
  36. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue.d.ts +57 -0
  37. package/dist/frontend/mf-order/src/views/order-settings/pickup/PickUpSettingDialogContent.vue.d.ts +23 -1
  38. package/dist/frontend/mf-order/src/views/order-settings/pickup/Preorder.vue.d.ts +27 -0
  39. package/dist/frontend/mf-order/src/views/order-settings/servicecharge/RateInput.vue.d.ts +8 -0
  40. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  41. package/dist/{index-BlKeAWPk.js → index-DEKeP24S.js} +7 -7
  42. package/dist/index-DJLCZHNZ.js +665 -0
  43. package/dist/lineman-settings.dto-DS4tgxBJ.js +61259 -0
  44. package/dist/package/entity/_type-assert.d.ts +7 -0
  45. package/dist/package/entity/booking/booking.dto.d.ts +24 -24
  46. package/dist/package/entity/delivery/delivery.dto.d.ts +8 -8
  47. package/dist/package/entity/delivery/delivery.enum.d.ts +12 -0
  48. package/dist/package/entity/delivery/gateway/grab.dto.d.ts +2 -2
  49. package/dist/package/entity/delivery/gateway/kosmo.dto.d.ts +16 -16
  50. package/dist/package/entity/delivery/gateway/pandago.dto.d.ts +10 -10
  51. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +282 -4591
  52. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +32 -24
  53. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +23 -11719
  54. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +2 -2
  55. package/dist/package/entity/index.d.ts +12 -0
  56. package/dist/package/entity/kiosk/kiosk.do.d.ts +140 -140
  57. package/dist/package/entity/kiosk/kiosk.dto.d.ts +168 -168
  58. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +63 -7
  59. package/dist/package/entity/marketing/marketing.dto.d.ts +4 -4
  60. package/dist/package/entity/member/member.dto.d.ts +6 -0
  61. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +8 -8
  62. package/dist/package/entity/order/effects/effect.dto.d.ts +68 -16
  63. package/dist/package/entity/order/menu/menu.dto.d.ts +45 -8
  64. package/dist/package/entity/order/order-item/order-item.dto.d.ts +358 -3853
  65. package/dist/package/entity/order/order.do.d.ts +239 -42
  66. package/dist/package/entity/order/order.dto.d.ts +6497 -2236
  67. package/dist/package/entity/order/payment/payment.dto.d.ts +52 -12
  68. package/dist/package/entity/order-platform/base-integration.do.d.ts +8 -0
  69. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +2 -2
  70. package/dist/package/entity/order-platform/deliveroo/deliveroo-order.do.d.ts +524 -524
  71. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +2 -2
  72. package/dist/package/entity/order-platform/deliveroo/deliveroo.menu.dto.d.ts +58 -58
  73. package/dist/package/entity/order-platform/external/menu/external-master-menu.do.d.ts +212 -284
  74. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +331 -589
  75. package/dist/package/entity/order-platform/external/menu/external-menu.dto.d.ts +1 -1
  76. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  77. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +275 -275
  78. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +3 -3
  79. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +3 -3
  80. package/dist/package/entity/order-platform/foodpanda/foodpanda-menu.dto.d.ts +284 -284
  81. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +40 -40
  82. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +16 -16
  83. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +2 -2
  84. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +2 -2
  85. package/dist/package/entity/order-platform/gofood/gofood-order.do.d.ts +18 -18
  86. package/dist/package/entity/order-platform/gofood/gofood-settings.do.d.ts +2 -2
  87. package/dist/package/entity/order-platform/gofood/gofood-settings.dto.d.ts +2 -2
  88. package/dist/package/entity/order-platform/gofood/gofood.dto.d.ts +32 -32
  89. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +12 -12
  90. package/dist/package/entity/order-platform/grabfood/grabfood-omni.do.d.ts +134 -115
  91. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +187 -165
  92. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +8 -2
  93. package/dist/package/entity/order-platform/grabfood/grabfood-webhook.dto.d.ts +49 -42
  94. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +67 -54
  95. package/dist/package/entity/order-platform/grabfood/grabfood.enum.d.ts +1 -1
  96. package/dist/package/entity/order-platform/lineman/lineman-settings.do.d.ts +37 -0
  97. package/dist/package/entity/order-platform/lineman/lineman-settings.dto.d.ts +40 -0
  98. package/dist/package/entity/order-platform/menu.dto.d.ts +716 -13887
  99. package/dist/package/entity/order-platform/order-platform.dto.d.ts +136 -2
  100. package/dist/package/entity/order-platform/order-platform.enum.d.ts +1 -1
  101. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +176 -176
  102. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.dto.d.ts +62 -62
  103. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +8 -2
  104. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +8 -2
  105. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +1061 -0
  106. package/dist/package/entity/order-platform/tng/tng-order.do.d.ts +1915 -0
  107. package/dist/package/entity/order-platform/tng/tng-settings.do.d.ts +379 -0
  108. package/dist/package/entity/order-platform/tng/tng-settings.dto.d.ts +301 -0
  109. package/dist/package/entity/order-platform/tng/tng.dto.d.ts +1162 -0
  110. package/dist/package/entity/order-platform/tng/tng.enum.d.ts +29 -0
  111. package/dist/package/entity/order-setting/delivery/inhouse-delivery.do.d.ts +12 -0
  112. package/dist/package/entity/order-setting/delivery/inhouse-delivery.dto.d.ts +12 -0
  113. package/dist/package/entity/order-setting/dine-in/dine-in.do.d.ts +11 -0
  114. package/dist/package/entity/order-setting/dine-in/dine-in.dto.d.ts +9 -0
  115. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +2 -2
  116. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +2 -2
  117. package/dist/package/entity/order-setting/order-setting.do.d.ts +59 -8
  118. package/dist/package/entity/order-setting/order-setting.dto.d.ts +118 -16
  119. package/dist/package/entity/order-setting/pickup/pickup.do.d.ts +12 -0
  120. package/dist/package/entity/order-setting/pickup/pickup.dto.d.ts +12 -0
  121. package/dist/package/entity/order-setting/sms/sms.do.d.ts +2 -2
  122. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +2 -2
  123. package/dist/package/entity/payment/transaction.d.ts +80 -8
  124. package/dist/package/entity/printer/printer.do.d.ts +14 -14
  125. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +1 -1
  126. package/dist/package/entity/queue/queue.do.d.ts +236 -1901
  127. package/dist/package/entity/queue/queue.dto.d.ts +743 -445
  128. package/dist/package/entity/restaurant/restaurant.dto.d.ts +27 -4
  129. package/dist/package/entity/websocket/websocket.dto.d.ts +10 -10
  130. package/dist/style.css +1 -0
  131. package/golar.config.ts +20 -0
  132. package/package.json +11 -4
  133. package/src/Entry.vue +2 -10
  134. package/src/api/index.ts +5 -2
  135. package/src/api/menu/index.ts +1 -1
  136. package/src/api/remoteOrder/index.ts +176 -110
  137. package/src/composables/useKioskPermission.ts +41 -0
  138. package/src/composables/useOrderSettingPermission.ts +34 -0
  139. package/src/composables/useQrOrderingEnabled.ts +66 -0
  140. package/src/helpers/menu.ts +1 -1
  141. package/src/locales/en-US.json +164 -147
  142. package/src/locales/ja-JP.json +1769 -1760
  143. package/src/locales/th-TH.json +409 -400
  144. package/src/locales/zh-CN.json +417 -408
  145. package/src/main.ts +12 -49
  146. package/src/router/index.ts +2 -2
  147. package/src/router/routes.ts +34 -5
  148. package/src/stores/menu/menu.ts +48 -27
  149. package/src/stores/restaurant/index.ts +24 -9
  150. package/src/utils/firebase-storage.ts +3 -13
  151. package/src/views/kiosk/KioskStatePanel.vue +31 -0
  152. package/src/views/kiosk/KioskView.vue +100 -62
  153. package/src/views/kiosk/devices/KioskDeviceCard.vue +4 -0
  154. package/src/views/kiosk/devices/KioskDevicesView.vue +42 -9
  155. package/src/views/kiosk/settings/KioskSettingView.vue +3 -2
  156. package/src/views/order-settings/OrderSettingsView.vue +39 -16
  157. package/src/views/order-settings/delivery/DeliverySetting.vue +223 -11
  158. package/src/views/order-settings/delivery/components/TaxInput.vue +1 -1
  159. package/src/views/order-settings/delivery/delivery.data.ts +31 -10
  160. package/src/views/order-settings/delivery/delivery.ts +60 -28
  161. package/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue +40 -1
  162. package/src/views/order-settings/delivery/integrated-delivery/DeliverooSetting.vue +1 -1
  163. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +15 -7
  164. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +83 -27
  165. package/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue +79 -0
  166. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +2 -0
  167. package/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue +749 -0
  168. package/src/views/order-settings/dine-in/DineInSetting.vue +54 -23
  169. package/src/views/order-settings/dine-in/PaymentType.vue +9 -12
  170. package/src/views/order-settings/general/GeneralSetting.vue +15 -6
  171. package/src/views/order-settings/pickup/PickUpSettingDialog.vue +31 -3
  172. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +34 -0
  173. package/src/views/order-settings/pickup/Preorder.vue +13 -12
  174. package/src/views/order-settings/queue/QueueSetting.vue +30 -1
  175. package/src/views/order-settings/servicecharge/RateInput.vue +9 -7
  176. package/vite.config.ts +21 -18
  177. package/dist/KioskDevicesView.vue_vue_type_script_setup_true_lang-CiNLqFw6.js +0 -707
  178. package/dist/KioskView-BYxPrI7N.js +0 -343
  179. package/dist/OrderSettingsView-C7Y-_y5U.js +0 -32222
  180. package/dist/app-BN02cB5o.js +0 -18668
  181. package/dist/frontend/mf-order/src/api/auth/index.d.ts +0 -7
  182. package/dist/frontend/mf-order/src/stores/iframe/index.d.ts +0 -14
  183. package/dist/index-DZA8A0m4.js +0 -630
  184. package/dist/queue-transfer.dto-C7nRZOZH.js +0 -45618
  185. package/src/api/auth/index.ts +0 -20
  186. 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
- import { defineConfig, loadEnv } from 'vite'
2
+ import { defineConfig, loadEnv, type UserConfig } 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,22 +39,27 @@ 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
61
- return fmmfVitePresent(config, env)
61
+ // fmmfVitePresent / @vitejs/plugin-vue types drifted vs vite's UserConfig after
62
+ // the mf-common ecosystem bump; the runtime shape is correct — cast to satisfy
63
+ // defineConfig's overload.
64
+ return fmmfVitePresent(config, env) as unknown as UserConfig
62
65
  })