-
+
+
+
-
-
-
{{ formatDate(schedule.date) }}
-
- {{ appointmentTimeText }}
-
-
+
+
+ {{ serviceDescriptionText }}
+
+
+ {{ workOrderTitle }}
+ {{ workOrderNumber }}
+
+
+
{{ appointmentWordingText }}
+
{{ formatDate(schedule.date) }}
+
{{ appointmentTimeText }}
+
{{ appointmentLocation }}
-
-
-
-
-
+
+ {{ wipersTitle }}
+ {{ description }}
+
+
+ {{ rainRepelTitle }}
+ {{ rainRepelBody }}
-
+ v-if="displaySMSPhone"
+ class="sms-phone-details confirmation-section">
+
{{ smsTitle }}
+
{{ contactInfo.servicePhone }}
+
+
+ {{ contactDetailsTitle }}
+ {{ contactDetailsBody }}
+
+
+
+
+
@@ -103,6 +131,9 @@ import { toTitleCase } from '@/helpers/text-helper.js';
import { AppointmentTypeStrings } from '@/constants/schedule-constants';
import applicationConfig from '@/constants/application-config';
import widgetFields from '@/constants/cms-widget-fields.js';
+import { getGlassList } from '@/helpers/damage-helper';
+import partTypeStrings from '@/constants/part-type-strings';
+import coverageType from '@/constants/coverage-type';
export default {
name: 'order-confirmation',
@@ -144,18 +175,21 @@ export default {
serviceLocation,
schedule,
customer,
+ contactInfo,
payment,
customerPortalLoginToken,
damage,
- referralNumber
+ referralNumber,
+ hasRecalibrationPart
} = this.submittedOrder;
- const { issConfig, hasRecalibrationPart } = this.mainStore;
+ const { issConfig } = this.mainStore;
return {
vehicle,
customerEmail: customer?.emailAddress,
payment,
schedule,
serviceLocation,
+ contactInfo,
appointmentType: serviceLocation.appointmentType,
providerAddress: serviceLocation?.provider?.address,
customerPortalLoginToken,
@@ -164,12 +198,23 @@ export default {
isRepair: damage.isRepair,
hasRecalibrationPart,
referralNumber: referralNumber?.toString(),
+ isNoComp: this.submittedOrder.insuranceCoverage.coverageType === coverageType.NO_COMP,
widgets: {
siteHeader: 'SiteHeaderWidget',
emailConfirmation: 'EmailConfirmationWordingWidget',
+ emailConfirmationNoComp: 'EmailConfirmationNoCompWordingWidget',
orderConfirmation: 'OrderConfirmationContent',
+ serviceDescription: 'ServiceDescriptionTextWidget',
+ workOrderNumberTitle: 'WorkOrderNumberTextWidget',
mobile: 'MobileWordingWidget',
dropOffAndInShop: 'DropOffAndInShopWordingWidget',
+ wipersText: 'WipersTextWidget',
+ rainRepel: 'RainRepelWidget',
+ smsUpdates: 'SmsUpdatesWidget',
+ contactDetails: 'ContactDetailsWidget',
+ vapsItemDescriptions: 'VapsItemDescriptions',
+ payAtAppointment: 'PayAtAppointmentTextWidget',
+ orderDetails: 'OrderDetailsTextWidget',
siteFooter: 'SiteFooterWidget'
}
};
@@ -182,18 +227,29 @@ export default {
vehicleYear: this.vehicle?.year,
vehicleMake: this.vehicle?.make,
vehicleModel: this.vehicle?.model,
+ serviceType: this.serviceTypeText,
address: this.appointmentLocation,
inShopDuration: this.inShopAppointmentDuration,
email: this.customerEmail,
+ phone: this.contactInfo.servicePhone,
+ workOrderNumber: this.workOrderNumber,
CUSTOMER_PORTAL_URL: applicationConfig.CUSTOMER_PORTAL_URL,
CUSTOMER_PORTAL_LOGIN_TOKEN: this.customerPortalLoginToken
};
},
- confirmationEmailText() {
- const content = this.getCmsContentWithCustomValues(
- this.widgets.emailConfirmation,
- widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
- );
+ orderConfirmationUpdateAppointmentText() {
+ let content = '';
+ if(this.isNoComp) {
+ content = this.getCmsContentWithCustomValues(
+ this.widgets.emailConfirmationNoComp,
+ widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ );
+ } else {
+ content = this.getCmsContentWithCustomValues(
+ this.widgets.emailConfirmation,
+ widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ );
+ }
return content
?.replaceAll('<', '<')
?.replaceAll('>', '>');
@@ -210,10 +266,51 @@ export default {
widgetFields.CONTENT_GROUP_WIDGET.IMAGE
);
},
+ orderConfirmationSubheaderText() {
+ return this.getCmsContent(
+ this.widgets.orderConfirmation,
+ widgetFields.CONTENT_GROUP_WIDGET.SUBHEADER_TEXT
+ );
+ },
+ serviceDescriptionText() {
+ const content = this.getCmsContentWithCustomValues(
+ this.widgets.serviceDescription,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ return content;
+ },
+ serviceTypeText() {
+ const glassPieces = this.submittedOrder.lineItems.glassParts?.map((part) => part.partType.toLowerCase()) ?? [];
+ let glassList = getGlassList(glassPieces);
+ let workType = '';
+ if (this.isRepair) {
+ workType = 'repair';
+ } else {
+ workType = 'replacement';
+ if (this.hasRecalibrationPart) {
+ if (glassList === 'windshield') {
+ workType = 'replacement and recalibration';
+ }
+ else {
+ glassList = glassList.replace('windshield', 'windshield replacement, recalibration');
+ }
+ }
+ }
+ return `${glassList} ${workType}`;
+ },
+ workOrderTitle() {
+ return this.getCmsContent(
+ this.widgets.workOrderNumberTitle,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ },
+ workOrderNumber() {
+ return this.submittedOrder.workOrderNumber;
+ },
mobileWordingText() {
return this.getCmsContentWithCustomValues(
this.widgets.mobile,
- widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT
);
},
mobileWordingText2() {
@@ -225,7 +322,7 @@ export default {
nonMobileWordingText() {
return this.getCmsContentWithCustomValues(
this.widgets.dropOffAndInShop,
- widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT
);
},
nonMobileWordingText2() {
@@ -241,12 +338,12 @@ export default {
}
if (this.isInShopAppointment) {
const formattedStartTime = get12HourTimeFormat(startTime);
- return `at ${formattedStartTime}`;
+ return `Your appointment is at ${formattedStartTime}`;
}
if (this.isMobileAppointment) {
const mobileStartTime = get12HourTimeMobileFormat(startTime);
const mobileEndTime = get12HourTimeMobileFormat(endTime);
- return `Between ${mobileStartTime} - ${mobileEndTime}`;
+ return `Your appointment is at ${mobileStartTime} - ${mobileEndTime}`;
}
return null;
},
@@ -261,12 +358,12 @@ export default {
},
serviceLocationFullAddress() {
const { address, address2, city, state, zipCode } = this.serviceLocation;
- return `${address ?? ''}, ${address2 ? `${address2},` : ''}
${city ?? ''}, ${state ?? ''} ${zipCode ?? ''}`;
+ return `${address ?? ''}, ${address2 ? `${address2},` : ''} ${city ?? ''}, ${state ?? ''} ${zipCode ?? ''}`;
},
providerFullAddress() {
const { streetAddress, city, state, zipCode } = this.providerAddress;
return streetAddress
- ? `${toTitleCase(streetAddress)},
${toTitleCase(city)}, ${state ?? ''} ${zipCode ?? ''}`
+ ? `${toTitleCase(streetAddress)}, ${toTitleCase(city)}, ${state ?? ''} ${zipCode ?? ''}`
: '';
},
appointmentWordingText() {
@@ -318,6 +415,84 @@ export default {
// settleTenderAmount always shows 0 via localhost or dev.
// Temporarily set return true to see cart in localhost or dev environment
return false;
+ },
+ displayWipers() {
+ const hasWiperPart = this.submittedOrder.lineItems.vaps.some((part) => part.partType.toLowerCase().includes('wiper'));
+ return hasWiperPart;
+ },
+ wipersTitle() {
+ return this.getCmsContent(
+ this.widgets.wipersText,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ },
+ wipersBody() {
+ const wiperTypesOnOrder = [];
+
+ const hasFrontWiper = this.submittedOrder.lineItems.vaps.some((part) => part.partType === partTypeStrings.FRONT_WIPER);
+ const hasRearWiper = this.submittedOrder.lineItems.vaps.some((part) => part.partType === partTypeStrings.REAR_WIPER);
+
+ if (hasFrontWiper) {
+ wiperTypesOnOrder.push(partTypeStrings.FRONT_WIPER);
+ }
+ if (hasRearWiper) {
+ wiperTypesOnOrder.push(partTypeStrings.REAR_WIPER);
+ }
+
+ const wiperDescriptions = wiperTypesOnOrder.map((type) => {
+ return this.getCmsContentForVapsType(type);
+ });
+
+ return wiperDescriptions;
+ },
+ displayRainRepel() {
+ return this.submittedOrder.lineItems.vaps.some((part) => part.partType === partTypeStrings.RAIN_DEFENSE);
+ },
+ rainRepelTitle() {
+ return this.getCmsContent(
+ this.widgets.rainRepel,
+ widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT
+ );
+ },
+ rainRepelBody() {
+ return this.getCmsContent(
+ this.widgets.rainRepel,
+ widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ );
+ },
+ displaySMSPhone() {
+ return this.contactInfo.requestTextUpdates && this.contactInfo.servicePhone;
+ },
+ smsTitle() {
+ return this.getCmsContent(
+ this.widgets.smsUpdates,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ },
+ contactDetailsTitle() {
+ return this.getCmsContent(
+ this.widgets.contactDetails,
+ widgetFields.CONTENT_GROUP_WIDGET.HEADER_TEXT
+ );
+ },
+ contactDetailsBody() {
+ return this.getCmsContentWithCustomValues(
+ this.widgets.contactDetails,
+ widgetFields.CONTENT_GROUP_WIDGET.BODY_TEXT
+ );
+ },
+ cartHeaderText() {
+ if (this.payment.isPayInAdvance) {
+ return this.getCmsContent(
+ this.widgets.orderDetails,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ } else {
+ return this.getCmsContent(
+ this.widgets.payAtAppointment,
+ widgetFields.TEXT_BLOCK_WIDGET.TEXT
+ );
+ }
}
},
mounted() {
@@ -411,68 +586,138 @@ export default {
return dateObject.toLocaleDateString('en-us', {
weekday: 'long',
month: 'long',
- day: 'numeric'
+ day: 'numeric',
+ year: 'numeric'
});
+ },
+ getCmsContentForVapsType(vapsPartType) {
+ const vapsItemDescriptions = this.getCmsContent(
+ this.widgets.vapsItemDescriptions,
+ widgetFields.INPUT_QUESTION_WIDGET.ANSWERS
+ );
+
+ if (!vapsItemDescriptions) {
+ return '';
+ }
+
+ const vapsTypeDescription = vapsItemDescriptions?.find((entry) => entry?.Name === vapsPartType);
+ return vapsTypeDescription?.Text ?? '';
}
}
};
diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue
index 195909ec..aaaa32e5 100644
--- a/src/layouts/payment-method/payment-method.vue
+++ b/src/layouts/payment-method/payment-method.vue
@@ -24,8 +24,6 @@
diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue
index 7dd6b673..f4c86f11 100644
--- a/src/layouts/payment-page/payment-page.vue
+++ b/src/layouts/payment-page/payment-page.vue
@@ -42,8 +42,7 @@
diff --git a/src/layouts/schedule-page/schedule-page.spec.js b/src/layouts/schedule-page/schedule-page.spec.js
index 4a756184..a418f35e 100644
--- a/src/layouts/schedule-page/schedule-page.spec.js
+++ b/src/layouts/schedule-page/schedule-page.spec.js
@@ -167,7 +167,7 @@ describe('schedule-page.vue', () => {
days: []
};
const store = useMainStore();
- store.getShopTimeSlots.mockImplementation(() => ({
+ store.getShopTimeSlots.mockImplementation(() => Promise.resolve({
data: {
estimatedServiceMinutesMinimum: 90,
estimatedServiceMinutesMaximum: 120,
@@ -219,7 +219,7 @@ describe('schedule-page.vue', () => {
days: []
};
const store = useMainStore();
- store.getShopTimeSlots.mockImplementation(() => ({
+ store.getShopTimeSlots.mockImplementation(() => Promise.resolve({
data: {
estimatedServiceMinutesMinimum: 90,
estimatedServiceMinutesMaximum: 120,
@@ -233,7 +233,8 @@ describe('schedule-page.vue', () => {
'2023-01-01',
'2023-03-31',
'Inshop',
- '123'
+ '123',
+ '43228'
);
// Assert
diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue
index 0cd0f480..45382ced 100644
--- a/src/layouts/schedule-page/schedule-page.vue
+++ b/src/layouts/schedule-page/schedule-page.vue
@@ -176,15 +176,18 @@ const getAvailableDates = async (
storeAction.payload.endDate,
storeAction.payload.shopAppointmentType,
storeAction.payload.providerNumber
- );
+ ).catch(() => {
+ // eslint-disable-next-line no-console
+ console.warn('Error fetching shop time slots...');
+ });
} else if (storeAction.payload?.zipCodeOverride) {
timeSlotsResponse = await useMainStore().getMobileTimeSlots(
storeAction.payload.startDate,
storeAction.payload.endDate,
storeAction.payload.zipCodeOverride
- ).catch((error) => {
+ ).catch(() => {
// eslint-disable-next-line no-console
- console.warn('Error fetching mobile time slots:', error);
+ console.warn('Error fetching mobile time slots...');
});
}
@@ -234,7 +237,7 @@ export default {
const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode);
const serviceabilityDetailsPromise = getServiceabilityDetails(serviceZipCode);
const getGlassFeesPromise = useMainStore().getGlassFees();
- const providersPromise = useMainStore().getProviders(serviceZipCode);
+ const providersPromise = useMainStore().getSafeliteProviders(serviceZipCode);
const premiumFeePromise = useMainStore().getMobilePremiumFee();
const premiumFeeWithPricePromise = premiumFeePromise.then((result) => {
diff --git a/src/layouts/schedule-page/service-location/service-location.spec.js b/src/layouts/schedule-page/service-location/service-location.spec.js
index 20e0596b..6f8d960d 100644
--- a/src/layouts/schedule-page/service-location/service-location.spec.js
+++ b/src/layouts/schedule-page/service-location/service-location.spec.js
@@ -147,7 +147,7 @@ function setupMocks({ appointmentType = AppointmentTypeStrings.IN_SHOP }) {
}
}
})];
- useMainStore().getProviders = jest.fn().mockImplementation(() => mockProviders());
+ useMainStore().getSafeliteProviders = jest.fn().mockImplementation(() => mockProviders());
const wrapper = mount(serviceLocation, mountOptions);
wrapper.vm.$router.navigateWithSpinner = jest.fn();
diff --git a/src/layouts/schedule-page/service-location/service-location.vue b/src/layouts/schedule-page/service-location/service-location.vue
index e48dddcc..75a5aa40 100644
--- a/src/layouts/schedule-page/service-location/service-location.vue
+++ b/src/layouts/schedule-page/service-location/service-location.vue
@@ -243,6 +243,10 @@ export default {
return this.isGlassServiceableInshop;
},
isServiceableMobile() {
+ if (this.isBigTruck) {
+ return false;
+ }
+
if (this.isRecalibrationServiceableMobile !== null) {
return (
this.isGlassServiceableMobile
@@ -553,7 +557,7 @@ export default {
}
});
- const providersPromise = useMainStore().getProviders(this.mobileZipCode);
+ const providersPromise = useMainStore().getSafeliteProviders(this.mobileZipCode);
await providersPromise.then((result) => {
const providers = result.data;
if (providers) {
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 54b9dc0d..934bd75f 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
@@ -195,7 +195,7 @@ export default {
const formattedEndDate = endDate.toISOString().split('T')[0];
return {
- displayAvailabilityIndicators: true,
+ displayAvailabilityIndicators: false,
availabilityRatingCallback: getAvailabilityRating,
startDate: formattedStartDate,
endDate: formattedEndDate,
@@ -314,7 +314,7 @@ export default {
}
},
async getNearbyShops(radiusInMiles) {
- const result = await useMainStore().getProviders(this.internalZipcode, radiusInMiles);
+ const result = await useMainStore().getSafeliteProviders(this.internalZipcode, radiusInMiles);
return result.data.shopProviders;
},
getFullProviderAddress(provider) {
diff --git a/src/layouts/vin-lookup/vin-lookup-alerts/vin-lookup-alerts.vue b/src/layouts/vin-lookup/vin-lookup-alerts/vin-lookup-alerts.vue
index f9be7ede..495881b9 100644
--- a/src/layouts/vin-lookup/vin-lookup-alerts/vin-lookup-alerts.vue
+++ b/src/layouts/vin-lookup/vin-lookup-alerts/vin-lookup-alerts.vue
@@ -3,15 +3,20 @@
id="vin-lookup-alerts-wrapper"
:class="wrapperCssClass">
+ v-if="isVehicleNotFoundVisible"
+ class="mt-5" />
+ v-if="isTwoIdenticalYMMVehicleFoundVisible"
+ class="mt-5" />
+ v-else-if="isVehicleNotMatchedVisible"
+ class="mt-5" />
+ v-else-if="isPerfectMatchVisible"
+ class="mt-5" />
+ v-else-if="isNoServiceVisible"
+ class="mt-5" />
+
+
diff --git a/src/layouts/vin-lookup/vin-lookup.vue b/src/layouts/vin-lookup/vin-lookup.vue
index 6585d865..e4b5ea85 100644
--- a/src/layouts/vin-lookup/vin-lookup.vue
+++ b/src/layouts/vin-lookup/vin-lookup.vue
@@ -13,13 +13,12 @@
+ class="mt-4" />
@@ -48,6 +47,7 @@ import { isGlassAvailableForCarId } from '@/helpers/damage-helper';
import settleAllPromises from '@/helpers/layout-helper';
import routerParams from '@/router/router-constants/router-params';
import { useMainStore } from '@/store';
+import showIssLoadingModal from '@/helpers/loading-modal-helper.js';
// Import Component
import baseFormMixin from '@/mixins/base-form-mixin';
@@ -140,7 +140,9 @@ export default {
// TODO: Side effects in computed.
if (this.vinPopulatedOnPageLoad) {
// TODO: Modify to remove side effects in computed
+ // eslint-disable-next-line vue/no-side-effects-in-computed-properties
this.activeVehicleLookupAlertType = vehicleLookupAlertTypes.PERFECT_MATCH;
+ // eslint-disable-next-line vue/no-side-effects-in-computed-properties
this.needToLookupVehicle = false;
const lastSixChars = this.vin.substring(11, this.vin.length);
return `!X!X!X!X!X!X!X!X!X!X!X${lastSixChars}`;
@@ -174,6 +176,7 @@ export default {
this.resetActiveAlert();
// Temp solution to reset the 'disabled' style on the Continue button
this.$refs.siteFooter.enableForwardAction();
+ showIssLoadingModal(true);
if (this.needToLookupVehicle) {
const vehicleLookupResponse = await this.lookupVehicleByVin(this.vin);
@@ -186,6 +189,7 @@ export default {
// because the form itself actually passes its client-side validation.
// SSR-189 Scenario #4.
this.$refs.siteFooter.enableForwardAction();
+ showIssLoadingModal(false);
return;
}
@@ -193,6 +197,7 @@ export default {
this.activeVehicleLookupAlertType = vehicleLookupAlertTypes.NO_SERVICE;
this.resetVehicleFromLookup();
this.$refs.siteFooter.disableForwardButton();
+ showIssLoadingModal(false);
return;
}
@@ -220,8 +225,8 @@ export default {
`${this.vehicleFromLookup.year} ${this.vehicleFromLookup.make} ${this.vehicleFromLookup.model} ${this.forwardButtonCarStyle}`;
this.$refs.siteFooter.updateButtonText(`Continue with ${vehicleYearMakeModelStyle}`);
this.needToLookupVehicle = false;
-
- return null;
+ showIssLoadingModal(false);
+ return;
}
let isSelectedGlassAvailableForVehicle = true;
@@ -242,7 +247,7 @@ export default {
);
// navigate() doesn't stop the processing flow
- return null;
+ return;
}
// save vehicle to store if it hasn't already been saved
@@ -255,7 +260,7 @@ export default {
this.navigationScenarios.CORRECTED_VIN_FROM_POLICY_VEHICLE,
this.$route
);
- return null;
+ return;
}
const partsOrQuestionsResponse = await this.getPartsOrQuestions();
diff --git a/src/main.js b/src/main.js
index 7b5ca497..03f498c1 100644
--- a/src/main.js
+++ b/src/main.js
@@ -29,7 +29,7 @@ vueApp.config.compilerOptions.isCustomElement = (tag) =>
const pinia = createPinia();
vueApp.use(pinia);
pinia.use(piniaPluginPersistedstate);
-useMainStore().populateInitialState();
+useMainStore().populateInitialState(false);
// Additional Vue items to setup
vueApp.use(router);
diff --git a/src/router/router-constants/routing-table.js b/src/router/router-constants/routing-table.js
index dea1daae..2698360f 100644
--- a/src/router/router-constants/routing-table.js
+++ b/src/router/router-constants/routing-table.js
@@ -277,6 +277,10 @@ const routingTable = () => [
{
scenario: navigationScenarios.CLICKED_FORWARD_WITH_NO_MORE_QUESTIONS,
destinationIssPageValue: issPageValues.COVERAGE_STATEMENT
+ },
+ {
+ scenario: navigationScenarios.CLICKED_NEED_HELP_WITH_BAILOUT,
+ destinationIssPageValue: issPageValues.BAILOUT_PAGE
}
]
},
diff --git a/src/store/index.js b/src/store/index.js
index d74067f7..6759f16f 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -299,6 +299,11 @@ export const useMainStore = defineStore({
const nonWindshieldItems = damage.glassToReplace?.filter((glass) => glass.glassLocation !== damageLocationsSelected.WINDSHIELD);
return !!nonWindshieldItems?.length;
},
+ hasMoldingPart: (s) => {
+ return s.order.lineItems.glassParts?.some((glassPart) => {
+ return glassPart.childParts?.some((childPart) => childPart.partType === partTypeStrings.MOLDING);
+ });
+ },
isMobileAppointment: (state) => state.order.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE
|| state.order.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP,
isDropOffAppointment: (state) => state.order.serviceLocation.appointmentType === AppointmentTypeStrings.DROP_OFF,
@@ -1029,46 +1034,35 @@ export const useMainStore = defineStore({
});
},
- getProviders(serviceZipCode, shopRadiusInMiles = 100) {
- const { carId, isBigTruck } = this.order.vehicle;
- const damageType = this.damage.isRepair ? 'Repair' : 'Replace';
- const { parentAccountNumber } = this.order;
- const partsWithRecal = getTopLevelGlassPartsWithRecal(this.order.lineItems.glassParts);
- const windshieldPartWithRecal = partsWithRecal?.length > 0 ? partsWithRecal[0] : null;
- const safeliteOnly = true;
-
- let url = `${endpoints.GetProviders.url}/${serviceZipCode}/${damageType}/${shopRadiusInMiles}/${parentAccountNumber}/${safeliteOnly}/${carId}`;
- if (windshieldPartWithRecal) {
- url += `/${windshieldPartWithRecal.partNumber}`;
- }
- url += `/${isBigTruck}`;
- return globalMethods.callHttpClient({
- method: endpoints.GetProviders.method,
- endpoint: url
- });
+ getSafeliteProviders(zipCode, radius = 100) {
+ return this.getProviders(zipCode, radius, true)
},
getTpaProviders(zipCode, radius) {
+ return this.getProviders(zipCode, radius, false)
+ },
+
+ getProviders(zipcode, radius, safeliteOnly) {
const { carId, isBigTruck } = this.order.vehicle;
const damageType = this.damage.isRepair ? 'Repair' : 'Replace';
const { parentAccountNumber } = this.order;
const partsWithRecal = getTopLevelGlassPartsWithRecal(this.order.lineItems.glassParts);
const windshieldPartWithRecal = partsWithRecal?.length > 0 ? partsWithRecal[0] : null;
- const safeliteOnly = false;
-
- let url = `${endpoints.GetProviders.url}/${zipCode}/${damageType}/${radius}/${parentAccountNumber}/${safeliteOnly}/${carId}`;
- if (windshieldPartWithRecal) {
- url += `/${windshieldPartWithRecal.partNumber}`;
- }
- url += `/${isBigTruck}`;
-
- return new Promise((resolve, reject) => {
- globalMethods.callHttpClient({
- method: endpoints.GetProviders.method,
- endpoint: url
- }).then((response) => resolve(response), (error) => reject(error));
+ return globalMethods.callHttpClient({
+ method: endpoints.GetProviders.method,
+ endpoint: endpoints.GetProviders.url(
+ zipcode,
+ damageType,
+ radius,
+ parentAccountNumber,
+ safeliteOnly,
+ carId,
+ windshieldPartWithRecal?.partNumber,
+ isBigTruck
+ )
});
},
+
getCarrierAccountInfo() {
return new Promise((resolve, reject) => {
globalMethods.callHttpClient({
@@ -1586,7 +1580,7 @@ export const useMainStore = defineStore({
endpoint: endpoints.LoadSession.url,
payload: {
referralNumber: duplicate.referralNumber,
- referralDate: duplicate.responseDate,
+ referralDate: duplicate.referralDate,
parentAccountNumber: order.parentAccountNumber,
referralCorrelationId: duplicate.correlationId
}
@@ -1596,22 +1590,35 @@ export const useMainStore = defineStore({
return;
}
- if (this.isPolicyLookupSuccessful) {
- order.customer.address.streetAddress = data.customer?.address?.streetAddress;
- order.customer.address.streetAddress2 = data.customer?.address?.streetAddress2;
- order.customer.address.city = data.customer?.address?.city;
- order.customer.address.state = data.customer?.address?.state;
- order.customer.address.zipCode = data.customer?.address?.zipCode;
+ if (data?.customer) {
order.customer.firstName = data?.customer?.firstName;
order.customer.lastName = data?.customer?.lastName;
order.customer.emailAddress = data?.customer?.emailAddress;
-
+
order.contactInfo.extension = data?.customer?.homePhone?.slice(10);
order.contactInfo.homePhone = data?.customer?.homePhone?.slice(0, 10);
order.contactInfo.servicePhone = data?.customer?.servicePhone;
order.contactInfo.alternativePhone = data?.customer?.alternativePhone;
order.contactInfo.requestTextUpdates = data?.customer?.isSmsOptIn;
+
+ if (data?.customer?.address) {
+ order.customer.address.streetAddress = data.customer?.address?.streetAddress;
+ order.customer.address.streetAddress2 = data.customer?.address?.streetAddress2;
+ order.customer.address.city = data.customer?.address?.city;
+ order.customer.address.state = data.customer?.address?.state;
+ order.customer.address.zipCode = data.customer?.address?.zipCode;
+ }
+ }
+
+ if (data?.vehicle) {
+ order.vehicle.year = data?.vehicle?.year;
+ order.vehicle.make = data?.vehicle?.make;
+ order.vehicle.model = data?.vehicle?.model;
+ order.vehicle.style = data?.vehicle?.style;
+ }
+
+ if (this.isPolicyLookupSuccessful) {
if (data.insuranceCoverage) {
order.insuranceCoverage.coverageType = data?.insuranceCoverage?.coverageType;
order.insuranceCoverage.coverageStatus = data?.insuranceCoverage?.coverageStatus;
@@ -1644,11 +1651,6 @@ export const useMainStore = defineStore({
}
}
}
-
- order.vehicle.year = data.vehicle.year;
- order.vehicle.make = data.vehicle.make;
- order.vehicle.model = data.vehicle.model;
- order.vehicle.style = data.vehicle.style;
}
}
@@ -2441,8 +2443,8 @@ export const useMainStore = defineStore({
},
// populate initial state
- populateInitialState() {
- if (!localStorage.getItem(storeId)) {
+ populateInitialState(forceReset) {
+ if (!sessionStorage.getItem(storeId) || forceReset ) {
this.$state = state;
}
},
@@ -2889,14 +2891,15 @@ export const useMainStore = defineStore({
await this.getCarrierAccountInfo();
const submittedOrder = this.order;
const { experiments } = this.applicationUser;
- const { issConfig } = this;
+ const { issConfig, hasRecalibrationPart } = this;
submittedOrder.isUnverified = this.isUnverified;
submittedOrder.isVerified = this.isVerified;
submittedOrder.submitType = submitType;
submittedOrder.payment.isPayInAdvance = this.isPayInAdvance;
+ submittedOrder.hasRecalibrationPart = hasRecalibrationPart;
- // set to local storage
+ // set to sessionStorage
window.sessionStorage.setItem(webStorageConstants.SUBMITTED_ORDER, JSON.stringify(submittedOrder));
// clear vuex
@@ -2912,11 +2915,14 @@ export const useMainStore = defineStore({
},
resetSubmittedOrder() {
- // clear from local storage
+ // clear from sessionStorage
window.sessionStorage.removeItem(webStorageConstants.SUBMITTED_ORDER);
}
},
- persist: true
+ persist: {
+ // Default is localStorage, but sessionStorage is used here to ensure state is cleared when the browser tab is closed, preventing potential issues with stale data on return visits.
+ storage: sessionStorage
+ }
});
// Private Functions
diff --git a/src/store/store.spec.js b/src/store/store.spec.js
index 1306221c..4f4173d8 100644
--- a/src/store/store.spec.js
+++ b/src/store/store.spec.js
@@ -14,6 +14,7 @@ import endpoints from '@/constants/endpoints';
import { AppointmentTypeStrings } from '@/constants/schedule-constants';
import coverageType from '@/constants/coverage-type';
import { getEnumName } from '@/helpers/unit-test-helper';
+import { strictEqual } from 'assert';
describe('Store', () => {
let store;
@@ -1071,28 +1072,29 @@ describe('Store', () => {
experiments: getRandomString(6, 6)
};
const vehicle = {
- year: getRandomString(6, 6),
- make: getRandomString(6, 6),
- model: getRandomString(6, 6),
- style: getRandomString(6, 6),
- vin: getRandomString(6, 6),
- carId: getRandomString(6, 6),
- licensePlateNumber: getRandomString(6, 6)
+ year: getRandomInt(2000, 2024).toString(),
+ make: getRandomString(5, 15),
+ model: getRandomString(5, 15),
+ style: getRandomString(5, 15),
+ carId: getRandomInt(1000, 9999),
+ vin: getRandomString(17, 17),
+ licensePlateNumber: getRandomString(7, 7)
};
- const customer = {
- firstName: getRandomString(6, 6),
- lastName: getRandomString(6, 6),
- emailAddress: getRandomString(6, 6),
- phoneNumber: getRandomString(6, 6),
- isSmsOptIn: getRandomString(6, 6),
+ const customer= {
address: {
- streetAddress: getRandomString(6, 6),
- streetAddress2: getRandomString(6, 6),
- city: getRandomString(6, 6),
- state: getRandomString(6, 6),
- zipCode: getRandomString(6, 6),
- zipCodeCtu: getRandomString(6, 6)
- }
+ streetAddress: getRandomString(10, 50),
+ streetAddress2: getRandomString(5, 20),
+ city: getRandomString(5, 20),
+ state: getRandomString(2, 2),
+ zipCode: getRandomString(5, 5)
+ },
+ firstName: getRandomString(5, 15),
+ lastName: getRandomString(5, 15),
+ emailAddress: `${getRandomString(5, 10)}@test.com`,
+ homePhone: getRandomString(10, 10),
+ servicePhone: getRandomString(10, 10),
+ alternativePhone: getRandomString(10, 10),
+ isSmsOptIn: getRandomBoolean()
};
const fullApiResponse = {
data: {
@@ -1140,7 +1142,7 @@ describe('Store', () => {
};
store.order.insuranceCoverage.coverageType = coverageType.Deductible;
- store.policy.vehicles = [{ vin: vehicle.vin }];
+ store.policy.vehicles = [{ vehicle }];
// Act
await store.loadSession(duplicate);
@@ -1150,7 +1152,7 @@ describe('Store', () => {
expect(store.vehicle.make).toBe(vehicle.make);
expect(store.vehicle.model).toBe(vehicle.model);
expect(store.vehicle.style).toBe(vehicle.style);
- expect(store.vehicle.vin).toBe(vehicle.vin);
+ // vin is not set directly by loadSession, it's set by updateVehicle after lookupVehicleByVin
expect(store.vehicle.registration.licensePlate).toBe(vehicle.licensePlateNumber);
});
it('sets expected customer data', async () => {
@@ -1981,16 +1983,16 @@ describe('Store', () => {
const radius = getRandomInt(5, 100);
const isBigTruck = false;
store.order.vehicle.isBigTruck = isBigTruck;
- const expectedEndpoint = [
- endpoints.GetProviders.url,
+ const expectedEndpoint = endpoints.GetProviders.url(
zipCode,
damageType,
radius,
parentAccountNumber,
'false',
carId,
+ null,
isBigTruck
- ].join('/');
+ );
// Act
await store.getTpaProviders(zipCode, radius);
@@ -2135,4 +2137,344 @@ describe('Store', () => {
expect(result).toBe(expected);
});
});
+
+ describe('loadSession method', () => {
+ let mockDuplicate;
+ let mockResponse;
+
+ beforeEach(() => {
+ mockDuplicate = {
+ referralNumber: getRandomString(10, 10),
+ referralDate: new Date().toISOString(),
+ correlationId: getRandomGuid()
+ };
+
+ mockResponse = {
+ data: {
+ customer: {
+ address: {
+ streetAddress: getRandomString(10, 50),
+ streetAddress2: getRandomString(5, 20),
+ city: getRandomString(5, 20),
+ state: getRandomString(2, 2),
+ zipCode: getRandomString(5, 5)
+ },
+ firstName: getRandomString(5, 15),
+ lastName: getRandomString(5, 15),
+ emailAddress: `${getRandomString(5, 10)}@test.com`,
+ homePhone: getRandomString(10, 10),
+ servicePhone: getRandomString(10, 10),
+ alternativePhone: getRandomString(10, 10),
+ isSmsOptIn: getRandomBoolean()
+ },
+ vehicle: {
+ year: getRandomInt(2000, 2024).toString(),
+ make: getRandomString(5, 15),
+ model: getRandomString(5, 15),
+ style: getRandomString(5, 15),
+ carId: getRandomInt(1000, 9999),
+ vin: getRandomString(17, 17),
+ licensePlateNumber: getRandomString(7, 7)
+ },
+ insuranceCoverage: {
+ coverageType: getRandomEnum(coverageType),
+ coverageStatus: getRandomEnum(coverageStatuses),
+ claimNumber: getRandomString(10, 10)
+ },
+ referralNumber: getRandomString(10, 10),
+ referralDate: new Date().toISOString(),
+ referralCorrelationId: getRandomGuid(),
+ referralSequenceNumber: getRandomInt(1, 100),
+ eon: getRandomString(10, 10)
+ }
+ };
+
+ store.order.parentAccountNumber = getRandomString(6, 6);
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ });
+
+ it('should call callHttpClient with correct parameters', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(globalMethods.callHttpClient).toHaveBeenCalledWith({
+ method: endpoints.LoadSession.method,
+ endpoint: endpoints.LoadSession.url,
+ payload: {
+ referralNumber: mockDuplicate.referralNumber,
+ referralDate: mockDuplicate.referralDate,
+ parentAccountNumber: store.order.parentAccountNumber,
+ referralCorrelationId: mockDuplicate.correlationId
+ }
+ });
+ });
+
+ it('should return early when response data is null/undefined', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({ data: null }));
+ const originalStreetAddress = store.order.customer.address.streetAddress;
+ const originalLoadedFromDupeCheck = store.order.loadedFromDupeCheck;
+
+ // Act
+ await store.loadSession(mockDuplicate);
+ // Assert
+ expect(store.order.customer.address.streetAddress).toBe(originalStreetAddress);
+ expect(store.order.loadedFromDupeCheck).toBe(originalLoadedFromDupeCheck);
+ });
+
+ it('should update customer address fields from response data', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.customer.address.streetAddress).toBe(mockResponse.data.customer.address.streetAddress);
+ expect(store.order.customer.address.streetAddress2).toBe(mockResponse.data.customer.address.streetAddress2);
+ expect(store.order.customer.address.city).toBe(mockResponse.data.customer.address.city);
+ expect(store.order.customer.address.state).toBe(mockResponse.data.customer.address.state);
+ expect(store.order.customer.address.zipCode).toBe(mockResponse.data.customer.address.zipCode);
+ });
+
+ it('should update contact information from response data', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.customer.firstName).toBe(mockResponse.data.customer.firstName);
+ expect(store.order.customer.lastName).toBe(mockResponse.data.customer.lastName);
+ expect(store.order.customer.emailAddress).toBe(mockResponse.data.customer.emailAddress);
+ expect(store.order.contactInfo.servicePhone).toBe(mockResponse.data.customer.servicePhone);
+ expect(store.order.contactInfo.alternativePhone).toBe(mockResponse.data.customer.alternativePhone);
+ expect(store.order.contactInfo.requestTextUpdates).toBe(mockResponse.data.customer.isSmsOptIn);
+ });
+
+ it('should extract extension from homePhone correctly', async () => {
+ // Arrange
+ mockResponse.data.customer.homePhone = '12345678901234';
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.contactInfo.homePhone).toBe('1234567890');
+ expect(store.order.contactInfo.extension).toBe('1234');
+ });
+
+ it('should update vehicle information from response data', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.vehicle.year).toBe(mockResponse.data.vehicle.year);
+ expect(store.order.vehicle.make).toBe(mockResponse.data.vehicle.make);
+ expect(store.order.vehicle.model).toBe(mockResponse.data.vehicle.model);
+ expect(store.order.vehicle.style).toBe(mockResponse.data.vehicle.style);
+ });
+
+ it('should update insurance coverage when isPolicyLookupSuccessful is true and insuranceCoverage exists in response', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible; // Make isPolicyLookupSuccessful true
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.insuranceCoverage.coverageType).toBe(mockResponse.data.insuranceCoverage.coverageType);
+ expect(store.order.insuranceCoverage.coverageStatus).toBe(mockResponse.data.insuranceCoverage.coverageStatus);
+ expect(store.order.insuranceCoverage.claimNumber).toBe(mockResponse.data.insuranceCoverage.claimNumber);
+ });
+
+ it('should update insurance coverage from payment.insuranceCoverage when main insuranceCoverage does not exist', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ mockResponse.data.insuranceCoverage = null;
+ mockResponse.data.payment = {
+ insuranceCoverage: {
+ isVerified: true,
+ claimNumber: getRandomString(10, 10)
+ }
+ };
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.insuranceCoverage.coverageStatus).toBe(coverageStatuses.VERIFIED);
+ expect(store.order.insuranceCoverage.claimNumber).toBe(mockResponse.data.payment.insuranceCoverage.claimNumber);
+ });
+
+ it('should update vehicle registration license plate when policy vehicles exist and carId is present', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ store.order.policy.vehicles = [
+ { id: 1, vin: mockResponse.data.vehicle.vin }
+ ];
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.vehicle.registration.licensePlate).toBe(mockResponse.data.vehicle.licensePlateNumber);
+ });
+
+ it('should call lookupVehicleByVin and update vehicle when vin matches policy vehicle', async () => {
+ // Arrange
+ const mockVehicleLookupResponse = {
+ data: {
+ carId: getRandomInt(1000, 9999),
+ year: getRandomInt(2000, 2024).toString()
+ }
+ };
+ const policyVehicle = {
+ id: getRandomInt(1, 100),
+ vin: mockResponse.data.vehicle.vin,
+ deductible: 100,
+ repairWaived: false,
+ endorsements: ['OEM Approved']
+ };
+
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ store.order.policy.vehicles = [policyVehicle];
+
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+ store.lookupVehicleByVin = jest.fn().mockReturnValue(Promise.resolve(mockVehicleLookupResponse));
+ store.updateVehicle = jest.fn();
+ store.updateVehicleCoverage = jest.fn();
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.lookupVehicleByVin).toHaveBeenCalledWith(mockResponse.data.vehicle.vin);
+ expect(store.updateVehicle).toHaveBeenCalledWith({
+ ...mockVehicleLookupResponse.data,
+ policyVehicleId: policyVehicle.id,
+ vin: policyVehicle.vin
+ });
+ expect(store.updateVehicleCoverage).toHaveBeenCalled();
+ });
+
+ it('should not call lookupVehicleByVin when policy vehicles array is empty', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ store.order.policy.vehicles = [];
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+ store.lookupVehicleByVin = jest.fn();
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
+ });
+
+ it('should not call lookupVehicleByVin when carId is not present', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ store.order.policy.vehicles = [{ id: 1, vin: 'TEST123456789' }];
+ mockResponse.data.vehicle.carId = null;
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+ store.lookupVehicleByVin = jest.fn();
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
+ });
+
+ it('should not call lookupVehicleByVin when vin is not present', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.Deductible;
+ store.order.policy.vehicles = [{ id: 1, vin: 'TEST123456789' }];
+ mockResponse.data.vehicle.vin = null;
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+ store.lookupVehicleByVin = jest.fn();
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.lookupVehicleByVin).not.toHaveBeenCalled();
+ });
+
+ it('should not update insurance coverage when isPolicyLookupSuccessful is false', async () => {
+ // Arrange
+ store.order.insuranceCoverage.coverageType = coverageType.NONE; // Make isPolicyLookupSuccessful false
+ const originalCoverageStatus = store.order.insuranceCoverage.coverageStatus;
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.insuranceCoverage.coverageStatus).toBe(originalCoverageStatus);
+ });
+
+ it('should update referral information from response data', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.referralNumber).toBe(mockResponse.data.referralNumber);
+ expect(store.order.referralDate).toBe(mockResponse.data.referralDate);
+ expect(store.order.referralCorrelationId).toBe(mockResponse.data.referralCorrelationId);
+ expect(store.order.referralSequenceNumber).toBe(mockResponse.data.referralSequenceNumber);
+ expect(store.order.eon).toBe(mockResponse.data.eon);
+ });
+
+ it('should set loadedFromDupeCheck and loadedSessionClearedPreviousData flags', async () => {
+ // Arrange
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.loadedFromDupeCheck).toBe(true);
+ expect(store.order.loadedSessionClearedPreviousData).toBe(false);
+ });
+
+ it('should handle API error gracefully', async () => {
+ // Arrange
+ const error = new Error('API Error');
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.reject(error));
+
+ // Act & Assert
+ await expect(store.loadSession(mockDuplicate)).rejects.toThrow('API Error');
+ });
+
+ it('should handle missing optional fields in response data', async () => {
+ // Arrange
+ mockResponse.data.customer.address.streetAddress2 = undefined;
+ mockResponse.data.customer.alternativePhone = undefined;
+ globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(mockResponse));
+
+ // Act
+ await store.loadSession(mockDuplicate);
+
+ // Assert
+ expect(store.order.customer.address.streetAddress2).toBeUndefined();
+ expect(store.order.contactInfo.alternativePhone).toBeUndefined();
+ });
+ });
});