From e74a9986656f2b2705d93cb1201ec6f4add0d7fe Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Mon, 16 Feb 2026 17:17:16 -0500 Subject: [PATCH 1/4] update for availabilityrating matching schedule --- src/layouts/schedule-page/schedule-page.vue | 27 +++++++++++++-- .../service-location/service-location.vue | 34 ++++++------------- .../shop-address/shop-address.vue | 20 +---------- 3 files changed, 35 insertions(+), 46 deletions(-) diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index da3ef43a..68045025 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -17,6 +17,7 @@
0) { + const numberOfDaysNeededToBeHighAvailability = 2; + const availabilityEndDate = new Date(); + availabilityEndDate.setDate(availabilityEndDate.getDate() + 6); + + const datesInAvailabilityRange = newData.initialShopTimeSlotsResponse.days.filter((day) => { + const dayDate = new Date(`${day.date}T00:00:00`); + return dayDate <= availabilityEndDate; + }); + const isGoodAvailability = + datesInAvailabilityRange.filter((x) => x.timeSlots.length > 0).length + >= numberOfDaysNeededToBeHighAvailability; + + this.inShopAvailabilityRating = isGoodAvailability ? 'high' : 'low'; + } else { + this.inShopAvailabilityRating = 'low'; + } + } + }, mounted() { showIssLoadingModal(true); this.mql = window.matchMedia('(min-width: 1200px)'); @@ -453,9 +476,6 @@ export default { }, getAvailableDates, async getDatePickerInitialData(defaultProviderNumber = null) { - this.inShopDatesData = []; - this.mobileDatesData = []; - let todayDateString; const todayDateObject = new Date(); const calendarViewDirection = 'future'; @@ -532,6 +552,7 @@ export default { } } else { this.inShopDatesData = initialData; + this.mobileDatesData = []; } return initialData; diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index cc96f7c2..de47fd87 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -129,7 +129,6 @@ import errorMessages from '@/constants/error-messages'; import { useMainStore } from '@/store'; import showIssLoadingModal from '@/helpers/loading-modal-helper.js'; import { - getAvailabilityRating, getServiceabilityDetails, getZipCodeData, getMobileZipCodeData @@ -160,6 +159,12 @@ export default { }, mixins: [baseFormMixin], emits: ['appointment-type-changed', 'city-updated', 'in-shop-zip-updated', 'mobile-zip-updated', 'provider-changed'], + props: { + schedulingInshopAvailabilityRating: { + type: String, + default: 'high' + } + }, setup() { const mainStore = useMainStore(); return { mainStore }; @@ -307,9 +312,12 @@ export default { this.$emit('mobile-zip-updated', updateMobileZipServiceLocationObj); } }, + schedulingInshopAvailabilityRating(newRating) { + this.availabilityRating = newRating; + }, selectedAppointmentType(newValue, oldValue) { if (this.isInshop && this.selectedProvider && this.availabilityRating === null) { - this.refreshAvailabilityRating(); + // this.refreshAvailabilityRating(); const appointmenTypeServiceLocationObj = { appointmentType: newValue, @@ -342,10 +350,6 @@ export default { refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null }; - if (appointmentIsInshop && newProvider?.providerNumber != null) { - this.refreshAvailabilityRating(); - } - if (newProvider?.providerNumber !== oldProvider?.providerNumber) { this.$emit('provider-changed', returnedProvider); } @@ -444,24 +448,6 @@ export default { this.$emit('in-shop-zip-updated', inShopZipServiceLocationObj); }); }, - refreshAvailabilityRating() { - const startDate = new Date(); - const endDate = new Date(); - endDate.setDate(startDate.getDate() + 6); - const formattedStartDate = startDate.toISOString().split('T')[0]; - const formattedEndDate = endDate.toISOString().split('T')[0]; - - getAvailabilityRating( - formattedStartDate, - formattedEndDate, - AppointmentTypeStrings.IN_SHOP, - this.selectedProvider ? this.selectedProvider.providerNumber : null - ).then((rating) => { - this.availabilityRating = rating; - }).catch(() => { - this.availabilityRating = null; - }); - }, setCtuForMobile(val) { this.zipCodeCtu = val; }, diff --git a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue index f125f41a..4bd7f49a 100644 --- a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue +++ b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue @@ -68,8 +68,7 @@ groupName="chooseShop" textPosition="text-start" isRequired - validationRules="option-required" - :additionalButtonData="additionalButtonData" /> + validationRules="option-required" /> {{ serviceZipPrompt }} @@ -108,7 +107,6 @@ import baseMixin from '@/mixins/base-mixin.js'; import showIssLoadingModal from '@/helpers/loading-modal-helper.js'; import { toTitleCase } from '@/helpers/text-helper.js'; import { markRaw } from 'vue'; -import { getAvailabilityRating } from '@/helpers/service-location-helper'; import { useMainStore } from '@/store'; import widgetFields from '@/constants/cms-widget-fields'; import { dropdownVariants, modalPositions } from '@/constants/component-variants'; @@ -185,22 +183,6 @@ export default { modalName() { return this.modalWidgetName; }, - additionalButtonData() { - const startDate = new Date(); - const endDate = new Date(); - endDate.setDate(startDate.getDate() + 6); - - const formattedStartDate = startDate.toISOString().split('T')[0]; - const formattedEndDate = endDate.toISOString().split('T')[0]; - - return { - displayAvailabilityIndicators: false, - availabilityRatingCallback: getAvailabilityRating, - startDate: formattedStartDate, - endDate: formattedEndDate, - shopAppointmentType: 'InshopOrDropoff' - }; - }, serviceZipPrompt() { return this.getCmsContent(this.modalWidgetName, widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT_2); }, From 309f08961bd25aed25937090f379bbce7cbda692 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Tue, 17 Feb 2026 16:15:58 -0500 Subject: [PATCH 2/4] some updates for schedule add period fetch billTo on provider change (needed for time slots) fix if Adak Alaska on load. --- .../date-picker/date-picker.vue | 2 +- src/layouts/schedule-page/schedule-page.vue | 51 ++++++++++++++++--- .../service-location/service-location.vue | 5 +- src/store/index.js | 19 +++++-- 4 files changed, 64 insertions(+), 13 deletions(-) diff --git a/src/digital-components/date-picker/date-picker.vue b/src/digital-components/date-picker/date-picker.vue index 70519fe4..4a9e78b5 100644 --- a/src/digital-components/date-picker/date-picker.vue +++ b/src/digital-components/date-picker/date-picker.vue @@ -10,7 +10,7 @@ When would you like service?
- Your service will take approximately {{ appointmentEstimate }} + Your service will take approximately {{ appointmentEstimate }}.
{ @@ -276,25 +276,39 @@ export default { // use resultMap to populate layout content. const resultMap = await settleAllPromises(promiseResultMap); + const providersUnderOneHundredMiles = resultMap.providers?.shopProviders?.filter((provider) => provider.distanceMiles <= 100); const serviceLocationData = { defaultMobileZipCode: isMobileAppointment ? storeServiceLocation?.zipCode : '', glassFees: resultMap.glassFees, mobileFeePart: resultMap.mobileFeePart, - providers: resultMap.providers, + providers: { + ...resultMap.providers, + shopProviders: providersUnderOneHundredMiles || [] + }, serviceabilityDetails: resultMap.serviceabilityDetails, zipCodeData: resultMap.zipCodeData }; useMainStore().updateIsSafeliteProvider(true); next(async (vm) => { - const providerToUse = resultMap.providers?.shopProviders + const foundProviderInFullList = resultMap.providers?.shopProviders .find((provider) => provider.providerNumber === storeSelectedProvider?.providerNumber) || resultMap.providers?.shopProviders[0]; + const foundProviderInHundredMiles = providersUnderOneHundredMiles + .find((provider) => provider.providerNumber === storeSelectedProvider?.providerNumber) || providersUnderOneHundredMiles[0]; + + if (!foundProviderInHundredMiles && !foundProviderInFullList) { + if (storeSelectedProvider?.providerNumber && resultMap.providers?.shopProviders) { + serviceLocationData.providers?.shopProviders.push(storeSelectedProvider); + } + } else if (!foundProviderInHundredMiles && foundProviderInFullList) { + serviceLocationData.providers?.shopProviders.push(foundProviderInFullList); + } const initialServiceLocationObj = { mobileProviderNumber: isMobileAppointment ? storeSelectedProvider?.providerNumber : null, - provider: isMobileAppointment ? null : providerToUse, + provider: isMobileAppointment ? null : foundProviderInFullList, zipCode: useMainStore().order.serviceLocation.zipCode || useMainStore().order.customer.address.zipCode, zipCodeCtu: resultMap.zipCodeData?.zipCodeCtu }; @@ -524,7 +538,20 @@ export default { preSelectedDate, initialDaysLoaded: endDateObject.newDaysLoaded || initialDays, daysFromStart: endDateObject.daysFromStart || null - })); + })) + .catch(() => { + console.warn('Error fetching initial available dates...'); + return { + todayDate: todayDateString, + initialViewStartDate, + initialViewEndDate, + calendarViewDirection, + initialShopTimeSlotsResponse: { days: [] }, + preSelectedDate, + initialDaysLoaded: endDateObject.newDaysLoaded || initialDays, + daysFromStart: endDateObject.daysFromStart || null + }; + }); if (this.selectedAppointmentType === AppointmentTypeStrings.MOBILE || this.selectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) { @@ -639,12 +666,20 @@ export default { } } }, - providerChangedFromServiceLocation(newProvider) { + async providerChangedFromServiceLocation(newProvider) { this.selectedProvider = newProvider?.provider; + if (newProvider?.refreshDatePicker && newProvider.provider) { + this.mainStore.updateServiceLocationProvider(newProvider.provider); - if (newProvider?.refreshDatePicker) { showIssLoadingModal(true); - this.refreshDatePicker(); + await this.mainStore.getBillToInfo(newProvider.provider?.providerNumber) + .then(() => { + this.refreshDatePicker(); + }) + .catch(() => { + console.warn('Error fetching bill to info...'); + showIssLoadingModal(false); + }); } }, async refreshDatePicker() { diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index de47fd87..78a5cb32 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -203,7 +203,7 @@ export default { return this.isBigTruck && !this.isServiceableInshop && !this.isServiceableMobile; }, displayLowAvailabilityInshop() { - return this.availabilityRating === 'low' && this.isInshop; + return this.availabilityRating === 'low' && this.isInshop && this.selectedProvider !== null; }, displayMilitaryZipAlert() { return this.zipContainsMilitaryBase && this.isServiceableMobile; @@ -622,5 +622,8 @@ $page-side-padding: 1.5rem; } } } + :deep(.alert-shop-distance) { + margin-bottom: 0; + } } diff --git a/src/store/index.js b/src/store/index.js index 3e3b8a57..806ce1e6 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1848,7 +1848,20 @@ export const useMainStore = defineStore({ } this.order.serviceLocation.tpaSearchRadius = serviceLocationInfo.tpaSearchRadius; }, - + updateServiceLocationProvider(providerInfo) { + this.order.serviceLocation.provider = { + providerNumber: providerInfo?.providerNumber, + address: { + streetAddress: providerInfo?.address?.streetAddress, + city: providerInfo?.address?.city, + state: providerInfo?.address?.state, + zipCode: providerInfo?.address?.zipCode, + zipCodeCtu: providerInfo?.address?.zipCodeCtu + }, + companyName: providerInfo?.companyName, + phoneNumber: providerInfo?.phoneNumber + }; + }, resetState() { Object.assign(this, getDefaultState()); }, @@ -2684,12 +2697,12 @@ export const useMainStore = defineStore({ } }, - async getBillToInfo() { + async getBillToInfo(componentProviderNumber = null) { const { order, issConfig } = this; try { const params = new URLSearchParams({ parentAccountNumber: order.parentAccountNumber.toString(), - providerNumber: this.providerNumber, + providerNumber: componentProviderNumber || this.providerNumber, typeOfClaim: 'GLASS ONLY', lineOfBusiness: 'PERSONAL', isItac: this.isITAC From f4fbca585eda7e9526d31b24e0709b4d6ad47f68 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 18 Feb 2026 10:05:13 -0500 Subject: [PATCH 3/4] clear list if no results --- .../schedule-page/service-location/shop-address/shop-address.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue index 4bd7f49a..85bffffa 100644 --- a/src/layouts/schedule-page/service-location/shop-address/shop-address.vue +++ b/src/layouts/schedule-page/service-location/shop-address/shop-address.vue @@ -253,6 +253,7 @@ export default { currentSearchIndex += 1; } if (result.length === 0) { + this.nearbyShops = []; this.errorMessage = errorMessages.ZIP_CODE_NOT_SERVICED_FOR_VEHICLE; } else { if (!result.find((shop) => shop.providerNumber === this.internalProviderNumber)) { From 205015914544353ccb77e13f203e617499357e91 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Wed, 18 Feb 2026 10:15:30 -0500 Subject: [PATCH 4/4] remove commented out line --- src/layouts/schedule-page/service-location/service-location.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue index 78a5cb32..bca1ba72 100644 --- a/src/layouts/schedule-page/service-location/service-location.vue +++ b/src/layouts/schedule-page/service-location/service-location.vue @@ -317,8 +317,6 @@ export default { }, selectedAppointmentType(newValue, oldValue) { if (this.isInshop && this.selectedProvider && this.availabilityRating === null) { - // this.refreshAvailabilityRating(); - const appointmenTypeServiceLocationObj = { appointmentType: newValue, mobileProviderNumber: null,