@feedmepos/mf-order-setting 0.0.32 → 0.0.34

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 (55) hide show
  1. package/dist/{KioskDevicesView-D2w5MMCg.js → KioskDevicesView-BHzBoF_O.js} +1 -1
  2. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-BwxGSbuI.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-C5JpMDP_.js} +2 -2
  3. package/dist/KioskSettingView-i8tgH3dF.js +841 -0
  4. package/dist/{KioskView-NetckXQx.js → KioskView-DW7vX6rJ.js} +41 -34
  5. package/dist/{OrderSettingsView-CL0o1fHq.js → OrderSettingsView-D3SQHET3.js} +5446 -5282
  6. package/dist/{app-DnvFFLBj.js → app-C15xKXga.js} +18 -8
  7. package/dist/app.js +1 -1
  8. package/dist/{dayjs.min-BAx2Uba9.js → dayjs.min-KE7XM_kc.js} +1 -1
  9. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +5 -2
  10. package/dist/frontend/mf-order/src/app.d.ts +10 -0
  11. package/dist/frontend/mf-order/src/main.d.ts +10 -0
  12. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +12 -0
  13. package/dist/frontend/mf-order/src/stores/order-setting/mapper.d.ts +3 -3
  14. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +5 -2
  15. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPaymentTypeSection.vue.d.ts +8 -0
  16. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +1 -1
  17. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +3 -1
  18. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +3 -1
  19. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/DeliverooSetting.vue.d.ts +46 -0
  20. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +4 -4
  21. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  22. package/dist/{index-DuneL3VN.js → index-DGfFxIZo.js} +2 -2
  23. package/dist/{queue.do-B1npBXsB.js → menu.dto-CLARGRsi.js} +15200 -14810
  24. package/dist/package/entity/index.d.ts +22 -1
  25. package/dist/package/entity/order/order-item/order-item.dto.d.ts +2 -2
  26. package/dist/package/entity/order/order.enum.d.ts +1 -1
  27. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +523 -0
  28. package/dist/package/entity/order-platform/deliveroo/deliveroo-order.do.d.ts +7814 -0
  29. package/dist/package/entity/order-platform/deliveroo/deliveroo-order.dto.d.ts +15 -0
  30. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +37 -0
  31. package/dist/package/entity/order-platform/deliveroo/deliveroo.enum.d.ts +31 -0
  32. package/dist/package/entity/order-platform/deliveroo/deliveroo.menu.dto.d.ts +2341 -0
  33. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +3 -3
  34. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +3 -3
  35. package/dist/package/entity/order-platform/order-platform.enum.d.ts +6 -1
  36. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +42 -0
  37. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +32 -0
  38. package/dist/package/entity/order-setting/order-setting.do.d.ts +22 -0
  39. package/dist/package/entity/order-setting/order-setting.dto.d.ts +44 -0
  40. package/dist/package/entity/restaurant/restaurant.dto.d.ts +22 -0
  41. package/dist/package/entity/websocket/websocket.dto.d.ts +48 -0
  42. package/package.json +1 -1
  43. package/src/api/remoteOrder/index.ts +20 -2
  44. package/src/locales/en-US.json +3 -0
  45. package/src/locales/th-TH.json +3 -0
  46. package/src/locales/zh-CN.json +4 -0
  47. package/src/stores/order-setting/mapper.ts +230 -168
  48. package/src/stores/restaurant/index.ts +12 -7
  49. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +31 -1
  50. package/src/views/order-settings/delivery/DeliverySetting.vue +141 -57
  51. package/src/views/order-settings/delivery/delivery.data.ts +10 -1
  52. package/src/views/order-settings/delivery/delivery.ts +34 -9
  53. package/src/views/order-settings/delivery/integrated-delivery/DeliverooSetting.vue +109 -0
  54. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +11 -10
  55. package/dist/KioskSettingView-CUMAS8OG.js +0 -821
@@ -39,7 +39,7 @@
39
39
  dismiss-away
40
40
  :maxWidth="600"
41
41
  :model-value="sideSheetIntegrated"
42
- @update:model-value="sideSheetIntegrated = $event"
42
+ @update:model-value="(v: boolean) => handleSideSheet(v)"
43
43
  >
44
44
  <FoodpandaSetting
45
45
  v-if="componentProps.key === AUTO_INTEGRATION_CLIENT.foodpanda"
@@ -62,6 +62,14 @@
62
62
  :can-use-auto-delivery-integration="componentProps.canUseAuto"
63
63
  @update:model-value="handleModelValueUpdate"
64
64
  />
65
+ <DeliverooSetting
66
+ v-if="componentProps.key === AUTO_INTEGRATION_CLIENT.deliveroo"
67
+ :initial-value="componentProps.initialValue"
68
+ :company="componentProps.company"
69
+ :can-use-auto-delivery-integration="componentProps.canUseAuto"
70
+ @update:model-value="handleModelValueUpdate"
71
+ />
72
+
65
73
  <FeedmeDelivery
66
74
  v-if="feedMeComponentProps.key === F_ORDER_PLATFORM.enum.FEEDME"
67
75
  :initial-value="feedMeComponentProps.initialValue"
@@ -160,13 +168,14 @@
160
168
  import { computed, h, ref, watch } from 'vue'
161
169
  import RestaurantSelector from '../components/RestaurantSelector.vue'
162
170
  import { type ColumnDef } from '@feedmepos/ui-library'
163
- import type { FdoExternalSetting, FdoFoodpandaSettings } from '@entity'
171
+ import type { FdoDeliverooSettings, FdoFoodpandaSettings, FdoExternalSetting } from '@entity'
164
172
  import type {
165
173
  FdoLinkedDelivery,
166
174
  FdoRestaurantFeedmeDelivery,
167
175
  FdoRestaurantInHouseDelivery
168
176
  } from '@feedmepos/core/entity'
169
177
  import {
178
+ F_COUNTRY,
170
179
  F_DELIVERY_TYPE,
171
180
  F_FEATURE,
172
181
  F_ORDER_PLATFORM,
@@ -193,6 +202,7 @@ import { formatAddress } from '@/helpers/profile'
193
202
  import { useSnackbarFunctions } from '@/components/snackbar'
194
203
  import useSearch from '@/composables/search'
195
204
  import DeliveryList from './DeliveryList.vue'
205
+ import DeliverooSetting from './integrated-delivery/DeliverooSetting.vue'
196
206
  import { Pos } from '@feedmepos/core'
197
207
  import { useI18n, useCoreStore } from '@feedmepos/mf-common'
198
208
 
@@ -200,8 +210,14 @@ const { t } = useI18n()
200
210
  const { searchKey, filter } = useSearch()
201
211
  const { showSuccess } = useSnackbarFunctions()
202
212
  const restaurantStore = useRestaurantStore()
203
- const { currentRestaurant, currentBusiness, readRestaurants, changeRestaurant, sessionUser } =
204
- useCoreStore()
213
+ const {
214
+ currentRestaurant,
215
+ currentBusiness,
216
+ readRestaurants,
217
+ changeRestaurant,
218
+ sessionUser,
219
+ currentCountry
220
+ } = useCoreStore()
205
221
  const menuStore = useMenuStore()
206
222
  const linkedCompanies = ref<LinkedDeliveryDoc[]>([])
207
223
  const deliveryCompanies = ref<DeliveryCompany[]>([])
@@ -243,6 +259,11 @@ async function toggleLocalSidesheet(rowData: any) {
243
259
  }
244
260
 
245
261
  const title = ref('')
262
+
263
+ function handleSideSheet(v: boolean) {
264
+ sideSheetIntegrated.value = v
265
+ feedmeValidate.value = true
266
+ }
246
267
  async function toggleIntegratedSidesheet(data: any) {
247
268
  const rowData = data.original ?? data
248
269
 
@@ -261,6 +282,10 @@ async function toggleIntegratedSidesheet(data: any) {
261
282
  title.value = `${t('order.manageDelivery', { company: 'shopeefood' })}`
262
283
  updateIntegratedDeliveryType(rowData)
263
284
  break
285
+ case AUTO_INTEGRATION_CLIENT.deliveroo:
286
+ title.value = 'Manage deliveroo deivery'
287
+ updateIntegratedDeliveryType(rowData)
288
+ break
264
289
  case F_ORDER_PLATFORM.enum.FEEDME:
265
290
  title.value = `${t('order.feedmeExpressTitle')}`
266
291
  updateFeedmeExpress(rowData)
@@ -481,6 +506,13 @@ const shopee = computed<FdoShopeeFoodSettings>(() => {
481
506
  }
482
507
  })
483
508
 
509
+ const deliveroo = computed<FdoDeliverooSettings>(() => {
510
+ return {
511
+ ...deliveryData.initDeliverooDelivery(),
512
+ ...deliverooSetting.value
513
+ }
514
+ })
515
+
484
516
  const external = computed<FdoExternalSetting>(() => {
485
517
  return {
486
518
  ...deliveryData.initExternalDelivery(),
@@ -488,7 +520,7 @@ const external = computed<FdoExternalSetting>(() => {
488
520
  }
489
521
  })
490
522
  const localDeliveryCompanies = computed<DeliveryRow[]>(() => {
491
- const res = filterLocalDeliveryCompanies(deliveryCompanies.value).map<DeliveryRow>((company) => {
523
+ const res = deliveryCompanies.value.map<DeliveryRow>((company) => {
492
524
  const { name, paymentTypeKey, key } = company
493
525
  const doc = getLinkedDeliveryDoc(linkedCompanies.value, key)
494
526
 
@@ -506,20 +538,13 @@ const localDeliveryCompanies = computed<DeliveryRow[]>(() => {
506
538
  return res.filter((r) => filter([r.name, r.paymentType, r.status.join(' ')]))
507
539
  })
508
540
 
509
- const { getLinkedDeliveryDoc, filterLocalDeliveryCompanies, getPaymentType, equalKey } =
541
+ const { getLinkedDeliveryDoc, getPaymentType, equalKey, isIntegratedPlatformSupported } =
510
542
  useDelivery()
511
543
 
512
544
  function getCatalog(catalogId: string | null) {
513
545
  return menuStore.catalogOptions.find(({ value }) => value === catalogId)?.label || ''
514
546
  }
515
547
 
516
- const reachMinPosVersion = computed<string | boolean>(() => {
517
- const posVersion = currentRestaurant.value?.posVersion
518
- if (!posVersion) return t('order.invalidPosVersion')
519
- const res = Pos.canUse({ feature: F_FEATURE.enum.deliveryIntegration, posVersion })
520
- return res === true ? true : res.toString()
521
- })
522
-
523
548
  function hasPurchaseFeature(deliveryType: string) {
524
549
  const features = currentRestaurant.value?.features || []
525
550
  const featureKey = equalKey(deliveryType, AUTO_INTEGRATION_CLIENT.foodpanda)
@@ -528,30 +553,35 @@ function hasPurchaseFeature(deliveryType: string) {
528
553
  return features.includes(featureKey) || t('order.restaurantHaveNotPurchase', { featureKey })
529
554
  }
530
555
 
531
- function canUseAutoDeliveryIntegration(deliveryType: string) {
532
- if (reachMinPosVersion.value !== true) return reachMinPosVersion.value
533
- return hasPurchaseFeature(deliveryType)
556
+ const canUseAutoDeliveryIntegration = (client: string) => {
557
+ const hasFeature = hasPurchaseFeature(client)
558
+ if (typeof hasFeature === 'string') {
559
+ return hasFeature
560
+ }
561
+ switch (client) {
562
+ case 'deliveroo':
563
+ return (
564
+ currentCountry.value === F_COUNTRY.enum.SG ||
565
+ `${t('order.autoIntegrationCountryNotSupport')}`
566
+ )
567
+ default:
568
+ return true
569
+ }
534
570
  }
535
571
 
536
572
  const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
537
- const fpManual = getLinkedDeliveryDoc(linkedCompanies.value, AUTO_INTEGRATION_CLIENT.foodpanda)
538
- const gfManual = getLinkedDeliveryDoc(linkedCompanies.value, AUTO_INTEGRATION_CLIENT.grabfood)
539
- const sfManual = getLinkedDeliveryDoc(linkedCompanies.value, AUTO_INTEGRATION_CLIENT.shopeefood)
540
-
541
573
  const getIntegrateDoc = (client: AUTO_INTEGRATION_CLIENT) =>
542
574
  deliveryCompanies.value.find(({ key }) => equalKey(key, client))
543
575
  const fpIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.foodpanda)
544
576
  const grabIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.grabfood)
545
577
  const sfIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.shopeefood)
578
+ const drIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.deliveroo)
546
579
 
547
- const generateStatus = (manualActive: boolean, integrateActive: boolean) => {
548
- if (manualActive && integrateActive) return 'Active'
549
- if (manualActive) return 'Manual'
550
- if (integrateActive) return 'Active'
551
- return 'Inactive'
580
+ const generateStatus = (integrateActive: boolean) => {
581
+ return integrateActive ? 'Active' : 'Inactive'
552
582
  }
553
583
 
554
- return [
584
+ const feedmeDelivery = [
555
585
  {
556
586
  id: loadingKey.value.inhouse,
557
587
  name: 'In house delivery',
@@ -571,31 +601,32 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
571
601
  status: feedmeExpress.value.enable ? ['Active'] : ['Inactive'],
572
602
  setting: feedmeExpress.value,
573
603
  catalog: getCatalog(feedmeExpress.value.catalogId || null)
574
- },
604
+ }
605
+ ]
606
+
607
+ const integratedDelivery = [
575
608
  {
576
609
  id: loadingKey.value.fp,
577
- name: 'FoodPanda delivery',
610
+ name: 'Food Panda delivery',
578
611
  key: AUTO_INTEGRATION_CLIENT.foodpanda,
579
612
  company: fpIntegrate,
580
- paymentType: foodpanda.value.enable ? getPaymentType(fpManual?.paymentTypeKey) : '-',
581
- status: [generateStatus(!!fpManual, foodpanda.value.enable)],
613
+ paymentType: 'Default',
614
+ status: [generateStatus(foodpanda.value.enable)],
582
615
  setting: foodpanda.value,
583
- doc: fpManual,
584
- catalog: getCatalog(fpManual?.catalogId || null),
616
+ catalog: getCatalog(foodpanda.value.catalogId ?? null),
585
617
  canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(
586
618
  AUTO_INTEGRATION_CLIENT.foodpanda
587
619
  )
588
620
  },
589
621
  {
590
622
  id: loadingKey.value.gf,
591
- name: 'GrabFood delivery',
623
+ name: 'Grab Food delivery',
592
624
  key: AUTO_INTEGRATION_CLIENT.grabfood,
593
625
  company: grabIntegrate,
594
- paymentType: grabfood.value.enable ? getPaymentType(gfManual?.paymentTypeKey) : '-',
595
- status: [generateStatus(!!gfManual, grabfood.value.enable)],
626
+ paymentType: 'Default',
627
+ status: [generateStatus(grabfood.value.enable)],
596
628
  setting: grabfood.value,
597
- doc: gfManual,
598
- catalog: getCatalog(gfManual?.catalogId || null),
629
+ catalog: getCatalog(grabfood.value?.catalogId || null),
599
630
  canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(AUTO_INTEGRATION_CLIENT.grabfood)
600
631
  },
601
632
  {
@@ -603,15 +634,27 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
603
634
  name: 'ShopeeFood delivery',
604
635
  key: AUTO_INTEGRATION_CLIENT.shopeefood,
605
636
  company: sfIntegrate,
606
- paymentType: shopee.value.enable ? getPaymentType(sfManual?.paymentTypeKey) : '-',
607
- status: [generateStatus(!!sfManual, shopee.value.enable)],
637
+ paymentType: 'Default',
638
+ status: [generateStatus(shopee.value.enable)],
608
639
  setting: shopee.value,
609
- doc: sfManual,
610
- catalog: getCatalog(sfManual?.catalogId || null),
640
+ catalog: getCatalog(shopee.value.catalogId || null),
611
641
  canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(
612
642
  AUTO_INTEGRATION_CLIENT.shopeefood
613
643
  )
614
644
  },
645
+ {
646
+ id: loadingKey.value.dr,
647
+ name: 'Deliveroo delivery',
648
+ key: AUTO_INTEGRATION_CLIENT.deliveroo,
649
+ company: drIntegrate,
650
+ paymentType: 'Default',
651
+ status: [generateStatus(deliveroo.value.enable)],
652
+ setting: deliveroo.value,
653
+ catalog: getCatalog(deliveroo.value?.catalogId || null),
654
+ canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(
655
+ AUTO_INTEGRATION_CLIENT.deliveroo
656
+ )
657
+ },
615
658
  {
616
659
  id: loadingKey.value.external,
617
660
  name: 'External delivery',
@@ -619,9 +662,16 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
619
662
  setting: external.value,
620
663
  catalog: '-',
621
664
  paymentType: '-',
622
- status: [generateStatus(false, external.value.enable)]
665
+ status: [generateStatus(external.value.enable)]
623
666
  }
624
667
  ]
668
+
669
+ return [
670
+ ...feedmeDelivery,
671
+ ...integratedDelivery.filter((delivery) => {
672
+ return isIntegratedPlatformSupported(delivery.key, currentCountry.value)
673
+ })
674
+ ]
625
675
  })
626
676
 
627
677
  const loadingKey = computed(() => {
@@ -632,12 +682,13 @@ const loadingKey = computed(() => {
632
682
  gf: `${id}_gf`,
633
683
  sf: `${id}_sf`,
634
684
  fm: `${id}_fm`,
685
+ dr: `${id}_dr`,
635
686
  external: `${id}_external`,
636
687
  local: (deliveryName: string) => `${id}_${deliveryName}`
637
688
  }
638
689
  })
639
690
 
640
- async function updateIntegratedDeliveryCompany(company: IntegratedDeliveryRow) {
691
+ async function updateIntegratedDeliveryCompany() {
641
692
  switch (selectedIntegratedRow.value) {
642
693
  case AUTO_INTEGRATION_CLIENT.foodpanda:
643
694
  await updateIntegratedDeliverySetting()
@@ -648,6 +699,9 @@ async function updateIntegratedDeliveryCompany(company: IntegratedDeliveryRow) {
648
699
  case AUTO_INTEGRATION_CLIENT.shopeefood:
649
700
  await updateIntegratedDeliverySetting()
650
701
  break
702
+ case AUTO_INTEGRATION_CLIENT.deliveroo:
703
+ await updateIntegratedDeliverySetting()
704
+ break
651
705
  case F_ORDER_PLATFORM.enum.FEEDME:
652
706
  await updateFeedmeExpressSetting()
653
707
  break
@@ -678,6 +732,7 @@ const filteredCompanies = computed(() => {
678
732
  const grabfoodSetting = ref<FdoGrabfoodSettings | null>(null)
679
733
  const foodpandaSetting = ref<FdoFoodpandaSettings | null>(null)
680
734
  const shopeefoodSetting = ref<FdoShopeeFoodSettings | null>(null)
735
+ const deliverooSetting = ref<FdoDeliverooSettings | null>(null)
681
736
  const externalSetting = ref<FdoExternalSetting | null>(null)
682
737
  const loadingDpi = ref<boolean>(false)
683
738
 
@@ -685,20 +740,41 @@ async function readData() {
685
740
  await startAsyncCallWithErr(async () => {
686
741
  loadingDpi.value = true
687
742
  linkedCompanies.value = await remoteOrderApi.readLinkedDeliveryCompanies()
743
+
688
744
  const resp = await remoteOrderApi.readLocalDeliveryCompanies()
689
745
  deliveryCompanies.value = sort(resp, { selector: 'name' })
690
- grabfoodSetting.value = await remoteOrderApi.integratedDelivery.readGrabfood(
691
- currentRestaurant.value?._id || ''
746
+
747
+ grabfoodSetting.value = isIntegratedPlatformSupported(
748
+ AUTO_INTEGRATION_CLIENT.grabfood,
749
+ currentCountry.value
750
+ )
751
+ ? await remoteOrderApi.integratedDelivery.readGrabfood(currentRestaurant.value?._id || '')
752
+ : null
753
+
754
+ foodpandaSetting.value = isIntegratedPlatformSupported(
755
+ AUTO_INTEGRATION_CLIENT.foodpanda,
756
+ currentCountry.value
692
757
  )
693
- foodpandaSetting.value = await remoteOrderApi.integratedDelivery.readFoodpanda(
694
- currentRestaurant.value?._id || ''
758
+ ? await remoteOrderApi.integratedDelivery.readFoodpanda(currentRestaurant.value?._id || '')
759
+ : null
760
+ shopeefoodSetting.value = isIntegratedPlatformSupported(
761
+ AUTO_INTEGRATION_CLIENT.shopeefood,
762
+ currentCountry.value
695
763
  )
696
- shopeefoodSetting.value = await remoteOrderApi.integratedDelivery.readShopeefood(
697
- currentRestaurant.value?._id || ''
764
+ ? await remoteOrderApi.integratedDelivery.readShopeefood(currentRestaurant.value?._id || '')
765
+ : null
766
+ deliverooSetting.value = isIntegratedPlatformSupported(
767
+ AUTO_INTEGRATION_CLIENT.deliveroo,
768
+ currentCountry.value
698
769
  )
699
- externalSetting.value = await remoteOrderApi.integratedDelivery.readExternal(
700
- currentRestaurant.value?._id || ''
770
+ ? await remoteOrderApi.integratedDelivery.readDeliveroo(currentRestaurant.value?._id || '')
771
+ : null
772
+ externalSetting.value = isIntegratedPlatformSupported(
773
+ AUTO_INTEGRATION_CLIENT.external,
774
+ currentCountry.value
701
775
  )
776
+ ? await remoteOrderApi.integratedDelivery.readExternal(currentRestaurant.value?._id || '')
777
+ : null
702
778
  })
703
779
  loadingDpi.value = false
704
780
  }
@@ -872,6 +948,11 @@ async function updateDelivery(
872
948
  integrated as FdoShopeeFoodSettings
873
949
  )
874
950
  break
951
+ case AUTO_INTEGRATION_CLIENT.deliveroo:
952
+ await restaurantStore.updateIntegratedDeliverooDelivery(
953
+ currentRestaurant.value?._id ?? '',
954
+ integrated as FdoDeliverooSettings
955
+ )
875
956
  }
876
957
  }
877
958
  }
@@ -927,9 +1008,10 @@ function convertStatustoI18(status: status): [string] {
927
1008
  type companyName =
928
1009
  | 'In house delivery'
929
1010
  | 'FeedMe express'
930
- | 'FoodPanda delivery'
931
- | 'GrabFood delivery'
1011
+ | 'Food Panda delivery'
1012
+ | 'Grab Food delivery'
932
1013
  | 'ShopeeFood delivery'
1014
+ | 'Deliveroo delivery'
933
1015
  | 'External delivery'
934
1016
 
935
1017
  function convertIntegratedCompanyName(name: companyName): string {
@@ -938,12 +1020,14 @@ function convertIntegratedCompanyName(name: companyName): string {
938
1020
  return `${t('order.deliveryTitle', { company: 'In House' })}`
939
1021
  case 'FeedMe express':
940
1022
  return `${t('order.feedMeExpress')}`
941
- case 'FoodPanda delivery':
942
- return `${t('order.deliveryTitle', { company: 'FoodPanda' })}`
943
- case 'GrabFood delivery':
944
- return `${t('order.deliveryTitle', { company: 'GrabFood' })}`
1023
+ case 'Food Panda delivery':
1024
+ return `${t('order.deliveryTitle', { company: 'Food Panda' })}`
1025
+ case 'Grab Food delivery':
1026
+ return `${t('order.deliveryTitle', { company: 'Grab Food' })}`
945
1027
  case 'ShopeeFood delivery':
946
1028
  return `${t('order.deliveryTitle', { company: 'ShopeeFood' })}`
1029
+ case 'Deliveroo delivery':
1030
+ return `${t('order.deliveryTitle', { company: 'Deliveroo' })}`
947
1031
  case 'External delivery':
948
1032
  return `${t('order.externalDelivery')}`
949
1033
  default:
@@ -1,4 +1,4 @@
1
- import type { FdoExternalSetting } from '@entity';
1
+ import type { FdoDeliverooSettings, FdoExternalSetting } from '@entity';
2
2
  import {
3
3
  FdoRestaurantFeedmeDelivery,
4
4
  FdoGrabfoodSettings,
@@ -67,6 +67,14 @@ function initShopeefoodDelivery(): FdoShopeeFoodSettings {
67
67
  }
68
68
  }
69
69
 
70
+ function initDeliverooDelivery(): FdoDeliverooSettings {
71
+ return {
72
+ enable: false,
73
+ merchantID: '',
74
+ catalogId: null,
75
+ autoCloseBill: false
76
+ }
77
+ }
70
78
  function initExternalDelivery(): FdoExternalSetting {
71
79
  return {
72
80
  _id: '',
@@ -87,5 +95,6 @@ export default {
87
95
  initFoodpandaDelivery,
88
96
  initGrabfoodDelivery,
89
97
  initShopeefoodDelivery,
98
+ initDeliverooDelivery,
90
99
  initExternalDelivery
91
100
  }
@@ -1,21 +1,22 @@
1
- import { F_PAYMENT_NAME, FdoLinkedDelivery } from "@feedmepos/core/entity";
1
+ import { F_PAYMENT_NAME, FdoLinkedDelivery, F_COUNTRY} from "@feedmepos/core/entity";
2
2
 
3
- export type LinkedDeliveryDoc = FdoLinkedDelivery & { _rev: string };
3
+ export type LinkedDeliveryDoc = FdoLinkedDelivery & { _rev: string };
4
4
 
5
5
  export enum AUTO_INTEGRATION_CLIENT {
6
6
  foodpanda = 'foodpanda',
7
7
  grabfood = 'grabfood',
8
8
  shopeefood = 'shopeefood',
9
+ deliveroo = 'deliveroo',
9
10
  external = 'external'
10
11
  }
11
12
 
12
13
  export interface DeliveryCompany {
13
- id: string;
14
- name: string;
15
- slotPrefix: string;
16
- paymentTypeKey: string;
17
- key: string;
18
- }
14
+ id: string;
15
+ name: string;
16
+ slotPrefix: string;
17
+ paymentTypeKey: string;
18
+ key: string;
19
+ }
19
20
 
20
21
  function formatDeliveryCompanyKey(key: string) {
21
22
  return key.toLowerCase().replace('_', '').toLowerCase();
@@ -38,5 +39,29 @@ export function useDelivery() {
38
39
  return formatDeliveryCompanyKey(key) === formatDeliveryCompanyKey(targetKey);
39
40
  }
40
41
 
41
- return { getLinkedDeliveryDoc, filterLocalDeliveryCompanies, getPaymentType, equalKey };
42
+ function isIntegratedPlatformSupported(platform: AUTO_INTEGRATION_CLIENT, country?: F_COUNTRY | null): boolean {
43
+ country = country || F_COUNTRY.enum.MY
44
+ const mySupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.shopeefood, AUTO_INTEGRATION_CLIENT.external];
45
+ const sgSupported = [AUTO_INTEGRATION_CLIENT.foodpanda, AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.deliveroo];
46
+ const thSupported = [AUTO_INTEGRATION_CLIENT.grabfood, AUTO_INTEGRATION_CLIENT.external ];
47
+
48
+ let supportedPlatforms:AUTO_INTEGRATION_CLIENT[] = [];
49
+ switch (country) {
50
+ case F_COUNTRY.enum.MY:
51
+ supportedPlatforms = mySupported
52
+ break;
53
+ case F_COUNTRY.enum.SG:
54
+ supportedPlatforms = sgSupported
55
+ break;
56
+ case F_COUNTRY.enum.TH:
57
+ supportedPlatforms = thSupported
58
+ break;
59
+ default:
60
+ break;
61
+ }
62
+
63
+ return supportedPlatforms.includes(platform)
64
+ }
65
+
66
+ return { getLinkedDeliveryDoc, filterLocalDeliveryCompanies, getPaymentType, equalKey, isIntegratedPlatformSupported };
42
67
  }
@@ -0,0 +1,109 @@
1
+ <script setup lang="ts">
2
+ import { computed, type PropType, reactive } from 'vue'
3
+ import type { FdoLinkedDelivery } from '@feedmepos/core/entity'
4
+ import { FdoDeliverooSettings } from '@entity'
5
+ import type { DeliveryCompany } from '../delivery'
6
+ import type { IntegratedDeliverySettingData } from './IntegratedDelivery.vue'
7
+ import { useLoading } from '@/composables/loading'
8
+ import { remoteOrderApi } from '@/api/remoteOrder'
9
+ import IntegratedDelivery from './IntegratedDelivery.vue'
10
+ import { clone } from '@/helpers/object'
11
+ import { useI18n, useCoreStore } from '@feedmepos/mf-common'
12
+ import { useSnackbarFunctions } from '@/components/snackbar'
13
+
14
+ const { t } = useI18n()
15
+ const { currentRestaurant } = useCoreStore()
16
+ const { showError } = useSnackbarFunctions()
17
+
18
+ export interface DeliverooDeliveryData {
19
+ manual: FdoLinkedDelivery | null
20
+ integrated: FdoDeliverooSettings
21
+ }
22
+
23
+ const props = defineProps({
24
+ initialValue: {
25
+ type: Object as PropType<DeliverooDeliveryData>,
26
+ required: true
27
+ },
28
+ company: {
29
+ type: Object as PropType<DeliveryCompany>,
30
+ required: true
31
+ },
32
+ canUseAutoDeliveryIntegration: {
33
+ type: [String, Boolean],
34
+ required: true
35
+ }
36
+ })
37
+
38
+ const data = reactive(clone(props.initialValue))
39
+ const modelValue = computed<IntegratedDeliverySettingData>(() => {
40
+ const auto = data.integrated
41
+ return {
42
+ manual: data.manual,
43
+ auto: {
44
+ enable: auto.enable,
45
+ integrationId: auto.merchantID,
46
+ autoCloseBill: auto.autoCloseBill || false,
47
+ catalogId: auto?.catalogId || null,
48
+ lastSynchronize: auto.lastSynchronize,
49
+ status: auto.status,
50
+ updatedAt: auto.updatedAt,
51
+ printReceiptAfterClose: auto.printReceiptAfterClose ?? true,
52
+ menuSyncError: auto.menuSyncError,
53
+ commissionRate: 0 // always 0
54
+ }
55
+ }
56
+ })
57
+
58
+ function updateData({ manual, auto }: IntegratedDeliverySettingData) {
59
+ data.manual = manual
60
+ data.integrated = {
61
+ ...auto,
62
+ merchantID: auto.integrationId
63
+ }
64
+ return { manual: data.manual, integrated: data.integrated }
65
+ }
66
+
67
+ const emits = defineEmits<{
68
+ (e: 'update:model-value', payload: { manual: any; auto: any }): void
69
+ }>()
70
+
71
+ function updateDataPass({ manual, auto }: IntegratedDeliverySettingData) {
72
+ const updatedData = updateData({ manual, auto })
73
+ emits('update:model-value', { manual: updatedData.manual, auto: updatedData.integrated })
74
+ }
75
+
76
+ const { startAsyncCallWithErr } = useLoading()
77
+ async function syncMenu() {
78
+ const restaurantId = currentRestaurant.value?._id ?? ''
79
+ await startAsyncCallWithErr(async () => {
80
+ try {
81
+ const res = await remoteOrderApi.integratedDelivery.syncDeliverooMernu(restaurantId)
82
+ const temp = {
83
+ ...modelValue.value.auto,
84
+ lastSynchronize: res?.lastSynchronize || modelValue.value.auto.lastSynchronize
85
+ }
86
+ updateData({ auto: temp, manual: data.manual })
87
+ } catch (error) {
88
+ console.log(error)
89
+ showError(`${t('order.rateLimitWarning')}`)
90
+ }
91
+ })
92
+ }
93
+
94
+ async function flowTestOrder() {}
95
+
96
+ async function cancelTestOrder() {}
97
+ </script>
98
+
99
+ <template>
100
+ <IntegratedDelivery
101
+ :model-value="modelValue"
102
+ :company="company"
103
+ :can-use-auto-delivery-integration="canUseAutoDeliveryIntegration"
104
+ @update:model-value="updateDataPass"
105
+ @sync-menu="syncMenu"
106
+ @flow-test-order="flowTestOrder"
107
+ @cancel-test-order="cancelTestOrder"
108
+ />
109
+ </template>
@@ -102,12 +102,12 @@ function updateIntegrateId(integrationId: InputModel) {
102
102
  }))
103
103
  }
104
104
 
105
- function updateCommission(commission: InputModel) {
106
- updateAuto((oldV) => ({
107
- ...oldV,
108
- commissionRate: getValue<number>(commission, 'number')
109
- }))
110
- }
105
+ // function updateCommission(commission: InputModel) {
106
+ // updateAuto((oldV) => ({
107
+ // ...oldV,
108
+ // commissionRate: getValue<number>(commission, 'number')
109
+ // }))
110
+ // }
111
111
 
112
112
  function updateMenuCatalog(catalogId: string | null) {
113
113
  updateAuto((oldV) => ({
@@ -191,12 +191,12 @@ function convertStatusI18n(status: string) {
191
191
  </script>
192
192
 
193
193
  <template>
194
- <ManualIntegratedDeliverySetting
194
+ <!-- <ManualIntegratedDeliverySetting
195
195
  :model-value="modelValue.manual"
196
196
  :company="company"
197
197
  :catalog-options="menuStore.catalogOptions"
198
198
  @update:model-value="updateManual"
199
- />
199
+ /> -->
200
200
  <div v-if="canUseAutoDeliveryIntegration === true" class="mt-10">
201
201
  <FmSwitch
202
202
  :disabled="!canEdit"
@@ -230,7 +230,8 @@ function convertStatusI18n(status: string) {
230
230
  </div>
231
231
  </div>
232
232
 
233
- <div class="mb-5">
233
+ <!-- Commision rate not used yet -->
234
+ <!-- <div class="mb-5">
234
235
  <FmTextField
235
236
  :model-value="modelValue.auto.commissionRate"
236
237
  :label="t('order.commission')"
@@ -239,7 +240,7 @@ function convertStatusI18n(status: string) {
239
240
  >
240
241
  <template #append>%</template>
241
242
  </FmTextField>
242
- </div>
243
+ </div> -->
243
244
  <div class="mb-3">
244
245
  <div class="flex-grow fm-typo-en-title-sm-600 mb-3 mt-7">{{ t('order.syncMenu') }}</div>
245
246
  <FmSelect