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 b391ffe8..9535437f 100644 --- a/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue +++ b/src/components/displays/department/pos/steps/mobile/elements/PosDepartmentStepMobileButtonNextStep.vue @@ -6,6 +6,7 @@ import { SessionUser } from "@/components/session/token/SessionUser.vue"; import GenericButton from "@/components/viewport/page/templates/generic/graphics/GenericButton.vue"; import ContinueArrow from "@/components/viewport/elements/icons/ContinueArrow.vue"; import { vehicles, metadata, getCustomerId, popups, resetPos, actionButtons } from "../objects/PosDepartmentStepMobileFlow.vue"; +import Swal from "sweetalert2"; const selectCustomerString = `${SessionUser.objects.global.language.select} ${SessionUser.objects.global.language.customer.toLowerCase()}`; const props = defineProps({ @@ -27,20 +28,85 @@ const updateNotes = () => { SessionUser.objects.orders.set.notes(order_id.value, order_notes.value); } +// Helpers: extracted for clarity and reuse +const isNonEmptyString = (val) => typeof val === 'string' && val.trim().length > 0; + +const resolveReferenceFromSources = () => { + // 1) Metadata reference + const metaRef = metadata.getReference?.(); + if (isNonEmptyString(metaRef)) return metaRef.trim(); + + // 2) Local reactive reference field + if (isNonEmptyString(reference.value)) return reference.value.trim(); + + // 3) Vehicle #1 reference (fallback) + const vehicleRef = vehicles.get(1)?.reference; + if (isNonEmptyString(vehicleRef)) return String(vehicleRef).trim(); + + return null; +}; + +const promptForReference = async (initialValue = '') => { + const result = await Swal.fire({ + title: 'Reference Number Required', + text: 'The selected customer requires a reference number to proceed. Please provide a reference number.', + input: 'text', + inputLabel: 'Reference', + inputValue: initialValue, + showCancelButton: true, + confirmButtonText: 'Save', + cancelButtonText: 'Cancel', + preConfirm: (newReference) => { + if (!isNonEmptyString(newReference)) { + Swal.showValidationMessage('Reference cannot be empty'); + } + return newReference; + } + }); + if (result.isConfirmed && isNonEmptyString(result.value)) { + return result.value.trim(); + } + return null; +}; + +// Refactored main function const validateReferenceRequirements = async () => { - // Load customer attributes await loadCustomerAttributes(); - // Check if the customer has the required attributes - const requiresReference = hasAttribute('requiresReferenceNumber'); - if (requiresReference && (!metadata.getReference() || metadata.getReference().length < 1)) { - popups.select('error', { - title: 'Reference Number Required', - message: 'The selected customer requires a reference number to proceed. Please provide a reference number and try again.', - }); + + const customerRequiresReference = hasAttribute('requiresReferenceNumber'); + + // Try to resolve an existing reference from known sources + const resolvedRef = resolveReferenceFromSources(); + if (isNonEmptyString(resolvedRef)) { + // Ensure both local ref and metadata are synchronized + if (reference.value !== resolvedRef) reference.value = resolvedRef; + if (metadata.getReference() !== resolvedRef) metadata.setReference(resolvedRef); + return true; + } + + // If customer does not require a reference, we are good even if none was resolved + if (!customerRequiresReference) { + return true; + } + + // Prompt user for a reference if required and none available + try { + const enteredRef = await promptForReference(reference.value ?? ''); + if (isNonEmptyString(enteredRef)) { + reference.value = enteredRef; + metadata.setReference(enteredRef); + console.warn('New reference set:', enteredRef); + onClick(); // Retry the click action + return true; + } + console.warn('Reference number is required but was not provided. Aborting operation.'); + return false; + } catch (error) { + console.warn('An error occurred while setting the reference number:', error); return false; } - return true; -} +}; + const step1 = () => { /** This function can be used to perform any specific actions for step 1 */ @@ -49,14 +115,21 @@ const step1 = () => { reg_2.value = vehicles.vehicle_2.value?.reg || ""; reg_3.value = vehicles.vehicle_3.value?.reg || ""; // We only need to check if the customer requires reference, if the field is empty. - validateReferenceRequirements().then((isValid: boolean) => { - if (!isValid) { - console.warn('Customer does not have the required attributes to proceed. Aborting step 1.'); - return; - } - }).catch((error: any) => { - console.warn('An error occurred while validating customer attributes gracefully:', error); - }); + if (!isNonEmptyString(reference.value)) { + validateReferenceRequirements().then((isValid) => { + if (!isValid) { + // The requirements were not met, do not proceed. + return; + } + // Proceed with setting reference and notes + finalizeStep1(); + }); + } else { + // Reference is already filled, just finalize step 1 + finalizeStep1(); + } +}; +const finalizeStep1 = () => { if (metadata.getReference() && metadata.getReference().length >= 1) { // If there is no reference, set it to the registration number of vehicle 1 reference.value = metadata.getReference();