@feedmepos/mf-order-setting 0.0.21-beta.3 → 0.0.23

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 (109) hide show
  1. package/dist/{KioskDevicesView-Cb7Rw7t8.js → KioskDevicesView-BdJCcotz.js} +1 -1
  2. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-raPhhBpi.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-DUPfN7ti.js} +2 -2
  3. package/dist/KioskSettingView-BChhriPk.js +782 -0
  4. package/dist/KioskView-DPU-oQ1H.js +426 -0
  5. package/dist/{OrderSettingsView-BJ1b1Qjg.js → OrderSettingsView-BOiflwB_.js} +34011 -32822
  6. package/dist/{app-BY258ajB.js → app-CaYWSLe1.js} +39 -17
  7. package/dist/app.js +1 -1
  8. package/dist/common/convertor/index.d.ts +2 -0
  9. package/dist/common/sms/index.d.ts +1 -1
  10. package/dist/common/util/index.d.ts +6 -0
  11. package/dist/{dayjs.min-4COVK72W.js → dayjs.min-8NyoNely.js} +36 -36
  12. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +5 -2
  13. package/dist/frontend/mf-order/src/app.d.ts +22 -0
  14. package/dist/frontend/mf-order/src/helpers/menu.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/modules/order-setting/kiosk/interface.d.ts +13 -0
  16. package/dist/frontend/mf-order/src/stores/app/index.d.ts +14 -4
  17. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +45 -35
  18. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +168 -12
  19. package/dist/frontend/mf-order/src/stores/order-setting/mapper.d.ts +2 -1
  20. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +581 -716
  21. package/dist/frontend/mf-order/src/views/all-orders/ReflowOrder.vue.d.ts +140 -174
  22. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskInstructionSection.vue.d.ts +15 -0
  23. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPickAtCounterSection.vue.d.ts +4 -3
  24. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +2 -2
  25. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +2 -1
  26. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +3 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +97 -0
  28. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue.d.ts +3 -3
  29. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  30. package/dist/{index-t_7ThPjm.js → index-B7GFhkAE.js} +2 -2
  31. package/dist/package/entity/booking/booking.do.d.ts +1516 -1276
  32. package/dist/package/entity/delivery/delivery.dto.d.ts +298 -251
  33. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +539 -0
  34. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +114 -9
  35. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +862 -4
  36. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
  37. package/dist/package/entity/index.d.ts +34 -22
  38. package/dist/package/entity/kiosk/kiosk.do.d.ts +12 -12
  39. package/dist/package/entity/kiosk/kiosk.dto.d.ts +12 -12
  40. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +1942 -1642
  41. package/dist/package/entity/member/member.dto.d.ts +33 -0
  42. package/dist/package/entity/order/order-item/order-item.dto.d.ts +15 -0
  43. package/dist/package/entity/order/order.do.d.ts +37 -0
  44. package/dist/package/entity/order/order.dto.d.ts +808 -17435
  45. package/dist/package/entity/order/order.enum.d.ts +2 -0
  46. package/dist/package/entity/order-platform/external/auth/external-auth.do.d.ts +12 -0
  47. package/dist/package/entity/order-platform/external/auth/external-auth.dto.d.ts +27 -0
  48. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +2868 -0
  49. package/dist/package/entity/order-platform/external/menu/external-menu.dto.d.ts +21 -0
  50. package/dist/package/entity/order-platform/external/menu/external-menu.enum.d.ts +3 -0
  51. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +1373 -0
  52. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +2834 -0
  53. package/dist/package/entity/order-platform/external/order/external-order.enum.d.ts +9 -0
  54. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +127 -0
  55. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +95 -0
  56. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +98 -98
  57. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +345 -297
  58. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +4 -4
  59. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -3
  60. package/dist/package/entity/order-platform/grabfood/grabfood-menu.do.d.ts +65 -65
  61. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +311 -263
  62. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
  63. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +7 -7
  64. package/dist/package/entity/order-platform/menu.dto.d.ts +126 -0
  65. package/dist/package/entity/order-platform/order-platform.dto.d.ts +4 -4
  66. package/dist/package/entity/order-platform/order-platform.enum.d.ts +1 -1
  67. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +298 -250
  68. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +115 -0
  69. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +225 -41
  70. package/dist/package/entity/order-setting/kiosk/kiosk.enum.d.ts +3 -0
  71. package/dist/package/entity/order-setting/order-setting.do.d.ts +138 -8
  72. package/dist/package/entity/order-setting/order-setting.dto.d.ts +276 -16
  73. package/dist/package/entity/order-setting/sequence/sequence.do.d.ts +4 -4
  74. package/dist/package/entity/order-setting/sequence/sequence.dto.d.ts +4 -4
  75. package/dist/package/entity/payment/payment.enum.d.ts +2 -0
  76. package/dist/package/entity/printer/printer.do.d.ts +2 -2
  77. package/dist/package/entity/pubsub/ably/ably.do.d.ts +60 -9
  78. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +1 -1
  79. package/dist/package/entity/queue/queue.do.d.ts +40 -0
  80. package/dist/package/entity/restaurant/restaurant.dto.d.ts +136 -6
  81. package/dist/package/entity/websocket/websocket.dto.d.ts +288 -0
  82. package/dist/{auth.dto-BOoRSQkS.js → queue.do-CIyIpp22.js} +30390 -29706
  83. package/package.json +4 -3
  84. package/src/api/remoteOrder/index.ts +13 -2
  85. package/src/helpers/menu.ts +2 -2
  86. package/src/locales/en-US.json +13 -2
  87. package/src/locales/zh-CN.json +12 -1
  88. package/src/modules/order-setting/kiosk/interface.ts +16 -0
  89. package/src/stores/order-setting/mapper.ts +58 -7
  90. package/src/stores/restaurant/index.ts +4 -1
  91. package/src/views/kiosk/settings/KioskDineInSection.vue +4 -5
  92. package/src/views/kiosk/settings/KioskDisplayStandSection.vue +36 -0
  93. package/src/views/kiosk/settings/KioskInstructionSection.vue +40 -0
  94. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +30 -19
  95. package/src/views/kiosk/settings/KioskPickAtCounterSection.vue +45 -7
  96. package/src/views/kiosk/settings/KioskSettingView.vue +15 -3
  97. package/src/views/kiosk/settings/KioskTakeawaySection.vue +38 -4
  98. package/src/views/order-settings/delivery/DeliverySetting.vue +82 -6
  99. package/src/views/order-settings/delivery/delivery.data.ts +16 -1
  100. package/src/views/order-settings/delivery/delivery.ts +1 -0
  101. package/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue +114 -0
  102. package/src/views/order-settings/delivery/integrated-delivery/FoodpandaSetting.vue +23 -6
  103. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +21 -16
  104. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +58 -59
  105. package/src/views/order-settings/pickup/PickUpSetting.vue +1 -1
  106. package/src/views/order-settings/servicecharge/ServiceChargeRule.vue +216 -165
  107. package/src/views/order-settings/servicecharge/ServiceChargeSetting.vue +1 -0
  108. package/dist/KioskSettingView-BQgyeWbo.js +0 -649
  109. package/dist/KioskView-BLkuqfZ_.js +0 -371
@@ -106,7 +106,11 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
106
106
  min: f.dineIn.displayStand.standSlotRange.min ?? 0,
107
107
  max: f.dineIn.displayStand.standSlotRange.max ?? 10
108
108
  },
109
- prefix: f.dineIn.displayStand.prefix ?? ''
109
+ prefix: f.dineIn.displayStand.prefix ?? '',
110
+ submitOrderInstruction: {
111
+ payAtCounter: f.dineIn.displayStand.submitOrderInstruction.payAtCounter ?? null,
112
+ paid: f.dineIn.displayStand.submitOrderInstruction.paid ?? null
113
+ }
110
114
  }
111
115
  }
112
116
  }
@@ -134,7 +138,11 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
134
138
  min: displayStand.standSlotRange.min,
135
139
  max: displayStand.standSlotRange.max
136
140
  },
137
- prefix: displayStand.prefix ?? ''
141
+ prefix: displayStand.prefix ?? '',
142
+ submitOrderInstruction: {
143
+ payAtCounter: displayStand.submitOrderInstruction.payAtCounter ?? null,
144
+ paid: displayStand.submitOrderInstruction.paid ?? null
145
+ }
138
146
  }
139
147
  }
140
148
  }
@@ -154,7 +162,11 @@ const validKioskOrderSetting = computed<MfKioskOrderSetting | null>(() => {
154
162
  min: f.dineIn.displayStand.standSlotRange.min ?? 0,
155
163
  max: f.dineIn.displayStand.standSlotRange.max ?? 10
156
164
  },
157
- prefix: f.dineIn.displayStand.prefix ?? ''
165
+ prefix: f.dineIn.displayStand.prefix ?? '',
166
+ submitOrderInstruction: {
167
+ payAtCounter: f.dineIn.displayStand.submitOrderInstruction.payAtCounter ?? null,
168
+ paid: f.dineIn.displayStand.submitOrderInstruction.paid ?? null
169
+ }
158
170
  }
159
171
  }
160
172
  }
@@ -4,14 +4,21 @@
4
4
  :model-value="v.enabled"
5
5
  :label="t('order.takeaway')"
6
6
  label-placement="right"
7
- @update:model-value="updateTakeawaySetting"
7
+ @update:model-value="updateTakeawaySettingEnabled"
8
8
  class="mb-5"
9
9
  />
10
+ <kiosk-instruction-section
11
+ v-show="v.enabled"
12
+ :fields="instructionFields"
13
+ @update:field="updateTakeawaySettingInstructions"
14
+ />
10
15
  </div>
11
16
  </template>
12
17
  <script setup lang="ts">
13
18
  import type { KioskTakeawaySettingForm } from '@/modules/order-setting/kiosk/interface'
14
19
  import { useI18n } from '@feedmepos/mf-common'
20
+ import { computed } from 'vue'
21
+ import KioskInstructionSection from './KioskInstructionSection.vue'
15
22
 
16
23
  const { t } = useI18n()
17
24
 
@@ -23,10 +30,37 @@ interface Emits {
23
30
  (e: 'updateTakeaway', setting: KioskTakeawaySettingForm): void
24
31
  }
25
32
 
26
- defineProps<Props>()
33
+ const props = defineProps<Props>()
27
34
  const emits = defineEmits<Emits>()
28
35
 
29
- function updateTakeawaySetting(v: boolean) {
30
- emits('updateTakeaway', { enabled: v })
36
+ const instructionFields = computed(() => {
37
+ return [
38
+ {
39
+ id: 'payAtCounter',
40
+ value: props.v.submitOrderInstruction.payAtCounter ?? undefined,
41
+ title: t('order.payAtCounter'),
42
+ defaultValue: 'Collect your transaction slip below and present it to the cashier'
43
+ },
44
+ {
45
+ id: 'paid',
46
+ value: props.v.submitOrderInstruction.paid ?? undefined,
47
+ title: t('order.paid'),
48
+ defaultValue: "Please wait as we prepare your food. We'll call your number when it's ready."
49
+ }
50
+ ]
51
+ })
52
+
53
+ function updateTakeawaySettingEnabled(v: boolean) {
54
+ emits('updateTakeaway', { ...props.v, enabled: v })
55
+ }
56
+
57
+ function updateTakeawaySettingInstructions(id: string, instructions: string) {
58
+ emits('updateTakeaway', {
59
+ ...props.v,
60
+ submitOrderInstruction: {
61
+ ...props.v.submitOrderInstruction,
62
+ [id]: instructions
63
+ }
64
+ })
31
65
  }
32
66
  </script>
@@ -78,6 +78,12 @@
78
78
  :address="formatAddress(currentRestaurant?.profile.address)"
79
79
  @update:model-value="handleModelValueUpdateInHouse"
80
80
  />
81
+ <ExternalSetting
82
+ v-if="externalComponentProps.key === AUTO_INTEGRATION_CLIENT.external"
83
+ :initial-value="externalComponentProps.initialValue"
84
+ @update:model-value="handleModelValueUpdateExternal"
85
+ />
86
+
81
87
  <template #side-sheet-footer v-if="feedmeValidate !== false">
82
88
  <div class="flex gap-8 items-center justify-start">
83
89
  <FmButton
@@ -157,7 +163,7 @@
157
163
  import { computed, h, ref, watch } from 'vue'
158
164
  import RestaurantSelector from '../components/RestaurantSelector.vue'
159
165
  import { type ColumnDef } from '@feedmepos/ui-library'
160
- import type { FdoFoodpandaSettings } from '@entity'
166
+ import type { FdoExternalSetting, FdoFoodpandaSettings } from '@entity'
161
167
  import type {
162
168
  FdoLinkedDelivery,
163
169
  FdoRestaurantFeedmeDelivery,
@@ -182,6 +188,7 @@ import type { FdoRestaurantFeedme } from '../delivery/integrated-delivery/Feedme
182
188
  import FoodpandaSetting from './integrated-delivery/FoodpandaSetting.vue'
183
189
  import GrabfoodSetting from './integrated-delivery/GrabfoodSetting.vue'
184
190
  import ShopeefoodSetting from './integrated-delivery/ShopeefoodSetting.vue'
191
+ import ExternalSetting from './integrated-delivery/ExternalSetting.vue'
185
192
  import { useRestaurantStore } from '@/stores/restaurant'
186
193
  import FeedmeDelivery from './integrated-delivery/FeedmeDelivery.vue'
187
194
  import InHouseDelivery, { type InhouseDialogData } from './inhouse/InHouseDelivery.vue'
@@ -215,6 +222,7 @@ type IntegratedDeliveryCompany =
215
222
  | FdoFoodpandaSettings
216
223
  | FdoGrabfoodSettings
217
224
  | FdoShopeeFoodSettings
225
+ | FdoExternalSetting
218
226
  export interface IntegratedDeliveryRow extends DeliveryRow {
219
227
  setting: IntegratedDeliveryCompany
220
228
  company?: DeliveryCompany
@@ -264,6 +272,10 @@ async function toggleIntegratedSidesheet(data: any) {
264
272
  title.value = `${t('order.inhouseDeliveryTitle')}`
265
273
  updateInHouse(rowData)
266
274
  break
275
+ case AUTO_INTEGRATION_CLIENT.external:
276
+ title.value = `${t('order.manageExternalDelivery')}`
277
+ updateExternalDelivery(rowData)
278
+ break
267
279
  }
268
280
  }
269
281
 
@@ -287,6 +299,11 @@ const inHouseComponentProps = ref({
287
299
  initialValue: {} as InhouseDialogData
288
300
  })
289
301
 
302
+ const externalComponentProps = ref({
303
+ key: '' as string,
304
+ initialValue: {} as FdoExternalSetting
305
+ })
306
+
290
307
  function clearComponentProps() {
291
308
  feedMeComponentProps.value = {
292
309
  key: '',
@@ -307,6 +324,11 @@ function clearComponentProps() {
307
324
  },
308
325
  canUseAuto: {} as boolean | string
309
326
  }
327
+
328
+ externalComponentProps.value = {
329
+ key: '',
330
+ initialValue: {} as any
331
+ }
310
332
  }
311
333
 
312
334
  async function updateIntegratedDeliveryType({
@@ -358,6 +380,18 @@ async function updateInHouse({ key, setting }: IntegratedDeliveryRow) {
358
380
  }
359
381
  }
360
382
 
383
+ async function updateExternalDelivery( {key, setting}: IntegratedDeliveryRow) {
384
+ clearComponentProps()
385
+ const externalSetting = setting as FdoExternalSetting
386
+
387
+ externalComponentProps.value = {
388
+ key,
389
+ initialValue: {
390
+ ...externalSetting
391
+ }
392
+ }
393
+ }
394
+
361
395
  const { startAsyncCallWithErr, isLoading } = useLoading()
362
396
  const columns: ColumnDef<any>[] = [
363
397
  {
@@ -447,6 +481,13 @@ const shopee = computed<FdoShopeeFoodSettings>(() => {
447
481
  ...shopeefoodSetting.value
448
482
  }
449
483
  })
484
+
485
+ const external = computed<FdoExternalSetting>(() => {
486
+ return {
487
+ ...deliveryData.initExternalDelivery(),
488
+ ...externalSetting.value
489
+ }
490
+ })
450
491
  const localDeliveryCompanies = computed<DeliveryRow[]>(() => {
451
492
  const res = filterLocalDeliveryCompanies(deliveryCompanies.value).map<DeliveryRow>((company) => {
452
493
  const { name, paymentTypeKey, key } = company
@@ -571,7 +612,16 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
571
612
  canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(
572
613
  AUTO_INTEGRATION_CLIENT.shopeefood
573
614
  )
574
- }
615
+ },
616
+ {
617
+ id: loadingKey.value.external,
618
+ name: 'External delivery',
619
+ key: AUTO_INTEGRATION_CLIENT.external,
620
+ setting: external.value,
621
+ catalog: '-',
622
+ paymentType: '-',
623
+ status: [generateStatus(false, external.value.enable)],
624
+ },
575
625
  ]
576
626
  })
577
627
 
@@ -583,6 +633,7 @@ const loadingKey = computed(() => {
583
633
  gf: `${id}_gf`,
584
634
  sf: `${id}_sf`,
585
635
  fm: `${id}_fm`,
636
+ external: `${id}_external`,
586
637
  local: (deliveryName: string) => `${id}_${deliveryName}`
587
638
  }
588
639
  })
@@ -604,6 +655,9 @@ async function updateIntegratedDeliveryCompany(company: IntegratedDeliveryRow) {
604
655
  case F_ORDER_PLATFORM.enum.IN_HOUSE:
605
656
  await updateInHouseSetting()
606
657
  break
658
+ case AUTO_INTEGRATION_CLIENT.external:
659
+ await updateExternalDeliverySetting()
660
+ break
607
661
  }
608
662
  await readData()
609
663
  }
@@ -625,6 +679,7 @@ const filteredCompanies = computed(() => {
625
679
  const grabfoodSetting = ref<FdoGrabfoodSettings | null>(null)
626
680
  const foodpandaSetting = ref<FdoFoodpandaSettings | null>(null)
627
681
  const shopeefoodSetting = ref<FdoShopeeFoodSettings | null>(null)
682
+ const externalSetting = ref<FdoExternalSetting | null>(null)
628
683
  const loadingDpi = ref<boolean>(false)
629
684
 
630
685
  async function readData() {
@@ -642,6 +697,9 @@ async function readData() {
642
697
  shopeefoodSetting.value = await remoteOrderApi.integratedDelivery.readShopeefood(
643
698
  currentRestaurant.value?._id || ''
644
699
  )
700
+ externalSetting.value = await remoteOrderApi.integratedDelivery.readExternal(
701
+ currentRestaurant.value?._id || ''
702
+ )
645
703
  })
646
704
  loadingDpi.value = false
647
705
  }
@@ -654,7 +712,7 @@ async function updateLocalDeliveryCompany() {
654
712
  company: selectedLocalRow.value.doc,
655
713
  data: localDocUpdate
656
714
  })
657
- showSuccess('Delivery setting updated. ')
715
+ showSuccess(t('order.DeliverySettingUpdated'))
658
716
  }
659
717
 
660
718
  async function updateManualDelivery({
@@ -738,7 +796,7 @@ async function updateIntegratedDeliverySetting() {
738
796
  componentProps.value.canUseAuto
739
797
  )
740
798
  })
741
- showSuccess('Delivery setting updated. ')
799
+ showSuccess(t('order.DeliverySettingUpdated'))
742
800
  }
743
801
 
744
802
  async function updateFeedmeExpressSetting() {
@@ -755,7 +813,7 @@ async function updateFeedmeExpressSetting() {
755
813
  currentRestaurant.value.feedmeDelivery = restaurant.feedmeDelivery
756
814
  }
757
815
  })
758
- showSuccess('Delivery setting updated. ')
816
+ showSuccess(t('order.DeliverySettingUpdated'))
759
817
  }
760
818
 
761
819
  async function updateInHouseSetting() {
@@ -765,7 +823,17 @@ async function updateInHouseSetting() {
765
823
  if (!!res) {
766
824
  await changeRestaurant(res)
767
825
  }
768
- showSuccess('Delivery setting updated. ')
826
+ showSuccess(t('order.DeliverySettingUpdated'))
827
+ }
828
+
829
+ async function updateExternalDeliverySetting() {
830
+ sideSheetIntegrated.value = false
831
+ await restaurantStore.updateExternalDelivery(currentRestaurant.value?._id ?? '', externalDoc.value)
832
+ const res = (await readRestaurants())?.find((res) => res._id === currentRestaurant.value?._id)
833
+ if (!!res) {
834
+ await changeRestaurant(res)
835
+ }
836
+ showSuccess(t('order.DeliverySettingUpdated'))
769
837
  }
770
838
 
771
839
  async function updateDelivery(
@@ -808,6 +876,7 @@ async function updateDelivery(
808
876
 
809
877
  const feedMeDoc = computed(() => feedMeComponentProps.value.initialValue)
810
878
  const inHouseDoc = computed(() => inHouseComponentProps.value.initialValue)
879
+ const externalDoc = computed(() => externalComponentProps.value.initialValue)
811
880
 
812
881
  const localManual = ref<LinkedDeliveryDoc>(componentProps.value.initialValue.manual)
813
882
  const localAuto = ref(componentProps.value.initialValue.integrated)
@@ -829,6 +898,10 @@ function handleModelValueUpdateInHouse(v: any) {
829
898
  inHouseComponentProps.value.initialValue = v
830
899
  }
831
900
 
901
+ function handleModelValueUpdateExternal(v: any) {
902
+ externalComponentProps.value.initialValue = v
903
+ }
904
+
832
905
  const feedmeValidate = ref<boolean | null>(null)
833
906
  function handleValidationResult(v: boolean) {
834
907
  feedmeValidate.value = v
@@ -855,6 +928,7 @@ type companyName =
855
928
  | 'FoodPanda delivery'
856
929
  | 'GrabFood delivery'
857
930
  | 'ShopeeFood delivery'
931
+ | 'External delivery'
858
932
 
859
933
  function convertIntegratedCompanyName(name: companyName): string {
860
934
  switch (name) {
@@ -868,6 +942,8 @@ function convertIntegratedCompanyName(name: companyName): string {
868
942
  return `${t('order.deliveryTitle', { company: 'GrabFood' })}`
869
943
  case 'ShopeeFood delivery':
870
944
  return `${t('order.deliveryTitle', { company: 'ShopeeFood' })}`
945
+ case 'External delivery':
946
+ return `${t('order.externalDelivery')}`
871
947
  default:
872
948
  return ''
873
949
  }
@@ -1,3 +1,4 @@
1
+ import type { FdoExternalSetting } from '@entity';
1
2
  import {
2
3
  FdoRestaurantFeedmeDelivery,
3
4
  FdoGrabfoodSettings,
@@ -66,10 +67,24 @@ function initShopeefoodDelivery(): FdoShopeeFoodSettings {
66
67
  }
67
68
  }
68
69
 
70
+ function initExternalDelivery(): FdoExternalSetting {
71
+ return {
72
+ _id: '',
73
+ enable: false,
74
+ config: {
75
+ autoAccept: false,
76
+ autoSend: false,
77
+ autoCloseBill: false,
78
+ },
79
+ platform: 'ZUS',
80
+ }
81
+ }
82
+
69
83
  export default {
70
84
  initInhouseDelivery,
71
85
  initFeedmeExpress,
72
86
  initFoodpandaDelivery,
73
87
  initGrabfoodDelivery,
74
- initShopeefoodDelivery
88
+ initShopeefoodDelivery,
89
+ initExternalDelivery
75
90
  }
@@ -6,6 +6,7 @@ export enum AUTO_INTEGRATION_CLIENT {
6
6
  foodpanda = 'foodpanda',
7
7
  grabfood = 'grabfood',
8
8
  shopeefood = 'shopeefood',
9
+ external = 'external'
9
10
  }
10
11
 
11
12
  export interface DeliveryCompany {
@@ -0,0 +1,114 @@
1
+ <template>
2
+ <div class="flex-grow mb-3 mt-3">
3
+ <FmSwitch
4
+ :model-value="data.enable"
5
+ :label="t('order.activateIntegration', { integrationType: t('order.auto') })"
6
+ label-placement="right"
7
+ @update:model-value="updateEnable"
8
+ />
9
+ <div v-if="data.enable">
10
+ <FmCard variant="outlined" class="mt-10 p-5">
11
+ <div class="mb-3">
12
+ <div class="flex-grow fm-typo-en-title-sm-600 mb-5">{{ t('order.syncMenu') }}</div>
13
+
14
+ <FmSelect
15
+ :placeholder="t('order.selectPlatform')"
16
+ :model-value="data.platform"
17
+ :label="t('order.platform')"
18
+ :items="platformOptions"
19
+ @update:model-value="updatePlatform"
20
+ />
21
+
22
+ <FmSelect
23
+ class="mt-5"
24
+ :placeholder="t('order.selectItem')"
25
+ :model-value="data.delivery!.catalogId"
26
+ :label="t('order.deliveryCatalog')"
27
+ :items="menuStore.catalogOptions"
28
+ @update:model-value="updateDeliveryMenuCatalog"
29
+ />
30
+
31
+ <FmSelect
32
+ class="mt-5"
33
+ :placeholder="t('order.selectItem')"
34
+ :model-value="data.pickup!.catalogId"
35
+ :label="t('order.pickupCatalog')"
36
+ :items="menuStore.catalogOptions"
37
+ @update:model-value="updatePickupMenuCatalog"
38
+ />
39
+ </div>
40
+
41
+ <div class="flex flex-row mt-5">
42
+ <FmButton variant="primary" :label="t('order.syncMenu')" @click="syncMenu()" />
43
+ </div>
44
+ </FmCard>
45
+ </div>
46
+ </div>
47
+ </template>
48
+
49
+ <script setup lang="ts">
50
+ import { type PropType, computed, reactive, ref, watch } from 'vue'
51
+ import { F_ORDER_PLATFORM, type FdoExternalSetting } from '@entity'
52
+ import { useI18n } from '@feedmepos/mf-common'
53
+ import { clone } from '@/helpers/object'
54
+ import { useMenuStore } from '@/stores/menu/menu'
55
+ import { useLoading } from '@/composables/loading'
56
+ import { remoteOrderApi } from '@/api/remoteOrder'
57
+ import { useSnackbarFunctions } from '@/components/snackbar'
58
+
59
+ const { showSuccess } = useSnackbarFunctions()
60
+ const { t } = useI18n()
61
+ const menuStore = useMenuStore()
62
+
63
+ const props = defineProps({
64
+ initialValue: {
65
+ type: Object as PropType<FdoExternalSetting>,
66
+ required: true
67
+ }
68
+ })
69
+
70
+ const data = reactive<FdoExternalSetting>({
71
+ ...clone(props.initialValue),
72
+ platform: props.initialValue.platform ?? 'ZUS',
73
+ delivery: props.initialValue.delivery ?? { catalogId: null },
74
+ pickup: props.initialValue.pickup ?? { catalogId: null }
75
+ })
76
+
77
+ const platformOptions = ref([{ label: 'ZUS', value: F_ORDER_PLATFORM.enum.ZUS }])
78
+
79
+ const emits = defineEmits<{
80
+ (event: 'update:model-value', v: FdoExternalSetting): void
81
+ }>()
82
+
83
+ function emitUpdatedValue() {
84
+ emits('update:model-value', { ...data })
85
+ }
86
+
87
+ function updateEnable(value: boolean) {
88
+ data.enable = value
89
+ emitUpdatedValue()
90
+ }
91
+
92
+ function updateDeliveryMenuCatalog(catalogId: string) {
93
+ data.delivery!.catalogId = catalogId
94
+ emitUpdatedValue()
95
+ }
96
+
97
+ function updatePickupMenuCatalog(catalogId: string) {
98
+ data.pickup!.catalogId = catalogId
99
+ emitUpdatedValue()
100
+ }
101
+
102
+ function updatePlatform(platform: F_ORDER_PLATFORM) {
103
+ data.platform = platform
104
+ emitUpdatedValue()
105
+ }
106
+
107
+ const { startAsyncCallWithErr } = useLoading()
108
+ async function syncMenu() {
109
+ await startAsyncCallWithErr(async () => {
110
+ await remoteOrderApi.integratedDelivery.syncExternalMenu(data._id ?? '')
111
+ showSuccess(t('order.syncMenuSuccess'))
112
+ })
113
+ }
114
+ </script>
@@ -198,6 +198,7 @@ async function syncMenu() {
198
198
  lastSynchronize: res?.lastSynchronize || modelValue.value.auto.lastSynchronize
199
199
  }
200
200
  updateData({ auto: temp, manual: data.manual })
201
+ showSuccess(t('order.syncMenuSuccess'))
201
202
  })
202
203
  }
203
204
 
@@ -222,18 +223,34 @@ async function cancelTestOrder() {
222
223
  }
223
224
  </script>
224
225
  <template>
225
- <IntegratedDelivery :model-value="modelValue" :company="company"
226
- :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration" @update:model-value="updateDataPass"
227
- @sync-menu="syncMenu" @flow-test-order="flowTestOrder" @cancel-test-order="cancelTestOrder">
226
+ <IntegratedDelivery
227
+ :model-value="modelValue"
228
+ :company="company"
229
+ :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration"
230
+ @update:model-value="updateDataPass"
231
+ @sync-menu="syncMenu"
232
+ @flow-test-order="flowTestOrder"
233
+ @cancel-test-order="cancelTestOrder"
234
+ >
228
235
  <template #default="{ editable }">
229
- <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-10">{{ t('order.discountCampaign')}}</div>
230
- <FmButton :label="t('order.addNewCampaign')" icon="add" variant="plain" @click="addCampaign" class="mb-3" />
236
+ <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-10">
237
+ {{ t('order.discountCampaign') }}
238
+ </div>
239
+ <FmButton
240
+ :label="t('order.addNewCampaign')"
241
+ icon="add"
242
+ variant="plain"
243
+ @click="addCampaign"
244
+ class="mb-3"
245
+ />
231
246
 
232
247
  <div v-if="campaigns.length > 0">
233
248
  <div v-for="(campaign, index) in campaigns" :key="index">
234
249
  <FmCard variant="outlined" class="p-5 flex justify-between items-center mb-5">
235
250
  <div>
236
- <span class="font-bold">{{ campaign.name }} ({{ campaign.vendorBearPercentage }}%)</span>
251
+ <span class="font-bold"
252
+ >{{ campaign.name }} ({{ campaign.vendorBearPercentage }}%)</span
253
+ >
237
254
  <br />
238
255
  {{ formatCampaignDate(campaign.date) }}
239
256
  </div>
@@ -9,12 +9,13 @@ import { useLoading } from '@/composables/loading'
9
9
  import { remoteOrderApi } from '@/api/remoteOrder'
10
10
  import IntegratedDelivery from './IntegratedDelivery.vue'
11
11
  import { clone } from '@/helpers/object'
12
- import { useCoreStore } from '@feedmepos/mf-common'
12
+ import { useI18n, useCoreStore } from '@feedmepos/mf-common'
13
13
 
14
14
  export interface GrabfoodDeliveryData {
15
15
  manual: FdoLinkedDelivery | null
16
16
  integrated: FdoGrabfoodSettings
17
17
  }
18
+ const { t } = useI18n()
18
19
 
19
20
  const props = defineProps({
20
21
  initialValue: {
@@ -31,7 +32,7 @@ const props = defineProps({
31
32
  }
32
33
  })
33
34
 
34
- const data = reactive(clone(props.initialValue));
35
+ const data = reactive(clone(props.initialValue))
35
36
  const modelValue = computed<IntegratedDeliverySettingData>(() => {
36
37
  const auto = data.integrated
37
38
  return {
@@ -45,35 +46,32 @@ const modelValue = computed<IntegratedDeliverySettingData>(() => {
45
46
  lastSynchronize: auto.lastSynchronize,
46
47
  status: auto.status,
47
48
  updatedAt: auto.updatedAt,
48
- menuSyncError: auto.menuSyncError,
49
+ menuSyncError: auto.menuSyncError
49
50
  }
50
51
  }
51
52
  })
52
53
 
53
54
  const { currentRestaurant } = useCoreStore()
54
55
 
55
-
56
56
  function updateData({ manual, auto }: IntegratedDeliverySettingData) {
57
57
  data.manual = manual
58
58
  data.integrated = {
59
59
  ...auto,
60
60
  merchantID: auto.integrationId,
61
- commissionRate: auto.commissionRate,
61
+ commissionRate: auto.commissionRate
62
62
  }
63
- return { manual: data.manual, integrated: data.integrated };
63
+ return { manual: data.manual, integrated: data.integrated }
64
64
  }
65
65
 
66
66
  const emits = defineEmits<{
67
- (e: 'update:model-value', payload: { manual: any; auto: any }): void;
68
- }>();
69
-
67
+ (e: 'update:model-value', payload: { manual: any; auto: any }): void
68
+ }>()
70
69
 
71
70
  function updateDataPass({ manual, auto }: IntegratedDeliverySettingData) {
72
- const updatedData = updateData({ manual, auto });
73
- emits('update:model-value', { manual: updatedData.manual, auto: updatedData.integrated });
71
+ const updatedData = updateData({ manual, auto })
72
+ emits('update:model-value', { manual: updatedData.manual, auto: updatedData.integrated })
74
73
  }
75
74
 
76
-
77
75
  const { startAsyncCallWithErr } = useLoading()
78
76
  async function syncMenu() {
79
77
  await startAsyncCallWithErr(async () => {
@@ -85,11 +83,12 @@ async function syncMenu() {
85
83
  lastSynchronize: res?.lastSynchronize || modelValue.value.auto.lastSynchronize
86
84
  }
87
85
  updateData({ auto: temp, manual: data.manual })
86
+ showSuccess(t('order.syncMenuSuccess'))
88
87
  })
89
88
  }
90
89
 
91
90
  import { useSnackbarFunctions } from '@/components/snackbar'
92
- const { showSuccess } = useSnackbarFunctions();
91
+ const { showSuccess } = useSnackbarFunctions()
93
92
 
94
93
  async function flowTestOrder() {
95
94
  await startAsyncCallWithErr(async () => {
@@ -112,7 +111,13 @@ async function cancelTestOrder() {
112
111
  </script>
113
112
 
114
113
  <template>
115
- <IntegratedDelivery :model-value="modelValue" :company="company"
116
- :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration" @update:model-value="updateDataPass"
117
- @sync-menu="syncMenu" @flow-test-order="flowTestOrder" @cancel-test-order="cancelTestOrder" />
114
+ <IntegratedDelivery
115
+ :model-value="modelValue"
116
+ :company="company"
117
+ :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration"
118
+ @update:model-value="updateDataPass"
119
+ @sync-menu="syncMenu"
120
+ @flow-test-order="flowTestOrder"
121
+ @cancel-test-order="cancelTestOrder"
122
+ />
118
123
  </template>