Merge pull request #3163 from Safelite/rlsmerge/2026.05.07-to-develop

Rlsmerge/2026.05.07 to develop
This commit is contained in:
CarlNation 2026-05-04 11:30:25 -04:00 committed by GitHub
commit 7e7ba9b13e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
21 changed files with 94 additions and 10 deletions

View file

@ -25,7 +25,7 @@ const endpoints = {
method: "GET", method: "GET",
}, },
GetDamageOptions: { GetDamageOptions: {
url: "/parts/api/v1/parts/damage-options", url: "/parts/api/v2/parts/damage-options",
method: "GET", method: "GET",
}, },
LookupVehicleByYmms: { LookupVehicleByYmms: {
@ -141,7 +141,7 @@ const endpoints = {
method: "POST", method: "POST",
}, },
ValidateZip: { ValidateZip: {
url: "/location/api/v1/location/zip", url: "/location/api/v2/location/zip",
method: "GET", method: "GET",
}, },
PriceOrderItems: { PriceOrderItems: {

View file

@ -962,7 +962,8 @@ export default {
return this.supportingItems.find( return this.supportingItems.find(
(lineItem) => (lineItem) =>
lineItem.partType == partTypeStrings.MOBILE_FEE && lineItem.partType == partTypeStrings.MOBILE_FEE &&
lineItem.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE (lineItem.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE ||
lineItem.partNumber == partNumberStrings.MOBILE_DUAL_RECAL_FEE)
); );
}, },
msrFeeCartItem() { msrFeeCartItem() {

View file

@ -103,7 +103,7 @@ export function getSideDoorGlassString(glassLocation, glassName) {
export function getDamageInfoWordingText(damageInfo) { export function getDamageInfoWordingText(damageInfo) {
const glassTextArray = []; const glassTextArray = [];
damageInfo.glassToReplace.forEach((item) => { damageInfo.glassToReplace?.forEach((item) => {
let string = ""; let string = "";
if (item.glassLocation === glassLocations.WINDSHIELD) { if (item.glassLocation === glassLocations.WINDSHIELD) {
string = item.glassLocation; string = item.glassLocation;

View file

@ -108,7 +108,9 @@ export async function getPricingByDayPartWithPrice(pageNameToLog) {
export function getMSRFeePartPrice(supportingItems, includeTax) { export function getMSRFeePartPrice(supportingItems, includeTax) {
let msrFeePrice = 0; let msrFeePrice = 0;
const msrFeeLineItem = supportingItems?.find( const msrFeeLineItem = supportingItems?.find(
(lineItem) => lineItem.partNumber === partNumberStrings.MOBILE_STATIC_RECAL_FEE (lineItem) =>
lineItem.partNumber === partNumberStrings.MOBILE_STATIC_RECAL_FEE ||
lineItem.partNumber === partNumberStrings.MOBILE_DUAL_RECAL_FEE
); );
if (msrFeeLineItem) { if (msrFeeLineItem) {
msrFeePrice = baseMixin?.methods?.getTotalPriceOfAllLineItemsAndChildParts( msrFeePrice = baseMixin?.methods?.getTotalPriceOfAllLineItemsAndChildParts(

View file

@ -421,6 +421,7 @@ export default {
state: resultMap.serviceZipValidationResponse.state, state: resultMap.serviceZipValidationResponse.state,
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
zipCodeCtu: resultMap.serviceZipValidationResponse.zipCodeCtu, zipCodeCtu: resultMap.serviceZipValidationResponse.zipCodeCtu,
providerNumber: resultMap.serviceZipValidationResponse.providerNumber,
}, },
false false
); );

View file

@ -73,6 +73,8 @@ export default {
zipCode: store.getters.externalParameterServiceZip.zipCode, zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null, state: null,
zipCodeCtu: null, zipCodeCtu: null,
providerNumber:
store.getters.externalParameterServiceZip.providerNumber,
}, },
false false
); );

View file

@ -360,6 +360,7 @@ export default {
state: resultMap.serviceZipValidationResponse.state, state: resultMap.serviceZipValidationResponse.state,
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
zipCodeCtu: resultMap.serviceZipValidationResponse.zipCodeCtu, zipCodeCtu: resultMap.serviceZipValidationResponse.zipCodeCtu,
providerNumber: resultMap.serviceZipValidationResponse.providerNumber,
}, },
false false
); );

View file

@ -73,6 +73,8 @@ export default {
zipCode: store.getters.externalParameterServiceZip.zipCode, zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null, state: null,
zipCodeCtu: null, zipCodeCtu: null,
providerNumber:
store.getters.externalParameterServiceZip.providerNumber,
}, },
false false
); );

View file

@ -75,6 +75,8 @@ export default {
zipCode: store.getters.externalParameterServiceZip.zipCode, zipCode: store.getters.externalParameterServiceZip.zipCode,
state: serviceState ?? null, state: serviceState ?? null,
zipCodeCtu: serviceZipCtu ?? null, zipCodeCtu: serviceZipCtu ?? null,
providerNumber:
store.getters.externalParameterServiceZip.providerNumber,
}, },
false false
); );

View file

@ -35,6 +35,7 @@
:insuranceCompanyName="insuranceCompanyName" :insuranceCompanyName="insuranceCompanyName"
:showInsuranceCoverageAs="showInsuranceCoverageAs" :showInsuranceCoverageAs="showInsuranceCoverageAs"
:isMSRFeeApplicable="isMSRFeeApplicable" :isMSRFeeApplicable="isMSRFeeApplicable"
:IsMSRFeeCoveredByInsurance="isMSRFeeCoveredByInsurance"
:isItac="isItac" :isItac="isItac"
:isNoComp="isNoComp" :isNoComp="isNoComp"
:isCollapsible="false" /> :isCollapsible="false" />
@ -77,6 +78,7 @@ import { createAdyenCheckout } from "@/helpers/adyen-helper";
import { Dropin } from "@adyen/adyen-web/auto"; import { Dropin } from "@adyen/adyen-web/auto";
import { applicationConfig } from "@/constants/application-config"; import { applicationConfig } from "@/constants/application-config";
import { paymentMethods } from "@/constants/payment-method-constants"; import { paymentMethods } from "@/constants/payment-method-constants";
import analyticsMixin from "@/mixins/analytics-mixin";
import "@adyen/adyen-web/styles/adyen.css"; import "@adyen/adyen-web/styles/adyen.css";
import { mapAdyenToFmgPaymentMethod, mapFmgToAdyenPaymentMethod } from "../../helpers/adyen-helper"; import { mapAdyenToFmgPaymentMethod, mapFmgToAdyenPaymentMethod } from "../../helpers/adyen-helper";
@ -133,6 +135,25 @@ export default {
}, },
methods: { methods: {
async initializeAdyenWithErrorHandling() {
try {
await this.initializeAdyen();
} catch (error) {
console.error("Failed to initialize Adyen payment:", error);
const errorJson = JSON.stringify(error, Object.getOwnPropertyNames(Object(error)));
analyticsMixin.methods.pushFmgSessionData(errorJson);
await global.$logger.logError(errorJson);
this.$router.navigateWithoutSaving(
this.navigationScenarios.PIA_ERROR,
this.pageName
);
return;
}
},
async backButtonAction() { async backButtonAction() {
// Stub, for navigating back via nav-bar. // Stub, for navigating back via nav-bar.
this.$router.navigateWithoutSaving( this.$router.navigateWithoutSaving(
@ -203,6 +224,12 @@ export default {
}, },
onError: (error, component) => { onError: (error, component) => {
console.log(`Error from Adyen`); console.log(`Error from Adyen`);
const errorJson = JSON.stringify(
error,
Object.getOwnPropertyNames(Object(error))
);
analyticsMixin.methods.pushFmgSessionData(errorJson);
this.handleError(error); this.handleError(error);
}, },
}, },
@ -371,7 +398,12 @@ export default {
await global.$logger.logError(stringToLog); await global.$logger.logError(stringToLog);
this.hasPaymentFailureError = true; this.$router.navigateWithoutSaving(
this.navigationScenarios.PIA_ERROR,
this.pageName
);
return;
} }
this.dropinComponent?.update(); this.dropinComponent?.update();
@ -560,13 +592,16 @@ export default {
isMSRFeeApplicable() { isMSRFeeApplicable() {
return this.$store.getters.order.isMSRFeeApplicable; return this.$store.getters.order.isMSRFeeApplicable;
}, },
isMSRFeeCoveredByInsurance() {
return this.$store.getters.order.isMSRFeeCoveredByInsurance;
},
lineItems() { lineItems() {
return deepClone(this.$store.getters.lineItems); return deepClone(this.$store.getters.lineItems);
}, },
}, },
mounted() { mounted() {
this.initializeAdyen(); this.initializeAdyenWithErrorHandling();
}, },
components: { components: {

View file

@ -47,6 +47,7 @@ import { Form } from "vee-validate";
import { getFunnelCookie } from "@/helpers/heritage-integration/cookie-helper"; import { getFunnelCookie } from "@/helpers/heritage-integration/cookie-helper";
import { deleteFunnelCookie } from "@/helpers/heritage-integration/cookie-helper"; import { deleteFunnelCookie } from "@/helpers/heritage-integration/cookie-helper";
import { storeActions } from "@/constants/store-actions"; import { storeActions } from "@/constants/store-actions";
import baseMixin from "@/mixins/base-mixin";
export default { export default {
name: "return-user", name: "return-user",
@ -74,6 +75,13 @@ export default {
startOverImage: null, startOverImage: null,
}; };
}, },
mounted() {
// The global baseMixin.mounted() skips hiding the loading modal when
// external-parameter state is active, but those parameters have no
// consumer on this interstitial. Clear that state and ensure the loader
// is hidden so the user can never get stuck behind it on this page.
baseMixin.methods.ResetExternalParamsAndHideModal();
},
methods: { methods: {
arePagePrerequisitesValid() { arePagePrerequisitesValid() {
return getFunnelCookie() !== null; return getFunnelCookie() !== null;

View file

@ -706,10 +706,16 @@ export default {
isMobileStaticRecalibrationApplicable() { isMobileStaticRecalibrationApplicable() {
return ( return (
this.displayMSR && this.displayMSR &&
this.mobileFeePart?.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE && this.isMSRFeePartNumber &&
(this.enableMSRSplitPay || this.isCashItacNoComp || this.mobileFeePart?.isInsurable) (this.enableMSRSplitPay || this.isCashItacNoComp || this.mobileFeePart?.isInsurable)
); );
}, },
isMSRFeePartNumber() {
return (
this.mobileFeePart?.partNumber === partNumberStrings.MOBILE_STATIC_RECAL_FEE ||
this.mobileFeePart?.partNumber === partNumberStrings.MOBILE_DUAL_RECAL_FEE
);
},
displayMSR() { displayMSR() {
return ( return (
experimentMixin.methods experimentMixin.methods
@ -1804,6 +1810,7 @@ export default {
zipCode: newZipCode.zipCode, zipCode: newZipCode.zipCode,
state: newZipCode.state, state: newZipCode.state,
zipCodeCtu: newZipCode.zipCodeCtu, zipCodeCtu: newZipCode.zipCodeCtu,
providerNumber: newZipCode.providerNumber,
}, },
false false
); );

View file

@ -135,6 +135,8 @@ export default {
zipCode: store.getters.externalParameterServiceZip.zipCode, zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null, state: null,
zipCodeCtu: null, zipCodeCtu: null,
providerNumber:
store.getters.externalParameterServiceZip.providerNumber,
}, },
false false
); );
@ -246,6 +248,7 @@ export default {
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
state: zipCodeData.state, state: zipCodeData.state,
zipCodeCtu: zipCodeData.zipCodeCtu, zipCodeCtu: zipCodeData.zipCodeCtu,
providerNumber: zipCodeData.providerNumber,
}, },
false false
); );

View file

@ -184,6 +184,8 @@ export default {
zipCode: store.getters.externalParameterServiceZip.zipCode, zipCode: store.getters.externalParameterServiceZip.zipCode,
state: null, state: null,
zipCodeCtu: null, zipCodeCtu: null,
providerNumber:
store.getters.externalParameterServiceZip.providerNumber,
}, },
false false
); );

View file

@ -525,6 +525,7 @@ export default {
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
state: zipCodeData.state, state: zipCodeData.state,
zipCodeCtu: zipCodeData.zipCodeCtu, zipCodeCtu: zipCodeData.zipCodeCtu,
providerNumber: zipCodeData.providerNumber,
}, },
false false
); );

View file

@ -380,6 +380,7 @@ export default {
state: resultMap.zipCodeData.state, state: resultMap.zipCodeData.state,
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
zipCodeCtu: resultMap.zipCodeData.zipCodeCtu, zipCodeCtu: resultMap.zipCodeData.zipCodeCtu,
providerNumber: resultMap.zipCodeData.providerNumber,
}, },
false false
); );
@ -401,6 +402,7 @@ export default {
state: zipCodeData.state, state: zipCodeData.state,
zipCode: this.serviceZipCode, zipCode: this.serviceZipCode,
zipCodeCtu: zipCodeData.zipCodeCtu, zipCodeCtu: zipCodeData.zipCodeCtu,
providerNumber: zipCodeData.providerNumber,
}, },
false false
); );

View file

@ -160,12 +160,16 @@ export default {
// and aws FireHose stream, DigitalConsumer-Session-Firehose, to push data to an // and aws FireHose stream, DigitalConsumer-Session-Firehose, to push data to an
// S3 bucket, safelite-dev-digitalconsumer-session-data-us-east-2/1. // S3 bucket, safelite-dev-digitalconsumer-session-data-us-east-2/1.
// This bucket data is then picked up by snowflake for analytics use. // This bucket data is then picked up by snowflake for analytics use.
async pushFmgSessionData() { async pushFmgSessionData(errorJson = null) {
var currentPageName = getPageNameFromRouter(true); var currentPageName = getPageNameFromRouter(true);
if (!currentPageName) { if (!currentPageName) {
return; return;
} }
if (errorJson) {
currentPageName += ` ERROR: ${errorJson}`;
}
const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder(); const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder();
const submittedOrder = baseMixin.methods.getSubmittedOrder(); const submittedOrder = baseMixin.methods.getSubmittedOrder();
const order = hasSubmittedOrder ? submittedOrder : store.getters.order; const order = hasSubmittedOrder ? submittedOrder : store.getters.order;
@ -209,6 +213,7 @@ export default {
var appointment = `${order?.schedule?.date ?? ""} ${order?.schedule?.startTime ?? ""}`; var appointment = `${order?.schedule?.date ?? ""} ${order?.schedule?.startTime ?? ""}`;
var sessionData = {}; var sessionData = {};
sessionData.currentPage = currentPageName; sessionData.currentPage = currentPageName;
sessionData.sid = getSessionIdValue(); sessionData.sid = getSessionIdValue();
sessionData.deviceId = getDeviceIdValue(); sessionData.deviceId = getDeviceIdValue();
@ -931,6 +936,11 @@ function getPageNameFromRouter(useDefaultUrl = false) {
router.currentRoute.value && router.currentRoute.value &&
router.currentRoute.value.name router.currentRoute.value.name
) { ) {
const query = router.currentRoute.value.query;
if (query && Object.keys(query).length > 0 && useDefaultUrl === true) {
const queryString = new URLSearchParams(query).toString();
return `${router.currentRoute.value.name}?${queryString}`;
}
return router.currentRoute.value.name; return router.currentRoute.value.name;
} }

View file

@ -82,6 +82,7 @@ export default {
isServiceable: serviceZipValidationResponse.data.isServiceable, isServiceable: serviceZipValidationResponse.data.isServiceable,
state: serviceZipValidationResponse.data.state, state: serviceZipValidationResponse.data.state,
zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu, zipCodeCtu: serviceZipValidationResponse.data.zipCodeCtu,
providerNumber: serviceZipValidationResponse.data.providerNumber,
}; };
}, },
getTierOnePackagePrice(lineItems) { getTierOnePackagePrice(lineItems) {

View file

@ -147,6 +147,7 @@ function resetStoreForExternalParameter() {
state: null, state: null,
zipCode: null, zipCode: null,
zipCodeCtu: null, zipCodeCtu: null,
providerNumber: null,
}); });
store.dispatch(storeActions.SAVE_EMAIL, null); store.dispatch(storeActions.SAVE_EMAIL, null);
store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES); store.dispatch(storeActions.RESET_DAMAGE_STATE_AND_DEPENDENCIES);

View file

@ -30,6 +30,7 @@ export async function vehicleBeforeEnter(to, from) {
zipCode: newZipFromQuerystring, zipCode: newZipFromQuerystring,
state: zipData.state, state: zipData.state,
zipCodeCtu: zipData.zipCodeCtu, zipCodeCtu: zipData.zipCodeCtu,
providerNumber: zipData.providerNumber,
}); });
} }
} }

View file

@ -465,6 +465,7 @@ export const mutations = {
state.order.serviceLocation.state = serviceZipInfo.state; state.order.serviceLocation.state = serviceZipInfo.state;
state.order.serviceLocation.zipCode = serviceZipInfo.zipCode; state.order.serviceLocation.zipCode = serviceZipInfo.zipCode;
state.order.serviceLocation.zipCodeCtu = serviceZipInfo.zipCodeCtu; state.order.serviceLocation.zipCodeCtu = serviceZipInfo.zipCodeCtu;
state.order.serviceLocation.providerNumber = serviceZipInfo.providerNumber;
}, },
updateServiceLocation(state, serviceLocationInfo) { updateServiceLocation(state, serviceLocationInfo) {
state.order.serviceLocation.address = serviceLocationInfo.address; state.order.serviceLocation.address = serviceLocationInfo.address;
@ -3471,7 +3472,8 @@ export const actions = {
{ {
payload: { payload: {
parentAccountNumber = context.getters.order.payment.parentAccountNumber, parentAccountNumber = context.getters.order.payment.parentAccountNumber,
providerNumber = context.getters.order.serviceLocation.zipCodeCtu, providerNumber = context.getters.order.serviceLocation.providerNumber ||
context.getters.order.serviceLocation.zipCodeCtu,
isItac = context.getters.order.policy.isItac, isItac = context.getters.order.policy.isItac,
}, },
pageNameToLog, pageNameToLog,