Merge pull request #1104 from Safelite/feature/digital/INSR-8549
INSR-8549 Fixed Zipcode 99546 causing all sorts of issues in NextGen
This commit is contained in:
commit
883d1980dc
8 changed files with 188 additions and 184 deletions
|
|
@ -32,9 +32,16 @@ export class Logger {
|
||||||
}
|
}
|
||||||
|
|
||||||
formatLogEntry(message, details) {
|
formatLogEntry(message, details) {
|
||||||
return `Application: ${applicationConfig.APPLICATION_NAME}\n${message}\n${
|
let json = '';
|
||||||
details ? JSON.stringify(details, undefined, 2) : ''
|
if (details) {
|
||||||
}`;
|
if (details instanceof Error) {
|
||||||
|
json = JSON.stringify(details, Object.getOwnPropertyNames(details), 2);
|
||||||
|
} else {
|
||||||
|
json = JSON.stringify(details, undefined, 2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return `Application: ${applicationConfig.APPLICATION_NAME} \n${message} \n${json}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
writeLogEntry(endpoint, logEntry) {
|
writeLogEntry(endpoint, logEntry) {
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
import { useMainStore } from '@/store';
|
import { useMainStore } from '@/store';
|
||||||
|
import { AppointmentTypeStrings } from '@/constants/schedule-constants';
|
||||||
|
import settleAllPromises from '@/helpers/layout-helper';
|
||||||
|
|
||||||
function processZipCodeResults(request) {
|
function processZipCodeResults(request) {
|
||||||
return request.then((serviceZipValidationResponse) => ({
|
return request.then((serviceZipValidationResponse) => ({
|
||||||
|
|
@ -29,7 +31,7 @@ export async function getPricedMobileFeePart(serviceZipCode) {
|
||||||
// Get the Mobile Fee Part
|
// Get the Mobile Fee Part
|
||||||
const mobileFeePart = await useMainStore().getMobileFeePart();
|
const mobileFeePart = await useMainStore().getMobileFeePart();
|
||||||
|
|
||||||
if (mobileFeePart.data == null || mobileFeePart.data === '') {
|
if (mobileFeePart?.data == null || mobileFeePart.data === '') {
|
||||||
return Promise.resolve(null);
|
return Promise.resolve(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -40,17 +42,6 @@ export async function getPricedMobileFeePart(serviceZipCode) {
|
||||||
return Promise.resolve(pricingResults[0]);
|
return Promise.resolve(pricingResults[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function getServiceabilityDetails(serviceZipCode, lineItems) {
|
|
||||||
const serviceabilityDetails = await useMainStore().getServiceabilityDetails(
|
|
||||||
{
|
|
||||||
serviceZipCode,
|
|
||||||
lineItems
|
|
||||||
},
|
|
||||||
false
|
|
||||||
);
|
|
||||||
return Promise.resolve(serviceabilityDetails);
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getAvailabilityRating(
|
export async function getAvailabilityRating(
|
||||||
startDate,
|
startDate,
|
||||||
endDate,
|
endDate,
|
||||||
|
|
@ -69,3 +60,45 @@ export async function getAvailabilityRating(
|
||||||
|
|
||||||
return Promise.resolve(shopStatus);
|
return Promise.resolve(shopStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getProviderData() {
|
||||||
|
const mainStore = useMainStore();
|
||||||
|
const storeServiceLocation = mainStore.order.serviceLocation;
|
||||||
|
const storeSelectedAppointmentType = storeServiceLocation?.appointmentType;
|
||||||
|
const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE
|
||||||
|
|| storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
|
||||||
|
const storeSelectedProvider = storeServiceLocation?.provider;
|
||||||
|
const serviceZipCode = storeServiceLocation?.zipCode || mainStore.order.customer.address.zipCode;
|
||||||
|
|
||||||
|
return { storeServiceLocation, isMobileAppointment, storeSelectedProvider, serviceZipCode }
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function onProviderChanged() {
|
||||||
|
const { isMobileAppointment, storeSelectedProvider, serviceZipCode } = getProviderData();
|
||||||
|
if (!storeSelectedProvider) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mainStore = useMainStore();
|
||||||
|
|
||||||
|
await mainStore.getBillToInfo(storeSelectedProvider.providerNumber);
|
||||||
|
const promiseResultMap = [
|
||||||
|
{
|
||||||
|
resultKey: 'glassFees',
|
||||||
|
promise: mainStore.getGlassFees()
|
||||||
|
.then(async (glassFees) => await mainStore.getCombinedQuote(glassFees.data))
|
||||||
|
.then(async (quotedGlassFees) => mainStore.updateGlassFees(quotedGlassFees))
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
if (isMobileAppointment && (mainStore.isNoComp || mainStore.isITAC)) {
|
||||||
|
promiseResultMap.push({
|
||||||
|
resultKey: 'priceMobileFee',
|
||||||
|
promise: getPricedMobileFeePart(serviceZipCode).then(mobileFee => mainStore.updateMobileFee(mobileFee))
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
mainStore.updateMobileFee(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
await settleAllPromises(promiseResultMap);
|
||||||
|
}
|
||||||
|
|
@ -89,9 +89,9 @@ import {
|
||||||
import settleAllPromises from '@/helpers/layout-helper';
|
import settleAllPromises from '@/helpers/layout-helper';
|
||||||
import showIssLoadingModal from '@/helpers/loading-modal-helper.js';
|
import showIssLoadingModal from '@/helpers/loading-modal-helper.js';
|
||||||
import {
|
import {
|
||||||
getPricedMobileFeePart,
|
getProviderData,
|
||||||
getServiceabilityDetails,
|
getZipCodeData,
|
||||||
getZipCodeData
|
onProviderChanged
|
||||||
} from '@/helpers/service-location-helper';
|
} from '@/helpers/service-location-helper';
|
||||||
import { Form } from 'vee-validate';
|
import { Form } from 'vee-validate';
|
||||||
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
import BaseFormMixin from '@/mixins/base-form-mixin.js';
|
||||||
|
|
@ -225,16 +225,9 @@ export default {
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
// Call APIs
|
// Call APIs
|
||||||
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
const cmsContentPromise = fetchCmsContentForPage(to.query.issPage);
|
||||||
const storeServiceLocation = useMainStore().order.serviceLocation;
|
const { isMobileAppointment, storeServiceLocation, storeSelectedProvider, serviceZipCode } = getProviderData();
|
||||||
const storeSelectedAppointmentType = storeServiceLocation?.appointmentType;
|
|
||||||
const isMobileAppointment = storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE
|
|
||||||
|| storeSelectedAppointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP;
|
|
||||||
const storeSelectedProvider = storeServiceLocation?.provider;
|
|
||||||
const serviceZipCode = storeServiceLocation?.zipCode || useMainStore().order.customer.address.zipCode;
|
|
||||||
const zipCodeData = getZipCodeData(serviceZipCode);
|
const zipCodeData = getZipCodeData(serviceZipCode);
|
||||||
const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode);
|
const serviceabilityDetailsPromise = useMainStore().getServiceabilityDetails(serviceZipCode);
|
||||||
const serviceabilityDetailsPromise = getServiceabilityDetails(serviceZipCode);
|
|
||||||
const getGlassFeesPromise = useMainStore().getGlassFees();
|
|
||||||
const providersPromise = useMainStore().getSafeliteProviders(serviceZipCode, 150);
|
const providersPromise = useMainStore().getSafeliteProviders(serviceZipCode, 150);
|
||||||
|
|
||||||
const premiumFeePromise = useMainStore().getMobilePremiumFee();
|
const premiumFeePromise = useMainStore().getMobilePremiumFee();
|
||||||
|
|
@ -251,14 +244,6 @@ export default {
|
||||||
resultKey: 'cmsContent',
|
resultKey: 'cmsContent',
|
||||||
promise: cmsContentPromise
|
promise: cmsContentPromise
|
||||||
},
|
},
|
||||||
{
|
|
||||||
resultKey: 'mobileFeePart',
|
|
||||||
promise: mobileFeePartPromise
|
|
||||||
},
|
|
||||||
{
|
|
||||||
resultKey: 'glassFees',
|
|
||||||
promise: getGlassFeesPromise
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
resultKey: 'serviceabilityDetails',
|
resultKey: 'serviceabilityDetails',
|
||||||
promise: serviceabilityDetailsPromise
|
promise: serviceabilityDetailsPromise
|
||||||
|
|
@ -271,6 +256,10 @@ export default {
|
||||||
resultKey: 'providers',
|
resultKey: 'providers',
|
||||||
promise: providersPromise
|
promise: providersPromise
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
resultKey: 'providerChanged',
|
||||||
|
promise: onProviderChanged()
|
||||||
|
},
|
||||||
{
|
{
|
||||||
resultKey: 'premiumFeeWithPrice',
|
resultKey: 'premiumFeeWithPrice',
|
||||||
promise: premiumFeeWithPricePromise
|
promise: premiumFeeWithPricePromise
|
||||||
|
|
@ -332,7 +321,6 @@ export default {
|
||||||
inShopDatesData: [],
|
inShopDatesData: [],
|
||||||
isMobileView: false,
|
isMobileView: false,
|
||||||
mobileDatesData: [],
|
mobileDatesData: [],
|
||||||
mobileFeePart: null,
|
|
||||||
mobilePremiumAppointmentFee: null,
|
mobilePremiumAppointmentFee: null,
|
||||||
mobileProviderNumber: null,
|
mobileProviderNumber: null,
|
||||||
selectableDatesData: [],
|
selectableDatesData: [],
|
||||||
|
|
@ -659,7 +647,9 @@ export default {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) {
|
mobileZipUpdatedFromServiceLocation(mobileZipServiceLocation) {
|
||||||
if (mobileZipServiceLocation) {
|
if (mobileZipServiceLocation
|
||||||
|
&& (this.mobileProviderNumber !== mobileZipServiceLocation.mobileProviderNumber
|
||||||
|
|| !this.hasNeededServiceLocationData)) {
|
||||||
this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber;
|
this.mobileProviderNumber = mobileZipServiceLocation.mobileProviderNumber;
|
||||||
this.selectedMobileZipCode = mobileZipServiceLocation.zipCode;
|
this.selectedMobileZipCode = mobileZipServiceLocation.zipCode;
|
||||||
this.selectedServiceLocation = mobileZipServiceLocation;
|
this.selectedServiceLocation = mobileZipServiceLocation;
|
||||||
|
|
@ -671,18 +661,15 @@ export default {
|
||||||
},
|
},
|
||||||
async providerChangedFromServiceLocation(newProvider) {
|
async providerChangedFromServiceLocation(newProvider) {
|
||||||
this.selectedProvider = newProvider?.provider;
|
this.selectedProvider = newProvider?.provider;
|
||||||
if (newProvider?.refreshDatePicker && newProvider.provider) {
|
if (newProvider?.provider) {
|
||||||
this.mainStore.updateServiceLocationProvider(newProvider.provider);
|
this.mainStore.updateServiceLocation(newProvider);
|
||||||
|
|
||||||
showIssLoadingModal(true);
|
showIssLoadingModal(true);
|
||||||
await this.mainStore.getBillToInfo(newProvider.provider?.providerNumber)
|
await onProviderChanged();
|
||||||
.then(() => {
|
if (newProvider.refreshDatePicker) {
|
||||||
this.refreshDatePicker();
|
await this.refreshDatePicker();
|
||||||
})
|
} else {
|
||||||
.catch(() => {
|
showIssLoadingModal(false);
|
||||||
console.warn('Error fetching bill to info...');
|
}
|
||||||
showIssLoadingModal(false);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async refreshDatePicker() {
|
async refreshDatePicker() {
|
||||||
|
|
@ -713,8 +700,7 @@ export default {
|
||||||
appointmentTypeToUse = AppointmentTypeStrings.DROP_OFF;
|
appointmentTypeToUse = AppointmentTypeStrings.DROP_OFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save service location then save schedule then navigate forward
|
this.mainStore.updateAppointmentType(appointmentTypeToUse);
|
||||||
await this.$refs.serviceLocation.forwardButtonAction(appointmentTypeToUse);
|
|
||||||
this.mainStore.saveSchedule(this.selectedTimeSlotInfo.timeSlot);
|
this.mainStore.saveSchedule(this.selectedTimeSlotInfo.timeSlot);
|
||||||
this.$router.navigate(
|
this.$router.navigate(
|
||||||
this.navigationScenarios.CLICKED_FORWARD,
|
this.navigationScenarios.CLICKED_FORWARD,
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,6 @@ import { useMainStore } from '@/store';
|
||||||
import {
|
import {
|
||||||
getMobileZipCodeData,
|
getMobileZipCodeData,
|
||||||
getPricedMobileFeePart,
|
getPricedMobileFeePart,
|
||||||
getServiceabilityDetails
|
|
||||||
} from '@/helpers/service-location-helper';
|
} from '@/helpers/service-location-helper';
|
||||||
import { deepClone } from '@/helpers/object-helper.js';
|
import { deepClone } from '@/helpers/object-helper.js';
|
||||||
import vehicleProtectedQuestion from '@/layouts/schedule-page/service-location/mobile-location-modal-question/vehicle-protected-question/vehicle-protected-question.vue';
|
import vehicleProtectedQuestion from '@/layouts/schedule-page/service-location/mobile-location-modal-question/vehicle-protected-question/vehicle-protected-question.vue';
|
||||||
|
|
@ -273,7 +272,7 @@ export default {
|
||||||
const mobileFeePart = await getPricedMobileFeePart(serviceZipCode);
|
const mobileFeePart = await getPricedMobileFeePart(serviceZipCode);
|
||||||
|
|
||||||
// retrieve serviceability details
|
// retrieve serviceability details
|
||||||
const serviceabilityDetails = await getServiceabilityDetails(serviceZipCode);
|
const serviceabilityDetails = await useMainStore().getServiceabilityDetails(serviceZipCode);
|
||||||
|
|
||||||
// update content related to service zip code
|
// update content related to service zip code
|
||||||
this.$emit('updated-mobile-fee-part', mobileFeePart);
|
this.$emit('updated-mobile-fee-part', mobileFeePart);
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,6 @@ const mockProviders = () => Promise.resolve([
|
||||||
jest.mock(
|
jest.mock(
|
||||||
'@/helpers/service-location-helper',
|
'@/helpers/service-location-helper',
|
||||||
() => ({
|
() => ({
|
||||||
getServiceabilityDetails: jest.fn((mockServiceZipCode) => mockGetServiceabilityDetails(mockServiceZipCode)),
|
|
||||||
getZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode)),
|
getZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode)),
|
||||||
getMobileZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode))
|
getMobileZipCodeData: jest.fn((mockServiceZipCode) => mockZipcodeData(mockServiceZipCode))
|
||||||
})
|
})
|
||||||
|
|
@ -147,6 +146,7 @@ function setupMocks({ appointmentType = AppointmentTypeStrings.IN_SHOP }) {
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
useMainStore().getSafeliteProviders = jest.fn().mockImplementation(() => mockProviders());
|
useMainStore().getSafeliteProviders = jest.fn().mockImplementation(() => mockProviders());
|
||||||
|
useMainStore().getServiceabilityDetails = jest.fn((mockServiceZipCode) => mockGetServiceabilityDetails(mockServiceZipCode));
|
||||||
const wrapper = mount(serviceLocation, mountOptions);
|
const wrapper = mount(serviceLocation, mountOptions);
|
||||||
|
|
||||||
wrapper.vm.$router.navigateWithSpinner = jest.fn();
|
wrapper.vm.$router.navigateWithSpinner = jest.fn();
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,6 @@ import errorMessages from '@/constants/error-messages';
|
||||||
import { useMainStore } from '@/store';
|
import { useMainStore } from '@/store';
|
||||||
import showIssLoadingModal from '@/helpers/loading-modal-helper.js';
|
import showIssLoadingModal from '@/helpers/loading-modal-helper.js';
|
||||||
import {
|
import {
|
||||||
getServiceabilityDetails,
|
|
||||||
getZipCodeData,
|
getZipCodeData,
|
||||||
getMobileZipCodeData
|
getMobileZipCodeData
|
||||||
} from '@/helpers/service-location-helper';
|
} from '@/helpers/service-location-helper';
|
||||||
|
|
@ -183,7 +182,6 @@ export default {
|
||||||
isRecalibrationServiceableMobile: null,
|
isRecalibrationServiceableMobile: null,
|
||||||
selectedAppointmentType: this.getSelectedAppointmentType(),
|
selectedAppointmentType: this.getSelectedAppointmentType(),
|
||||||
selectedProvider: this.getSelectedProvider(),
|
selectedProvider: this.getSelectedProvider(),
|
||||||
mobileFeePart: null,
|
|
||||||
mobileProviderNumber: null,
|
mobileProviderNumber: null,
|
||||||
zipContainsMilitaryBase: false,
|
zipContainsMilitaryBase: false,
|
||||||
zipCodeCtu: null,
|
zipCodeCtu: null,
|
||||||
|
|
@ -233,8 +231,8 @@ export default {
|
||||||
},
|
},
|
||||||
isInshop() {
|
isInshop() {
|
||||||
return (
|
return (
|
||||||
this.selectedAppointmentType === 'Inshop'
|
this.selectedAppointmentType === AppointmentTypeStrings.IN_SHOP
|
||||||
|| this.selectedAppointmentType === 'Dropoff'
|
|| this.selectedAppointmentType === AppointmentTypeStrings.DROP_OFF
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
isMobile() {
|
isMobile() {
|
||||||
|
|
@ -317,7 +315,7 @@ export default {
|
||||||
},
|
},
|
||||||
selectedAppointmentType(newValue, oldValue) {
|
selectedAppointmentType(newValue, oldValue) {
|
||||||
if (this.isInshop && this.selectedProvider && this.availabilityRating === null) {
|
if (this.isInshop && this.selectedProvider && this.availabilityRating === null) {
|
||||||
const appointmenTypeServiceLocationObj = {
|
const appointmentTypeServiceLocationObj = {
|
||||||
appointmentType: newValue,
|
appointmentType: newValue,
|
||||||
mobileProviderNumber: null,
|
mobileProviderNumber: null,
|
||||||
provider: this.selectedProvider,
|
provider: this.selectedProvider,
|
||||||
|
|
@ -326,9 +324,9 @@ export default {
|
||||||
zipCode: this.zipCode,
|
zipCode: this.zipCode,
|
||||||
zipCodeCtu: this.zipCodeCtu
|
zipCodeCtu: this.zipCodeCtu
|
||||||
};
|
};
|
||||||
this.$emit('appointment-type-changed', appointmenTypeServiceLocationObj);
|
this.$emit('appointment-type-changed', appointmentTypeServiceLocationObj);
|
||||||
} else {
|
} else {
|
||||||
const appointmenTypeServiceLocationObj = {
|
const appointmentTypeServiceLocationObj = {
|
||||||
appointmentType: newValue,
|
appointmentType: newValue,
|
||||||
mobileProviderNumber: this.mobileProviderNumber,
|
mobileProviderNumber: this.mobileProviderNumber,
|
||||||
provider: null,
|
provider: null,
|
||||||
|
|
@ -337,20 +335,31 @@ export default {
|
||||||
zipCode: this.zipCode,
|
zipCode: this.zipCode,
|
||||||
zipCodeCtu: this.zipCodeCtu
|
zipCodeCtu: this.zipCodeCtu
|
||||||
};
|
};
|
||||||
this.$emit('appointment-type-changed', appointmenTypeServiceLocationObj);
|
this.$emit('appointment-type-changed', appointmentTypeServiceLocationObj);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
selectedProvider(newProvider, oldProvider) {
|
selectedProvider(newProvider, oldProvider) {
|
||||||
if (newProvider?.providerNumber !== oldProvider?.providerNumber || this.availabilityRating === null) {
|
if (newProvider?.providerNumber !== oldProvider?.providerNumber) {
|
||||||
const appointmentIsInshop = this.isInshop;
|
const appointmentIsInshop = this.isInshop;
|
||||||
const returnedProvider = {
|
const returnedProvider = {
|
||||||
provider: newProvider,
|
refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null,
|
||||||
refreshDatePicker: appointmentIsInshop && oldProvider?.providerNumber !== null
|
state: this.state,
|
||||||
|
zipCode: this.zipCode,
|
||||||
|
zipCodeCtu: this.zipCodeCtu,
|
||||||
|
appointmentType: this.selectedAppointmentType,
|
||||||
|
provider: !this.isMobile ? newProvider : {
|
||||||
|
providerNumber: this.mobileProviderNumber,
|
||||||
|
address: {
|
||||||
|
streetAddress: null,
|
||||||
|
city: null,
|
||||||
|
state: null,
|
||||||
|
zipCode: null,
|
||||||
|
zipCodeCtu: null
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (newProvider?.providerNumber !== oldProvider?.providerNumber) {
|
this.$emit('provider-changed', returnedProvider);
|
||||||
this.$emit('provider-changed', returnedProvider);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -360,34 +369,6 @@ export default {
|
||||||
await this.setData(initialData);
|
await this.setData(initialData);
|
||||||
this.initializingData = false;
|
this.initializingData = false;
|
||||||
},
|
},
|
||||||
async forwardButtonAction(appointmentType) {
|
|
||||||
let provider = this.selectedProvider;
|
|
||||||
this.mainStore.updateMobileFee(null);
|
|
||||||
if (this.isMobile) {
|
|
||||||
if (this.mainStore.isNoComp || this.mainStore.isITAC) {
|
|
||||||
this.mainStore.updateMobileFee(this.mobileFeePart);
|
|
||||||
}
|
|
||||||
|
|
||||||
provider = {
|
|
||||||
providerNumber: this.mobileProviderNumber,
|
|
||||||
address: {
|
|
||||||
streetAddress: null,
|
|
||||||
city: null,
|
|
||||||
state: null,
|
|
||||||
zipCode: null,
|
|
||||||
zipCodeCtu: null
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
this.mainStore.saveServiceLocation({
|
|
||||||
state: this.state,
|
|
||||||
zipCode: this.zipCode,
|
|
||||||
zipCodeCtu: this.zipCodeCtu,
|
|
||||||
appointmentType: appointmentType || this.selectedAppointmentType,
|
|
||||||
provider
|
|
||||||
});
|
|
||||||
},
|
|
||||||
openModalAction(modalName) {
|
openModalAction(modalName) {
|
||||||
this.$refs[modalName].openModal();
|
this.$refs[modalName].openModal();
|
||||||
},
|
},
|
||||||
|
|
@ -427,7 +408,7 @@ export default {
|
||||||
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
||||||
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
||||||
|
|
||||||
const serviceabilityDetailsPromise = getServiceabilityDetails(this.zipCode);
|
const serviceabilityDetailsPromise = this.mainStore.getServiceabilityDetails(this.zipCode);
|
||||||
await serviceabilityDetailsPromise.then((result) => {
|
await serviceabilityDetailsPromise.then((result) => {
|
||||||
const details = result.data;
|
const details = result.data;
|
||||||
if (details) {
|
if (details) {
|
||||||
|
|
@ -465,10 +446,6 @@ export default {
|
||||||
this.setServiceabilityDetails(initialData.serviceabilityDetails);
|
this.setServiceabilityDetails(initialData.serviceabilityDetails);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initialData.mobileFeePart) {
|
|
||||||
this.mobileFeePart = initialData.mobileFeePart;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (initialData.providers) {
|
if (initialData.providers) {
|
||||||
this.setMobileProviderNumber(initialData.providers.mobileProviderNumber);
|
this.setMobileProviderNumber(initialData.providers.mobileProviderNumber);
|
||||||
let foundMatch = false;
|
let foundMatch = false;
|
||||||
|
|
@ -485,22 +462,12 @@ export default {
|
||||||
this.selectedProvider = null;
|
this.selectedProvider = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initialData.glassFees) {
|
|
||||||
useMainStore().getCombinedQuote(initialData.glassFees)
|
|
||||||
.then((combinedQuote) => {
|
|
||||||
this.setGlassFeeItems(combinedQuote);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
setContainsMilitaryBase(val) {
|
setContainsMilitaryBase(val) {
|
||||||
if (this.zipContainsMilitaryBase !== val) {
|
if (this.zipContainsMilitaryBase !== val) {
|
||||||
this.zipContainsMilitaryBase = val;
|
this.zipContainsMilitaryBase = val;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
setGlassFeeItems(newGlassFeeItems) {
|
|
||||||
this.mainStore.updateGlassFees(newGlassFeeItems);
|
|
||||||
},
|
|
||||||
setMobileProviderNumber(providerNumber) {
|
setMobileProviderNumber(providerNumber) {
|
||||||
this.mobileProviderNumber = providerNumber;
|
this.mobileProviderNumber = providerNumber;
|
||||||
},
|
},
|
||||||
|
|
@ -531,7 +498,7 @@ export default {
|
||||||
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
this.setCtuForMobile(zipCodeData.zipCodeCtu);
|
||||||
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
this.setContainsMilitaryBase(zipCodeData.containsMilitaryBase);
|
||||||
|
|
||||||
const serviceabilityDetailsPromise = getServiceabilityDetails(this.mobileZipCode);
|
const serviceabilityDetailsPromise = this.mainStore.getServiceabilityDetails(this.mobileZipCode);
|
||||||
await serviceabilityDetailsPromise.then((result) => {
|
await serviceabilityDetailsPromise.then((result) => {
|
||||||
const details = result.data;
|
const details = result.data;
|
||||||
if (details) {
|
if (details) {
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,6 @@ export default {
|
||||||
}
|
}
|
||||||
|
|
||||||
const promises = [
|
const promises = [
|
||||||
// Suppress error from API call we can try again later in the flow
|
|
||||||
this.mainStore.getBillToInfo()
|
this.mainStore.getBillToInfo()
|
||||||
];
|
];
|
||||||
// Skip duplicate check if loaded from cookie or already visited duplicate check page.
|
// Skip duplicate check if loaded from cookie or already visited duplicate check page.
|
||||||
|
|
|
||||||
|
|
@ -873,6 +873,10 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
getMobileTimeSlots(startDate, endDate, zipCodeOverride = null) {
|
getMobileTimeSlots(startDate, endDate, zipCodeOverride = null) {
|
||||||
const { order } = this;
|
const { order } = this;
|
||||||
|
if (!this.billToAccountNumber) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const { vehicle } = this.order;
|
const { vehicle } = this.order;
|
||||||
let lineItems = [
|
let lineItems = [
|
||||||
...(order.lineItems.supportingItems ?? []),
|
...(order.lineItems.supportingItems ?? []),
|
||||||
|
|
@ -928,6 +932,9 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
getShopTimeSlots(startDate, endDate, shopAppointmentType, providerNumber) {
|
getShopTimeSlots(startDate, endDate, shopAppointmentType, providerNumber) {
|
||||||
const { order } = this;
|
const { order } = this;
|
||||||
|
if (!this.billToAccountNumber || !providerNumber) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
const { vehicle } = this.order;
|
const { vehicle } = this.order;
|
||||||
|
|
||||||
let lineItems = [
|
let lineItems = [
|
||||||
|
|
@ -1125,6 +1132,10 @@ export const useMainStore = defineStore({
|
||||||
const providerToUse = provider?.providerNumber ?? defaultProviderNumber;
|
const providerToUse = provider?.providerNumber ?? defaultProviderNumber;
|
||||||
const partNumberListQueryString = getPartNumbersListForQueryString(glassParts, 'PartNumbers');
|
const partNumberListQueryString = getPartNumbersListForQueryString(glassParts, 'PartNumbers');
|
||||||
|
|
||||||
|
if (!this.billToAccountNumber || !providerToUse) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
serviceType: damageType,
|
serviceType: damageType,
|
||||||
facilityType,
|
facilityType,
|
||||||
|
|
@ -1242,62 +1253,74 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
|
|
||||||
async getCombinedQuote(availableLineItems) {
|
async getCombinedQuote(availableLineItems) {
|
||||||
if (availableLineItems && availableLineItems.length > 0) {
|
if (!availableLineItems || availableLineItems.length === 0) {
|
||||||
const { vehicle, serviceLocation, policy, eon, referralNumber, referralDate, referralSequenceNumber, lineItems } = this.order;
|
return [];
|
||||||
|
|
||||||
const availableLineItemsFiltered = availableLineItems.filter((lineItem) => !!(lineItem.partNumber));
|
|
||||||
|
|
||||||
const lineItemsWithOnlyPartNumbers = availableLineItemsFiltered.map((lineItem) => ({ partNumber: lineItem.partNumber }));
|
|
||||||
|
|
||||||
const payload = {
|
|
||||||
ParentAccountNumber: this.order.parentAccountNumber,
|
|
||||||
BillToAccountNumber: this.billToAccountNumber,
|
|
||||||
ProviderNumber: this.providerNumber,
|
|
||||||
CarId: vehicle.carId,
|
|
||||||
Make: vehicle.make,
|
|
||||||
Model: vehicle.model,
|
|
||||||
Year: vehicle.year,
|
|
||||||
EON: eon,
|
|
||||||
ZipCode: policy.policyZipCode,
|
|
||||||
State: this.order.customer.address.state,
|
|
||||||
ReferralNumber: referralNumber,
|
|
||||||
ReferralDate: referralDate,
|
|
||||||
ReferralSequenceNumber: referralSequenceNumber,
|
|
||||||
ServiceZipCode: serviceLocation.zipCode,
|
|
||||||
IsReplacement: !this.isRepair,
|
|
||||||
ServerData: lineItems.serverData,
|
|
||||||
LineItems: lineItemsWithOnlyPartNumbers,
|
|
||||||
FeatureToggles: getFeatureTogglesPayloadObject(this.experimentSettings)
|
|
||||||
};
|
|
||||||
|
|
||||||
const response = await globalMethods
|
|
||||||
.callHttpClient({
|
|
||||||
method: endpoints.GetCombinedQuote.method,
|
|
||||||
endpoint: endpoints.GetCombinedQuote.url,
|
|
||||||
payload
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
console.error(error);
|
|
||||||
return [];
|
|
||||||
});
|
|
||||||
|
|
||||||
const { lineItems: pricedLinedItems, serverData } = response.data;
|
|
||||||
|
|
||||||
if (serverData) {
|
|
||||||
this.order.lineItems.serverData = serverData;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pricedLinedItems) {
|
|
||||||
return addPricesToLineItems(availableLineItems, pricedLinedItems);
|
|
||||||
}
|
|
||||||
return availableLineItems;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
const {
|
||||||
|
vehicle,
|
||||||
|
serviceLocation,
|
||||||
|
policy,
|
||||||
|
eon,
|
||||||
|
referralNumber,
|
||||||
|
referralDate,
|
||||||
|
referralSequenceNumber,
|
||||||
|
lineItems
|
||||||
|
} = this.order;
|
||||||
|
|
||||||
|
const availableLineItemsFiltered = availableLineItems.filter((lineItem) => !!(lineItem.partNumber));
|
||||||
|
|
||||||
|
const lineItemsWithOnlyPartNumbers = availableLineItemsFiltered.map((lineItem) => ({ partNumber: lineItem.partNumber }));
|
||||||
|
|
||||||
|
const payload = {
|
||||||
|
ParentAccountNumber: this.order.parentAccountNumber,
|
||||||
|
BillToAccountNumber: this.billToAccountNumber,
|
||||||
|
ProviderNumber: this.providerNumber,
|
||||||
|
CarId: vehicle.carId,
|
||||||
|
Make: vehicle.make,
|
||||||
|
Model: vehicle.model,
|
||||||
|
Year: vehicle.year,
|
||||||
|
EON: eon,
|
||||||
|
ZipCode: policy.policyZipCode,
|
||||||
|
State: this.order.customer.address.state,
|
||||||
|
ReferralNumber: referralNumber,
|
||||||
|
ReferralDate: referralDate,
|
||||||
|
ReferralSequenceNumber: referralSequenceNumber,
|
||||||
|
ServiceZipCode: serviceLocation.zipCode,
|
||||||
|
IsReplacement: !this.isRepair,
|
||||||
|
ServerData: lineItems.serverData,
|
||||||
|
LineItems: lineItemsWithOnlyPartNumbers,
|
||||||
|
FeatureToggles: getFeatureTogglesPayloadObject(this.experimentSettings)
|
||||||
|
};
|
||||||
|
|
||||||
|
const response = await globalMethods
|
||||||
|
.callHttpClient({
|
||||||
|
method: endpoints.GetCombinedQuote.method,
|
||||||
|
endpoint: endpoints.GetCombinedQuote.url,
|
||||||
|
payload
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error(error);
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
|
||||||
|
const { lineItems: pricedLinedItems, serverData } = response.data;
|
||||||
|
|
||||||
|
if (serverData) {
|
||||||
|
this.order.lineItems.serverData = serverData;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pricedLinedItems) {
|
||||||
|
return addPricesToLineItems(availableLineItems, pricedLinedItems);
|
||||||
|
}
|
||||||
|
return availableLineItems;
|
||||||
},
|
},
|
||||||
|
|
||||||
getMobileFeePart() {
|
getMobileFeePart() {
|
||||||
const { vehicle, insuranceCoverage } = this.order;
|
const { vehicle, insuranceCoverage } = this.order;
|
||||||
|
if (!this.billToAccountNumber || !this.providerNumber) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
serviceType: this.damage.isRepair ? 'Repair' : 'Install',
|
serviceType: this.damage.isRepair ? 'Repair' : 'Install',
|
||||||
|
|
@ -1317,7 +1340,7 @@ export const useMainStore = defineStore({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
getServiceabilityDetails({ serviceZipCode }) {
|
getServiceabilityDetails(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);
|
||||||
|
|
@ -1819,23 +1842,12 @@ export const useMainStore = defineStore({
|
||||||
this.order.serviceLocation.zipCodeCtu = serviceLocationInfo.zipCodeCtu ?? this.order.serviceLocation.zipCodeCtu;
|
this.order.serviceLocation.zipCodeCtu = serviceLocationInfo.zipCodeCtu ?? this.order.serviceLocation.zipCodeCtu;
|
||||||
this.order.serviceLocation.appointmentType = serviceLocationInfo.appointmentType ?? this.order.serviceLocation.appointmentType;
|
this.order.serviceLocation.appointmentType = serviceLocationInfo.appointmentType ?? this.order.serviceLocation.appointmentType;
|
||||||
this.order.serviceLocation.isVehicleProtected = serviceLocationInfo.isVehicleProtected ?? this.order.serviceLocation.isVehicleProtected;
|
this.order.serviceLocation.isVehicleProtected = serviceLocationInfo.isVehicleProtected ?? this.order.serviceLocation.isVehicleProtected;
|
||||||
|
this.updateServiceLocationProvider(serviceLocationInfo.provider)
|
||||||
if (serviceLocationInfo.provider) {
|
|
||||||
this.order.serviceLocation.provider = {
|
|
||||||
providerNumber: serviceLocationInfo.provider?.providerNumber,
|
|
||||||
address: {
|
|
||||||
streetAddress: serviceLocationInfo.provider?.address?.streetAddress,
|
|
||||||
city: serviceLocationInfo.provider?.address?.city,
|
|
||||||
state: serviceLocationInfo.provider?.address?.state,
|
|
||||||
zipCode: serviceLocationInfo.provider?.address?.zipCode,
|
|
||||||
zipCodeCtu: serviceLocationInfo.provider?.address?.zipCodeCtu
|
|
||||||
},
|
|
||||||
companyName: serviceLocationInfo.provider?.companyName,
|
|
||||||
phoneNumber: serviceLocationInfo.provider?.phoneNumber
|
|
||||||
};
|
|
||||||
}
|
|
||||||
this.order.serviceLocation.tpaSearchRadius = serviceLocationInfo.tpaSearchRadius;
|
this.order.serviceLocation.tpaSearchRadius = serviceLocationInfo.tpaSearchRadius;
|
||||||
},
|
},
|
||||||
|
updateAppointmentType(appointmentType) {
|
||||||
|
this.order.serviceLocation.appointmentType = appointmentType;
|
||||||
|
},
|
||||||
updateServiceLocationProvider(providerInfo) {
|
updateServiceLocationProvider(providerInfo) {
|
||||||
this.order.serviceLocation.provider = {
|
this.order.serviceLocation.provider = {
|
||||||
providerNumber: providerInfo?.providerNumber,
|
providerNumber: providerInfo?.providerNumber,
|
||||||
|
|
@ -2687,10 +2699,15 @@ export const useMainStore = defineStore({
|
||||||
},
|
},
|
||||||
|
|
||||||
async getBillToInfo(componentProviderNumber = null) {
|
async getBillToInfo(componentProviderNumber = null) {
|
||||||
|
const providerNumber = componentProviderNumber || this.providerNumber;
|
||||||
|
if (!providerNumber) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const { order, issConfig } = this;
|
const { order, issConfig } = this;
|
||||||
const params = new URLSearchParams({
|
const params = new URLSearchParams({
|
||||||
parentAccountNumber: order.parentAccountNumber.toString(),
|
parentAccountNumber: order.parentAccountNumber.toString(),
|
||||||
providerNumber: componentProviderNumber || this.providerNumber,
|
providerNumber,
|
||||||
typeOfClaim: 'GLASS ONLY',
|
typeOfClaim: 'GLASS ONLY',
|
||||||
lineOfBusiness: 'PERSONAL',
|
lineOfBusiness: 'PERSONAL',
|
||||||
isItac: this.isITAC
|
isItac: this.isITAC
|
||||||
|
|
@ -2727,10 +2744,6 @@ export const useMainStore = defineStore({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
saveServiceLocation(serviceLocationInfo) {
|
|
||||||
this.updateServiceLocation(serviceLocationInfo);
|
|
||||||
},
|
|
||||||
|
|
||||||
saveRegistrationAddressLookup({ isSelectedGlassAvailableForVehicle, vehicleInfo, registrationInfo }) {
|
saveRegistrationAddressLookup({ isSelectedGlassAvailableForVehicle, vehicleInfo, registrationInfo }) {
|
||||||
// Reset dependent state when changing
|
// Reset dependent state when changing
|
||||||
if
|
if
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue