Merge remote-tracking branch 'origin/develop' into feature/skiener/INSR-2124

This commit is contained in:
scottkiener-at-safelite 2026-04-01 12:28:30 -04:00
commit 5fa9aba5fd
8 changed files with 100 additions and 10 deletions

View file

@ -244,6 +244,11 @@ stages:
Contents: '**' Contents: '**'
TargetFolder: 'public/.well-known' TargetFolder: 'public/.well-known'
CleanTargetFolder: true CleanTargetFolder: true
- task: CopyFiles@2
inputs:
SourceFolder: 'public/apple-pay/non-prod'
Contents: '**'
TargetFolder: 'public/.well-known'
- task: DeleteFiles@1 - task: DeleteFiles@1
inputs: inputs:
SourceFolder: 'public/apple-pay' SourceFolder: 'public/apple-pay'
@ -309,6 +314,11 @@ stages:
Contents: '**' Contents: '**'
TargetFolder: 'public/.well-known' TargetFolder: 'public/.well-known'
CleanTargetFolder: true CleanTargetFolder: true
- task: CopyFiles@2
inputs:
SourceFolder: 'public/apple-pay/non-prod'
Contents: '**'
TargetFolder: 'public/.well-known'
- task: DeleteFiles@1 - task: DeleteFiles@1
inputs: inputs:
SourceFolder: 'public/apple-pay' SourceFolder: 'public/apple-pay'
@ -374,6 +384,11 @@ stages:
Contents: '**' Contents: '**'
TargetFolder: 'public/.well-known' TargetFolder: 'public/.well-known'
CleanTargetFolder: true CleanTargetFolder: true
- task: CopyFiles@2
inputs:
SourceFolder: 'public/apple-pay/non-prod'
Contents: '**'
TargetFolder: 'public/.well-known'
- task: DeleteFiles@1 - task: DeleteFiles@1
inputs: inputs:
SourceFolder: 'public/apple-pay' SourceFolder: 'public/apple-pay'

File diff suppressed because one or more lines are too long

View file

@ -19,9 +19,18 @@ const experimentSettings = Object.freeze({
ISS_ENABLE_ADYEN_V1: 'ISS_Enable_Adyen_V1' ISS_ENABLE_ADYEN_V1: 'ISS_Enable_Adyen_V1'
}); });
const experimentTest = Object.freeze({
ISS_MOBILE_FIRST_POPUP_V3: 'ISS_Mobile_First_Popup_V3'
});
const experimentVariation = Object.freeze({
ISS_MOBILE_FIRST_CONTROL_V3: 'NoShowMobileFirstPopUp_V3_CONTROL',
ISS_MOBILE_FIRST_TEST_V3: 'YesShowMobileFirstPopUp_V3_TEST'
});
const experimentTriggers = Object.freeze({ const experimentTriggers = Object.freeze({
SITE_ENTRY: 'SiteEntry', SITE_ENTRY: 'SiteEntry',
PAGE_ENTRY: 'PageEntry' PAGE_ENTRY: 'PageEntry'
}); });
export { experimentUniverses, experimentSettings, experimentTriggers }; export { experimentUniverses, experimentSettings, experimentTest, experimentVariation, experimentTriggers };

View file

@ -73,6 +73,21 @@ export async function getZipCodeData(zipCode) {
return await processZipCodeResults(useMainStore().validateZip({ zip: zipCode })); return await processZipCodeResults(useMainStore().validateZip({ zip: zipCode }));
} }
export function isServiceableMobileWithData(isGlassServiceableMobile, isRecalibrationServiceableMobile) {
const isBigTruck = useMainStore().order.serviceLocation.isBigTruck;
if (isBigTruck) {
return false;
}
if (isRecalibrationServiceableMobile === true || isRecalibrationServiceableMobile === false) {
return (
isGlassServiceableMobile
&& isRecalibrationServiceableMobile
);
}
return !!isGlassServiceableMobile;
}
export function mapTimeSlot(timeSlot, timeOfDay) { export function mapTimeSlot(timeSlot, timeOfDay) {
return { return {
...timeSlot, ...timeSlot,

View file

@ -77,7 +77,7 @@ import siteFooter from '@/iss-components/site-footer/site-footer.vue';
import suggestTimeslotModal from '@/layouts/schedule-page/suggest-timeslot-modal/suggest-timeslot-modal.vue'; import suggestTimeslotModal from '@/layouts/schedule-page/suggest-timeslot-modal/suggest-timeslot-modal.vue';
// Supporting files // Supporting files
import { experimentSettings, experimentUniverses } from '@/constants/experiments'; import { experimentSettings, experimentTest, experimentVariation, experimentUniverses } from '@/constants/experiments';
import { import {
AppointmentTypeStrings, AppointmentTypeStrings,
GET_MOBILE_TIME_SLOTS, GET_MOBILE_TIME_SLOTS,
@ -99,6 +99,7 @@ import {
getPricedMobileFeePart, getPricedMobileFeePart,
getMobileZipCodeData, getMobileZipCodeData,
getZipCodeData, getZipCodeData,
isServiceableMobileWithData,
mapTimeSlot mapTimeSlot
} from '@/helpers/service-location-helper'; } from '@/helpers/service-location-helper';
import { Form } from 'vee-validate'; import { Form } from 'vee-validate';
@ -337,7 +338,7 @@ export default {
mobileProviderNumber: resultMap.providers?.mobileProviderNumber, mobileProviderNumber: resultMap.providers?.mobileProviderNumber,
serviceabilityDetails: resultMap.serviceabilityDetails, serviceabilityDetails: resultMap.serviceabilityDetails,
zipCode: initialServiceLocationObj.zipCode zipCode: initialServiceLocationObj.zipCode
} };
vm.setCmsContent(resultMap.cmsContent); vm.setCmsContent(resultMap.cmsContent);
vm.$refs.serviceLocation.initializeComponent(serviceLocationData); vm.$refs.serviceLocation.initializeComponent(serviceLocationData);
@ -492,13 +493,18 @@ export default {
); );
}, },
async checkMobileFirstExperience(mobileFirstObject = {}) { async checkMobileFirstExperience(mobileFirstObject = {}) {
const mobileFirstExperimentVariation = this.getExperimentVariationNameByTestName(experimentTest.ISS_MOBILE_FIRST_POPUP_V3);
const isMobileFirstTestVariation = mobileFirstExperimentVariation === experimentVariation.ISS_MOBILE_FIRST_TEST_V3;
const showMobileFirst = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_SHOW_FIRST_MOBILE_APPOINTMENT); const showMobileFirst = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_SHOW_FIRST_MOBILE_APPOINTMENT);
if (showMobileFirst) { if (showMobileFirst) {
const pmMobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_PM_MOBILE_DAYS); const pmMobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_PM_MOBILE_DAYS);
const mobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_MOBILE_DAYS); const mobileDaysLimit = this.getSettingValue(experimentSettings.ISS_MOBILE_FIRST_MAX_MOBILE_DAYS);
const hasSelectedDate = !!this.getSelectedDate(); const hasSelectedDate = !!this.getSelectedDate();
const isServicableMobile = mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile; const isServiceableMobile = isServiceableMobileWithData(
if (!hasSelectedDate && isServicableMobile && mobileFirstObject.mobileProviderNumber && mobileFirstObject.zipCode) { mobileFirstObject.serviceabilityDetails?.isGlassServiceableMobile ?? null,
mobileFirstObject.serviceabilityDetails?.isRecalibrationServiceableMobile ?? null
);
if (!hasSelectedDate && isServiceableMobile && mobileFirstObject.mobileProviderNumber && mobileFirstObject.zipCode) {
const todayDateObject = new Date(); const todayDateObject = new Date();
const todayDateString = convertDateToDateString(todayDateObject); const todayDateString = convertDateToDateString(todayDateObject);
const calendarViewDirection = 'future'; const calendarViewDirection = 'future';
@ -624,7 +630,11 @@ export default {
this.mainStore.logMobileFirstExperimentExposure(); this.mainStore.logMobileFirstExperimentExposure();
} }
this.$refs[SUGGEST_TIMESLOT_MODAL_REF_NAME].openModal(timeSlotForAutoSelectionMobile); if (isMobileFirstTestVariation) {
this.$refs[SUGGEST_TIMESLOT_MODAL_REF_NAME].openModal(timeSlotForAutoSelectionMobile);
} else {
console.log('In Control group or experiment not found, skip showing popup');
}
} }
} }
} }

View file

@ -252,7 +252,7 @@ export default {
return false; return false;
} }
if (this.isRecalibrationServiceableMobile !== null) { if (this.isRecalibrationServiceableMobile === true || this.isRecalibrationServiceableMobile === false) {
return ( return (
this.isGlassServiceableMobile this.isGlassServiceableMobile
&& this.isRecalibrationServiceableMobile && this.isRecalibrationServiceableMobile

View file

@ -12,6 +12,17 @@ export default {
const experiment = useMainStore().applicationUser.experiments.find((e) => e.universeName === experimentName); const experiment = useMainStore().applicationUser.experiments.find((e) => e.universeName === experimentName);
return experiment ? experiment : null; return experiment ? experiment : null;
}, },
getExperimentByTestName(testName) {
const experiment = useMainStore().applicationUser.experiments.find((experiment) => experiment.testName === testName);
return experiment ? experiment : null;
},
getExperimentVariationNameByTestName(testName) {
const experimentByTestName = this.getExperimentByTestName(testName);
if (!experimentByTestName) {
return null;
}
return experimentByTestName.variationName;
},
getSettingValue(settingName) { getSettingValue(settingName) {
return this.hasSetting(settingName) return this.hasSetting(settingName)
? useMainStore().experimentSettings[settingName] ? useMainStore().experimentSettings[settingName]

View file

@ -1346,8 +1346,22 @@ export const useMainStore = defineStore({
endpoint: `${endpoints.GetMobileFeePart.url}?${params.toString()}` endpoint: `${endpoints.GetMobileFeePart.url}?${params.toString()}`
}); });
}, },
getServiceabilityDetails(serviceZipCode) { getServiceabilityDetails(serviceZipCode) {
console.log('BEEP BOOP');
console.log('--ENVIRONMENT DETECTOR ROBOT ENGAGED--');
const currentEnvironment = applicationConfig.CURRENT_ENVIRONMENT;
console.log('I HAVE DETERMINED THAT THE CURRENT ENVIRONMENT IS:', currentEnvironment);
console.log('---');
console.log('---');
if (currentEnvironment === 'Localhost' || currentEnvironment === 'Dev') {
console.log('NEW SERVICEABILITY DETAILS METHOD ACTIVATED');
return this.getServiceabilityDetailsNewMethod(serviceZipCode);
} else {
console.log('OLD SERVICEABILITY DETAILS METHOD ACTIVATED');
return this.getServiceabilityDetailsOldMethod(serviceZipCode);
}
},
getServiceabilityDetailsOldMethod(serviceZipCode) {
const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order; const { vehicle, damage, parentAccountNumber, referralSequenceNumber, lineItems } = this.order;
const { carId } = vehicle; const { carId } = vehicle;
const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace); const glassArray = convertGlassPieceNamingForApi(damage.glassToReplace);
@ -1371,6 +1385,22 @@ export const useMainStore = defineStore({
endpoint: `${endpoints.GetServiceabilityDetails.url}?${params.toString()}` endpoint: `${endpoints.GetServiceabilityDetails.url}?${params.toString()}`
}); });
}, },
getServiceabilityDetailsNewMethod(serviceZipCode) {
const { damage, lineItems, parentAccountNumber, vehicle } = this.order;
const { carId } = vehicle;
const flattenedGlassParts = getLineItemsFlattened(lineItems.glassParts);
const lineItemsList = flattenedGlassParts.map((part) => part.partNumber).join(',');
let endPoint = `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}&parentAccountNumber=${parentAccountNumber}&isRepair=${damage.isRepair}`;
if (lineItemsList) {
endPoint += `&lineItems=${lineItemsList}`;
}
return globalMethods.callHttpClient({
method: endpoints.GetServiceabilityDetails.method,
endpoint: endPoint
});
},
lookupVehicleByVin(vin) { lookupVehicleByVin(vin) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LookupVehicleByVin.method, method: endpoints.LookupVehicleByVin.method,
@ -2800,7 +2830,6 @@ export const useMainStore = defineStore({
); );
}, },
updateContactInfo(contactInfo) { updateContactInfo(contactInfo) {
this.order.customer.firstName = contactInfo?.firstName ?? this.order.customer.firstName; this.order.customer.firstName = contactInfo?.firstName ?? this.order.customer.firstName;
this.order.customer.lastName = contactInfo?.lastName ?? this.order.customer.lastName; this.order.customer.lastName = contactInfo?.lastName ?? this.order.customer.lastName;
@ -3092,7 +3121,7 @@ export const useMainStore = defineStore({
}); });
return response.data; return response.data;
}, },
hasSubmittedOrder() { hasSubmittedOrder() {
return window.sessionStorage.getItem(webStorageConstants.SUBMITTED_ORDER) !== null; return window.sessionStorage.getItem(webStorageConstants.SUBMITTED_ORDER) !== null;
}, },