@feedmepos/mf-order-setting 0.0.72-prod → 0.0.73-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/.env +1 -1
  2. package/README.md +7 -23
  3. package/dist/{KioskDevicesView-DIiEVc0i.js → KioskDevicesView-Dztw-Q35.js} +1 -1
  4. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-BD0Olm4_.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-Ol419NZh.js} +3 -3
  5. package/dist/{KioskSettingView-Csm9he9M.js → KioskSettingView-BUHmoxyO.js} +183 -202
  6. package/dist/{KioskView-Ho2ts0j6.js → KioskView-B8j77zMA.js} +4 -4
  7. package/dist/OrderSettingsView-C5PK8CKZ.js +60009 -0
  8. package/dist/{app-xl2InG-H.js → app-C2_s0fkK.js} +5066 -4942
  9. package/dist/app.js +1 -1
  10. package/dist/{dayjs.min-BVqlMLNE.js → dayjs.min-B3nOmXcs.js} +1 -1
  11. package/dist/frontend/mf-order/src/api/menu/index.d.ts +1 -1
  12. package/dist/frontend/mf-order/src/api/remoteOrder/index.d.ts +10 -3
  13. package/dist/frontend/mf-order/src/app.d.ts +44 -8
  14. package/dist/frontend/mf-order/src/components/GoogleMap.vue.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/composables/useQrOrderingEnabled.d.ts +2 -0
  16. package/dist/frontend/mf-order/src/helpers/menu.d.ts +1 -1
  17. package/dist/frontend/mf-order/src/main.d.ts +44 -8
  18. package/dist/frontend/mf-order/src/stores/kiosk/index.d.ts +21 -21
  19. package/dist/frontend/mf-order/src/stores/menu/menu.d.ts +906 -1044
  20. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +36 -3
  21. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +5 -2
  22. package/dist/frontend/mf-order/src/views/order-settings/delivery/DeliverySetting.vue.d.ts +2 -2
  23. package/dist/frontend/mf-order/src/views/order-settings/delivery/components/TaxInput.vue.d.ts +3 -8
  24. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.d.ts +3 -1
  25. package/dist/frontend/mf-order/src/views/order-settings/delivery/delivery.data.d.ts +5 -1
  26. package/dist/frontend/mf-order/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue.d.ts +21 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +2 -2
  28. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue.d.ts +1 -1
  29. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue.d.ts +28 -2
  30. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue.d.ts +46 -0
  31. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue.d.ts +57 -0
  32. package/dist/frontend/mf-order/src/views/order-settings/pickup/PickUpSettingDialogContent.vue.d.ts +23 -1
  33. package/dist/frontend/mf-order/src/views/order-settings/pickup/Preorder.vue.d.ts +27 -0
  34. package/dist/frontend/mf-order/src/views/order-settings/servicecharge/RateInput.vue.d.ts +8 -0
  35. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  36. package/dist/index-6PQJ07gD.js +665 -0
  37. package/dist/{index-B4qdL9W3.js → index-B4XxBqiV.js} +1 -1
  38. package/dist/lineman-settings.dto-DcYJFu0U.js +60394 -0
  39. package/dist/package/entity/_type-assert.d.ts +7 -0
  40. package/dist/package/entity/booking/booking.dto.d.ts +24 -24
  41. package/dist/package/entity/delivery/delivery.dto.d.ts +8 -8
  42. package/dist/package/entity/delivery/delivery.enum.d.ts +12 -0
  43. package/dist/package/entity/delivery/gateway/grab.dto.d.ts +2 -2
  44. package/dist/package/entity/delivery/gateway/kosmo.dto.d.ts +16 -16
  45. package/dist/package/entity/delivery/gateway/pandago.dto.d.ts +4 -4
  46. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +282 -4591
  47. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +32 -24
  48. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +23 -11719
  49. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +2 -2
  50. package/dist/package/entity/index.d.ts +12 -0
  51. package/dist/package/entity/kiosk/kiosk.do.d.ts +140 -140
  52. package/dist/package/entity/kiosk/kiosk.dto.d.ts +168 -168
  53. package/dist/package/entity/kiosk/marketing/marketing.dto.d.ts +63 -7
  54. package/dist/package/entity/marketing/marketing.dto.d.ts +4 -4
  55. package/dist/package/entity/member/member.dto.d.ts +6 -0
  56. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +8 -8
  57. package/dist/package/entity/order/effects/effect.dto.d.ts +68 -16
  58. package/dist/package/entity/order/menu/menu.dto.d.ts +45 -8
  59. package/dist/package/entity/order/order-item/order-item.dto.d.ts +358 -3853
  60. package/dist/package/entity/order/order.do.d.ts +239 -42
  61. package/dist/package/entity/order/order.dto.d.ts +6497 -2236
  62. package/dist/package/entity/order/payment/payment.dto.d.ts +52 -12
  63. package/dist/package/entity/order-platform/base-integration.do.d.ts +8 -0
  64. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +2 -2
  65. package/dist/package/entity/order-platform/deliveroo/deliveroo-order.do.d.ts +524 -524
  66. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +2 -2
  67. package/dist/package/entity/order-platform/deliveroo/deliveroo.menu.dto.d.ts +58 -58
  68. package/dist/package/entity/order-platform/external/menu/external-master-menu.do.d.ts +212 -284
  69. package/dist/package/entity/order-platform/external/menu/external-menu.do.d.ts +331 -589
  70. package/dist/package/entity/order-platform/external/menu/external-menu.dto.d.ts +1 -1
  71. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  72. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +275 -275
  73. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +3 -3
  74. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +3 -3
  75. package/dist/package/entity/order-platform/foodpanda/foodpanda-menu.dto.d.ts +284 -284
  76. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.do.d.ts +40 -40
  77. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +16 -16
  78. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +2 -2
  79. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +2 -2
  80. package/dist/package/entity/order-platform/gofood/gofood-order.do.d.ts +18 -18
  81. package/dist/package/entity/order-platform/gofood/gofood-settings.do.d.ts +2 -2
  82. package/dist/package/entity/order-platform/gofood/gofood-settings.dto.d.ts +2 -2
  83. package/dist/package/entity/order-platform/gofood/gofood.dto.d.ts +32 -32
  84. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +12 -12
  85. package/dist/package/entity/order-platform/grabfood/grabfood-omni.do.d.ts +134 -115
  86. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +187 -165
  87. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +8 -2
  88. package/dist/package/entity/order-platform/grabfood/grabfood-webhook.dto.d.ts +49 -42
  89. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +67 -54
  90. package/dist/package/entity/order-platform/grabfood/grabfood.enum.d.ts +1 -1
  91. package/dist/package/entity/order-platform/lineman/lineman-settings.do.d.ts +37 -0
  92. package/dist/package/entity/order-platform/lineman/lineman-settings.dto.d.ts +40 -0
  93. package/dist/package/entity/order-platform/menu.dto.d.ts +716 -13887
  94. package/dist/package/entity/order-platform/order-platform.dto.d.ts +136 -2
  95. package/dist/package/entity/order-platform/order-platform.enum.d.ts +1 -1
  96. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +176 -176
  97. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.dto.d.ts +62 -62
  98. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +8 -2
  99. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +8 -2
  100. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +1061 -0
  101. package/dist/package/entity/order-platform/tng/tng-order.do.d.ts +1915 -0
  102. package/dist/package/entity/order-platform/tng/tng-settings.do.d.ts +379 -0
  103. package/dist/package/entity/order-platform/tng/tng-settings.dto.d.ts +301 -0
  104. package/dist/package/entity/order-platform/tng/tng.dto.d.ts +1162 -0
  105. package/dist/package/entity/order-platform/tng/tng.enum.d.ts +29 -0
  106. package/dist/package/entity/order-setting/delivery/inhouse-delivery.do.d.ts +12 -0
  107. package/dist/package/entity/order-setting/delivery/inhouse-delivery.dto.d.ts +12 -0
  108. package/dist/package/entity/order-setting/dine-in/dine-in.do.d.ts +11 -0
  109. package/dist/package/entity/order-setting/dine-in/dine-in.dto.d.ts +9 -0
  110. package/dist/package/entity/order-setting/kiosk/kiosk.do.d.ts +2 -2
  111. package/dist/package/entity/order-setting/kiosk/kiosk.dto.d.ts +2 -2
  112. package/dist/package/entity/order-setting/order-setting.do.d.ts +55 -4
  113. package/dist/package/entity/order-setting/order-setting.dto.d.ts +110 -8
  114. package/dist/package/entity/order-setting/pickup/pickup.do.d.ts +12 -0
  115. package/dist/package/entity/order-setting/pickup/pickup.dto.d.ts +12 -0
  116. package/dist/package/entity/payment/transaction.d.ts +80 -8
  117. package/dist/package/entity/printer/printer.do.d.ts +14 -14
  118. package/dist/package/entity/pubsub/ably/ably.enum.d.ts +1 -1
  119. package/dist/package/entity/queue/queue.do.d.ts +236 -1901
  120. package/dist/package/entity/queue/queue.dto.d.ts +743 -445
  121. package/dist/package/entity/restaurant/restaurant.dto.d.ts +27 -4
  122. package/dist/package/entity/websocket/websocket.dto.d.ts +10 -10
  123. package/dist/style.css +1 -0
  124. package/golar.config.ts +20 -0
  125. package/package.json +28 -22
  126. package/src/Entry.vue +2 -10
  127. package/src/api/menu/index.ts +1 -1
  128. package/src/api/remoteOrder/index.ts +176 -110
  129. package/src/composables/useQrOrderingEnabled.ts +66 -0
  130. package/src/helpers/menu.ts +1 -1
  131. package/src/locales/en-US.json +421 -412
  132. package/src/locales/ja-JP.json +1769 -1760
  133. package/src/locales/th-TH.json +409 -400
  134. package/src/locales/zh-CN.json +417 -408
  135. package/src/main.ts +4 -44
  136. package/src/router/index.ts +2 -2
  137. package/src/stores/menu/menu.ts +48 -27
  138. package/src/stores/restaurant/index.ts +24 -9
  139. package/src/utils/firebase-storage.ts +3 -13
  140. package/src/views/kiosk/settings/KioskSettingView.vue +3 -2
  141. package/src/views/order-settings/OrderSettingsView.vue +31 -11
  142. package/src/views/order-settings/delivery/DeliverySetting.vue +223 -11
  143. package/src/views/order-settings/delivery/components/TaxInput.vue +1 -1
  144. package/src/views/order-settings/delivery/delivery.data.ts +31 -10
  145. package/src/views/order-settings/delivery/delivery.ts +60 -28
  146. package/src/views/order-settings/delivery/inhouse/InHouseDelivery.vue +40 -1
  147. package/src/views/order-settings/delivery/integrated-delivery/DeliverooSetting.vue +1 -1
  148. package/src/views/order-settings/delivery/integrated-delivery/GrabfoodSetting.vue +15 -7
  149. package/src/views/order-settings/delivery/integrated-delivery/IntegratedDelivery.vue +83 -27
  150. package/src/views/order-settings/delivery/integrated-delivery/LinemanSetting.vue +79 -0
  151. package/src/views/order-settings/delivery/integrated-delivery/ShopeefoodSetting.vue +2 -0
  152. package/src/views/order-settings/delivery/integrated-delivery/TngSetting.vue +749 -0
  153. package/src/views/order-settings/dine-in/DineInSetting.vue +54 -23
  154. package/src/views/order-settings/general/GeneralSetting.vue +15 -6
  155. package/src/views/order-settings/pickup/PickUpSettingDialog.vue +31 -3
  156. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +34 -0
  157. package/src/views/order-settings/pickup/Preorder.vue +13 -12
  158. package/src/views/order-settings/queue/QueueSetting.vue +30 -1
  159. package/src/views/order-settings/servicecharge/RateInput.vue +9 -7
  160. package/vite.config.ts +16 -16
  161. package/dist/OrderSettingsView-C0G8kP3v.js +0 -32222
  162. package/dist/frontend/mf-order/src/api/auth/index.d.ts +0 -7
  163. package/dist/frontend/mf-order/src/stores/iframe/index.d.ts +0 -14
  164. package/dist/index-kCI8JdNP.js +0 -628
  165. package/dist/queue-transfer.dto-BLyCakS5.js +0 -45618
  166. package/src/api/auth/index.ts +0 -20
  167. package/src/stores/iframe/index.ts +0 -23
@@ -7,7 +7,7 @@
7
7
  class="mx-5 xs:my-3 xs:order-1"
8
8
  />
9
9
  </div>
10
- <div class="block">
10
+ <div v-if="qrEnabled" class="block">
11
11
  <FmPageHead
12
12
  class="flex-grow"
13
13
  :title="`${t('order.integratedDeliveryCompany')}`"
@@ -55,6 +55,13 @@
55
55
  :can-use-auto-delivery-integration="componentProps.canUseAuto"
56
56
  @update:model-value="handleModelValueUpdate"
57
57
  />
58
+ <LinemanSetting
59
+ v-if="componentProps.key === AUTO_INTEGRATION_CLIENT.lineman"
60
+ :initial-value="componentProps.initialValue"
61
+ :company="componentProps.company"
62
+ :can-use-auto-delivery-integration="componentProps.canUseAuto"
63
+ @update:model-value="handleModelValueUpdate"
64
+ />
58
65
  <ShopeefoodSetting
59
66
  v-if="componentProps.key === AUTO_INTEGRATION_CLIENT.shopeefood"
60
67
  :initial-value="componentProps.initialValue"
@@ -76,6 +83,15 @@
76
83
  :can-use-auto-delivery-integration="componentProps.canUseAuto"
77
84
  @update:model-value="handleModelValueUpdate"
78
85
  />
86
+ <TngSetting
87
+ v-if="componentProps.key === AUTO_INTEGRATION_CLIENT.tng"
88
+ :initial-value="componentProps.initialValue"
89
+ :company="componentProps.company"
90
+ :can-use-auto-delivery-integration="componentProps.canUseAuto"
91
+ :categorized-items="menuStore.rawCategorizedItems"
92
+ @update:model-value="handleModelValueUpdate"
93
+ @validation-result="handleIntegratedValidationMessage"
94
+ />
79
95
 
80
96
  <FeedmeDelivery
81
97
  v-if="feedMeComponentProps.key === F_ORDER_PLATFORM.enum.FEEDME"
@@ -88,7 +104,9 @@
88
104
  v-if="inHouseComponentProps.key === F_ORDER_PLATFORM.enum.IN_HOUSE"
89
105
  :initial-value="inHouseComponentProps.initialValue"
90
106
  :address="formatAddress((currentRestaurant as any).profile.address)"
107
+ :order-inhouse-delivery-settings="orderInhouseDeliverySettings"
91
108
  @update:model-value="handleModelValueUpdateInHouse"
109
+ @update:order-settings="handleOrderInhouseDeliverySettingsUpdate"
92
110
  />
93
111
  <ExternalSetting
94
112
  v-if="externalComponentProps.key === AUTO_INTEGRATION_CLIENT.external"
@@ -172,10 +190,18 @@
172
190
  </template>
173
191
 
174
192
  <script setup lang="ts">
175
- import { computed, h, ref, watch, onMounted } from 'vue'
193
+ import { computed, h, ref, watch } from 'vue'
176
194
  import RestaurantSelector from '../components/RestaurantSelector.vue'
177
195
  import { type ColumnDef, useDialog } from '@feedmepos/ui-library'
178
- import type { FdoDeliverooSettings, FdoFoodpandaSettings, FdoExternalSetting } from '@entity'
196
+ import type {
197
+ FdoDeliverooSettings,
198
+ FdoFoodpandaSettings,
199
+ FdoExternalSetting,
200
+ FdoLinemanSettings,
201
+ FdoTngSettings,
202
+ TNG_FULFILLMENT_KEY
203
+ } from '@entity'
204
+ import { TNG_FULFILLMENT_KEYS } from '@entity'
179
205
  import type {
180
206
  FdoLinkedDelivery,
181
207
  FdoRestaurantFeedmeDelivery,
@@ -183,6 +209,8 @@ import type {
183
209
  } from '@feedmepos/core/entity'
184
210
  import { F_DELIVERY_TYPE, F_ORDER_PLATFORM, F_RESTAURANT_FEATURE } from '@feedmepos/core/entity'
185
211
  import { FdoGoFoodSettings, FdoGrabfoodSettings, FdoShopeeFoodSettings } from '@entity'
212
+ import type { OrderInhouseDeliverySettingsDto, OrderSettingsDto } from '@entity'
213
+ import { OrderSettingApi } from '@/api/order-setting'
186
214
  import deliveryData from './delivery.data'
187
215
  import { useDelivery, type DeliveryCompany, type LinkedDeliveryDoc } from './delivery'
188
216
  import { useLoading } from '@/composables/loading'
@@ -194,7 +222,9 @@ import { insertOrUpdate, remove, sort } from '@/helpers/iteration'
194
222
  import type { FdoRestaurantFeedme } from '../delivery/integrated-delivery/FeedmeDelivery.vue'
195
223
  import FoodpandaSetting from './integrated-delivery/FoodpandaSetting.vue'
196
224
  import GrabfoodSetting from './integrated-delivery/GrabfoodSetting.vue'
225
+ import LinemanSetting from './integrated-delivery/LinemanSetting.vue'
197
226
  import ShopeefoodSetting from './integrated-delivery/ShopeefoodSetting.vue'
227
+ import TngSetting from './integrated-delivery/TngSetting.vue'
198
228
  import GoFoodSetting from './integrated-delivery/GoFoodSetting.vue'
199
229
  import ExternalSetting from './integrated-delivery/ExternalSetting.vue'
200
230
  import { useRestaurantStore } from '@/stores/restaurant'
@@ -208,10 +238,12 @@ import DeliverooSetting from './integrated-delivery/DeliverooSetting.vue'
208
238
  import FeedmeExpressDeprecationNotice from './components/FeedmeExpressDeprecationNotice.vue'
209
239
  import { useDeprecationNotice } from '@/composables/useDeprecationNotice'
210
240
  import { useI18n, useCoreStore } from '@feedmepos/mf-common'
241
+ import { useQrOrderingEnabled } from '@/composables/useQrOrderingEnabled'
211
242
 
212
243
  const { t } = useI18n()
244
+ const qrEnabled = useQrOrderingEnabled()
213
245
  const { searchKey, filter } = useSearch()
214
- const { showSuccess } = useSnackbarFunctions()
246
+ const { showError, showSuccess } = useSnackbarFunctions()
215
247
  const restaurantStore = useRestaurantStore()
216
248
  const {
217
249
  currentRestaurant,
@@ -271,7 +303,9 @@ type IntegratedDeliveryCompany =
271
303
  | FdoRestaurantFeedmeDelivery
272
304
  | FdoFoodpandaSettings
273
305
  | FdoGrabfoodSettings
306
+ | FdoLinemanSettings
274
307
  | FdoShopeeFoodSettings
308
+ | FdoTngSettings
275
309
  | FdoGoFoodSettings
276
310
  | FdoExternalSetting
277
311
  export interface IntegratedDeliveryRow extends DeliveryRow {
@@ -315,6 +349,10 @@ async function toggleIntegratedSidesheet(data: any) {
315
349
  title.value = `${t('order.manageDelivery', { company: 'grabfood' })}`
316
350
  updateIntegratedDeliveryType(rowData)
317
351
  break
352
+ case AUTO_INTEGRATION_CLIENT.lineman:
353
+ title.value = `${t('order.manageDelivery', { company: 'Lineman' })}`
354
+ updateIntegratedDeliveryType(rowData)
355
+ break
318
356
  case AUTO_INTEGRATION_CLIENT.shopeefood:
319
357
  title.value = `${t('order.manageDelivery', { company: 'shopeefood' })}`
320
358
  updateIntegratedDeliveryType(rowData)
@@ -327,6 +365,10 @@ async function toggleIntegratedSidesheet(data: any) {
327
365
  title.value = 'Manage deliveroo deivery'
328
366
  updateIntegratedDeliveryType(rowData)
329
367
  break
368
+ case AUTO_INTEGRATION_CLIENT.tng:
369
+ title.value = `${t('order.manageDelivery', { company: 'TNG' })}`
370
+ updateIntegratedDeliveryType(rowData)
371
+ break
330
372
  case F_ORDER_PLATFORM.enum.FEEDME:
331
373
  title.value = `${t('order.feedmeExpressTitle')}`
332
374
  updateFeedmeExpress(rowData)
@@ -362,6 +404,16 @@ const inHouseComponentProps = ref({
362
404
  initialValue: {} as InhouseDialogData
363
405
  })
364
406
 
407
+ // `orderSetting.inhouseDeliverySettings` (bill auto-close / receipt-print) is a
408
+ // separate doc from the restaurant-level in-house delivery setting; loaded when
409
+ // the in-house sidesheet opens and saved alongside it.
410
+ const orderSetting = ref<OrderSettingsDto | undefined>(undefined)
411
+ const orderInhouseDeliverySettings = ref<OrderInhouseDeliverySettingsDto>({})
412
+
413
+ function handleOrderInhouseDeliverySettingsUpdate(v: OrderInhouseDeliverySettingsDto) {
414
+ orderInhouseDeliverySettings.value = v
415
+ }
416
+
365
417
  const externalComponentProps = ref({
366
418
  key: '' as string,
367
419
  initialValue: {} as FdoExternalSetting
@@ -443,6 +495,12 @@ async function updateInHouse({ key, setting }: IntegratedDeliveryRow) {
443
495
  taxes: inhouseSetting.taxes || {}
444
496
  }
445
497
  }
498
+
499
+ await startAsyncCallWithErr(async () => {
500
+ const orderSettingData = await OrderSettingApi.getOrderSetting()
501
+ orderSetting.value = orderSettingData
502
+ orderInhouseDeliverySettings.value = orderSettingData.inhouseDeliverySettings ?? {}
503
+ })
446
504
  }
447
505
 
448
506
  async function updateExternalDelivery({ key, setting }: IntegratedDeliveryRow) {
@@ -538,14 +596,23 @@ const grabfood = computed<FdoGrabfoodSettings>(() => {
538
596
  return {
539
597
  ...deliveryData.initGrabfoodDelivery(),
540
598
  ...grabfoodSetting.value,
541
- partnerMerchantID: grabfoodSetting?.value?._id
599
+ partnerMerchantID: grabfoodSetting?.value?._id,
600
+ ignoreDiscount: grabfoodSetting?.value?.ignoreDiscount ?? false
601
+ }
602
+ })
603
+
604
+ const lineman = computed<FdoLinemanSettings>(() => {
605
+ return {
606
+ ...deliveryData.initLinemanDelivery(),
607
+ ...linemanSetting.value
542
608
  }
543
609
  })
544
610
 
545
611
  const shopee = computed<FdoShopeeFoodSettings>(() => {
546
612
  return {
547
613
  ...deliveryData.initShopeefoodDelivery(),
548
- ...shopeefoodSetting.value
614
+ ...shopeefoodSetting.value,
615
+ ignoreDiscount: shopeefoodSetting?.value?.ignoreDiscount ?? false
549
616
  }
550
617
  })
551
618
 
@@ -563,6 +630,13 @@ const deliveroo = computed<FdoDeliverooSettings>(() => {
563
630
  }
564
631
  })
565
632
 
633
+ const tng = computed<FdoTngSettings>(() => {
634
+ return {
635
+ ...deliveryData.initTngDelivery(),
636
+ ...tngSetting.value
637
+ }
638
+ })
639
+
566
640
  const external = computed<FdoExternalSetting>(() => {
567
641
  return {
568
642
  ...deliveryData.initExternalDelivery(),
@@ -595,6 +669,26 @@ function getCatalog(catalogId: string | null) {
595
669
  return menuStore.catalogOptions.find(({ value }) => value === catalogId)?.label || ''
596
670
  }
597
671
 
672
+ function getTngCatalog(setting: FdoTngSettings): string {
673
+ return (
674
+ TNG_FULFILLMENT_KEYS.flatMap((mode) =>
675
+ setting?.[mode] ? [getCatalog(setting[mode]?.catalogId ?? null)] : []
676
+ )
677
+ .filter((v) => !!v)
678
+ .filter((v, i, arr) => arr.indexOf(v) === i)
679
+ .join(', ') || '-'
680
+ )
681
+ }
682
+
683
+ function getTngPaymentType(setting: FdoTngSettings): string {
684
+ return (
685
+ TNG_FULFILLMENT_KEYS.flatMap((mode) => setting?.[mode]?.paymentMethods ?? [])
686
+ .filter((v, i, arr) => arr.indexOf(v) === i)
687
+ .map((m) => (m === 'TNGD' ? 'TNGD' : 'Cashier'))
688
+ .join(', ') || '-'
689
+ )
690
+ }
691
+
598
692
  function hasPurchaseFeature(deliveryType: string) {
599
693
  const features = currentRestaurant.value?.features || []
600
694
  const featureKey = equalKey(deliveryType, AUTO_INTEGRATION_CLIENT.foodpanda)
@@ -613,9 +707,11 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
613
707
  deliveryCompanies.value.find(({ key }) => equalKey(key, client))
614
708
  const fpIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.foodpanda)
615
709
  const grabIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.grabfood)
710
+ const linemanIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.lineman)
616
711
  const sfIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.shopeefood)
617
712
  const gofoodIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.gofood)
618
713
  const drIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.deliveroo)
714
+ const tngIntegrate = getIntegrateDoc(AUTO_INTEGRATION_CLIENT.tng)
619
715
 
620
716
  const generateStatus = (integrateActive: boolean) => {
621
717
  return integrateActive ? 'Active' : 'Inactive'
@@ -669,6 +765,17 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
669
765
  catalog: getCatalog(grabfood.value?.catalogId || null),
670
766
  canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(AUTO_INTEGRATION_CLIENT.grabfood)
671
767
  },
768
+ {
769
+ id: loadingKey.value.lm,
770
+ name: 'Lineman delivery',
771
+ key: AUTO_INTEGRATION_CLIENT.lineman,
772
+ company: linemanIntegrate,
773
+ paymentType: 'Default',
774
+ status: [generateStatus(lineman.value.enable)],
775
+ setting: lineman.value,
776
+ catalog: getCatalog(lineman.value.catalogId || null),
777
+ canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(AUTO_INTEGRATION_CLIENT.lineman)
778
+ },
672
779
  {
673
780
  id: loadingKey.value.sf,
674
781
  name: 'ShopeeFood delivery',
@@ -691,9 +798,7 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
691
798
  status: [generateStatus(gofood.value.enable)],
692
799
  setting: gofood.value,
693
800
  catalog: getCatalog(gofood.value.catalogId || null),
694
- canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(
695
- AUTO_INTEGRATION_CLIENT.gofood
696
- )
801
+ canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(AUTO_INTEGRATION_CLIENT.gofood)
697
802
  },
698
803
  {
699
804
  id: loadingKey.value.dr,
@@ -708,6 +813,17 @@ const integratedCompanies = computed<IntegratedDeliveryRow[]>(() => {
708
813
  AUTO_INTEGRATION_CLIENT.deliveroo
709
814
  )
710
815
  },
816
+ {
817
+ id: loadingKey.value.tng,
818
+ name: 'TNG delivery',
819
+ key: AUTO_INTEGRATION_CLIENT.tng,
820
+ company: tngIntegrate,
821
+ paymentType: getTngPaymentType(tng.value),
822
+ status: [generateStatus(tng.value.enable)],
823
+ setting: tng.value,
824
+ catalog: getTngCatalog(tng.value),
825
+ canUseAutoDeliveryIntegration: canUseAutoDeliveryIntegration(AUTO_INTEGRATION_CLIENT.tng)
826
+ },
711
827
  {
712
828
  id: loadingKey.value.external,
713
829
  name: 'External delivery',
@@ -733,10 +849,12 @@ const loadingKey = computed(() => {
733
849
  inhouse: `${id}_inhouse`,
734
850
  fp: `${id}_fp`,
735
851
  gf: `${id}_gf`,
852
+ lm: `${id}_lm`,
736
853
  sf: `${id}_sf`,
737
854
  gofood: `${id}_gofood`,
738
855
  fm: `${id}_fm`,
739
856
  dr: `${id}_dr`,
857
+ tng: `${id}_tng`,
740
858
  external: `${id}_external`,
741
859
  local: (deliveryName: string) => `${id}_${deliveryName}`
742
860
  }
@@ -750,6 +868,9 @@ async function updateIntegratedDeliveryCompany() {
750
868
  case AUTO_INTEGRATION_CLIENT.grabfood:
751
869
  await updateIntegratedDeliverySetting()
752
870
  break
871
+ case AUTO_INTEGRATION_CLIENT.lineman:
872
+ await updateIntegratedDeliverySetting()
873
+ break
753
874
  case AUTO_INTEGRATION_CLIENT.shopeefood:
754
875
  await updateIntegratedDeliverySetting()
755
876
  break
@@ -759,6 +880,9 @@ async function updateIntegratedDeliveryCompany() {
759
880
  case AUTO_INTEGRATION_CLIENT.deliveroo:
760
881
  await updateIntegratedDeliverySetting()
761
882
  break
883
+ case AUTO_INTEGRATION_CLIENT.tng:
884
+ await updateIntegratedDeliverySetting()
885
+ break
762
886
  case F_ORDER_PLATFORM.enum.FEEDME:
763
887
  await updateFeedmeExpressSetting()
764
888
  break
@@ -788,9 +912,11 @@ const filteredCompanies = computed(() => {
788
912
 
789
913
  const grabfoodSetting = ref<FdoGrabfoodSettings | null>(null)
790
914
  const foodpandaSetting = ref<FdoFoodpandaSettings | null>(null)
915
+ const linemanSetting = ref<FdoLinemanSettings | null>(null)
791
916
  const shopeefoodSetting = ref<FdoShopeeFoodSettings | null>(null)
792
917
  const gofoodSetting = ref<FdoGoFoodSettings | null>(null)
793
918
  const deliverooSetting = ref<FdoDeliverooSettings | null>(null)
919
+ const tngSetting = ref<FdoTngSettings | null>(null)
794
920
  const externalSetting = ref<FdoExternalSetting | null>(null)
795
921
  const loadingDpi = ref<boolean>(false)
796
922
 
@@ -809,6 +935,13 @@ async function readData() {
809
935
  ? await remoteOrderApi.integratedDelivery.readGrabfood(currentRestaurant.value?._id || '')
810
936
  : null
811
937
 
938
+ linemanSetting.value = isIntegratedPlatformSupported(
939
+ AUTO_INTEGRATION_CLIENT.lineman,
940
+ currentCountry.value
941
+ )
942
+ ? await remoteOrderApi.integratedDelivery.readLineman(currentRestaurant.value?._id || '')
943
+ : null
944
+
812
945
  foodpandaSetting.value = isIntegratedPlatformSupported(
813
946
  AUTO_INTEGRATION_CLIENT.foodpanda,
814
947
  currentCountry.value
@@ -833,6 +966,12 @@ async function readData() {
833
966
  )
834
967
  ? await remoteOrderApi.integratedDelivery.readDeliveroo(currentRestaurant.value?._id || '')
835
968
  : null
969
+ tngSetting.value = isIntegratedPlatformSupported(
970
+ AUTO_INTEGRATION_CLIENT.tng,
971
+ currentCountry.value
972
+ )
973
+ ? await remoteOrderApi.integratedDelivery.readTng(currentRestaurant.value?._id || '')
974
+ : null
836
975
  externalSetting.value = isIntegratedPlatformSupported(
837
976
  AUTO_INTEGRATION_CLIENT.external,
838
977
  currentCountry.value
@@ -966,7 +1105,16 @@ async function updateFeedmeExpressSetting() {
966
1105
  async function updateInHouseSetting() {
967
1106
  sideSheetIntegrated.value = false
968
1107
  await startAsyncCallWithErr(async () => {
969
- await restaurantStore.updateInhouseDelivery(currentRestaurant.value?._id ?? '', inHouseDoc.value)
1108
+ await restaurantStore.updateInhouseDelivery(
1109
+ currentRestaurant.value?._id ?? '',
1110
+ inHouseDoc.value
1111
+ )
1112
+ if (orderSetting.value) {
1113
+ orderSetting.value = await OrderSettingApi.updateOrderSetting({
1114
+ ...orderSetting.value,
1115
+ inhouseDeliverySettings: orderInhouseDeliverySettings.value
1116
+ })
1117
+ }
970
1118
  const res = (await readRestaurants())?.find((res) => res._id === currentRestaurant.value?._id)
971
1119
  if (res) {
972
1120
  await changeRestaurant(res)
@@ -1000,7 +1148,9 @@ async function updateDelivery(
1000
1148
  integrated:
1001
1149
  | FdoFoodpandaSettings
1002
1150
  | FdoGrabfoodSettings
1151
+ | FdoLinemanSettings
1003
1152
  | FdoShopeeFoodSettings
1153
+ | FdoTngSettings
1004
1154
  | FdoGoFoodSettings,
1005
1155
  hasOriDeliverySetting: boolean,
1006
1156
  canUseAutoDeliveryIntegration?: string | boolean
@@ -1008,7 +1158,7 @@ async function updateDelivery(
1008
1158
  await updateManualDelivery({ doc: manual.doc, company: manual.company, data: manual.data })
1009
1159
  if ((canUseAutoDeliveryIntegration === true && hasOriDeliverySetting) || integrated.enable) {
1010
1160
  switch (client) {
1011
- case AUTO_INTEGRATION_CLIENT.foodpanda:
1161
+ case AUTO_INTEGRATION_CLIENT.foodpanda: {
1012
1162
  const integratedDocument = integrated as FdoFoodpandaSettings
1013
1163
 
1014
1164
  await restaurantStore.updateIntegratedFoodpandaDelivery(
@@ -1016,12 +1166,19 @@ async function updateDelivery(
1016
1166
  { ...integratedDocument, autoAccept: integratedDocument.autoAccept ?? true }
1017
1167
  )
1018
1168
  break
1169
+ }
1019
1170
  case AUTO_INTEGRATION_CLIENT.grabfood:
1020
1171
  await restaurantStore.updateIntegratedGrabfoodDelivery(
1021
1172
  currentRestaurant.value?._id ?? '',
1022
1173
  integrated as FdoGrabfoodSettings
1023
1174
  )
1024
1175
  break
1176
+ case AUTO_INTEGRATION_CLIENT.lineman:
1177
+ await restaurantStore.updateIntegratedLinemanDelivery(
1178
+ currentRestaurant.value?._id ?? '',
1179
+ integrated as FdoLinemanSettings
1180
+ )
1181
+ break
1025
1182
  case AUTO_INTEGRATION_CLIENT.shopeefood:
1026
1183
  await restaurantStore.updateIntegratedShopeefoodDelivery(
1027
1184
  currentRestaurant.value?._id ?? '',
@@ -1039,6 +1196,50 @@ async function updateDelivery(
1039
1196
  currentRestaurant.value?._id ?? '',
1040
1197
  integrated as FdoDeliverooSettings
1041
1198
  )
1199
+ break
1200
+ case AUTO_INTEGRATION_CLIENT.tng:
1201
+ {
1202
+ const integratedDocument = integrated as FdoTngSettings
1203
+ const hasFulfillmentMode = TNG_FULFILLMENT_KEYS.some((mode: TNG_FULFILLMENT_KEY) =>
1204
+ Boolean(integratedDocument[mode])
1205
+ )
1206
+
1207
+ if (integratedDocument.enable && !hasFulfillmentMode) {
1208
+ showError('At least one fulfillment mode is required')
1209
+ return
1210
+ }
1211
+
1212
+ const cleanFulfillment = (config: any) => {
1213
+ if (!config) return config
1214
+ return {
1215
+ ...config,
1216
+ serviceCharge: (config.serviceCharge ?? []).filter(
1217
+ (sc: any) => sc.items === null || (Array.isArray(sc.items) && sc.items.length > 0)
1218
+ )
1219
+ }
1220
+ }
1221
+
1222
+ const tngPayload: FdoTngSettings = {
1223
+ enable: integratedDocument.enable,
1224
+ partnerMerchantId: integratedDocument.partnerMerchantId,
1225
+ autoAccept: integratedDocument.autoAccept,
1226
+ autoCloseBill: integratedDocument.autoCloseBill,
1227
+ printReceiptAfterClose: integratedDocument.printReceiptAfterClose,
1228
+ canRemark: integratedDocument.canRemark,
1229
+ status: integratedDocument.status,
1230
+ dineIn: cleanFulfillment(integratedDocument.dineIn),
1231
+ pickup: cleanFulfillment(integratedDocument.pickup),
1232
+ reservation: cleanFulfillment(integratedDocument.reservation),
1233
+ updatedAt: integratedDocument.updatedAt,
1234
+ lastSynchronize: integratedDocument.lastSynchronize,
1235
+ menuSyncError: integratedDocument.menuSyncError
1236
+ }
1237
+ await remoteOrderApi.integratedDelivery.updateTng(
1238
+ currentRestaurant.value?._id ?? '',
1239
+ tngPayload
1240
+ )
1241
+ }
1242
+ break
1042
1243
  }
1043
1244
  }
1044
1245
  }
@@ -1072,6 +1273,7 @@ function handleModelValueUpdateExternal(v: any) {
1072
1273
  }
1073
1274
 
1074
1275
  const feedmeValidate = ref<boolean | null>(null)
1276
+ const integratedValidationMessage = ref<string | null>(null)
1075
1277
  const isAdmin = computed(() => sessionUser.value?.role?.isAdmin ?? false)
1076
1278
 
1077
1279
  const canSave = computed(() => {
@@ -1086,6 +1288,10 @@ function handleValidationResult(v: boolean) {
1086
1288
  feedmeValidate.value = v
1087
1289
  }
1088
1290
 
1291
+ function handleIntegratedValidationMessage(message: string | null) {
1292
+ integratedValidationMessage.value = message
1293
+ }
1294
+
1089
1295
  type status = 'Manual' | 'Active' | 'Inactive'
1090
1296
 
1091
1297
  function convertStatustoI18(status: status): [string] {
@@ -1106,10 +1312,12 @@ type companyName =
1106
1312
  | 'FeedMe express'
1107
1313
  | 'Food Panda delivery'
1108
1314
  | 'Grab Food delivery'
1315
+ | 'Lineman delivery'
1109
1316
  | 'ShopeeFood delivery'
1110
1317
  | 'GoFood delivery'
1111
1318
  | 'Deliveroo delivery'
1112
1319
  | 'External delivery'
1320
+ | 'TNG delivery'
1113
1321
 
1114
1322
  function convertIntegratedCompanyName(name: companyName): string {
1115
1323
  switch (name) {
@@ -1121,12 +1329,16 @@ function convertIntegratedCompanyName(name: companyName): string {
1121
1329
  return `${t('order.deliveryTitle', { company: 'Food Panda' })}`
1122
1330
  case 'Grab Food delivery':
1123
1331
  return `${t('order.deliveryTitle', { company: 'Grab Food' })}`
1332
+ case 'Lineman delivery':
1333
+ return `${t('order.deliveryTitle', { company: 'Lineman' })}`
1124
1334
  case 'ShopeeFood delivery':
1125
1335
  return `${t('order.deliveryTitle', { company: 'ShopeeFood' })}`
1126
1336
  case 'GoFood delivery':
1127
1337
  return `${t('order.deliveryTitle', { company: 'GoFood' })}`
1128
1338
  case 'Deliveroo delivery':
1129
1339
  return `${t('order.deliveryTitle', { company: 'Deliveroo' })}`
1340
+ case 'TNG delivery':
1341
+ return `${t('order.deliveryTitle', { company: 'TNG' })}`
1130
1342
  case 'External delivery':
1131
1343
  return `${t('order.externalDelivery')}`
1132
1344
  default:
@@ -3,7 +3,7 @@ import { computed } from 'vue';
3
3
  import type { PropType } from 'vue';
4
4
  import { ItemTax } from '@/helpers/menu';
5
5
  import type { Tax } from '@/helpers/menu';
6
- import { FdoProductTaxSetting } from '@feedmepos/menu/entity';
6
+ import { FdoProductTaxSetting } from '@feedmepos/entity';
7
7
 
8
8
  const props = defineProps({
9
9
  modelValue: {
@@ -2,14 +2,13 @@ import type {
2
2
  FdoDeliverooSettings,
3
3
  FdoExternalSetting,
4
4
  FdoGrabfoodSettings,
5
+ FdoLinemanSettings,
5
6
  FdoShopeeFoodSettings,
6
7
  FdoFoodpandaSettings,
8
+ FdoTngSettings,
7
9
  FdoGoFoodSettings
8
- } from '@entity';
9
- import {
10
- FdoRestaurantFeedmeDelivery,
11
- FdoRestaurantInHouseDelivery
12
- } from '@feedmepos/core/entity'
10
+ } from '@entity'
11
+ import { FdoRestaurantFeedmeDelivery, FdoRestaurantInHouseDelivery } from '@feedmepos/core/entity'
13
12
 
14
13
  function initInhouseDelivery(): FdoRestaurantInHouseDelivery {
15
14
  return {
@@ -44,17 +43,26 @@ export function initFoodpandaDelivery(): FdoFoodpandaSettings {
44
43
  commissionRate: 0
45
44
  },
46
45
  autoAccept: true
47
- };
46
+ }
48
47
  }
49
48
 
50
-
51
49
  function initGrabfoodDelivery(): FdoGrabfoodSettings {
52
50
  return {
53
51
  enable: false,
54
52
  merchantID: '',
55
53
  catalogId: null,
56
54
  autoCloseBill: false,
57
- commissionRate: 0,
55
+ commissionRate: 0
56
+ }
57
+ }
58
+
59
+ function initLinemanDelivery(): FdoLinemanSettings {
60
+ return {
61
+ enable: false,
62
+ partnerID: '',
63
+ catalogId: null,
64
+ autoCloseBill: false,
65
+ printReceiptAfterClose: true
58
66
  }
59
67
  }
60
68
 
@@ -80,6 +88,17 @@ function initDeliverooDelivery(): FdoDeliverooSettings {
80
88
  }
81
89
  }
82
90
 
91
+ function initTngDelivery(): FdoTngSettings {
92
+ return {
93
+ enable: false,
94
+ partnerMerchantId: '',
95
+ autoAccept: true,
96
+ autoCloseBill: false,
97
+ printReceiptAfterClose: true,
98
+ canRemark: true
99
+ }
100
+ }
101
+
83
102
  function initGoFoodDelivery(): FdoGoFoodSettings {
84
103
  return {
85
104
  enable: false,
@@ -96,9 +115,9 @@ function initExternalDelivery(): FdoExternalSetting {
96
115
  autoAccept: true,
97
116
  autoSend: true,
98
117
  autoCloseBill: false,
99
- printReceiptAfterClose: false,
118
+ printReceiptAfterClose: false
100
119
  },
101
- platform: 'ZUS',
120
+ platform: 'ZUS'
102
121
  }
103
122
  }
104
123
 
@@ -107,8 +126,10 @@ export default {
107
126
  initFeedmeExpress,
108
127
  initFoodpandaDelivery,
109
128
  initGrabfoodDelivery,
129
+ initLinemanDelivery,
110
130
  initShopeefoodDelivery,
111
131
  initDeliverooDelivery,
132
+ initTngDelivery,
112
133
  initGoFoodDelivery,
113
134
  initExternalDelivery
114
135
  }