diff --git a/src/components/displays/department/pos/steps/mobile/PosDepartmentStepMobile2.vue b/src/components/displays/department/pos/steps/mobile/PosDepartmentStepMobile2.vue index 9ac7d16b..6cc31285 100644 --- a/src/components/displays/department/pos/steps/mobile/PosDepartmentStepMobile2.vue +++ b/src/components/displays/department/pos/steps/mobile/PosDepartmentStepMobile2.vue @@ -307,11 +307,11 @@ const initializeStepTwo = async () => { } const fetchPrimaryItemProduct = () => { - if (!vehicles.vehicle_1.value.type && !transactionItems.primaryItem.value) { + if (!vehicles.vehicle_1.value?.type && !transactionItems.primaryItem.value) { vehicleSelection.value = true; // Force the user to select a product. } else { // Load the product from the type id. - if (!vehicles.vehicle_1.value.type) { + if (!vehicles.vehicle_1.value?.type) { return; // If no vehicle type is set, do not proceed. } // If the primary item is already set and matches the vehicle type, do not fetch again. @@ -630,7 +630,7 @@ const filteredAddons = computed(() => { - + {{ SessionUser.objects.global.language.next }} {{ primaryItem ? primaryItem.name : SessionUser.objects.global.language.next }} diff --git a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue index de0b7a16..1cdedbfa 100644 --- a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue +++ b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue @@ -245,14 +245,50 @@ const step2 = () => { // Set the order bookings id to the metadata if (metadata.getBookingId() && metadata.getBookingId() > 0) { SessionUser.objects.order_bookings.set.order_id(metadata.getBookingId(), order_id.value).then(() => { - popups.select('complete_booking', {}); + // Check if order requires safety seal popup (product id 41 present as item or addon) + try { + const posStr = localStorage.getItem('pos'); + let hasSeal = false; + if (posStr) { + try { + const posData = JSON.parse(posStr); + const primaryItem = posData?.transactionItems?.primaryItem; + const additionalItems = posData?.transactionItems?.additionalItems || []; + const allItems = [primaryItem, ...additionalItems].filter(Boolean); + hasSeal = allItems.some((item: any) => + item?.product?.id === 41 || + (item?.addons && item.addons.some((addon: any) => addon?.product?.id === 41)) + ); + } catch (parseErr) { + console.error('Failed to parse pos data:', parseErr); + } + } + if (!hasSeal) { + metadata.setLoadingState(true); + metadata.setLoadingMessage(t('admin.pos.waiting_for_booking')); + SessionUser.objects.order_bookings.functions.complete(metadata.getBookingId(), null, (response: any) => { + console.log('Auto-completed booking without safety seal prompt (mobile POS - localStorage)'); + completeOrder(); + }); + } else { + popups.select('complete_booking', {}); + awaitBookingCompletion(() => { + completeOrder(); + }); + } + } catch (err) { + console.error('Error checking safety seal via localStorage:', err); + popups.select('complete_booking', {}); + awaitBookingCompletion(() => { + completeOrder(); + }); + } + }).catch((err: any) => { + console.error('Error setting order_id on booking:', err); + errors.value.push(err); + completeOrder(); }); } - // Listen for the booking to be completed - awaitBookingCompletion(() => { - completeOrder(); - }); - return; // Wait for the booking to be completed } else { // The booking has been completed, complete the order completeOrder(); @@ -261,6 +297,7 @@ const step2 = () => { errors.value.push(error); // An error occurred, log it and complete the order anyway console.warn('An error occurred while checking if the booking has been completed:', error); + completeOrder(); }); } else { completeOrder(); @@ -291,6 +328,7 @@ const awaitBookingCompletion = (callback: Function) => { }).catch((error: any) => { errors.value.push(error); console.warn('An error occurred while checking if the booking has been completed:', error); + completeOrder(); }); }, 250) // Check every 250ms (Should be quick enough to catch the popup close event); } diff --git a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobilePopupCompleteBooking.vue b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobilePopupCompleteBooking.vue index f216a045..d17525f1 100644 --- a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobilePopupCompleteBooking.vue +++ b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobilePopupCompleteBooking.vue @@ -33,7 +33,7 @@ const safetySealNumber = ref("");
-