@feedmepos/mf-order-setting 0.0.56-dev.1 → 0.0.56-dev.2

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 (64) hide show
  1. package/.tsbuildinfo +1 -1
  2. package/dist/{KioskDevicesView-CccsAZqK.js → KioskDevicesView-Qv-xd_kZ.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-dF1jgi53.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-CCF1mKni.js} +2 -2
  4. package/dist/KioskSettingView-CvvrK6Bv.js +643 -0
  5. package/dist/{KioskView-DmaCjLcw.js → KioskView-CppTVBv-.js} +117 -117
  6. package/dist/OrderSettingsView-C38N61dM.js +36564 -0
  7. package/dist/{app-EGmxrjDM.js → app-Bss1GkKY.js} +4 -4
  8. package/dist/app.js +1 -1
  9. package/dist/{dayjs.min-lCwCAXUZ.js → dayjs.min-DZfxGUk4.js} +1 -1
  10. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -0
  11. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
  12. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPaymentTypeSection.vue.d.ts +13 -3
  13. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +12 -4
  14. package/dist/frontend/mf-order/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue.d.ts +4 -4
  15. package/dist/frontend/mf-order/src/views/order-settings/dine-in/PaymentType.vue.d.ts +38 -4
  16. package/dist/frontend/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +1 -0
  17. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +1 -0
  18. package/dist/{index-CWrX79Jg.js → index-B6AGCsrw.js} +6 -6
  19. package/dist/index-BpKR-Cxd.js +19757 -0
  20. package/dist/{menu.dto-CgymySda.js → menu.dto-C_B3M2fs.js} +44222 -46755
  21. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +22443 -3
  22. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +3 -3
  23. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
  24. package/dist/package/entity/index.d.ts +1 -0
  25. package/dist/package/entity/marketing/marketing.dto.d.ts +1 -1
  26. package/dist/package/entity/order/dine-in/qr.dto.d.ts +38 -0
  27. package/dist/package/entity/order/order.do.d.ts +6358 -2
  28. package/dist/package/entity/order/order.dto.d.ts +22 -0
  29. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +3 -0
  30. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +3 -0
  31. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  32. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +32 -32
  33. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +21 -3
  34. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +12 -2
  35. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +3 -0
  36. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -0
  37. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +9 -1
  38. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
  39. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +3 -3
  40. package/dist/package/entity/order-platform/order-platform.dto.d.ts +2 -2
  41. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +3 -0
  42. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +3 -0
  43. package/dist/package/entity/order-setting/order-setting.do.d.ts +3 -0
  44. package/dist/package/entity/order-setting/order-setting.dto.d.ts +6 -0
  45. package/dist/package/entity/queue/queue.do.d.ts +3 -8
  46. package/dist/package/entity/queue/queue.dto.d.ts +10 -0
  47. package/dist/package/entity/reservation/reservation.do.d.ts +4 -0
  48. package/dist/package/entity/reservation/reservation.dto.d.ts +10 -0
  49. package/dist/package/entity/reservation/reservation.utils.d.ts +2 -2
  50. package/dist/style.css +1 -1
  51. package/package.json +1 -1
  52. package/src/views/kiosk/KioskSummary.vue +3 -0
  53. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +99 -211
  54. package/src/views/kiosk/settings/KioskSettingView.vue +27 -11
  55. package/src/views/order-settings/dine-in/DineInSetting.vue +1 -0
  56. package/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue +2 -3
  57. package/src/views/order-settings/dine-in/PaymentType.vue +151 -43
  58. package/src/views/order-settings/pickup/PaymentSidesheet.vue +33 -172
  59. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +1 -0
  60. package/src/views/order-settings/reservation/CustomTimePicker.vue +129 -49
  61. package/src/views/order-settings/reservation/ReservationSetting.vue +547 -303
  62. package/dist/KioskSettingView-8GY7AT-N.js +0 -722
  63. package/dist/OrderSettingsView-BZcU4t9L.js +0 -56240
  64. package/dist/index-BXsnV_eO.js +0 -150
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
- import { FdoOfflinePaymentMethod } from '@feedmepos/core/entity'
2
+ import { FdoOfflinePaymentMethod, F_ORDER_PAYMENT_TYPE as _F_ORDER_PAYMENT_TYPE } from '@feedmepos/core/entity'
3
3
  import { F_ORDER_PAYMENT_TYPE, F_ORDER_E_PAYMENT_TYPE, FdoEPaymentMethod } from '@entity'
4
4
  import { type PropType, computed, onMounted, ref } from 'vue'
5
- import OfflinePaymentTypeDialog from '../../order-settings/dine-in/OfflinePaymentTypeDialog.vue'
5
+ import PaymentType from '../../order-settings/dine-in/PaymentType.vue'
6
6
  import { useI18n } from '@feedmepos/mf-common'
7
7
 
8
8
  const { t } = useI18n()
@@ -20,6 +20,10 @@ const props = defineProps({
20
20
  type: [Boolean, String],
21
21
  required: true
22
22
  },
23
+ allowCredit: {
24
+ type: [Boolean, String],
25
+ default: false
26
+ },
23
27
  ePaymentTypes: {
24
28
  type: Object as PropType<FdoEPaymentMethod>,
25
29
  required: true
@@ -32,44 +36,18 @@ const emits = defineEmits<{
32
36
  (event: 'update:ePaymentTypes', v: FdoEPaymentMethod): void
33
37
  }>()
34
38
 
35
- async function deleteOfflinePayment(index: number) {
36
- emits(
37
- 'update:offlinePaymentTypes',
38
- props.offlinePaymentTypes.filter((_, i) => i !== index)
39
- )
40
- }
41
-
42
39
  const allowEPayment = computed(() => {
43
40
  const paymentTypes = props.paymentTypes || []
44
41
  return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
45
42
  })
46
43
 
47
- const allowOfflinePayment = computed(() => {
48
- const paymentTypes = props.paymentTypes || []
49
- const offlinePaymentTypes = props.offlinePaymentTypes || []
50
-
51
- return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.cash) || offlinePaymentTypes.length > 0
52
- })
53
-
54
- const parentCheckbox = ref(false)
55
- const paymentCheckboxVal = ref<string[]>([])
56
44
  const cardPaymentRadioVal = ref<string>()
57
45
  const eWalletPaymentCheckboxVal = ref<string[]>([])
58
46
  const useCard = ref(false)
59
47
  const useTerminal = ref(false)
60
48
  const useEwallet = ref(false)
61
49
 
62
- const checkboxChildren = [
63
- { label: t('order.offlinePayment'), value: 'offline' },
64
- { label: t('order.ePayment'), value: 'e-payment' }
65
- ]
66
-
67
50
  const initializeCheckboxes = () => {
68
- const initialValues: string[] = []
69
- if (allowOfflinePayment.value) initialValues.push('offline')
70
- if (allowEPayment.value) initialValues.push('e-payment')
71
- paymentCheckboxVal.value = initialValues
72
- parentCheckbox.value = initialValues.length === checkboxChildren.length
73
51
  if (!(Object.keys(props.ePaymentTypes).length === 0)) {
74
52
  if (props.ePaymentTypes.terminal) {
75
53
  useTerminal.value = true
@@ -97,54 +75,6 @@ const initializeCheckboxes = () => {
97
75
 
98
76
  initializeCheckboxes()
99
77
 
100
- const handleParentUpdate = (ev: boolean) => {
101
- paymentCheckboxVal.value = ev ? checkboxChildren.map((item) => item.value) : []
102
- parentCheckbox.value = ev
103
-
104
- const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
105
- const updatedOfflinePaymentTypes = ev ? props.offlinePaymentTypes || [] : []
106
-
107
- if (paymentCheckboxVal.value.includes('e-payment')) {
108
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.ePayment)
109
- useCard.value = true
110
- useEwallet.value = true
111
- }
112
- if (paymentCheckboxVal.value.includes('offline')) {
113
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
114
- }
115
-
116
- emits('update:paymentTypes', updatedPaymentTypes)
117
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
118
- updateCardSwitch(useCard.value)
119
- updateECardSwitch(useEwallet.value)
120
- }
121
-
122
- const handleChildUpdate = (ev: string[]) => {
123
- const currentPaymentCheckboxVal = paymentCheckboxVal.value
124
- paymentCheckboxVal.value = ev
125
- parentCheckbox.value = ev.length === checkboxChildren.length
126
-
127
- const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
128
- const updatedOfflinePaymentTypes = ev.includes('offline') ? props.offlinePaymentTypes || [] : []
129
-
130
- if (ev.includes('e-payment')) {
131
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.ePayment)
132
- }
133
- if (ev.includes('offline')) {
134
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
135
- }
136
-
137
- if (!currentPaymentCheckboxVal.includes('e-payment')) {
138
- useCard.value = true
139
- useEwallet.value = true
140
- updateCardSwitch(useCard.value)
141
- updateECardSwitch(useEwallet.value)
142
- }
143
-
144
- emits('update:paymentTypes', updatedPaymentTypes)
145
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
146
- }
147
-
148
78
  const handleEPaymentCardUpdate = (ev: string) => {
149
79
  const ePaymentObj = {
150
80
  terminal: false,
@@ -158,7 +88,7 @@ const handleEPaymentCardUpdate = (ev: string) => {
158
88
  }
159
89
  } as FdoEPaymentMethod
160
90
 
161
- if (paymentCheckboxVal.value.includes('e-payment')) {
91
+ if (allowEPayment.value) { // Check computed property instead of local state
162
92
  if (ev == F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL) {
163
93
  ePaymentObj.card.terminal = true
164
94
  }
@@ -200,7 +130,7 @@ const handleEPaymentEWalletUpdate = () => {
200
130
  }
201
131
  } as FdoEPaymentMethod
202
132
 
203
- if (paymentCheckboxVal.value.includes('e-payment')) {
133
+ if (allowEPayment.value) {
204
134
  if (cardPaymentRadioVal.value) {
205
135
  if (cardPaymentRadioVal.value === F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL) {
206
136
  ePaymentObj.card.terminal = true
@@ -254,145 +184,103 @@ const updateECardSwitch = (enabled: boolean) => {
254
184
  handleEPaymentEWalletUpdate()
255
185
  }
256
186
 
187
+ const handlePaymentTypesUpdate = (v: F_ORDER_PAYMENT_TYPE[]) => {
188
+ emits('update:paymentTypes', v)
189
+ if (!v.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)) {
190
+ useCard.value = false
191
+ useEwallet.value = false
192
+ updateCardSwitch(false)
193
+ updateECardSwitch(false)
194
+ }
195
+ }
196
+
257
197
  onMounted(() => {
258
198
  initializeCheckboxes()
259
199
  })
260
200
  </script>
261
201
  <template>
262
- <FmCheckbox
263
- value=""
264
- :model-value="parentCheckbox"
265
- :label="t('order.all')"
266
- :indeterminate="
267
- paymentCheckboxVal.length > 0 && paymentCheckboxVal.length < checkboxChildren.length
268
- "
269
- @update:model-value="handleParentUpdate"
270
- />
271
-
272
- <div class="flex flex-row items-center">
273
- <FmCheckbox
274
- v-model="paymentCheckboxVal"
275
- :label="checkboxChildren[0].label"
276
- :value="checkboxChildren[0].value"
277
- @update:model-value="handleChildUpdate"
278
- />
279
- </div>
280
- <div
281
- v-if="
282
- paymentCheckboxVal.includes(checkboxChildren[0].value) && offlinePaymentTypes?.length === 0
283
- "
284
- >
285
- <OfflinePaymentTypeDialog
286
- @update:offline-payment-types="
287
- (v: FdoOfflinePaymentMethod[]) => emits('update:offlinePaymentTypes', v)
288
- "
289
- />
290
- </div>
291
-
292
- <div v-if="paymentCheckboxVal.includes('offline')" class="ml-7">
293
- <div v-if="offlinePaymentTypes?.length === 0">
294
- <FmCard variant="outlined">
295
- <FmCardSection>{{ t('order.payAtCounter') }}</FmCardSection>
296
- </FmCard>
297
- </div>
298
- <p v-for="(type, i) in offlinePaymentTypes" :key="i">
299
- <FmCard variant="outlined">
300
- <FmCardSection class="flex items-center justify-between">
301
- <div>
302
- <span class="font-bold">{{ type.name }}</span>
303
- <br />
304
- <span>{{ type.instruction }}</span>
305
- </div>
306
- <div v-for="(payment, index) in offlinePaymentTypes" :key="index">
307
- <FmButton
308
- append-icon="delete"
309
- variant="tertiary"
310
- @click="deleteOfflinePayment(index)"
202
+ <PaymentType
203
+ :payment-types="paymentTypes as unknown as _F_ORDER_PAYMENT_TYPE[]"
204
+ :offline-payment-types="offlinePaymentTypes"
205
+ :allow-e-payment="props.allowEPayment"
206
+ :allow-credit="props.allowCredit"
207
+ @update:payment-types="handlePaymentTypesUpdate"
208
+ @update:offline-payment-types="(v) => emits('update:offlinePaymentTypes', v || [])"
209
+ >
210
+ <template #e-payment-content>
211
+ <FmCard variant="outlined">
212
+ <FmCardSection>
213
+ <FmSwitch
214
+ :label="t('order.bankCard')"
215
+ :sublabel="t('order.cardPaymentDescription')"
216
+ label-placement="right"
217
+ v-model="useCard"
218
+ @update:modelValue="updateCardSwitch"
311
219
  />
312
- </div>
313
- </FmCardSection>
314
- </FmCard>
315
- </p>
316
- </div>
317
- <FmCheckbox
318
- v-model="paymentCheckboxVal"
319
- :label="checkboxChildren[1].label"
320
- :value="checkboxChildren[1].value"
321
- @update:model-value="handleChildUpdate"
322
- />
323
- <div v-if="paymentCheckboxVal.includes(checkboxChildren[1].value)" class="ml-7">
324
- <FmCard variant="outlined">
325
- <FmCardSection>
326
- <FmSwitch
327
- :label="t('order.bankCard')"
328
- :sublabel="t('order.cardPaymentDescription')"
329
- label-placement="right"
330
- v-model="useCard"
331
- @update:modelValue="updateCardSwitch"
332
- />
333
- <br />
334
- <div v-show="useCard" class="ml-7">
335
- <FmRadioGroup
336
- v-model="cardPaymentRadioVal"
337
- @update:model-value="handleEPaymentCardUpdate"
338
- inline
339
- >
340
- <FmRadio :label="t('order.terminal')" :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL" />
341
- <FmRadio :label="t('order.nfc')" :value="F_ORDER_E_PAYMENT_TYPE.enum.NFC" />
342
- </FmRadioGroup>
343
- </div>
344
- </FmCardSection>
345
- </FmCard>
346
- <FmCard variant="outlined" class="mt-2">
347
- <FmCardSection>
348
- <FmSwitch
349
- :label="t('order.terminal')"
350
- :sublabel="t('order.terminalPaymentDescription')"
351
- label-placement="right"
352
- v-model="useTerminal"
353
- @update:modelValue="updateCardSwitch"
354
- />
355
- </FmCardSection>
356
- </FmCard>
357
- <FmCard variant="outlined" class="mt-2">
358
- <FmCardSection>
359
- <FmSwitch
360
- :label="t('order.eWallet')"
361
- :sublabel="t('order.eWalletDescription')"
362
- label-placement="right"
363
- v-model="useEwallet"
364
- @update:modelValue="updateECardSwitch"
365
- />
366
- <br />
367
- <div v-show="useEwallet" class="ml-7">
368
- <div class="flex flex-row gap-9">
369
- <FmCheckbox
370
- v-model="eWalletPaymentCheckboxVal"
371
- :label="t('order.qrPay')"
372
- :value="F_ORDER_E_PAYMENT_TYPE.enum.QRPAY"
373
- @update:model-value="handleEPaymentEWalletUpdate"
374
- />
375
- <FmCheckbox
376
- v-model="eWalletPaymentCheckboxVal"
377
- :label="t('order.scanPay')"
378
- :value="F_ORDER_E_PAYMENT_TYPE.enum.SCANPAY"
379
- @update:model-value="handleEPaymentEWalletUpdate"
380
- />
381
- <FmCheckbox
382
- v-model="eWalletPaymentCheckboxVal"
383
- :label="t('order.terminalScanPay')"
384
- :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_SCAN_PAY"
385
- @update:model-value="handleEPaymentEWalletUpdate"
220
+ <br />
221
+ <div v-show="useCard" class="ml-7">
222
+ <FmRadioGroup
223
+ v-model="cardPaymentRadioVal"
224
+ @update:model-value="handleEPaymentCardUpdate"
225
+ inline
226
+ >
227
+ <FmRadio :label="t('order.terminal')" :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL" />
228
+ <FmRadio :label="t('order.nfc')" :value="F_ORDER_E_PAYMENT_TYPE.enum.NFC" />
229
+ </FmRadioGroup>
230
+ </div>
231
+ </FmCardSection>
232
+ </FmCard>
233
+ <FmCard variant="outlined" class="mt-2">
234
+ <FmCardSection>
235
+ <FmSwitch
236
+ :label="t('order.terminal')"
237
+ :sublabel="t('order.terminalPaymentDescription')"
238
+ label-placement="right"
239
+ v-model="useTerminal"
240
+ @update:modelValue="handleEPaymentEWalletUpdate"
386
241
  />
387
- <FmCheckbox
388
- v-model="eWalletPaymentCheckboxVal"
389
- :label="t('order.terminalQrPay')"
390
- :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_QR_PAY"
391
- @update:model-value="handleEPaymentEWalletUpdate"
242
+ </FmCardSection>
243
+ </FmCard>
244
+ <FmCard variant="outlined" class="mt-2">
245
+ <FmCardSection>
246
+ <FmSwitch
247
+ :label="t('order.eWallet')"
248
+ :sublabel="t('order.eWalletDescription')"
249
+ label-placement="right"
250
+ v-model="useEwallet"
251
+ @update:modelValue="updateECardSwitch"
392
252
  />
393
- </div>
394
- </div>
395
- </FmCardSection>
396
- </FmCard>
397
- </div>
253
+ <br />
254
+ <div v-show="useEwallet" class="ml-7">
255
+ <div class="flex flex-row gap-9">
256
+ <FmCheckbox
257
+ v-model="eWalletPaymentCheckboxVal"
258
+ :label="t('order.qrPay')"
259
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.QRPAY"
260
+ @update:model-value="handleEPaymentEWalletUpdate"
261
+ />
262
+ <FmCheckbox
263
+ v-model="eWalletPaymentCheckboxVal"
264
+ :label="t('order.scanPay')"
265
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.SCANPAY"
266
+ @update:model-value="handleEPaymentEWalletUpdate"
267
+ />
268
+ <FmCheckbox
269
+ v-model="eWalletPaymentCheckboxVal"
270
+ :label="t('order.terminalScanPay')"
271
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_SCAN_PAY"
272
+ @update:model-value="handleEPaymentEWalletUpdate"
273
+ />
274
+ <FmCheckbox
275
+ v-model="eWalletPaymentCheckboxVal"
276
+ :label="t('order.terminalQrPay')"
277
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_QR_PAY"
278
+ @update:model-value="handleEPaymentEWalletUpdate"
279
+ />
280
+ </div>
281
+ </div>
282
+ </FmCardSection>
283
+ </FmCard>
284
+ </template>
285
+ </PaymentType>
398
286
  </template>
@@ -217,10 +217,9 @@
217
217
 
218
218
  <!-- Payment Section -->
219
219
  <div class="flex flex-col gap-2">
220
- <span class="fm-typo-en-title-sm-600">{{ t('order.acceptedPayment') }}</span>
221
- <span class="fm-typo-en-title-sm-400 font-bold">{{ t('order.configuration') }}</span>
222
220
  <KioskPaymentTypeSection
223
221
  :payment-types="kioskOrderSettingForm.paymentSetting.paymentTypes ?? []"
222
+ :allow-credit="true"
224
223
  :allow-e-payment="allowEPayment"
225
224
  :offline-payment-types="kioskOrderSettingForm.paymentSetting.offlinePaymentTypes ?? []"
226
225
  :ePaymentTypes="kioskOrderSettingForm.paymentSetting.ePaymentTypes ?? {}"
@@ -248,6 +247,7 @@
248
247
  <script setup lang="ts">
249
248
  import { computed, ref } from 'vue'
250
249
  import KioskPaymentTypeSection from './KioskPaymentTypeSection.vue'
250
+ import { useRestaurantStore } from '@/stores/restaurant'
251
251
  import { FdoOfflinePaymentMethod } from '@feedmepos/core/entity'
252
252
  import { FdoEPaymentMethod, F_ORDER_PAYMENT_TYPE } from '@entity'
253
253
  import type {
@@ -312,6 +312,22 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
312
312
  if (!isValid) return null
313
313
  }
314
314
 
315
+ // Validate payment settings
316
+ const payment = f.paymentSetting
317
+ if (payment?.paymentTypes?.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)) {
318
+ const ePayment = payment.ePaymentTypes
319
+ if (!ePayment) return null
320
+
321
+ const hasCard = ePayment.card?.terminal || ePayment.card?.nfc
322
+ const hasWallet =
323
+ ePayment.eWallet?.qrPay ||
324
+ ePayment.eWallet?.scanPay ||
325
+ ePayment.eWallet?.terminalScanPay ||
326
+ ePayment.eWallet?.terminalQrPay
327
+
328
+ if (!hasCard && !hasWallet) return null
329
+ }
330
+
315
331
  // Return the form as-is if valid, with display stand disabled when dineIn is disabled
316
332
  return {
317
333
  ...f,
@@ -341,6 +357,7 @@ function updateEPaymentSetting(form: FdoEPaymentMethod) {
341
357
  kioskOrderSettingForm.value.paymentSetting.ePaymentTypes = form
342
358
  }
343
359
 
360
+ const restaurantStore = useRestaurantStore()
344
361
  type CoverImageField = 'coverImageLandscape' | 'coverImagePortrait'
345
362
  const MAX_IMAGE_FILE_SIZE = 10 * 1000 * 1000
346
363
 
@@ -376,10 +393,10 @@ async function uploadCoverImage(field: CoverImageField, file: File) {
376
393
  }
377
394
  }
378
395
 
379
- function handleCoverImageRejected(
380
- field: CoverImageField,
381
- rejected: { file: File; reason: string[] }[]
382
- ) {
396
+ function handleCoverImageRejected(
397
+ field: CoverImageField,
398
+ rejected: { file: File; reason: string[] }[]
399
+ ) {
383
400
  const fieldName =
384
401
  field === 'coverImageLandscape' ? t('order.coverImageLandscape') : t('order.coverImagePortrait')
385
402
  const firstReason = rejected[0]?.reason?.[0]
@@ -387,13 +404,12 @@ function handleCoverImageRejected(
387
404
  title: firstReason
388
405
  ? `${t('order.imageUploadRejected')}: ${fieldName} (${firstReason})`
389
406
  : `${t('order.imageUploadRejected')}: ${fieldName}`,
390
- type: 'error'
391
- })
392
- }
407
+ type: 'error'
408
+ })
409
+ }
393
410
 
394
411
  const allowEPayment = computed(() => {
395
- const paymentTypes = kioskOrderSettingForm.value.paymentSetting.paymentTypes || []
396
- return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
412
+ return restaurantStore.getRestaurantEPayment()
397
413
  })
398
414
 
399
415
  const enablePaxDialog = computed({
@@ -90,6 +90,7 @@
90
90
  <PaymentType
91
91
  :payment-types="dineInSetting.paymentTypes ?? []"
92
92
  :allow-e-payment="allowEPayment"
93
+ :allow-credit="true"
93
94
  :offline-payment-types="dineInSetting.offlinePaymentTypes ?? []"
94
95
  @update:payment-types="(v: F_ORDER_PAYMENT_TYPE[]) => (dineInSetting.paymentTypes = v)"
95
96
  @update:offline-payment-types="
@@ -40,12 +40,11 @@ const openDialog = () => {
40
40
  }
41
41
 
42
42
  async function addOfflinePayment(newPaymentType: FdoOfflinePaymentMethod) {
43
- const updatedOfflinePaymentTypes = [newPaymentType]
44
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
43
+ emits('add:offline-payment-type', newPaymentType)
45
44
  }
46
45
 
47
46
  const emits = defineEmits<{
48
- (event: 'update:offlinePaymentTypes', v: FdoOfflinePaymentMethod[]): void
47
+ (event: 'add:offline-payment-type', v: FdoOfflinePaymentMethod): void
49
48
  }>()
50
49
  </script>
51
50