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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/dist/{KioskDevicesView-CMKNjgWx.js → KioskDevicesView-Qv-xd_kZ.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-B1sNvlUC.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-CCF1mKni.js} +2 -2
  4. package/dist/KioskSettingView-CvvrK6Bv.js +643 -0
  5. package/dist/{KioskView-U-Wg8oMC.js → KioskView-CppTVBv-.js} +117 -117
  6. package/dist/OrderSettingsView-C38N61dM.js +36564 -0
  7. package/dist/{app-CFfgPAd8.js → app-Bss1GkKY.js} +392 -228
  8. package/dist/app.js +1 -1
  9. package/dist/{dayjs.min-CuRr-wlf.js → dayjs.min-DZfxGUk4.js} +1 -1
  10. package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
  11. package/dist/frontend/mf-order/src/app.d.ts +164 -0
  12. package/dist/frontend/mf-order/src/main.d.ts +164 -0
  13. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -0
  14. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +1 -1
  15. package/dist/frontend/mf-order/src/views/kiosk/settings/KioskPaymentTypeSection.vue.d.ts +13 -3
  16. package/dist/frontend/mf-order/src/views/order-settings/delivery/integrated-delivery/ExternalSetting.vue.d.ts +12 -4
  17. package/dist/frontend/mf-order/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue.d.ts +4 -4
  18. package/dist/frontend/mf-order/src/views/order-settings/dine-in/PaymentType.vue.d.ts +38 -4
  19. package/dist/frontend/mf-order/src/views/order-settings/pickup/PaymentSidesheet.vue.d.ts +1 -0
  20. package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
  21. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomSelect.vue.d.ts +15 -0
  22. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
  23. package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
  24. package/dist/{index-Bj0bCGTm.js → index-B6AGCsrw.js} +3 -3
  25. package/dist/index-BpKR-Cxd.js +19757 -0
  26. package/dist/{menu.dto-DAh1J2ES.js → menu.dto-C_B3M2fs.js} +7390 -7134
  27. package/dist/package/entity/incoming-order/incoming-order.do.d.ts +22443 -3
  28. package/dist/package/entity/incoming-order/incoming-order.dto.d.ts +3 -3
  29. package/dist/package/entity/incoming-order/incoming-order.enum.d.ts +1 -1
  30. package/dist/package/entity/index.d.ts +6 -0
  31. package/dist/package/entity/marketing/marketing.dto.d.ts +1 -1
  32. package/dist/package/entity/order/dine-in/qr.dto.d.ts +38 -0
  33. package/dist/package/entity/order/order.do.d.ts +6358 -2
  34. package/dist/package/entity/order/order.dto.d.ts +22 -0
  35. package/dist/package/entity/order-platform/deliveroo/deliveroo-dto.d.ts +3 -0
  36. package/dist/package/entity/order-platform/deliveroo/deliveroo-setting.do.d.ts +3 -0
  37. package/dist/package/entity/order-platform/external/order/external-order.do.d.ts +12 -12
  38. package/dist/package/entity/order-platform/external/order/external-order.dto.d.ts +32 -32
  39. package/dist/package/entity/order-platform/external/setting/external-setting.do.d.ts +21 -3
  40. package/dist/package/entity/order-platform/external/setting/external-setting.dto.d.ts +12 -2
  41. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.do.d.ts +3 -0
  42. package/dist/package/entity/order-platform/foodpanda/foodpanda-settings.dto.d.ts +3 -0
  43. package/dist/package/entity/order-platform/grabfood/grabfood-edit-order.do.d.ts +9 -1
  44. package/dist/package/entity/order-platform/grabfood/grabfood-settings.do.d.ts +2 -2
  45. package/dist/package/entity/order-platform/grabfood/grabfood.dto.d.ts +3 -3
  46. package/dist/package/entity/order-platform/order-platform.dto.d.ts +2 -2
  47. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.do.d.ts +3 -0
  48. package/dist/package/entity/order-platform/shopeefood/shopeefood-settings.dto.d.ts +3 -0
  49. package/dist/package/entity/order-setting/order-setting.do.d.ts +864 -0
  50. package/dist/package/entity/order-setting/order-setting.dto.d.ts +6 -0
  51. package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
  52. package/dist/package/entity/queue/queue.do.d.ts +3 -8
  53. package/dist/package/entity/queue/queue.dto.d.ts +10 -0
  54. package/dist/package/entity/reservation/reservation.do.d.ts +105 -0
  55. package/dist/package/entity/reservation/reservation.dto.d.ts +335 -0
  56. package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
  57. package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
  58. package/dist/style.css +1 -0
  59. package/package.json +1 -1
  60. package/src/api/reservation/index.ts +28 -0
  61. package/src/assets/images/not-found.png +0 -0
  62. package/src/locales/en-US.json +56 -0
  63. package/src/locales/th-TH.json +54 -0
  64. package/src/locales/zh-CN.json +54 -0
  65. package/src/views/kiosk/KioskSummary.vue +3 -0
  66. package/src/views/kiosk/settings/KioskPaymentTypeSection.vue +99 -211
  67. package/src/views/kiosk/settings/KioskSettingView.vue +43 -25
  68. package/src/views/order-settings/OrderSettingsView.vue +6 -1
  69. package/src/views/order-settings/dine-in/DineInSetting.vue +1 -0
  70. package/src/views/order-settings/dine-in/OfflinePaymentTypeDialog.vue +2 -3
  71. package/src/views/order-settings/dine-in/PaymentType.vue +151 -43
  72. package/src/views/order-settings/pickup/PaymentSidesheet.vue +33 -172
  73. package/src/views/order-settings/pickup/PickUpSettingDialogContent.vue +1 -0
  74. package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
  75. package/src/views/order-settings/reservation/CustomSelect.vue +99 -0
  76. package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
  77. package/src/views/order-settings/reservation/ReservationSetting.vue +1555 -0
  78. package/tsconfig.app.json +8 -6
  79. package/dist/KioskSettingView-BE_pMA-i.js +0 -720
  80. package/dist/OrderSettingsView-BWzaITT6.js +0 -51916
  81. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +0 -1
  82. package/dist/index-BXsnV_eO.js +0 -150
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-order-setting",
3
- "version": "0.0.54",
3
+ "version": "0.0.56-dev.2",
4
4
  "type": "module",
5
5
  "module": "./dist/app.js",
6
6
  "license": "UNLICENSED",
@@ -0,0 +1,28 @@
1
+ import { baseClientInstance, getData } from '@/api'
2
+ import { FdoOrderReservationSettingsV2 } from '@entity'
3
+
4
+ // const baseClientInstance = () =>
5
+ // _baseClientInstance(undefined, 'portal', {
6
+ // url: 'http://localhost:3000/portal'
7
+ // })
8
+
9
+ async function getReservationSetting(restaurantId: string): Promise<FdoOrderReservationSettingsV2> {
10
+ const result = await baseClientInstance().get(`/reservation/restaurant/${restaurantId}/setting`)
11
+ return getData<FdoOrderReservationSettingsV2>(result)
12
+ }
13
+
14
+ async function updateReservationSetting(
15
+ restaurantId: string,
16
+ payload: FdoOrderReservationSettingsV2
17
+ ): Promise<FdoOrderReservationSettingsV2> {
18
+ const result = await baseClientInstance().put(
19
+ `/reservation/restaurant/${restaurantId}/setting`,
20
+ payload
21
+ )
22
+ return getData<FdoOrderReservationSettingsV2>(result)
23
+ }
24
+
25
+ export const ReservationApi = {
26
+ getReservationSetting,
27
+ updateReservationSetting
28
+ }
Binary file
@@ -246,6 +246,62 @@
246
246
  "current": "Current",
247
247
  "paxMin": "Pax Min",
248
248
  "paxMax": "Pax Max",
249
+ "reservation": "Reservation",
250
+ "reservationStatus": "Reservation Status",
251
+ "reservationSettings": "Reservation Settings",
252
+ "reservationRanges": "Reservation Ranges",
253
+ "reservationAvailability": "Reservation Availability",
254
+ "addRange": "Add Range",
255
+ "range": "Range",
256
+ "rangeName": "Range Name",
257
+ "priority": "Priority",
258
+ "priorityDescription": "Higher number = higher priority when matching slots",
259
+ "capacity": "Capacity",
260
+ "capacityDescription": "Maximum concurrent reservations for this range",
261
+ "minPax": "Min Pax",
262
+ "maxPax": "Max Pax",
263
+ "slotInterval": "Slot Interval",
264
+ "slotIntervalDescription": "Time between each available booking slot (e.g., 30 mins)",
265
+ "bookingDuration": "Booking Duration",
266
+ "bookingDurationDescription": "Duration of each reservation (e.g., 60 mins)",
267
+ "minLeadDays": "Min Lead Days",
268
+ "minLeadDaysDescription": "Minimum days in advance customers must book (0 = same day)",
269
+ "maxLeadDays": "Max Lead Days",
270
+ "maxLeadDaysDescription": "Maximum days in advance customers can book",
271
+ "operatingWindows": "Operating Windows",
272
+ "addWindow": "Add Window",
273
+ "startTime": "Start Time",
274
+ "endTime": "End Time",
275
+ "customPresetRemarks": "Custom Preset Remarks",
276
+ "addRemark": "Add Remark",
277
+ "noRangesConfigured": "No reservation ranges configured. Click 'Add Range' to get started.",
278
+ "addFirstRange": "Add your first reservation range to get started",
279
+ "globalSettings": "Global Settings",
280
+ "paxRange": "Pax Range",
281
+ "noOperatingHours": "No operating hours",
282
+ "saveAllChanges": "Save All Changes",
283
+ "confirmDeleteRange": "Are you sure you want to delete {name}?",
284
+ "settingUpdated": "Settings updated successfully",
285
+ "newReservationRange": "New Reservation Range",
286
+ "basicInformation": "Basic Information",
287
+ "guestRequirements": "Guest Requirements",
288
+ "bookingConfiguration": "Booking Configuration",
289
+ "rangeNamePlaceholder": "e.g., VIP Room, Main Hall",
290
+ "presetRemarkPlaceholder": "e.g., Window seat, Quiet area",
291
+ "saveRange": "Save Range",
292
+ "draftHoldTimeMinutes": "Draft Hold Time (Minutes)",
293
+ "draftHoldTimeDescription": "How long to hold a draft reservation before it expires",
294
+ "posCanOverbook": "POS Can Overbook",
295
+ "posCanOverbookDescription": "Allow POS to create reservations even when capacity is full",
296
+ "notificationSettings": "Notification Settings",
297
+ "smsEnabled": "Enable SMS Notifications",
298
+ "smsEnabledDescription": "Send SMS notifications to customers for reservation updates",
299
+ "emailEnabled": "Enable Email Notifications",
300
+ "emailEnabledDescription": "Send email notifications to customers for reservation updates",
301
+ "notifyOnConfirm": "Notify on Confirmation",
302
+ "notifyOnConfirmDescription": "Send notifications when a reservation is confirmed",
303
+ "notifyOnCancel": "Notify on Cancellation",
304
+ "notifyOnCancelDescription": "Send notifications when a reservation is cancelled",
249
305
  "qrPay": "QR Pay",
250
306
  "terminalScanPay": "Terminal Scan Pay",
251
307
  "terminalQrPay": "Terminal QR Pay",
@@ -243,6 +243,60 @@
243
243
  "current": "ปัจจุบัน",
244
244
  "paxMin": "จำนวนผู้โดยสารขั้นต่ำ",
245
245
  "paxMax": "จำนวนผู้โดยสารสูงสุด",
246
+ "reservation": "การจอง",
247
+ "reservationSettings": "การตั้งค่าการจอง",
248
+ "reservationRanges": "ช่วงการจอง",
249
+ "addRange": "เพิ่มช่วง",
250
+ "range": "ช่วง",
251
+ "rangeName": "ชื่อช่วง",
252
+ "priority": "ลำดับความสำคัญ",
253
+ "priorityDescription": "ตัวเลขที่สูงกว่า = ลำดับความสำคัญสูงกว่าเมื่อจับคู่ช่วงเวลา",
254
+ "capacity": "ความจุ",
255
+ "capacityDescription": "จำนวนการจองพร้อมกันสูงสุดสำหรับช่วงนี้",
256
+ "minPax": "จำนวนผู้โดยสารขั้นต่ำ",
257
+ "maxPax": "จำนวนผู้โดยสารสูงสุด",
258
+ "slotInterval": "ช่วงเวลา",
259
+ "slotIntervalDescription": "เวลาระหว่างช่วงการจองที่ว่าง (เช่น 30 นาที)",
260
+ "bookingDuration": "ระยะเวลาการจอง",
261
+ "bookingDurationDescription": "ระยะเวลาของการจองแต่ละครั้ง (เช่น 60 นาที)",
262
+ "minLeadDays": "จำนวนวันล่วงหน้าขั้นต่ำ",
263
+ "minLeadDaysDescription": "จำนวนวันขั้นต่ำที่ลูกค้าต้องจองล่วงหน้า (0 = วันเดียวกัน)",
264
+ "maxLeadDays": "จำนวนวันล่วงหน้าสูงสุด",
265
+ "maxLeadDaysDescription": "จำนวนวันสูงสุดที่ลูกค้าสามารถจองล่วงหน้าได้",
266
+ "operatingWindows": "ช่วงเวลาทำการ",
267
+ "addWindow": "เพิ่มช่วงเวลา",
268
+ "startTime": "เวลาเริ่มต้น",
269
+ "endTime": "เวลาสิ้นสุด",
270
+ "customPresetRemarks": "หมายเหตุที่กำหนดไว้ล่วงหน้า",
271
+ "addRemark": "เพิ่มหมายเหตุ",
272
+ "noRangesConfigured": "ยังไม่มีการกำหนดช่วงการจอง คลิก 'เพิ่มช่วง' เพื่อเริ่มต้น",
273
+ "addFirstRange": "เพิ่มช่วงการจองแรกของคุณเพื่อเริ่มต้น",
274
+ "globalSettings": "การตั้งค่าทั่วไป",
275
+ "paxRange": "ช่วงจำนวนผู้โดยสาร",
276
+ "noOperatingHours": "ไม่มีเวลาทำการ",
277
+ "saveAllChanges": "บันทึกการเปลี่ยนแปลงทั้งหมด",
278
+ "confirmDeleteRange": "คุณแน่ใจหรือไม่ว่าต้องการลบ {name}?",
279
+ "settingUpdated": "อัปเดตการตั้งค่าสำเร็จ",
280
+ "newReservationRange": "ช่วงการจองใหม่",
281
+ "basicInformation": "ข้อมูลพื้นฐาน",
282
+ "guestRequirements": "ความต้องการของแขก",
283
+ "bookingConfiguration": "การกำหนดค่าการจอง",
284
+ "rangeNamePlaceholder": "เช่น ห้อง VIP, ห้องโถง",
285
+ "presetRemarkPlaceholder": "เช่น ที่นั่งริมหน้าต่าง, พื้นที่เงียบ",
286
+ "saveRange": "บันทึกช่วง",
287
+ "draftHoldTimeMinutes": "เวลาเก็บร่าง (นาที)",
288
+ "draftHoldTimeDescription": "ระยะเวลาในการเก็บการจองแบบร่างก่อนที่จะหมดอายุ",
289
+ "posCanOverbook": "POS สามารถจองเกินได้",
290
+ "posCanOverbookDescription": "อนุญาตให้ POS สร้างการจองแม้ว่าความจุเต็มแล้ว",
291
+ "notificationSettings": "การตั้งค่าการแจ้งเตือน",
292
+ "smsEnabled": "เปิดใช้งานการแจ้งเตือนผ่าน SMS",
293
+ "smsEnabledDescription": "ส่งการแจ้งเตือนผ่าน SMS ให้กับลูกค้าสำหรับการอัพเดทการจอง",
294
+ "emailEnabled": "เปิดใช้งานการแจ้งเตือนผ่านอีเมล",
295
+ "emailEnabledDescription": "ส่งการแจ้งเตือนผ่านอีเมลให้กับลูกค้าสำหรับการอัพเดทการจอง",
296
+ "notifyOnConfirm": "แจ้งเตือนเมื่อยืนยัน",
297
+ "notifyOnConfirmDescription": "ส่งการแจ้งเตือนเมื่อการจองได้รับการยืนยัน",
298
+ "notifyOnCancel": "แจ้งเตือนเมื่อยกเลิก",
299
+ "notifyOnCancelDescription": "ส่งการแจ้งเตือนเมื่อการจองถูกยกเลิก",
246
300
  "qrPay": "ชำระเงินด้วย QR",
247
301
  "terminalScanPay": "ชำระเงินด้วยการสแกนเทอร์มินัล",
248
302
  "terminalQrPay": "ชำระเงินด้วย QR เทอร์มินัล",
@@ -247,6 +247,60 @@
247
247
  "current": "当前",
248
248
  "paxMin": "最少人数",
249
249
  "paxMax": "最多人数",
250
+ "reservation": "预订",
251
+ "reservationSettings": "预订设置",
252
+ "reservationRanges": "预订范围",
253
+ "addRange": "添加范围",
254
+ "range": "范围",
255
+ "rangeName": "范围名称",
256
+ "priority": "优先级",
257
+ "priorityDescription": "数字越大,匹配时段时优先级越高",
258
+ "capacity": "容量",
259
+ "capacityDescription": "此范围的最大并发预订数",
260
+ "minPax": "最少人数",
261
+ "maxPax": "最多人数",
262
+ "slotInterval": "时段间隔",
263
+ "slotIntervalDescription": "每个可预订时段之间的时间(例如30分钟)",
264
+ "bookingDuration": "预订时长",
265
+ "bookingDurationDescription": "每次预订的持续时间(例如60分钟)",
266
+ "minLeadDays": "最少提前天数",
267
+ "minLeadDaysDescription": "顾客必须提前预订的最少天数(0 = 当天)",
268
+ "maxLeadDays": "最多提前天数",
269
+ "maxLeadDaysDescription": "顾客可以提前预订的最多天数",
270
+ "operatingWindows": "营业时段",
271
+ "addWindow": "添加时段",
272
+ "startTime": "开始时间",
273
+ "endTime": "结束时间",
274
+ "customPresetRemarks": "自定义预设备注",
275
+ "addRemark": "添加备注",
276
+ "noRangesConfigured": "未配置预订范围。点击\"添加范围\"开始",
277
+ "addFirstRange": "添加您的第一个预订范围以开始",
278
+ "globalSettings": "全局设置",
279
+ "paxRange": "人数范围",
280
+ "noOperatingHours": "无营业时间",
281
+ "saveAllChanges": "保存所有更改",
282
+ "confirmDeleteRange": "您确定要删除{name}吗?",
283
+ "settingUpdated": "设置已成功更新",
284
+ "newReservationRange": "新预订范围",
285
+ "basicInformation": "基本信息",
286
+ "guestRequirements": "客人要求",
287
+ "bookingConfiguration": "预订配置",
288
+ "rangeNamePlaceholder": "例如:VIP包厢、大厅",
289
+ "presetRemarkPlaceholder": "例如:靠窗座位、安静区域",
290
+ "saveRange": "保存范围",
291
+ "draftHoldTimeMinutes": "草稿保留时间(分钟)",
292
+ "draftHoldTimeDescription": "在草稿预订过期前保留的时间",
293
+ "posCanOverbook": "POS可以超额预订",
294
+ "posCanOverbookDescription": "允许POS在容量已满时创建预订",
295
+ "notificationSettings": "通知设置",
296
+ "smsEnabled": "启用短信通知",
297
+ "smsEnabledDescription": "向客户发送预订更新的短信通知",
298
+ "emailEnabled": "启用电子邮件通知",
299
+ "emailEnabledDescription": "向客户发送预订更新的电子邮件通知",
300
+ "notifyOnConfirm": "确认时通知",
301
+ "notifyOnConfirmDescription": "当预订被确认时发送通知",
302
+ "notifyOnCancel": "取消时通知",
303
+ "notifyOnCancelDescription": "当预订被取消时发送通知",
250
304
  "qrPay": "二维码支付",
251
305
  "terminalScanPay": "终端扫描支付",
252
306
  "terminalQrPay": "终端二维码支付",
@@ -98,6 +98,9 @@ const acceptedPaymentStatus = computed<string>(() => {
98
98
  if (type === F_ORDER_PAYMENT_TYPE.enum.ePayment) {
99
99
  acceptedPayment.push(t('order.ePayment'));
100
100
  }
101
+ if (type == F_ORDER_PAYMENT_TYPE.enum.credit){
102
+ acceptedPayment.push(t('order.credit'));
103
+ }
101
104
  });
102
105
 
103
106
  if (
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
- import { FdoOfflinePaymentMethod } from '@feedmepos/core/entity'
2
+ import { FdoOfflinePaymentMethod, F_ORDER_PAYMENT_TYPE as _F_ORDER_PAYMENT_TYPE } from '@feedmepos/core/entity'
3
3
  import { F_ORDER_PAYMENT_TYPE, F_ORDER_E_PAYMENT_TYPE, FdoEPaymentMethod } from '@entity'
4
4
  import { type PropType, computed, onMounted, ref } from 'vue'
5
- import OfflinePaymentTypeDialog from '../../order-settings/dine-in/OfflinePaymentTypeDialog.vue'
5
+ import PaymentType from '../../order-settings/dine-in/PaymentType.vue'
6
6
  import { useI18n } from '@feedmepos/mf-common'
7
7
 
8
8
  const { t } = useI18n()
@@ -20,6 +20,10 @@ const props = defineProps({
20
20
  type: [Boolean, String],
21
21
  required: true
22
22
  },
23
+ allowCredit: {
24
+ type: [Boolean, String],
25
+ default: false
26
+ },
23
27
  ePaymentTypes: {
24
28
  type: Object as PropType<FdoEPaymentMethod>,
25
29
  required: true
@@ -32,44 +36,18 @@ const emits = defineEmits<{
32
36
  (event: 'update:ePaymentTypes', v: FdoEPaymentMethod): void
33
37
  }>()
34
38
 
35
- async function deleteOfflinePayment(index: number) {
36
- emits(
37
- 'update:offlinePaymentTypes',
38
- props.offlinePaymentTypes.filter((_, i) => i !== index)
39
- )
40
- }
41
-
42
39
  const allowEPayment = computed(() => {
43
40
  const paymentTypes = props.paymentTypes || []
44
41
  return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)
45
42
  })
46
43
 
47
- const allowOfflinePayment = computed(() => {
48
- const paymentTypes = props.paymentTypes || []
49
- const offlinePaymentTypes = props.offlinePaymentTypes || []
50
-
51
- return paymentTypes.includes(F_ORDER_PAYMENT_TYPE.enum.cash) || offlinePaymentTypes.length > 0
52
- })
53
-
54
- const parentCheckbox = ref(false)
55
- const paymentCheckboxVal = ref<string[]>([])
56
44
  const cardPaymentRadioVal = ref<string>()
57
45
  const eWalletPaymentCheckboxVal = ref<string[]>([])
58
46
  const useCard = ref(false)
59
47
  const useTerminal = ref(false)
60
48
  const useEwallet = ref(false)
61
49
 
62
- const checkboxChildren = [
63
- { label: t('order.offlinePayment'), value: 'offline' },
64
- { label: t('order.ePayment'), value: 'e-payment' }
65
- ]
66
-
67
50
  const initializeCheckboxes = () => {
68
- const initialValues: string[] = []
69
- if (allowOfflinePayment.value) initialValues.push('offline')
70
- if (allowEPayment.value) initialValues.push('e-payment')
71
- paymentCheckboxVal.value = initialValues
72
- parentCheckbox.value = initialValues.length === checkboxChildren.length
73
51
  if (!(Object.keys(props.ePaymentTypes).length === 0)) {
74
52
  if (props.ePaymentTypes.terminal) {
75
53
  useTerminal.value = true
@@ -97,54 +75,6 @@ const initializeCheckboxes = () => {
97
75
 
98
76
  initializeCheckboxes()
99
77
 
100
- const handleParentUpdate = (ev: boolean) => {
101
- paymentCheckboxVal.value = ev ? checkboxChildren.map((item) => item.value) : []
102
- parentCheckbox.value = ev
103
-
104
- const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
105
- const updatedOfflinePaymentTypes = ev ? props.offlinePaymentTypes || [] : []
106
-
107
- if (paymentCheckboxVal.value.includes('e-payment')) {
108
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.ePayment)
109
- useCard.value = true
110
- useEwallet.value = true
111
- }
112
- if (paymentCheckboxVal.value.includes('offline')) {
113
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
114
- }
115
-
116
- emits('update:paymentTypes', updatedPaymentTypes)
117
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
118
- updateCardSwitch(useCard.value)
119
- updateECardSwitch(useEwallet.value)
120
- }
121
-
122
- const handleChildUpdate = (ev: string[]) => {
123
- const currentPaymentCheckboxVal = paymentCheckboxVal.value
124
- paymentCheckboxVal.value = ev
125
- parentCheckbox.value = ev.length === checkboxChildren.length
126
-
127
- const updatedPaymentTypes: F_ORDER_PAYMENT_TYPE[] = []
128
- const updatedOfflinePaymentTypes = ev.includes('offline') ? props.offlinePaymentTypes || [] : []
129
-
130
- if (ev.includes('e-payment')) {
131
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.ePayment)
132
- }
133
- if (ev.includes('offline')) {
134
- updatedPaymentTypes.push(F_ORDER_PAYMENT_TYPE.enum.cash)
135
- }
136
-
137
- if (!currentPaymentCheckboxVal.includes('e-payment')) {
138
- useCard.value = true
139
- useEwallet.value = true
140
- updateCardSwitch(useCard.value)
141
- updateECardSwitch(useEwallet.value)
142
- }
143
-
144
- emits('update:paymentTypes', updatedPaymentTypes)
145
- emits('update:offlinePaymentTypes', updatedOfflinePaymentTypes)
146
- }
147
-
148
78
  const handleEPaymentCardUpdate = (ev: string) => {
149
79
  const ePaymentObj = {
150
80
  terminal: false,
@@ -158,7 +88,7 @@ const handleEPaymentCardUpdate = (ev: string) => {
158
88
  }
159
89
  } as FdoEPaymentMethod
160
90
 
161
- if (paymentCheckboxVal.value.includes('e-payment')) {
91
+ if (allowEPayment.value) { // Check computed property instead of local state
162
92
  if (ev == F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL) {
163
93
  ePaymentObj.card.terminal = true
164
94
  }
@@ -200,7 +130,7 @@ const handleEPaymentEWalletUpdate = () => {
200
130
  }
201
131
  } as FdoEPaymentMethod
202
132
 
203
- if (paymentCheckboxVal.value.includes('e-payment')) {
133
+ if (allowEPayment.value) {
204
134
  if (cardPaymentRadioVal.value) {
205
135
  if (cardPaymentRadioVal.value === F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL) {
206
136
  ePaymentObj.card.terminal = true
@@ -254,145 +184,103 @@ const updateECardSwitch = (enabled: boolean) => {
254
184
  handleEPaymentEWalletUpdate()
255
185
  }
256
186
 
187
+ const handlePaymentTypesUpdate = (v: F_ORDER_PAYMENT_TYPE[]) => {
188
+ emits('update:paymentTypes', v)
189
+ if (!v.includes(F_ORDER_PAYMENT_TYPE.enum.ePayment)) {
190
+ useCard.value = false
191
+ useEwallet.value = false
192
+ updateCardSwitch(false)
193
+ updateECardSwitch(false)
194
+ }
195
+ }
196
+
257
197
  onMounted(() => {
258
198
  initializeCheckboxes()
259
199
  })
260
200
  </script>
261
201
  <template>
262
- <FmCheckbox
263
- value=""
264
- :model-value="parentCheckbox"
265
- :label="t('order.all')"
266
- :indeterminate="
267
- paymentCheckboxVal.length > 0 && paymentCheckboxVal.length < checkboxChildren.length
268
- "
269
- @update:model-value="handleParentUpdate"
270
- />
271
-
272
- <div class="flex flex-row items-center">
273
- <FmCheckbox
274
- v-model="paymentCheckboxVal"
275
- :label="checkboxChildren[0].label"
276
- :value="checkboxChildren[0].value"
277
- @update:model-value="handleChildUpdate"
278
- />
279
- </div>
280
- <div
281
- v-if="
282
- paymentCheckboxVal.includes(checkboxChildren[0].value) && offlinePaymentTypes?.length === 0
283
- "
284
- >
285
- <OfflinePaymentTypeDialog
286
- @update:offline-payment-types="
287
- (v: FdoOfflinePaymentMethod[]) => emits('update:offlinePaymentTypes', v)
288
- "
289
- />
290
- </div>
291
-
292
- <div v-if="paymentCheckboxVal.includes('offline')" class="ml-7">
293
- <div v-if="offlinePaymentTypes?.length === 0">
294
- <FmCard variant="outlined">
295
- <FmCardSection>{{ t('order.payAtCounter') }}</FmCardSection>
296
- </FmCard>
297
- </div>
298
- <p v-for="(type, i) in offlinePaymentTypes" :key="i">
299
- <FmCard variant="outlined">
300
- <FmCardSection class="flex items-center justify-between">
301
- <div>
302
- <span class="font-bold">{{ type.name }}</span>
303
- <br />
304
- <span>{{ type.instruction }}</span>
305
- </div>
306
- <div v-for="(payment, index) in offlinePaymentTypes" :key="index">
307
- <FmButton
308
- append-icon="delete"
309
- variant="tertiary"
310
- @click="deleteOfflinePayment(index)"
202
+ <PaymentType
203
+ :payment-types="paymentTypes as unknown as _F_ORDER_PAYMENT_TYPE[]"
204
+ :offline-payment-types="offlinePaymentTypes"
205
+ :allow-e-payment="props.allowEPayment"
206
+ :allow-credit="props.allowCredit"
207
+ @update:payment-types="handlePaymentTypesUpdate"
208
+ @update:offline-payment-types="(v) => emits('update:offlinePaymentTypes', v || [])"
209
+ >
210
+ <template #e-payment-content>
211
+ <FmCard variant="outlined">
212
+ <FmCardSection>
213
+ <FmSwitch
214
+ :label="t('order.bankCard')"
215
+ :sublabel="t('order.cardPaymentDescription')"
216
+ label-placement="right"
217
+ v-model="useCard"
218
+ @update:modelValue="updateCardSwitch"
311
219
  />
312
- </div>
313
- </FmCardSection>
314
- </FmCard>
315
- </p>
316
- </div>
317
- <FmCheckbox
318
- v-model="paymentCheckboxVal"
319
- :label="checkboxChildren[1].label"
320
- :value="checkboxChildren[1].value"
321
- @update:model-value="handleChildUpdate"
322
- />
323
- <div v-if="paymentCheckboxVal.includes(checkboxChildren[1].value)" class="ml-7">
324
- <FmCard variant="outlined">
325
- <FmCardSection>
326
- <FmSwitch
327
- :label="t('order.bankCard')"
328
- :sublabel="t('order.cardPaymentDescription')"
329
- label-placement="right"
330
- v-model="useCard"
331
- @update:modelValue="updateCardSwitch"
332
- />
333
- <br />
334
- <div v-show="useCard" class="ml-7">
335
- <FmRadioGroup
336
- v-model="cardPaymentRadioVal"
337
- @update:model-value="handleEPaymentCardUpdate"
338
- inline
339
- >
340
- <FmRadio :label="t('order.terminal')" :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL" />
341
- <FmRadio :label="t('order.nfc')" :value="F_ORDER_E_PAYMENT_TYPE.enum.NFC" />
342
- </FmRadioGroup>
343
- </div>
344
- </FmCardSection>
345
- </FmCard>
346
- <FmCard variant="outlined" class="mt-2">
347
- <FmCardSection>
348
- <FmSwitch
349
- :label="t('order.terminal')"
350
- :sublabel="t('order.terminalPaymentDescription')"
351
- label-placement="right"
352
- v-model="useTerminal"
353
- @update:modelValue="updateCardSwitch"
354
- />
355
- </FmCardSection>
356
- </FmCard>
357
- <FmCard variant="outlined" class="mt-2">
358
- <FmCardSection>
359
- <FmSwitch
360
- :label="t('order.eWallet')"
361
- :sublabel="t('order.eWalletDescription')"
362
- label-placement="right"
363
- v-model="useEwallet"
364
- @update:modelValue="updateECardSwitch"
365
- />
366
- <br />
367
- <div v-show="useEwallet" class="ml-7">
368
- <div class="flex flex-row gap-9">
369
- <FmCheckbox
370
- v-model="eWalletPaymentCheckboxVal"
371
- :label="t('order.qrPay')"
372
- :value="F_ORDER_E_PAYMENT_TYPE.enum.QRPAY"
373
- @update:model-value="handleEPaymentEWalletUpdate"
374
- />
375
- <FmCheckbox
376
- v-model="eWalletPaymentCheckboxVal"
377
- :label="t('order.scanPay')"
378
- :value="F_ORDER_E_PAYMENT_TYPE.enum.SCANPAY"
379
- @update:model-value="handleEPaymentEWalletUpdate"
380
- />
381
- <FmCheckbox
382
- v-model="eWalletPaymentCheckboxVal"
383
- :label="t('order.terminalScanPay')"
384
- :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_SCAN_PAY"
385
- @update:model-value="handleEPaymentEWalletUpdate"
220
+ <br />
221
+ <div v-show="useCard" class="ml-7">
222
+ <FmRadioGroup
223
+ v-model="cardPaymentRadioVal"
224
+ @update:model-value="handleEPaymentCardUpdate"
225
+ inline
226
+ >
227
+ <FmRadio :label="t('order.terminal')" :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL" />
228
+ <FmRadio :label="t('order.nfc')" :value="F_ORDER_E_PAYMENT_TYPE.enum.NFC" />
229
+ </FmRadioGroup>
230
+ </div>
231
+ </FmCardSection>
232
+ </FmCard>
233
+ <FmCard variant="outlined" class="mt-2">
234
+ <FmCardSection>
235
+ <FmSwitch
236
+ :label="t('order.terminal')"
237
+ :sublabel="t('order.terminalPaymentDescription')"
238
+ label-placement="right"
239
+ v-model="useTerminal"
240
+ @update:modelValue="handleEPaymentEWalletUpdate"
386
241
  />
387
- <FmCheckbox
388
- v-model="eWalletPaymentCheckboxVal"
389
- :label="t('order.terminalQrPay')"
390
- :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_QR_PAY"
391
- @update:model-value="handleEPaymentEWalletUpdate"
242
+ </FmCardSection>
243
+ </FmCard>
244
+ <FmCard variant="outlined" class="mt-2">
245
+ <FmCardSection>
246
+ <FmSwitch
247
+ :label="t('order.eWallet')"
248
+ :sublabel="t('order.eWalletDescription')"
249
+ label-placement="right"
250
+ v-model="useEwallet"
251
+ @update:modelValue="updateECardSwitch"
392
252
  />
393
- </div>
394
- </div>
395
- </FmCardSection>
396
- </FmCard>
397
- </div>
253
+ <br />
254
+ <div v-show="useEwallet" class="ml-7">
255
+ <div class="flex flex-row gap-9">
256
+ <FmCheckbox
257
+ v-model="eWalletPaymentCheckboxVal"
258
+ :label="t('order.qrPay')"
259
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.QRPAY"
260
+ @update:model-value="handleEPaymentEWalletUpdate"
261
+ />
262
+ <FmCheckbox
263
+ v-model="eWalletPaymentCheckboxVal"
264
+ :label="t('order.scanPay')"
265
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.SCANPAY"
266
+ @update:model-value="handleEPaymentEWalletUpdate"
267
+ />
268
+ <FmCheckbox
269
+ v-model="eWalletPaymentCheckboxVal"
270
+ :label="t('order.terminalScanPay')"
271
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_SCAN_PAY"
272
+ @update:model-value="handleEPaymentEWalletUpdate"
273
+ />
274
+ <FmCheckbox
275
+ v-model="eWalletPaymentCheckboxVal"
276
+ :label="t('order.terminalQrPay')"
277
+ :value="F_ORDER_E_PAYMENT_TYPE.enum.TERMINAL_QR_PAY"
278
+ @update:model-value="handleEPaymentEWalletUpdate"
279
+ />
280
+ </div>
281
+ </div>
282
+ </FmCardSection>
283
+ </FmCard>
284
+ </template>
285
+ </PaymentType>
398
286
  </template>