From 831d4f8ecd859957b31f10180fbc22410fc54d1b Mon Sep 17 00:00:00 2001 From: CarlNation Date: Tue, 4 Mar 2025 09:38:04 -0500 Subject: [PATCH 01/31] CASH-276 CASH-276 initial changes to add heavy truck --- src/constants/store-mutations.js | 1 + src/constants/vehicle-categories.js | 6 +++ src/layouts/vehicle/vehicle.vue | 73 +++++++++++++++++++++++++++-- src/store/index.js | 19 +++++++- 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index dceeac63e..a88f5dddb 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -9,6 +9,7 @@ const storeMutations = { UPDATE_MAKE: "updateMake", UPDATE_MODEL: "updateModel", UPDATE_STYLE: "updateStyle", + UPDATE_VEHICLE_SUBTYPE: "updateVehicleSubType", UPDATE_CAR_ID: "updateCarId", UPDATE_VEHICLE_CATEGORY: "updateVehicleCategory", UPDATE_VEHICLE_IMAGE_URL: "updateVehicleImageUrl", diff --git a/src/constants/vehicle-categories.js b/src/constants/vehicle-categories.js index 37ffcf5e1..9300f47e2 100644 --- a/src/constants/vehicle-categories.js +++ b/src/constants/vehicle-categories.js @@ -9,3 +9,9 @@ const vehicleCategories = { }; export { vehicleCategories }; + +const vehicleSubTypes = { + HEAVY_TRUCK: "HEAVY TRUCK", +}; + +export { vehicleSubTypes }; diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index 12e7268fa..4edccc675 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -48,6 +48,19 @@ validationRules="style-required" placeHolderText="Select style" customDropdownId="styleQuestionField" /> + +
+
+ +
+ @@ -557,4 +615,9 @@ export default { margin-top: 1.5rem; margin-bottom: 0; } +.separator-line { + grid-area: 2/1/2/8; + border-top: 1px solid $gray-500; + margin: 0.5rem 0; +} diff --git a/src/store/index.js b/src/store/index.js index 3408c0b26..2f3772255 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -61,6 +61,7 @@ const getDefaultState = () => { make: null, model: null, style: null, + vehicleSubType: null, carId: null, category: null, vin: null, @@ -210,6 +211,9 @@ export const mutations = { updateStyle(state, style) { state.order.vehicle.style = style; }, + updateVehicleSubType(state, vehicleSubType) { + state.order.vehicle.vehicleSubType = vehicleSubType; + }, updateCarId(state, carId) { state.order.vehicle.carId = carId; }, @@ -2121,6 +2125,7 @@ export const actions = { model: vehicle.model, style: vehicle.style, vin: vehicle.vin, + vehicleSubType: vehicle.vehicleSubType, registration: { firstName: vehicle.registration.firstName, lastName: vehicle.registration.lastName, @@ -2330,7 +2335,18 @@ export const actions = { // Vehicle saveVehicle( context, - { year, make, model, style, carId, category, imageUrl, imageVifNumber, imageVifColor } + { + year, + make, + model, + style, + vehicleSubType, + carId, + category, + imageUrl, + imageVifNumber, + imageVifColor, + } ) { if ( context.state.order.vehicle.year != year || @@ -2346,6 +2362,7 @@ export const actions = { context.commit(storeMutations.UPDATE_MAKE, make); context.commit(storeMutations.UPDATE_MODEL, model); context.commit(storeMutations.UPDATE_STYLE, style); + context.commit(storeMutations.UPDATE_VEHICLE_SUBTYPE, vehicleSubType); context.commit(storeMutations.UPDATE_CAR_ID, carId); context.commit(storeMutations.UPDATE_VEHICLE_CATEGORY, category); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, imageUrl); From eb33bd46ffb0905e186268f0a3ab30a50b593163 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Tue, 4 Mar 2025 10:23:22 -0500 Subject: [PATCH 02/31] prettier --- src/layouts/vehicle/vehicle.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index 4edccc675..fafa4c079 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -426,7 +426,9 @@ export default { ); }, showHeavyTruck() { - return this.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK && !this.displayNoServiceAlert; + return ( + this.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK && !this.displayNoServiceAlert + ); }, }, methods: { From e1c5fc83c446ee1aacbb27688807c23d3a6d6351 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Mon, 17 Mar 2025 13:34:40 -0400 Subject: [PATCH 03/31] CASH-276 CASH-276 add call to location service to determine if a zip code has a provider that can service heavy truck --- src/constants/endpoints.js | 4 ++++ src/constants/store-actions.js | 1 + src/layouts/vehicle/vehicle.vue | 26 ++++++++++++++++++-------- src/store/index.js | 9 +++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 29d36d091..976696976 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -188,6 +188,10 @@ const endpoints = { url: "/account/api/v1/account/bill-to-account-number", method: "GET", }, + ClosestApplicableShops: { + url: "/location/api/v1/location/closest-applicable-shops", + method: "GET", + }, }; export { endpoints }; diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index 6c6ba62b7..4a5e713f4 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -53,6 +53,7 @@ const storeActions = { GET_INSURANCE_COMPANY_LIST: "getInsuranceCompanyList", GET_BILL_TO_ACCOUNT_NUMBER: "getBillToAccountNumber", GET_RECAL_PARTS_AND_SAVE_TO_LINE_ITEMS: "getRecalPartsAndSaveToLineItems", + GET_CLOSEST_APPLICABLE_SHOPS: "getClosestApplicableShops", // Analytics LOG_EXPERIMENT_EXPOSURE_AND_UPDATE_STORE: "logExperimentExposureAndUpdateStore", diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index fafa4c079..521793adc 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -49,7 +49,7 @@ placeHolderText="Select style" customDropdownId="styleQuestionField" /> -
+
Date: Mon, 17 Mar 2025 13:43:49 -0400 Subject: [PATCH 04/31] prettier prettier --- src/layouts/vehicle/vehicle.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index 521793adc..bab3a92e8 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -427,9 +427,7 @@ export default { ); }, isHeavyTruck() { - return ( - this.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK && this.canSafeliteService - ); + return this.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK && this.canSafeliteService; }, }, methods: { From b9f14fdb2d270836c241dc0f8f41c4def2caf5c9 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Tue, 18 Mar 2025 03:55:00 -0400 Subject: [PATCH 05/31] CASH-276 CASH-276 persist canSafeliteService field --- src/constants/store-mutations.js | 1 + src/layouts/vehicle/vehicle.vue | 10 +++++++++- src/store/index.js | 6 ++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 6a5873e83..509988c6e 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -17,6 +17,7 @@ const storeMutations = { UPDATE_VEHICLE_IMAGE_COLOR: "updateVehicleImageColor", UPDATE_VEHICLE_VIN: "updateVehicleVin", UPDATE_VEHICLE: "updateVehicle", + UPDATE_VEHICLE_CAN_SAFELITE_SERVICE: "updateVehicleCanSafeliteService", UPDATE_IS_REPAIR: "updateIsRepair", UPDATE_NUMBER_OF_CHIPS: "updateNumberOfChips", diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index bab3a92e8..da4ee6689 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -140,7 +140,7 @@ export default { modelOptions: [], styleOptions: [], displayNoServiceAlert: false, - canSafeliteService: false, + canSafeliteService: this.canSafeliteServiceFromStore(), }; }, @@ -316,6 +316,9 @@ export default { }, watch: { + serviceZipCode(newValue, oldValue) { + this.resetAlert(); + }, async selectedYear(year) { this.resetAlert(); this.makeOptions = []; @@ -323,6 +326,7 @@ export default { this.selectedModel = null; this.selectedStyle = null; this.vehicleSubType = null; + this.canSafeliteService = false; this.carId = null; if (year) { const result = await this.getMakeOptions(year); @@ -496,6 +500,7 @@ export default { vehicleSubType: this.vehicleSubType, carId: this.carId, category: this.category, + canSafeliteService: this.canSafeliteService, imageUrl: this.imageUrl, imageVifNumber: this.imageVifNumber, imageVifColor: this.imageVifColor, @@ -553,6 +558,9 @@ export default { selectedStylefromStore() { return store.getters.externalParameterVehicle.style ?? store.getters.vehicle.style; }, + canSafeliteServiceFromStore() { + return store.getters.vehicle.canSafeliteService ?? false; + }, async getMakeOptions(year) { return await baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_VEHICLE_MAKES, diff --git a/src/store/index.js b/src/store/index.js index aaee4c996..08307ec12 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -65,6 +65,7 @@ const getDefaultState = () => { carId: null, category: null, vin: null, + canSafeliteService: null, imageUrl: null, imageVifNumber: null, imageColor: null, @@ -221,6 +222,9 @@ export const mutations = { updateVehicleCategory(state, category) { state.order.vehicle.category = category; }, + updateVehicleCanSafeliteService(state, canSafeliteService) { + state.order.vehicle.canSafeliteService = canSafeliteService; + }, updateVehicleImageUrl(state, imageUrl) { state.order.vehicle.imageUrl = imageUrl; }, @@ -2357,6 +2361,7 @@ export const actions = { vehicleSubType, carId, category, + canSafeliteService, imageUrl, imageVifNumber, imageVifColor, @@ -2379,6 +2384,7 @@ export const actions = { context.commit(storeMutations.UPDATE_VEHICLE_SUBTYPE, vehicleSubType); context.commit(storeMutations.UPDATE_CAR_ID, carId); context.commit(storeMutations.UPDATE_VEHICLE_CATEGORY, category); + context.commit(storeMutations.UPDATE_VEHICLE_CAN_SAFELITE_SERVICE, canSafeliteService); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_URL, imageUrl); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_VIF_NUMBER, imageVifNumber); context.commit(storeMutations.UPDATE_VEHICLE_IMAGE_COLOR, imageVifColor); From 0becaee2030c8c3ed92a787c367c0c26a9ed5246 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Wed, 19 Mar 2025 17:08:58 +0530 Subject: [PATCH 06/31] CASH-278 pass additional param isHeavyTruckVehicle to provider endpoint to filter heavy truck shops --- src/store/index.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 08307ec12..02677051b 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -51,6 +51,7 @@ import { import { externalParameterStatus } from "@/constants/external-parameters"; import { experimentSettings } from "@/constants/experiments"; import experimentMixin from "@/mixins/experiment-mixin.js"; +import { vehicleSubTypes } from "@/constants/vehicle-categories.js"; // Export State const getDefaultState = () => { @@ -845,6 +846,9 @@ export const getters = { return false; }, + isHeavyTruckVehicle: (state) => { + return state.order.vehicle.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK; + }, isMobileAppointment: (state) => { return state.order.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE; }, @@ -1858,6 +1862,8 @@ export const actions = { if (windshieldPartWithRecal) { url += `/${windshieldPartWithRecal.partNumber}`; } + //heavy truck vehicle + url += `/${context.getters.isHeavyTruckVehicle}`; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, From acb64c788fc87cecae15675cf38482754abd5e2c Mon Sep 17 00:00:00 2001 From: CarlNation Date: Wed, 19 Mar 2025 14:01:21 -0400 Subject: [PATCH 07/31] CASH-320 CASH-320 pass isHeavyTruck flag to serviceability endpoint to determine mobile availability --- src/store/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/store/index.js b/src/store/index.js index 02677051b..19fb5316a 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1836,6 +1836,8 @@ export const actions = { endPoint += `&${glassPieces}`; } + endPoint += `&isHeavyTruckVehicle=${context.getters.isHeavyTruckVehicle}`; + return globalMethods.callHttpClient({ method: endpoints.GetServiceabilityDetails.method, endpoint: endPoint, From e9c0898442bd5124db4cf9a91451b09726b14346 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Thu, 27 Mar 2025 14:18:51 -0400 Subject: [PATCH 08/31] CASH-417 CASH-417 pass vehicle sub type to save-progress endpoint --- src/store/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/index.js b/src/store/index.js index 26186e208..abed5d31c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2110,6 +2110,7 @@ export const actions = { year: vehicle.year, make: vehicle.make, model: vehicle.model, + subType: vehicle.vehicleSubType, isInsurance: order.payment.isInsurance ?? false, isVerified: order.payment.insuranceCoverage.isVerified ?? false, lineItems: { From 9d2b530b12d3d8d0198d67e845c70298b2dca799 Mon Sep 17 00:00:00 2001 From: Chris Redelinghuys Date: Fri, 28 Mar 2025 11:33:18 -0400 Subject: [PATCH 09/31] CASH-277: Check applicable stores for heavy truck on location change. --- .../service-location-helper.js | 17 ++++++++++ .../service-location/service-location.vue | 10 ++++++ .../service-zip-modal-question.vue | 31 +++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js index 7a9ac00d0..106ed892c 100644 --- a/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js +++ b/src/layouts/service-location/helpers/service-location-helper/service-location-helper.js @@ -149,6 +149,23 @@ export async function getAvailabilityRating( return shopStatus; } +export async function getClosestApplicableShops(serviceZipCode, carId, pageNameToLog) { + if (!serviceZipCode) { + return null; + } + + const closestShops = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.GET_CLOSEST_APPLICABLE_SHOPS, + { + zip: serviceZipCode, + carId: carId, + }, + pageNameToLog + ); + + return closestShops.data; +} + export async function getZipCodeData(serviceZipCode) { return await baseMixin.methods.getZipCodeData(serviceZipCode, "service-location"); } diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 56c76bb2d..142c3468b 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -15,6 +15,8 @@ editScreenReaderTextCmsWidgetName="ScreenReaderZipEditWidget" v-model="serviceZipCodeQuestion" ref="serviceZipCodeQuestion" + :carId="carId" + :isVehicleHeavyTruck="isVehicleHeavyTruck" :mobileFeePart="mobileFeePart" @updated-mobile-fee-part="setMobileFeePart" @updated-recycle-fee-part="setRecycleFeePart" @@ -186,9 +188,11 @@ export default { return { streetAddress: this.getServiceAddressFromStore(), apartmentNumberOrBusinessName: this.getServiceAddress2FromStore(), + carId: this.getCarIdfromStore(), city: this.getServiceCityFromStore(), state: this.getServiceStateFromStore(), zipCode: this.getServiceZipCodeFromStore(), + isVehicleHeavyTruck: this.getIsVehicleHeavyTruckFromStore(), isVehicleProtected: this.getIsVehicleProtectedFromStore(), isGlassServiceableInshop: null, isRecalibrationServiceableInshop: null, @@ -514,6 +518,9 @@ export default { }); } }, + getCarIdfromStore() { + return store.getters.vehicle.carId; + }, getServiceAddressFromStore() { return store.getters.order.serviceLocation.address; }, @@ -529,6 +536,9 @@ export default { getServiceZipCodeFromStore() { return store.getters.order.serviceLocation.zipCode; }, + getIsVehicleHeavyTruckFromStore() { + return store.getters.isHeavyTruckVehicle; + }, getIsVehicleProtectedFromStore() { return store.getters.order.serviceLocation.isVehicleProtected; }, diff --git a/src/layouts/service-location/service-zip-modal-question/service-zip-modal-question.vue b/src/layouts/service-location/service-zip-modal-question/service-zip-modal-question.vue index a2ab4134e..5e7aa73e4 100644 --- a/src/layouts/service-location/service-zip-modal-question/service-zip-modal-question.vue +++ b/src/layouts/service-location/service-zip-modal-question/service-zip-modal-question.vue @@ -33,6 +33,13 @@ cmsWidgetName="AlertInvalidZipWidget" alertClass="alert-danger" v-bind:isDismissible="false" /> + @@ -48,6 +55,7 @@ import { getPricedRecycleFeePart, getServiceabilityDetails, getBillToAccountNumber, + getClosestApplicableShops, } from "@/layouts/service-location/helpers/service-location-helper/service-location-helper"; export default { @@ -63,6 +71,7 @@ export default { internalModel: this.copyModel(this.modelValue), serviceZipCodeTextInputId: "", displayInvalidZipAlert: false, + displayNoServiceAlert: false, }; }, props: { @@ -73,6 +82,11 @@ export default { zipCode: "", }), }, + carId: String, + isVehicleHeavyTruck: { + type: Boolean, + default: false, + }, mobileFeePart: { type: Object, default: () => ({}), @@ -107,6 +121,7 @@ export default { methods: { resetAlerts() { this.displayInvalidZipAlert = false; + this.displayNoServiceAlert = false; }, resetsOnZipInput() { this.resetAlerts(); @@ -155,6 +170,22 @@ export default { this.focusOnZipInput(); this.resetModalButtonStyle(); } else { + if (this.isVehicleHeavyTruck) { + // check the location endpoint to verify this zip can service a heavy truck + const closestShops = await getClosestApplicableShops( + this.internalModel.zipCode, + this.carId, + "service-location" + ); + + if (!closestShops || closestShops.providers?.length === 0) { + this.displayNoServiceAlert = true; + this.focusOnZipInput(); + this.resetModalButtonStyle(); + return null; + } + } + this.internalModel.state = zipCodeData.state; this.internalModel.zipCodeCtu = zipCodeData.zipCodeCtu; From bb5b200d303032f95f5378a2e31671223db5f9e7 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Wed, 2 Apr 2025 09:54:34 -0400 Subject: [PATCH 10/31] More cleanup --- src/fmg-components/cart/cart.vue | 18 +++++++++--------- src/layouts/confirmation/confirmation.vue | 4 +--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 1cc1bb484..a4a0e0243 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -401,11 +401,15 @@ export default { if (!this.lineItems || this.lineItems.length < 1) { return []; } + let supportingItemsToAdd = []; + if (this.lineItems.supportingItems) { + supportingItemsToAdd = this.lineItems.supportingItems.filter( + (item) => item.partType !== partTypeStrings.DONATION + ) + } return [ ...(this.lineItems.glassParts ?? []), - ...(this.lineItems.supportingItems.filter( - (item) => item.partType !== partTypeStrings.DONATION - ) ?? []), + ...supportingItemsToAdd, ...(this.availableVaps ?? []), ]; }, @@ -1074,11 +1078,7 @@ export default { const donationLineItem = this.lineItems.supportingItems.find( (item) => item.partType === partTypeStrings.DONATION ); - if (donationLineItem?.sellingPrice !== 0) { - return true; - } else { - return false; - } + return !!donationLineItem; }, donationCartItemName() { return this.getCmsContent("DonationCartTextWidget", "Text"); @@ -1092,7 +1092,7 @@ export default { (item) => item.partType === partTypeStrings.DONATION ); - if (donationLineItem?.sellingPrice > 0) { + if (donationLineItem) { return { name: this.donationCartItemName, category: cartItemCategories.SUPPORTING_ITEMS, diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 12415226b..8e49f298d 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -63,9 +63,7 @@ :isExpandedOnLoad="false" :isItac="isItac" :isNoComp="isNoComp" - :isMSRFeeApplicable="isMSRFeeApplicable" - :donationAmount="donationAmount" - @update-donation-amount="updateDonationAmount" /> + :isMSRFeeApplicable="isMSRFeeApplicable" />
Date: Wed, 2 Apr 2025 10:04:44 -0400 Subject: [PATCH 11/31] Formatting --- src/fmg-components/cart/cart.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index a4a0e0243..2a715bc93 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -405,7 +405,7 @@ export default { if (this.lineItems.supportingItems) { supportingItemsToAdd = this.lineItems.supportingItems.filter( (item) => item.partType !== partTypeStrings.DONATION - ) + ); } return [ ...(this.lineItems.glassParts ?? []), From 958c6cc6ece2b344cdc266447b866c95dc5de667 Mon Sep 17 00:00:00 2001 From: hiteshkumar87 Date: Thu, 3 Apr 2025 14:43:52 +0530 Subject: [PATCH 12/31] CASH-134 spacing before footer text --- src/experiment-components/donation-block.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/experiment-components/donation-block.vue b/src/experiment-components/donation-block.vue index c90e6af14..1710440d6 100644 --- a/src/experiment-components/donation-block.vue +++ b/src/experiment-components/donation-block.vue @@ -62,11 +62,11 @@
-
+
-

+

@@ -261,6 +261,8 @@ export default { } .alert { border: 1px solid $red; + margin-top: 0.5rem; + margin-bottom: 0.5rem; } .btn-success { background: $green-100; From e894522acbdd29d1e032b7940da54a1b1e653ad0 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 10:12:02 -0400 Subject: [PATCH 13/31] CASH-462 | First look at order changes --- src/global-methods.js | 2 +- src/helpers/pricing-helper.js | 2 +- src/layouts/confirmation/confirmation.vue | 92 +++++++++++------------ src/store/index.js | 6 +- 4 files changed, 53 insertions(+), 49 deletions(-) diff --git a/src/global-methods.js b/src/global-methods.js index ba6cec1ec..01d0c9488 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -61,7 +61,7 @@ export default { const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; const submittedOrder = baseMixin.methods.getSubmittedOrder(); const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder(); - const order = hasSubmittedOrder ? submittedOrder : store.getters.order; + const order = hasSubmittedOrder ? submittedOrder.order : store.getters.order; const payloadAndAnalyticsData = Object.assign({}, payload, { AppName: "FixMyGlass" }); const headers = { [headerKeys.EXPERIMENT]: JSON.stringify(store.getters.experimentSettings), diff --git a/src/helpers/pricing-helper.js b/src/helpers/pricing-helper.js index fda5b3b9c..4c87b8cf4 100644 --- a/src/helpers/pricing-helper.js +++ b/src/helpers/pricing-helper.js @@ -12,7 +12,7 @@ export function getDisplayAmountDue(lineItemsObject, includeTax = true) { export function getAmountDue(lineItemsObject, includeTax = true) { let amountDue = 0; const order = baseMixin?.methods?.hasSubmittedOrder() - ? baseMixin?.methods?.getSubmittedOrder() + ? baseMixin?.methods?.getSubmittedOrder().order : store.getters.order; if (lineItemsObject?.glassParts) { diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 8e49f298d..0aadfdf5c 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -173,8 +173,8 @@ export default { const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_WIPERS, { - serviceZipCode: submittedOrder.serviceLocation.zipCode, - carId: submittedOrder.vehicle.carId, + serviceZipCode: submittedOrder.order.serviceLocation.zipCode, + carId: submittedOrder.order.vehicle.carId, }, "confirmation" ); @@ -203,10 +203,10 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); const availableVaps = [resultMap.rainDefense, ...resultMap.wipers]; - const lineItemsFromSubmittedOrder = deepClone(submittedOrder.lineItems); + const lineItemsFromSubmittedOrder = deepClone(submittedOrder.order.lineItems); - const isNoComp = submittedOrder?.policy?.isNoComp; - const isItac = submittedOrder?.policy?.isItac; + const isNoComp = submittedOrder?.order?.policy?.isNoComp; + const isItac = submittedOrder?.order?.policy?.isItac; const isRecalibrationOnOrder = containsRecalParts(lineItemsFromSubmittedOrder); const shouldHideRecalibration = () => { @@ -254,7 +254,7 @@ export default { return containsRecalParts(this?.lineItems); }, ShowCart() { - if (this.isPia && this.submittedOrder?.settledTenderAmount == 0) { + if (this.isPia && this.submittedOrder?.order?.settledTenderAmount == 0) { // settleTenderAmount always shows 0 via localhost or dev. // Temporarily set return true to see cart in localhost or dev environment return false; @@ -269,13 +269,13 @@ export default { return this.getCmsContent("ScheduleConfirmationWidget", "Image"); }, CustomerPortalLoginToken() { - return this.submittedOrder?.customerPortalLoginToken; + return this.submittedOrder?.order.customerPortalLoginToken; }, ConfirmationEmailText() { return this.getCmsContent("ConfirmationEmailWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.customer.emailAddress}", - this.submittedOrder?.customer?.emailAddress + this.submittedOrder?.order.customer?.emailAddress ) ?.replaceAll("{custom:MY_ACCOUNT_URL}", applicationConfig.MY_ACCOUNT) ?.replaceAll("{custom:CUSTOMER_PORTAL_LOGIN_TOKEN}", this.CustomerPortalLoginToken) @@ -283,88 +283,88 @@ export default { ?.replaceAll(">", ">"); }, ScheduleDate() { - return this.submittedOrder?.schedule?.date; + return this.submittedOrder?.order.schedule?.date; }, AppointmentType() { - return this.submittedOrder?.serviceLocation?.appointmentType; + return this.submittedOrder?.order.serviceLocation?.appointmentType; }, ScheduleStartTime() { - return this.submittedOrder?.schedule?.startTime; + return this.submittedOrder?.order.schedule?.startTime; }, ScheduleEndTime() { - return this.submittedOrder?.schedule?.endTime; + return this.submittedOrder?.order.schedule?.endTime; }, InShopWordingText() { return this.getCmsContent("InShopWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.vehicle?.year + this.submittedOrder?.order?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.vehicle?.make + this.submittedOrder?.order?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.vehicle?.model + this.submittedOrder?.order?.vehicle?.model ); }, MobileWordingText() { return this.getCmsContent("MobileWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.vehicle?.year + this.submittedOrder?.order?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.vehicle?.make + this.submittedOrder?.order?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.vehicle?.model + this.submittedOrder?.order?.vehicle?.model ); }, DropOffWordingText() { return this.getCmsContent("DropOffWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.vehicle?.year + this.submittedOrder?.order?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.vehicle?.make + this.submittedOrder?.order?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.vehicle?.model + this.submittedOrder?.order?.vehicle?.model ); }, ServiceLocationAddress() { - return this.submittedOrder?.serviceLocation?.address; + return this.submittedOrder?.order?.serviceLocation?.address; }, ServiceLocationAddress2() { - return this.submittedOrder?.serviceLocation?.address2; + return this.submittedOrder?.order?.serviceLocation?.address2; }, ServiceLocationCity() { - return this.submittedOrder?.serviceLocation?.city; + return this.submittedOrder?.order?.serviceLocation?.city; }, ServiceLocationState() { - return this.submittedOrder?.serviceLocation?.state; + return this.submittedOrder?.order?.serviceLocation?.state; }, ServiceLocationZipCode() { - return this.submittedOrder?.serviceLocation?.zipCode; + return this.submittedOrder?.order?.serviceLocation?.zipCode; }, ProviderAddress() { - return this.submittedOrder?.serviceLocation?.provider?.address?.streetAddress; + return this.submittedOrder?.order?.serviceLocation?.provider?.address?.streetAddress; }, ProviderCity() { - return this.submittedOrder?.serviceLocation?.provider?.address?.city; + return this.submittedOrder?.order?.serviceLocation?.provider?.address?.city; }, ProviderState() { - return this.submittedOrder?.serviceLocation?.provider?.address?.state; + return this.submittedOrder?.order?.serviceLocation?.provider?.address?.state; }, ProviderZipCode() { - return this.submittedOrder?.serviceLocation?.provider?.address?.zipCode; + return this.submittedOrder?.order?.serviceLocation?.provider?.address?.zipCode; }, AppointmentWordingText() { if (this.AppointmentType == AppointmentTypeStrings.MOBILE) { @@ -408,7 +408,7 @@ export default { } if (this.AppointmentType == AppointmentTypeStrings.DROP_OFF) { if ( - this.submittedOrder?.schedule?.routeCode.includes( + this.submittedOrder?.order?.schedule?.routeCode.includes( RouteCodeFlags.OVERNIGHT_DROP_OFF ) ) { @@ -420,22 +420,22 @@ export default { return `at ${get12HourTimeFormat(this.ScheduleStartTime)}`; }, vehicleBannerImageUrl() { - return this.submittedOrder?.vehicle.imageUrl; + return this.submittedOrder?.order?.vehicle.imageUrl; }, damageInfo() { - return this.submittedOrder?.damage; + return this.submittedOrder?.order?.damage; }, isMSRFeeApplicable() { - return this.submittedOrder?.isMSRFeeApplicable; + return this.submittedOrder?.order?.isMSRFeeApplicable; }, isInsurance() { - return this.submittedOrder?.payment?.isInsurance; + return this.submittedOrder?.order?.payment?.isInsurance; }, isNoComp() { - return this.submittedOrder?.policy?.isNoComp; + return this.submittedOrder?.order?.policy?.isNoComp; }, isItac() { - return this.submittedOrder?.policy?.isItac; + return this.submittedOrder?.order?.policy?.isItac; }, hasVapsInCart() { if (this.lineItems?.vaps?.length > 0) { @@ -448,28 +448,28 @@ export default { if (this.isNoComp || this.isItac) { return coverageStatus.NOCOMP; } else { - return this.submittedOrder?.payment?.insuranceCoverage?.coverageStatus; + return this.submittedOrder?.order?.payment?.insuranceCoverage?.coverageStatus; } }, currentDeductible() { - return this.submittedOrder?.policy?.currentDeductible; + return this.submittedOrder?.order?.policy?.currentDeductible; }, insuranceCompanyName() { - return this.submittedOrder?.policy?.insuranceCompanyName; + return this.submittedOrder?.order?.policy?.insuranceCompanyName; }, isPia() { - return this.submittedOrder?.payment?.isPia; + return this.submittedOrder?.order?.payment?.isPia; }, AppointmentDuration() { - const durationMaximum = this.submittedOrder?.schedule?.jobMaxMinutes; - const durationMinimum = this.submittedOrder?.schedule?.jobMinMinutes; + const durationMaximum = this.submittedOrder?.order?.schedule?.jobMaxMinutes; + const durationMinimum = this.submittedOrder?.order?.schedule?.jobMinMinutes; const durationLengthString = "Duration: "; if ( - this.submittedOrder?.schedule?.routeCode.includes(RouteCodeFlags.ALL_DAY_DROP_OFF) + this.submittedOrder?.order?.schedule?.routeCode.includes(RouteCodeFlags.ALL_DAY_DROP_OFF) ) { return durationLengthString.concat("All Day"); } else if ( - this.submittedOrder?.schedule?.routeCode.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF) + this.submittedOrder?.order?.schedule?.routeCode.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF) ) { return durationLengthString.concat("Overnight"); } else { @@ -541,7 +541,7 @@ export default { parseInt(this.donationAmount), false ); - this.lineItems = deepClone(this.getSubmittedOrder().lineItems); + this.lineItems = deepClone(this.getSubmittedOrder().order.lineItems); } else { this.showDonationError = true; this.showDonationSuccess = false; diff --git a/src/store/index.js b/src/store/index.js index 032660c6f..05cb572e1 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1854,6 +1854,7 @@ export const actions = { if (windshieldPartWithRecal) { url += `/${windshieldPartWithRecal.partNumber}`; } + url += "/false"; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, @@ -3263,7 +3264,10 @@ export const actions = { } // create a submitted order object from vuex. - const submittedOrder = context.state.order; + const submittedOrder = { + order: context.state.order, + applicationUser: context.state.applicationUser, + }; const experiments = context.state.applicationUser.experiments; const affiliateCookies = context.state.applicationUser.affiliateCookies; From d38cc5f2e65f298120af51c53778ca74176fc77d Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 10:31:52 -0400 Subject: [PATCH 14/31] Revert "CASH-462 | First look at order changes" This reverts commit e894522acbdd29d1e032b7940da54a1b1e653ad0. --- src/global-methods.js | 2 +- src/helpers/pricing-helper.js | 2 +- src/layouts/confirmation/confirmation.vue | 92 +++++++++++------------ src/store/index.js | 6 +- 4 files changed, 49 insertions(+), 53 deletions(-) diff --git a/src/global-methods.js b/src/global-methods.js index 01d0c9488..ba6cec1ec 100644 --- a/src/global-methods.js +++ b/src/global-methods.js @@ -61,7 +61,7 @@ export default { const cfDistroUrl = applicationConfig.CONSUMER_CF_DISTRO; const submittedOrder = baseMixin.methods.getSubmittedOrder(); const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder(); - const order = hasSubmittedOrder ? submittedOrder.order : store.getters.order; + const order = hasSubmittedOrder ? submittedOrder : store.getters.order; const payloadAndAnalyticsData = Object.assign({}, payload, { AppName: "FixMyGlass" }); const headers = { [headerKeys.EXPERIMENT]: JSON.stringify(store.getters.experimentSettings), diff --git a/src/helpers/pricing-helper.js b/src/helpers/pricing-helper.js index 4c87b8cf4..fda5b3b9c 100644 --- a/src/helpers/pricing-helper.js +++ b/src/helpers/pricing-helper.js @@ -12,7 +12,7 @@ export function getDisplayAmountDue(lineItemsObject, includeTax = true) { export function getAmountDue(lineItemsObject, includeTax = true) { let amountDue = 0; const order = baseMixin?.methods?.hasSubmittedOrder() - ? baseMixin?.methods?.getSubmittedOrder().order + ? baseMixin?.methods?.getSubmittedOrder() : store.getters.order; if (lineItemsObject?.glassParts) { diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 0aadfdf5c..8e49f298d 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -173,8 +173,8 @@ export default { const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_WIPERS, { - serviceZipCode: submittedOrder.order.serviceLocation.zipCode, - carId: submittedOrder.order.vehicle.carId, + serviceZipCode: submittedOrder.serviceLocation.zipCode, + carId: submittedOrder.vehicle.carId, }, "confirmation" ); @@ -203,10 +203,10 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); const availableVaps = [resultMap.rainDefense, ...resultMap.wipers]; - const lineItemsFromSubmittedOrder = deepClone(submittedOrder.order.lineItems); + const lineItemsFromSubmittedOrder = deepClone(submittedOrder.lineItems); - const isNoComp = submittedOrder?.order?.policy?.isNoComp; - const isItac = submittedOrder?.order?.policy?.isItac; + const isNoComp = submittedOrder?.policy?.isNoComp; + const isItac = submittedOrder?.policy?.isItac; const isRecalibrationOnOrder = containsRecalParts(lineItemsFromSubmittedOrder); const shouldHideRecalibration = () => { @@ -254,7 +254,7 @@ export default { return containsRecalParts(this?.lineItems); }, ShowCart() { - if (this.isPia && this.submittedOrder?.order?.settledTenderAmount == 0) { + if (this.isPia && this.submittedOrder?.settledTenderAmount == 0) { // settleTenderAmount always shows 0 via localhost or dev. // Temporarily set return true to see cart in localhost or dev environment return false; @@ -269,13 +269,13 @@ export default { return this.getCmsContent("ScheduleConfirmationWidget", "Image"); }, CustomerPortalLoginToken() { - return this.submittedOrder?.order.customerPortalLoginToken; + return this.submittedOrder?.customerPortalLoginToken; }, ConfirmationEmailText() { return this.getCmsContent("ConfirmationEmailWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.customer.emailAddress}", - this.submittedOrder?.order.customer?.emailAddress + this.submittedOrder?.customer?.emailAddress ) ?.replaceAll("{custom:MY_ACCOUNT_URL}", applicationConfig.MY_ACCOUNT) ?.replaceAll("{custom:CUSTOMER_PORTAL_LOGIN_TOKEN}", this.CustomerPortalLoginToken) @@ -283,88 +283,88 @@ export default { ?.replaceAll(">", ">"); }, ScheduleDate() { - return this.submittedOrder?.order.schedule?.date; + return this.submittedOrder?.schedule?.date; }, AppointmentType() { - return this.submittedOrder?.order.serviceLocation?.appointmentType; + return this.submittedOrder?.serviceLocation?.appointmentType; }, ScheduleStartTime() { - return this.submittedOrder?.order.schedule?.startTime; + return this.submittedOrder?.schedule?.startTime; }, ScheduleEndTime() { - return this.submittedOrder?.order.schedule?.endTime; + return this.submittedOrder?.schedule?.endTime; }, InShopWordingText() { return this.getCmsContent("InShopWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.order?.vehicle?.year + this.submittedOrder?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.order?.vehicle?.make + this.submittedOrder?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.order?.vehicle?.model + this.submittedOrder?.vehicle?.model ); }, MobileWordingText() { return this.getCmsContent("MobileWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.order?.vehicle?.year + this.submittedOrder?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.order?.vehicle?.make + this.submittedOrder?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.order?.vehicle?.model + this.submittedOrder?.vehicle?.model ); }, DropOffWordingText() { return this.getCmsContent("DropOffWordingWidget", "BodyText") ?.replaceAll( "{custom:submittedOrder.vehicle.year}", - this.submittedOrder?.order?.vehicle?.year + this.submittedOrder?.vehicle?.year ) ?.replaceAll( "{custom:submittedOrder.vehicle.make}", - this.submittedOrder?.order?.vehicle?.make + this.submittedOrder?.vehicle?.make ) ?.replaceAll( "{custom:submittedOrder.vehicle.model}", - this.submittedOrder?.order?.vehicle?.model + this.submittedOrder?.vehicle?.model ); }, ServiceLocationAddress() { - return this.submittedOrder?.order?.serviceLocation?.address; + return this.submittedOrder?.serviceLocation?.address; }, ServiceLocationAddress2() { - return this.submittedOrder?.order?.serviceLocation?.address2; + return this.submittedOrder?.serviceLocation?.address2; }, ServiceLocationCity() { - return this.submittedOrder?.order?.serviceLocation?.city; + return this.submittedOrder?.serviceLocation?.city; }, ServiceLocationState() { - return this.submittedOrder?.order?.serviceLocation?.state; + return this.submittedOrder?.serviceLocation?.state; }, ServiceLocationZipCode() { - return this.submittedOrder?.order?.serviceLocation?.zipCode; + return this.submittedOrder?.serviceLocation?.zipCode; }, ProviderAddress() { - return this.submittedOrder?.order?.serviceLocation?.provider?.address?.streetAddress; + return this.submittedOrder?.serviceLocation?.provider?.address?.streetAddress; }, ProviderCity() { - return this.submittedOrder?.order?.serviceLocation?.provider?.address?.city; + return this.submittedOrder?.serviceLocation?.provider?.address?.city; }, ProviderState() { - return this.submittedOrder?.order?.serviceLocation?.provider?.address?.state; + return this.submittedOrder?.serviceLocation?.provider?.address?.state; }, ProviderZipCode() { - return this.submittedOrder?.order?.serviceLocation?.provider?.address?.zipCode; + return this.submittedOrder?.serviceLocation?.provider?.address?.zipCode; }, AppointmentWordingText() { if (this.AppointmentType == AppointmentTypeStrings.MOBILE) { @@ -408,7 +408,7 @@ export default { } if (this.AppointmentType == AppointmentTypeStrings.DROP_OFF) { if ( - this.submittedOrder?.order?.schedule?.routeCode.includes( + this.submittedOrder?.schedule?.routeCode.includes( RouteCodeFlags.OVERNIGHT_DROP_OFF ) ) { @@ -420,22 +420,22 @@ export default { return `at ${get12HourTimeFormat(this.ScheduleStartTime)}`; }, vehicleBannerImageUrl() { - return this.submittedOrder?.order?.vehicle.imageUrl; + return this.submittedOrder?.vehicle.imageUrl; }, damageInfo() { - return this.submittedOrder?.order?.damage; + return this.submittedOrder?.damage; }, isMSRFeeApplicable() { - return this.submittedOrder?.order?.isMSRFeeApplicable; + return this.submittedOrder?.isMSRFeeApplicable; }, isInsurance() { - return this.submittedOrder?.order?.payment?.isInsurance; + return this.submittedOrder?.payment?.isInsurance; }, isNoComp() { - return this.submittedOrder?.order?.policy?.isNoComp; + return this.submittedOrder?.policy?.isNoComp; }, isItac() { - return this.submittedOrder?.order?.policy?.isItac; + return this.submittedOrder?.policy?.isItac; }, hasVapsInCart() { if (this.lineItems?.vaps?.length > 0) { @@ -448,28 +448,28 @@ export default { if (this.isNoComp || this.isItac) { return coverageStatus.NOCOMP; } else { - return this.submittedOrder?.order?.payment?.insuranceCoverage?.coverageStatus; + return this.submittedOrder?.payment?.insuranceCoverage?.coverageStatus; } }, currentDeductible() { - return this.submittedOrder?.order?.policy?.currentDeductible; + return this.submittedOrder?.policy?.currentDeductible; }, insuranceCompanyName() { - return this.submittedOrder?.order?.policy?.insuranceCompanyName; + return this.submittedOrder?.policy?.insuranceCompanyName; }, isPia() { - return this.submittedOrder?.order?.payment?.isPia; + return this.submittedOrder?.payment?.isPia; }, AppointmentDuration() { - const durationMaximum = this.submittedOrder?.order?.schedule?.jobMaxMinutes; - const durationMinimum = this.submittedOrder?.order?.schedule?.jobMinMinutes; + const durationMaximum = this.submittedOrder?.schedule?.jobMaxMinutes; + const durationMinimum = this.submittedOrder?.schedule?.jobMinMinutes; const durationLengthString = "Duration: "; if ( - this.submittedOrder?.order?.schedule?.routeCode.includes(RouteCodeFlags.ALL_DAY_DROP_OFF) + this.submittedOrder?.schedule?.routeCode.includes(RouteCodeFlags.ALL_DAY_DROP_OFF) ) { return durationLengthString.concat("All Day"); } else if ( - this.submittedOrder?.order?.schedule?.routeCode.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF) + this.submittedOrder?.schedule?.routeCode.includes(RouteCodeFlags.OVERNIGHT_DROP_OFF) ) { return durationLengthString.concat("Overnight"); } else { @@ -541,7 +541,7 @@ export default { parseInt(this.donationAmount), false ); - this.lineItems = deepClone(this.getSubmittedOrder().order.lineItems); + this.lineItems = deepClone(this.getSubmittedOrder().lineItems); } else { this.showDonationError = true; this.showDonationSuccess = false; diff --git a/src/store/index.js b/src/store/index.js index 05cb572e1..032660c6f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1854,7 +1854,6 @@ export const actions = { if (windshieldPartWithRecal) { url += `/${windshieldPartWithRecal.partNumber}`; } - url += "/false"; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, @@ -3264,10 +3263,7 @@ export const actions = { } // create a submitted order object from vuex. - const submittedOrder = { - order: context.state.order, - applicationUser: context.state.applicationUser, - }; + const submittedOrder = context.state.order; const experiments = context.state.applicationUser.experiments; const affiliateCookies = context.state.applicationUser.affiliateCookies; From 76b26e2991597aefaa61dd03664fff3ff8f009a5 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Thu, 3 Apr 2025 10:57:06 -0400 Subject: [PATCH 15/31] CASH-417 CASH-417 use the isBigTruck property returned from the service instead of computing it based on subType and special class --- src/constants/store-mutations.js | 2 ++ src/constants/vehicle-categories.js | 8 +----- .../service-location/service-location.vue | 2 +- .../shop-question/shop-question.vue | 7 +++++- src/layouts/vehicle/vehicle.vue | 25 +++++++++++-------- src/store/index.js | 24 +++++++++++++----- 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/constants/store-mutations.js b/src/constants/store-mutations.js index 509988c6e..2f53d8133 100644 --- a/src/constants/store-mutations.js +++ b/src/constants/store-mutations.js @@ -10,6 +10,8 @@ const storeMutations = { UPDATE_MODEL: "updateModel", UPDATE_STYLE: "updateStyle", UPDATE_VEHICLE_SUBTYPE: "updateVehicleSubType", + UPDATE_VEHICLE_SPECIAL_CLASS: "updateVehicleSpecialClass", + UPDATE_IS_BIGTRUCK: "updateIsBigTruck", UPDATE_CAR_ID: "updateCarId", UPDATE_VEHICLE_CATEGORY: "updateVehicleCategory", UPDATE_VEHICLE_IMAGE_URL: "updateVehicleImageUrl", diff --git a/src/constants/vehicle-categories.js b/src/constants/vehicle-categories.js index 9300f47e2..8ef3e0134 100644 --- a/src/constants/vehicle-categories.js +++ b/src/constants/vehicle-categories.js @@ -8,10 +8,4 @@ const vehicleCategories = { SEMI: "SEMI", }; -export { vehicleCategories }; - -const vehicleSubTypes = { - HEAVY_TRUCK: "HEAVY TRUCK", -}; - -export { vehicleSubTypes }; +export { vehicleCategories }; \ No newline at end of file diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 142c3468b..758dc88e9 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -537,7 +537,7 @@ export default { return store.getters.order.serviceLocation.zipCode; }, getIsVehicleHeavyTruckFromStore() { - return store.getters.isHeavyTruckVehicle; + return store.getters.order.vehicle.isBigTruck; }, getIsVehicleProtectedFromStore() { return store.getters.order.serviceLocation.isVehicleProtected; diff --git a/src/layouts/service-location/shop-question/shop-question.vue b/src/layouts/service-location/shop-question/shop-question.vue index a15d8bb0b..c0e2bffe0 100644 --- a/src/layouts/service-location/shop-question/shop-question.vue +++ b/src/layouts/service-location/shop-question/shop-question.vue @@ -179,10 +179,15 @@ export default { } }); + var joinedShops = shops.join(","); + if (!joinedShops) { + joinedShops = "no-shops"; + } + this.pushEventToGA( this.GaCategories.SERVICE_LOCATION, gaAction, - shops.join(","), + joinedShops, true ); } diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index da4ee6689..257de9bf6 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -49,7 +49,7 @@ placeHolderText="Select style" customDropdownId="styleQuestionField" /> -
+
{ @@ -63,6 +62,8 @@ const getDefaultState = () => { model: null, style: null, vehicleSubType: null, + vehicleSpecialClass: null, + isBigTruck: false, carId: null, category: null, vin: null, @@ -217,6 +218,12 @@ export const mutations = { updateVehicleSubType(state, vehicleSubType) { state.order.vehicle.vehicleSubType = vehicleSubType; }, + updateVehicleSpecialClass(state, vehicleSpecialClass) { + state.order.vehicle.vehicleSpecialClass = vehicleSpecialClass; + }, + updateIsBigTruck(state, isBigTruck) { + state.order.vehicle.isBigTruck = isBigTruck; + }, updateCarId(state, carId) { state.order.vehicle.carId = carId; }, @@ -847,9 +854,6 @@ export const getters = { return false; }, - isHeavyTruckVehicle: (state) => { - return state.order.vehicle.vehicleSubType === vehicleSubTypes.HEAVY_TRUCK; - }, isMobileAppointment: (state) => { return state.order.serviceLocation.appointmentType === AppointmentTypeStrings.MOBILE; }, @@ -1849,7 +1853,7 @@ export const actions = { endPoint += `&${glassPieces}`; } - endPoint += `&isHeavyTruckVehicle=${context.getters.isHeavyTruckVehicle}`; + endPoint += `&isHeavyTruckVehicle=${context.getters.order.vehicle.isBigTruck}`; return globalMethods.callHttpClient({ method: endpoints.GetServiceabilityDetails.method, @@ -1878,7 +1882,7 @@ export const actions = { url += `/${windshieldPartWithRecal.partNumber}`; } //heavy truck vehicle - url += `/${context.getters.isHeavyTruckVehicle}`; + url += `/${context.getters.order.vehicle.isBigTruck}`; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, @@ -2111,6 +2115,8 @@ export const actions = { make: vehicle.make, model: vehicle.model, subType: vehicle.vehicleSubType, + specialClass: vehicle.vehicleSpecialClass, + isBigTruck: vehicle.isBigTruck, isInsurance: order.payment.isInsurance ?? false, isVerified: order.payment.insuranceCoverage.isVerified ?? false, lineItems: { @@ -2165,6 +2171,8 @@ export const actions = { style: vehicle.style, vin: vehicle.vin, vehicleSubType: vehicle.vehicleSubType, + vehicleSpecialClass: vehicle.vehicleSpecialClass, + isBigTruck: vehicle.isBigTruck, registration: { firstName: vehicle.registration.firstName, lastName: vehicle.registration.lastName, @@ -2381,6 +2389,8 @@ export const actions = { model, style, vehicleSubType, + vehicleSpecialClass, + isBigTruck, carId, category, canSafeliteService, @@ -2404,6 +2414,8 @@ export const actions = { context.commit(storeMutations.UPDATE_MODEL, model); context.commit(storeMutations.UPDATE_STYLE, style); context.commit(storeMutations.UPDATE_VEHICLE_SUBTYPE, vehicleSubType); + context.commit(storeMutations.UPDATE_VEHICLE_SPECIAL_CLASS, vehicleSpecialClass); + context.commit(storeMutations.UPDATE_IS_BIGTRUCK, isBigTruck); context.commit(storeMutations.UPDATE_CAR_ID, carId); context.commit(storeMutations.UPDATE_VEHICLE_CATEGORY, category); context.commit(storeMutations.UPDATE_VEHICLE_CAN_SAFELITE_SERVICE, canSafeliteService); From 749fa3219e5d8eef2e068805a3b1832c569867cd Mon Sep 17 00:00:00 2001 From: CarlNation Date: Thu, 3 Apr 2025 12:07:11 -0400 Subject: [PATCH 16/31] prettier --- src/constants/vehicle-categories.js | 2 +- .../service-location/shop-question/shop-question.vue | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/constants/vehicle-categories.js b/src/constants/vehicle-categories.js index 8ef3e0134..37ffcf5e1 100644 --- a/src/constants/vehicle-categories.js +++ b/src/constants/vehicle-categories.js @@ -8,4 +8,4 @@ const vehicleCategories = { SEMI: "SEMI", }; -export { vehicleCategories }; \ No newline at end of file +export { vehicleCategories }; diff --git a/src/layouts/service-location/shop-question/shop-question.vue b/src/layouts/service-location/shop-question/shop-question.vue index c0e2bffe0..0a3e9eefa 100644 --- a/src/layouts/service-location/shop-question/shop-question.vue +++ b/src/layouts/service-location/shop-question/shop-question.vue @@ -184,12 +184,7 @@ export default { joinedShops = "no-shops"; } - this.pushEventToGA( - this.GaCategories.SERVICE_LOCATION, - gaAction, - joinedShops, - true - ); + this.pushEventToGA(this.GaCategories.SERVICE_LOCATION, gaAction, joinedShops, true); } if (this.answers.length === 0) { From 21c9607682b5c180289f12fca81068dad0317f68 Mon Sep 17 00:00:00 2001 From: CarlNation Date: Thu, 3 Apr 2025 12:26:58 -0400 Subject: [PATCH 17/31] CASH-417 CASH-417 null check --- src/layouts/service-location/service-location.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 758dc88e9..a85a5bd17 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -537,7 +537,7 @@ export default { return store.getters.order.serviceLocation.zipCode; }, getIsVehicleHeavyTruckFromStore() { - return store.getters.order.vehicle.isBigTruck; + return store.getters.order.vehicle?.isBigTruck ?? false; }, getIsVehicleProtectedFromStore() { return store.getters.order.serviceLocation.isVehicleProtected; From 77c007c4447ff5a05db4614605269ea9cb1db4cb Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 13:19:44 -0400 Subject: [PATCH 18/31] CASH-462 | Rename and restructure submittedOrder Rename to submittedState Add an applicationUser attribute --- src/constants/store-actions.js | 6 +-- .../add-to-calendar/add-to-calendar.vue | 2 +- src/layouts/confirmation/confirmation.vue | 7 +--- .../payment-pia-return/payment-pia-return.vue | 2 +- src/layouts/payment/payment.vue | 2 +- src/layouts/vehicle/vehicle.vue | 2 +- src/mixins/analytics-mixin.js | 2 +- src/mixins/analytics-mixin.spec.js | 2 +- src/mixins/base-mixin.js | 12 +++++- src/router/index.js | 4 +- src/store/index.js | 39 ++++++++++++------- 11 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/constants/store-actions.js b/src/constants/store-actions.js index e7cb38953..1e8945c49 100644 --- a/src/constants/store-actions.js +++ b/src/constants/store-actions.js @@ -109,9 +109,9 @@ const storeActions = { SAVE_IS_RECAL_ACK_OPT_IN: "saveIsRecalAckOptIn", SAVE_IS_MSR_FEE_APPLICABLE: "saveIsMSRFeeApplicable", - CREATE_SUBMITTED_ORDER: "createSubmittedOrder", - RESET_SUBMITTED_ORDER: "resetSubmittedOrder", - ADD_DONATION_TO_SUBMITTED_ORDER: "addDonationToSubmittedOrder", + CREATE_SUBMITTED_STATE: "createSubmittedState", + RESET_SUBMITTED_STATE: "resetSubmittedState", + ADD_DONATION_TO_SUBMITTED_STATE: "addDonationToSubmittedState", RESET_EXTERNAL_PARAMETER_STATE: "resetExternalParameterState", UPDATE_EXTERNAL_PARAMETER_MMS: "updateExternalParameterMMS", diff --git a/src/layouts/confirmation/add-to-calendar/add-to-calendar.vue b/src/layouts/confirmation/add-to-calendar/add-to-calendar.vue index 1fef02247..c986e0366 100644 --- a/src/layouts/confirmation/add-to-calendar/add-to-calendar.vue +++ b/src/layouts/confirmation/add-to-calendar/add-to-calendar.vue @@ -115,7 +115,7 @@ export default { }, ServiceType() { const isRepair = this.getSubmittedOrder()?.damage.isRepair; - const funnelHasRecalibrationPart = store.getters.isRecalibrationOnSubmittedOrder; + const funnelHasRecalibrationPart = store.getters.isRecalibrationOnSubmittedState; if (!isRepair) { if (funnelHasRecalibrationPart) { return serviceType.REPLACEMENT_AND_RECALIBRATION; diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 8e49f298d..7e9cfe71e 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -164,7 +164,7 @@ export default { } // Create order - await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); // This nulls the Store order + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_STATE); // This nulls the Store order // Call APIs const submittedOrder = baseMixin.methods.getSubmittedOrder(); @@ -255,11 +255,8 @@ export default { }, ShowCart() { if (this.isPia && this.submittedOrder?.settledTenderAmount == 0) { - // settleTenderAmount always shows 0 via localhost or dev. - // Temporarily set return true to see cart in localhost or dev environment return false; } - return true; }, ScheduleConfirmationText() { @@ -537,7 +534,7 @@ export default { this.showDonationSuccess = true; this.showDonationError = false; await baseMixin.methods.dispatchStoreAction( - storeActions.ADD_DONATION_TO_SUBMITTED_ORDER, + storeActions.ADD_DONATION_TO_SUBMITTED_STATE, parseInt(this.donationAmount), false ); diff --git a/src/layouts/payment-pia-return/payment-pia-return.vue b/src/layouts/payment-pia-return/payment-pia-return.vue index b9f19f64a..f0b4433ea 100644 --- a/src/layouts/payment-pia-return/payment-pia-return.vue +++ b/src/layouts/payment-pia-return/payment-pia-return.vue @@ -192,7 +192,7 @@ export default { } this.$refs.loadingModal.isModalVisible = false; - await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_STATE); this.$router.navigateWithoutSaving(this.navigationScenarios.PIA_SUCCESS, this.$route); }, }, diff --git a/src/layouts/payment/payment.vue b/src/layouts/payment/payment.vue index abf06927b..3c87f85f2 100644 --- a/src/layouts/payment/payment.vue +++ b/src/layouts/payment/payment.vue @@ -683,7 +683,7 @@ export default { submitAfterSave: true, }); - await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_ORDER); + await baseMixin.methods.dispatchStoreAction(storeActions.CREATE_SUBMITTED_STATE); window.location = applicationConfig.CONFIRMATION_URL; } catch (error) { console.log("error: response from submit work order(payment pg):" + error.message); diff --git a/src/layouts/vehicle/vehicle.vue b/src/layouts/vehicle/vehicle.vue index 12e7268fa..5f769b9b7 100644 --- a/src/layouts/vehicle/vehicle.vue +++ b/src/layouts/vehicle/vehicle.vue @@ -448,7 +448,7 @@ export default { this.displayNoServiceAlert = false; }, async forwardButtonAction() { - await this.dispatchStoreAction(storeActions.RESET_SUBMITTED_ORDER); + await this.dispatchStoreAction(storeActions.RESET_SUBMITTED_STATE); this.dispatchStoreAction( storeActions.SAVE_VEHICLE, { diff --git a/src/mixins/analytics-mixin.js b/src/mixins/analytics-mixin.js index e59ec5039..d6e608d4b 100644 --- a/src/mixins/analytics-mixin.js +++ b/src/mixins/analytics-mixin.js @@ -337,7 +337,7 @@ export default { // Recalibration if (hasSubmittedOrder) { - payload.isRecalibrationOnOrder = store.getters.isRecalibrationOnSubmittedOrder; + payload.isRecalibrationOnOrder = store.getters.isRecalibrationOnSubmittedState; } else { payload.isRecalibrationOnOrder = store.getters.isRecalibrationOnOrder; } diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js index a4b4672bb..711702c4a 100644 --- a/src/mixins/analytics-mixin.spec.js +++ b/src/mixins/analytics-mixin.spec.js @@ -425,7 +425,7 @@ describe("analyticsMixin.js", () => { workOrderId: "222222222222", }; store.getters.isRecalibrationOnOrder = true; - store.getters.isRecalibrationOnSubmittedOrder = false; + store.getters.isRecalibrationOnSubmittedState = false; }); test("Pushes to data layer if nominal", () => { diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 151d17dd9..1c33640f8 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -198,10 +198,18 @@ export default { } }, getSubmittedOrder() { - return JSON.parse(window.sessionStorage.getItem("submittedOrder")); + return JSON.parse(window.sessionStorage.getItem("submittedState"))?.order; }, hasSubmittedOrder() { - return window.sessionStorage.getItem("submittedOrder") !== null; + const submittedState = window.sessionStorage.getItem("submittedState"); + return submittedState !== null && submittedState.order !== null; + }, + getSubmittedApplicationUser() { + return JSON.parse(window.sessionStorage.getItem("submittedState"))?.applicationUser; + }, + hasSubmittedApplicationUser() { + const submittedState = window.sessionStorage.getItem("submittedState"); + return submittedState !== null && submittedState.applicationUser !== null; }, }, computed: { diff --git a/src/router/index.js b/src/router/index.js index 345790734..e2263b32d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -93,10 +93,10 @@ const routes = [ log(" --to.query.fmgPage ", to.query?.fmgPage); // Intercept all navigation if a submitted order exists in storage - if (window.sessionStorage.getItem("submittedOrder") !== null) { + if (window.sessionStorage.getItem("submittedState") !== null) { if (to.query.fmgPage !== funnelStartPageName) { to.query.fmgPage = fmgPageValues.CONFIRMATION; - log(" --has submittedOrder go to confirmation"); + log(" --has submittedState go to confirmation"); } } // On entering the funnel "fresh", read cookie information, decide what to do next. diff --git a/src/store/index.js b/src/store/index.js index 032660c6f..cdd81d164 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -822,8 +822,8 @@ export const getters = { }, coverageIsVerified: (state) => { let order; - if (window.sessionStorage.getItem("submittedOrder") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedOrder")); + if (window.sessionStorage.getItem("submittedState") !== null) { + order = JSON.parse(window.sessionStorage.getItem("submittedState")).order; } else { order = state.order; } @@ -850,10 +850,10 @@ export const getters = { isRecalibrationOnOrder: (state) => { return getHasRecalibrationPart(state); }, - isRecalibrationOnSubmittedOrder: (state) => { - if (window.sessionStorage.getItem("submittedOrder") !== null) { + isRecalibrationOnSubmittedState: (state) => { + if (window.sessionStorage.getItem("submittedState") !== null) { return getHasRecalibrationPart({ - order: JSON.parse(window.sessionStorage.getItem("submittedOrder")), + order: JSON.parse(window.sessionStorage.getItem("submittedState")).order, }); } @@ -861,8 +861,8 @@ export const getters = { }, shouldHideRecalibration: (state) => { var order; - if (window.sessionStorage.getItem("submittedOrder") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedOrder")); + if (window.sessionStorage.getItem("submittedState") !== null) { + order = JSON.parse(window.sessionStorage.getItem("submittedState")).order; } else { order = state.order; } @@ -3257,19 +3257,22 @@ export const actions = { return false; }, - createSubmittedOrder(context) { - if (window.sessionStorage.getItem("submittedOrder") !== null) { + createSubmittedState(context) { + if (window.sessionStorage.getItem("submittedState") !== null) { return; } // create a submitted order object from vuex. - const submittedOrder = context.state.order; + const submittedState = { + order: context.state.order, + applicationUser: context.state.applicationUser + }; const experiments = context.state.applicationUser.experiments; const affiliateCookies = context.state.applicationUser.affiliateCookies; // set to local storage - window.sessionStorage.setItem("submittedOrder", JSON.stringify(submittedOrder)); + window.sessionStorage.setItem("submittedState", JSON.stringify(submittedState)); window.sessionStorage.setItem("createNewSessionForHeritage", true); // clear vuex @@ -3288,10 +3291,11 @@ export const actions = { context.commit(storeMutations.UPDATE_AFFILIATE_COOKIES, affiliateCookies); }, - addDonationToSubmittedOrder(context, donationAmount) { + addDonationToSubmittedState(context, donationAmount) { console.log("running addDonationToSubmittedOrder()... donationAmount: ", donationAmount); const submittedOrder = deepClone(baseMixin.methods.getSubmittedOrder()); + const submittedApplicationUser = deepClone(baseMixin.methods.getSubmittedApplicationUser()); if (donationAmount > 0) { console.log( @@ -3320,13 +3324,18 @@ export const actions = { }); submittedOrder.lineItems.supportingItems = nonDonationItems; } + + const submittedState = { + order: submittedOrder, + applicationUser: submittedApplicationUser + } // set to local storage - window.sessionStorage.setItem("submittedOrder", JSON.stringify(submittedOrder)); + window.sessionStorage.setItem("submittedState", JSON.stringify(submittedState)); }, - resetSubmittedOrder(context) { + resetSubmittedState(context) { // clear from local storage - window.sessionStorage.removeItem("submittedOrder"); + window.sessionStorage.removeItem("submittedState"); }, resetExternalParameterState(context) { if (context.getters.isExternalParameter) { From b90c3644d6e7151fec00b41eb0c1df320b4717c8 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 13:20:25 -0400 Subject: [PATCH 19/31] CASH-462 | Styling --- src/store/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index cdd81d164..4d079056e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -3265,7 +3265,7 @@ export const actions = { // create a submitted order object from vuex. const submittedState = { order: context.state.order, - applicationUser: context.state.applicationUser + applicationUser: context.state.applicationUser, }; const experiments = context.state.applicationUser.experiments; @@ -3327,8 +3327,8 @@ export const actions = { const submittedState = { order: submittedOrder, - applicationUser: submittedApplicationUser - } + applicationUser: submittedApplicationUser, + }; // set to local storage window.sessionStorage.setItem("submittedState", JSON.stringify(submittedState)); }, From 43d1353e52776e9832dc826e691305c4967cbc99 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 14:15:39 -0400 Subject: [PATCH 20/31] CASH-462 | Add constant for submittedState --- src/constants/session-storage.js | 3 +++ src/mixins/base-mixin.js | 9 +++++---- src/router/index.js | 6 ++++-- 3 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 src/constants/session-storage.js diff --git a/src/constants/session-storage.js b/src/constants/session-storage.js new file mode 100644 index 000000000..577fa4c0f --- /dev/null +++ b/src/constants/session-storage.js @@ -0,0 +1,3 @@ +export const sessionStorageKeyConstants = { + SUBMITTED_STATE: "submittedState" +} \ No newline at end of file diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 1c33640f8..73677726a 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -1,6 +1,7 @@ import store from "@/store"; import { storeActions } from "@/constants/store-actions.js"; import { storeMutations } from "@/constants/store-mutations.js"; +import { sessionStorageKeyConstants } from "@/constants/session-storage.js"; import { navigationScenarios } from "@/router/router-constants/navigation-scenarios"; import { vehicleCategories } from "@/constants/vehicle-categories.js"; import { routerParams } from "@/router/router-constants/router-params"; @@ -198,17 +199,17 @@ export default { } }, getSubmittedOrder() { - return JSON.parse(window.sessionStorage.getItem("submittedState"))?.order; + return JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE))?.order; }, hasSubmittedOrder() { - const submittedState = window.sessionStorage.getItem("submittedState"); + const submittedState = window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE); return submittedState !== null && submittedState.order !== null; }, getSubmittedApplicationUser() { - return JSON.parse(window.sessionStorage.getItem("submittedState"))?.applicationUser; + return JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE))?.applicationUser; }, hasSubmittedApplicationUser() { - const submittedState = window.sessionStorage.getItem("submittedState"); + const submittedState = window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE); return submittedState !== null && submittedState.applicationUser !== null; }, }, diff --git a/src/router/index.js b/src/router/index.js index e2263b32d..95aca54d8 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -2,6 +2,7 @@ import { createWebHistory, createRouter } from "vue-router"; import { storeActions } from "@/constants/store-actions"; import { storeMutations } from "../constants/store-mutations"; +import { sessionStorageKeyConstants } from "@/constants/session-storage.js"; import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js"; import { routingTable } from "@/router/router-constants/routing-table.js"; import { globalEvents, globalEventTypes } from "@/constants/events"; @@ -39,6 +40,7 @@ import { shouldStripPromoQueryString } from "@/helpers/promotions-helper"; import bailout from "@/layouts/bailout/bailout"; import { nextTick } from "vue"; import { getBoolFromString } from "@/helpers/boolean-helper"; +import { sessionStorageKeyConstants } from "../constants/session-storage"; const routes = [ { @@ -93,10 +95,10 @@ const routes = [ log(" --to.query.fmgPage ", to.query?.fmgPage); // Intercept all navigation if a submitted order exists in storage - if (window.sessionStorage.getItem("submittedState") !== null) { + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { if (to.query.fmgPage !== funnelStartPageName) { to.query.fmgPage = fmgPageValues.CONFIRMATION; - log(" --has submittedState go to confirmation"); + log(` --has ${sessionStorageKeyConstants.SUBMITTED_STATE} go to confirmation`); } } // On entering the funnel "fresh", read cookie information, decide what to do next. From af9775aa3b8e470f1360b1160448b3a408e65a24 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 14:17:31 -0400 Subject: [PATCH 21/31] CASH-462 | Prettier changes --- src/constants/session-storage.js | 6 +++--- src/mixins/base-mixin.js | 16 ++++++++++++---- src/router/index.js | 10 +++++++--- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/constants/session-storage.js b/src/constants/session-storage.js index 577fa4c0f..589dd6b71 100644 --- a/src/constants/session-storage.js +++ b/src/constants/session-storage.js @@ -1,3 +1,3 @@ -export const sessionStorageKeyConstants = { - SUBMITTED_STATE: "submittedState" -} \ No newline at end of file +export const sessionStorageKeyConstants = { + SUBMITTED_STATE: "submittedState", +}; diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 73677726a..b29eae8c1 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -199,17 +199,25 @@ export default { } }, getSubmittedOrder() { - return JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE))?.order; + return JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + )?.order; }, hasSubmittedOrder() { - const submittedState = window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE); + const submittedState = window.sessionStorage.getItem( + sessionStorageKeyConstants.SUBMITTED_STATE + ); return submittedState !== null && submittedState.order !== null; }, getSubmittedApplicationUser() { - return JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE))?.applicationUser; + return JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + )?.applicationUser; }, hasSubmittedApplicationUser() { - const submittedState = window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE); + const submittedState = window.sessionStorage.getItem( + sessionStorageKeyConstants.SUBMITTED_STATE + ); return submittedState !== null && submittedState.applicationUser !== null; }, }, diff --git a/src/router/index.js b/src/router/index.js index 95aca54d8..5ec909f97 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -40,7 +40,6 @@ import { shouldStripPromoQueryString } from "@/helpers/promotions-helper"; import bailout from "@/layouts/bailout/bailout"; import { nextTick } from "vue"; import { getBoolFromString } from "@/helpers/boolean-helper"; -import { sessionStorageKeyConstants } from "../constants/session-storage"; const routes = [ { @@ -95,10 +94,15 @@ const routes = [ log(" --to.query.fmgPage ", to.query?.fmgPage); // Intercept all navigation if a submitted order exists in storage - if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { + if ( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== + null + ) { if (to.query.fmgPage !== funnelStartPageName) { to.query.fmgPage = fmgPageValues.CONFIRMATION; - log(` --has ${sessionStorageKeyConstants.SUBMITTED_STATE} go to confirmation`); + log( + ` --has ${sessionStorageKeyConstants.SUBMITTED_STATE} go to confirmation` + ); } } // On entering the funnel "fresh", read cookie information, decide what to do next. From fe666f381abce1e3c9ce945010e1335c2b6656f3 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Thu, 3 Apr 2025 14:23:09 -0400 Subject: [PATCH 22/31] CASH-462 | Utilize new constant in the store --- src/store/index.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/store/index.js b/src/store/index.js index 4d079056e..673bf36ee 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,6 +1,7 @@ import { createStore } from "vuex"; import { endpoints } from "@/constants/endpoints.js"; import { storeMutations } from "@/constants/store-mutations"; +import { sessionStorageKeyConstants } from "@/constants/session-storage.js"; import { getDateForSavedSessionTimeout } from "@/helpers/heritage-integration/session-helper"; import createPersistedState from "vuex-persistedstate"; import globalMethods from "@/global-methods"; @@ -822,8 +823,8 @@ export const getters = { }, coverageIsVerified: (state) => { let order; - if (window.sessionStorage.getItem("submittedState") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedState")).order; + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { + order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order; } else { order = state.order; } @@ -851,9 +852,9 @@ export const getters = { return getHasRecalibrationPart(state); }, isRecalibrationOnSubmittedState: (state) => { - if (window.sessionStorage.getItem("submittedState") !== null) { + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { return getHasRecalibrationPart({ - order: JSON.parse(window.sessionStorage.getItem("submittedState")).order, + order: JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order, }); } @@ -861,8 +862,8 @@ export const getters = { }, shouldHideRecalibration: (state) => { var order; - if (window.sessionStorage.getItem("submittedState") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedState")).order; + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { + order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order; } else { order = state.order; } @@ -3258,7 +3259,7 @@ export const actions = { }, createSubmittedState(context) { - if (window.sessionStorage.getItem("submittedState") !== null) { + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { return; } @@ -3272,7 +3273,7 @@ export const actions = { const affiliateCookies = context.state.applicationUser.affiliateCookies; // set to local storage - window.sessionStorage.setItem("submittedState", JSON.stringify(submittedState)); + window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState)); window.sessionStorage.setItem("createNewSessionForHeritage", true); // clear vuex @@ -3330,12 +3331,12 @@ export const actions = { applicationUser: submittedApplicationUser, }; // set to local storage - window.sessionStorage.setItem("submittedState", JSON.stringify(submittedState)); + window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState)); }, resetSubmittedState(context) { // clear from local storage - window.sessionStorage.removeItem("submittedState"); + window.sessionStorage.removeItem(sessionStorageKeyConstants.SUBMITTED_STATE); }, resetExternalParameterState(context) { if (context.getters.isExternalParameter) { From 14165f72fdde93c7822870c5dbdc72d813fcb56a Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 7 Apr 2025 10:45:35 -0400 Subject: [PATCH 23/31] CASH-462 | Add applicationUser information to submittedState Refactor experiment mixin --- src/helpers/experiment-helper.js | 20 +++++++++++ src/layouts/confirmation/confirmation.vue | 22 ++++++------ src/mixins/experiment-mixin.js | 32 ++++++++++++----- src/store/index.js | 43 +++++++++++++---------- 4 files changed, 80 insertions(+), 37 deletions(-) create mode 100644 src/helpers/experiment-helper.js diff --git a/src/helpers/experiment-helper.js b/src/helpers/experiment-helper.js new file mode 100644 index 000000000..c0c094529 --- /dev/null +++ b/src/helpers/experiment-helper.js @@ -0,0 +1,20 @@ +export function getExperimentSettingsFromExperimentList(experimentList) { + return ( + experimentList + .filter((x) => !!x.isActive) + .map((x) => x.settings) + .reduce((r, c) => Object.assign(r, c), {}) ?? {} + ); +} + +export function getSettingValue(settingName, experimentSettings) { + return hasSetting(settingName, experimentSettings) ? experimentSettings[settingName] : null; +} + +export function hasSettingEqualTo(settingName, settingValue, experimentSettings) { + return experimentSettings[settingName] == settingValue; +} + +export function hasSetting(settingName, experimentSettings) { + return Object.hasOwn(experimentSettings, settingName); +} diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 7e9cfe71e..40fa73dbe 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -65,7 +65,7 @@ :isNoComp="isNoComp" :isMSRFeeApplicable="isMSRFeeApplicable" /> -
+
{ let order; if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { - order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order; + order = JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ).order; } else { order = state.order; } @@ -854,29 +860,24 @@ export const getters = { isRecalibrationOnSubmittedState: (state) => { if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { return getHasRecalibrationPart({ - order: JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order, + order: JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ).order, }); } - return false; }, shouldHideRecalibration: (state) => { - var order; if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { - order = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)).order; - } else { - order = state.order; + state = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)); } - + let order = state.order; + let applicationUser = state.applicationUser; if (order.payment.isInsurance) { return false; } - return ( - experimentMixin.methods - .getSettingValue(experimentSettings.RECAL_PRICE_REMOVE) - ?.toLowerCase() === "true" && getters.isRecalibrationOnOrder(state) - ); + return (hasSettingEqualTo(experimentSettings.RECAL_PRICE_REMOVE, "true", getExperimentSettingsFromExperimentList(applicationUser.experiments)) && getters.isRecalibrationOnOrder(state)) }, areRearWipersOnOrder: (state) => { return !!state.order.lineItems.vaps?.some( @@ -975,10 +976,7 @@ export const getters = { }; }, experimentSettings: (state) => - state.applicationUser.experiments - .filter((x) => !!x.isActive) - .map((x) => x.settings) - .reduce((r, c) => Object.assign(r, c), {}) ?? {}, + getExperimentSettingsFromExperimentList(state.applicationUser.experiments), isVerifiedAndDeductibleZeroConfirmed: (state) => { // used in CMS on /payment-method in Header Sub Text, for FunnelSubHeaderWidget on cart pages @@ -1855,6 +1853,7 @@ export const actions = { if (windshieldPartWithRecal) { url += `/${windshieldPartWithRecal.partNumber}`; } + url += "/false"; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, @@ -3273,7 +3272,10 @@ export const actions = { const affiliateCookies = context.state.applicationUser.affiliateCookies; // set to local storage - window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState)); + window.sessionStorage.setItem( + sessionStorageKeyConstants.SUBMITTED_STATE, + JSON.stringify(submittedState) + ); window.sessionStorage.setItem("createNewSessionForHeritage", true); // clear vuex @@ -3331,7 +3333,10 @@ export const actions = { applicationUser: submittedApplicationUser, }; // set to local storage - window.sessionStorage.setItem(sessionStorageKeyConstants.SUBMITTED_STATE, JSON.stringify(submittedState)); + window.sessionStorage.setItem( + sessionStorageKeyConstants.SUBMITTED_STATE, + JSON.stringify(submittedState) + ); }, resetSubmittedState(context) { From 23e16f02f4e25dbd35dc64b734893e221c463527 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 7 Apr 2025 10:46:35 -0400 Subject: [PATCH 24/31] CASH-462 | lnter changes --- src/mixins/experiment-mixin.js | 9 ++++++--- src/store/index.js | 14 +++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/mixins/experiment-mixin.js b/src/mixins/experiment-mixin.js index 079c5fe53..474945a54 100644 --- a/src/mixins/experiment-mixin.js +++ b/src/mixins/experiment-mixin.js @@ -14,7 +14,8 @@ export default { settingValue, experimentList = store.getters.applicationUser.experiments ) { - const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); return experimentHelper.hasSettingEqualTo( settingName, settingValue, @@ -22,11 +23,13 @@ export default { ); }, hasSetting(settingName, experimentList = store.getters.applicationUser.experiments) { - const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); return experimentHelper.hasSetting(settingName, experimentSettings); }, getSettingValue(settingName, experimentList = store.getters.applicationUser.experiments) { - const experimentSettings = experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); return experimentHelper.getSettingValue(settingName, experimentSettings); }, }, diff --git a/src/store/index.js b/src/store/index.js index 0257d8b1f..26b7c3286 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,7 +23,7 @@ import { getQuerystringParameter } from "@/helpers/querystring-helper"; import { deepClone } from "@/helpers/object-helper"; import { getExperimentSettingsFromExperimentList, - hasSettingEqualTo + hasSettingEqualTo, } from "../helpers/experiment-helper"; import { queryStrings } from "@/constants/query-strings"; import { partTypeStrings } from "@/constants/part-type-strings"; @@ -869,7 +869,9 @@ export const getters = { }, shouldHideRecalibration: (state) => { if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { - state = JSON.parse(window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE)); + state = JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ); } let order = state.order; let applicationUser = state.applicationUser; @@ -877,7 +879,13 @@ export const getters = { return false; } - return (hasSettingEqualTo(experimentSettings.RECAL_PRICE_REMOVE, "true", getExperimentSettingsFromExperimentList(applicationUser.experiments)) && getters.isRecalibrationOnOrder(state)) + return ( + hasSettingEqualTo( + experimentSettings.RECAL_PRICE_REMOVE, + "true", + getExperimentSettingsFromExperimentList(applicationUser.experiments) + ) && getters.isRecalibrationOnOrder(state) + ); }, areRearWipersOnOrder: (state) => { return !!state.order.lineItems.vaps?.some( From 565c9408f63024948756e66162bbf7d3278bfe84 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 7 Apr 2025 11:27:52 -0400 Subject: [PATCH 25/31] CASH-462 | remove heavy truck work around --- src/store/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index 26b7c3286..36a459d80 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1861,7 +1861,6 @@ export const actions = { if (windshieldPartWithRecal) { url += `/${windshieldPartWithRecal.partNumber}`; } - url += "/false"; return globalMethods.callHttpClient({ method: endpoints.GetProviders.method, From 2d9b59eab4609f590fbf08dfcec1c71b6896dc5b Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 7 Apr 2025 13:11:55 -0400 Subject: [PATCH 26/31] CASH-462 | Update unit tests --- src/layouts/schedule/schedule.spec.js | 4 +++- src/layouts/service-location/service-location.spec.js | 1 + src/layouts/service-zip/service-zip.spec.js | 5 +++++ src/mixins/experiment-mixin.spec.js | 10 ++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/layouts/schedule/schedule.spec.js b/src/layouts/schedule/schedule.spec.js index 3344e3d27..0e519742a 100644 --- a/src/layouts/schedule/schedule.spec.js +++ b/src/layouts/schedule/schedule.spec.js @@ -7,7 +7,6 @@ import { getMountOptions } from "@/helpers/unit-test-helper.js"; import store from "@/store"; import router from "@/router"; import baseMixin from "../../mixins/base-mixin"; -import { experimentSettings } from "../../constants/experiments"; // Mock basemixin jest.mock("@/mixins/base-mixin.js", () => ({ @@ -147,6 +146,9 @@ beforeEach(() => { jest.restoreAllMocks(); jest.clearAllMocks(); store.getters = { + applicationUser: { + experiments: [] + }, order: { schedule: { date: "2019-01-01", diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index fb34f3921..e0caf3694 100644 --- a/src/layouts/service-location/service-location.spec.js +++ b/src/layouts/service-location/service-location.spec.js @@ -174,6 +174,7 @@ const mockMixin = { beforeEach(() => { store.getters = { + applicationUser: {experiments: []}, lineItems: { supportingItems: [ { diff --git a/src/layouts/service-zip/service-zip.spec.js b/src/layouts/service-zip/service-zip.spec.js index 773157980..cb1406ce5 100644 --- a/src/layouts/service-zip/service-zip.spec.js +++ b/src/layouts/service-zip/service-zip.spec.js @@ -173,9 +173,14 @@ function resetMockStoreData() { }; } +const applicationUser = { + experiments: [] +}; + function applyMockStoreDataToGetters() { store.getters = { experimentSettings: mockExperimentSettings, + applicationUser: applicationUser, order: mockStoreData, damage: mockStoreData.damage, payment: mockStoreData.payment, diff --git a/src/mixins/experiment-mixin.spec.js b/src/mixins/experiment-mixin.spec.js index 1b2bff2f5..2031d63ef 100644 --- a/src/mixins/experiment-mixin.spec.js +++ b/src/mixins/experiment-mixin.spec.js @@ -135,6 +135,16 @@ function setupMocks({ experimentSettings }) { store.getters = { experimentSettings: experimentSettings ?? testExperimentSettings, + applicationUser: { + experiments: [ + { + isActive: true, + isExposed: true, + settings: experimentSettings ?? testExperimentSettings + } + + ] + } }; const mockComponent = { From d461576ddbae56a604fa37e1ab87bd67d9b6bfd5 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Mon, 7 Apr 2025 13:12:39 -0400 Subject: [PATCH 27/31] CASH-462 | Pretter --- src/layouts/schedule/schedule.spec.js | 2 +- src/layouts/service-location/service-location.spec.js | 2 +- src/layouts/service-zip/service-zip.spec.js | 2 +- src/mixins/experiment-mixin.spec.js | 9 ++++----- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/layouts/schedule/schedule.spec.js b/src/layouts/schedule/schedule.spec.js index 0e519742a..3a389aec5 100644 --- a/src/layouts/schedule/schedule.spec.js +++ b/src/layouts/schedule/schedule.spec.js @@ -147,7 +147,7 @@ beforeEach(() => { jest.clearAllMocks(); store.getters = { applicationUser: { - experiments: [] + experiments: [], }, order: { schedule: { diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index e0caf3694..7dccc1b1e 100644 --- a/src/layouts/service-location/service-location.spec.js +++ b/src/layouts/service-location/service-location.spec.js @@ -174,7 +174,7 @@ const mockMixin = { beforeEach(() => { store.getters = { - applicationUser: {experiments: []}, + applicationUser: { experiments: [] }, lineItems: { supportingItems: [ { diff --git a/src/layouts/service-zip/service-zip.spec.js b/src/layouts/service-zip/service-zip.spec.js index cb1406ce5..3346970cf 100644 --- a/src/layouts/service-zip/service-zip.spec.js +++ b/src/layouts/service-zip/service-zip.spec.js @@ -174,7 +174,7 @@ function resetMockStoreData() { } const applicationUser = { - experiments: [] + experiments: [], }; function applyMockStoreDataToGetters() { diff --git a/src/mixins/experiment-mixin.spec.js b/src/mixins/experiment-mixin.spec.js index 2031d63ef..8dc3df2b6 100644 --- a/src/mixins/experiment-mixin.spec.js +++ b/src/mixins/experiment-mixin.spec.js @@ -140,11 +140,10 @@ function setupMocks({ experimentSettings }) { { isActive: true, isExposed: true, - settings: experimentSettings ?? testExperimentSettings - } - - ] - } + settings: experimentSettings ?? testExperimentSettings, + }, + ], + }, }; const mockComponent = { From 9083ffbaed34b1e527f19b8d6c358ef5992a922e Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 7 Apr 2025 15:59:57 -0400 Subject: [PATCH 28/31] CASH-484: add logic to make sure insurance orders won't keep the upcharge part item --- src/layouts/schedule/schedule.vue | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index 63e4a3775..d00f2dff2 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -269,14 +269,16 @@ export default { const priceString = getAmountDue(lineItemsToBePriced, false); // pass the IncludeTax param as false const priceStringIntegerRoundedDown = priceString?.split(".")[0]; // same method used as getDisplayPrice() in service-package-radio used on /quote const pricingByDayBasePrice = parseInt(priceStringIntegerRoundedDown); + const payment = store.getters.order.payment; + const isInsurance = payment?.isInsurance; // Check to see if includePricingByDayUpcharge should already be set (based on order lineItems) let includePricingByDayUpcharge = false; if (supportingItemsFromStore) { const pricingByDayUpchargeFeeIndex = supportingItemsFromStore?.findIndex( (item) => item.partType == PRICING_BY_DAY_PART_TYPE - ); - if (pricingByDayUpchargeFeeIndex > -1) { + ); + if (pricingByDayUpchargeFeeIndex > -1 && !isInsurance) { includePricingByDayUpcharge = true; } } @@ -630,26 +632,24 @@ export default { const supportingItems = this.getSupportingItems(); // if we have a pricing by day upcharge, then save/update supporting items with it - if (this.showPricingByDay) { - const pricingByDayUpchargeFeeIndex = supportingItems?.findIndex( - (item) => item.partType == PRICING_BY_DAY_PART_TYPE - ); + const pricingByDayUpchargeFeeIndex = supportingItems?.findIndex( + (item) => item.partType == PRICING_BY_DAY_PART_TYPE + ); - if (this.includePricingByDayUpcharge) { - if (pricingByDayUpchargeFeeIndex > -1) { - supportingItems[pricingByDayUpchargeFeeIndex].laborAmount = - this.pricingByDayUpchargeLineItem.laborAmount; - supportingItems[pricingByDayUpchargeFeeIndex].sellingPrice = - this.pricingByDayUpchargeLineItem.sellingPrice; - supportingItems[pricingByDayUpchargeFeeIndex].kitPrice = - this.pricingByDayUpchargeLineItem.kitPrice; - } else { - supportingItems.push(this.pricingByDayUpchargeLineItem); - } + if (this.includePricingByDayUpcharge && this.showPricingByDay) { + if (pricingByDayUpchargeFeeIndex && pricingByDayUpchargeFeeIndex > -1) { + supportingItems[pricingByDayUpchargeFeeIndex].laborAmount = + this.pricingByDayUpchargeLineItem.laborAmount; + supportingItems[pricingByDayUpchargeFeeIndex].sellingPrice = + this.pricingByDayUpchargeLineItem.sellingPrice; + supportingItems[pricingByDayUpchargeFeeIndex].kitPrice = + this.pricingByDayUpchargeLineItem.kitPrice; } else { - if (pricingByDayUpchargeFeeIndex >= 0) { - supportingItems.splice(pricingByDayUpchargeFeeIndex, 1); - } + supportingItems.push(this.pricingByDayUpchargeLineItem); + } + } else { + if (pricingByDayUpchargeFeeIndex >= 0) { // remove pricing by day upcharge if it already was in store + supportingItems.splice(pricingByDayUpchargeFeeIndex, 1); } } From f71de530af85653f4daa4c2e5b96139c09393e89 Mon Sep 17 00:00:00 2001 From: Adam Caouette Date: Mon, 7 Apr 2025 16:17:11 -0400 Subject: [PATCH 29/31] CASH-484: prettier changes --- src/layouts/schedule/schedule.vue | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index d00f2dff2..318ff0aa5 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -277,7 +277,7 @@ export default { if (supportingItemsFromStore) { const pricingByDayUpchargeFeeIndex = supportingItemsFromStore?.findIndex( (item) => item.partType == PRICING_BY_DAY_PART_TYPE - ); + ); if (pricingByDayUpchargeFeeIndex > -1 && !isInsurance) { includePricingByDayUpcharge = true; } @@ -636,7 +636,7 @@ export default { (item) => item.partType == PRICING_BY_DAY_PART_TYPE ); - if (this.includePricingByDayUpcharge && this.showPricingByDay) { + if (this.includePricingByDayUpcharge && this.showPricingByDay) { if (pricingByDayUpchargeFeeIndex && pricingByDayUpchargeFeeIndex > -1) { supportingItems[pricingByDayUpchargeFeeIndex].laborAmount = this.pricingByDayUpchargeLineItem.laborAmount; @@ -648,7 +648,8 @@ export default { supportingItems.push(this.pricingByDayUpchargeLineItem); } } else { - if (pricingByDayUpchargeFeeIndex >= 0) { // remove pricing by day upcharge if it already was in store + if (pricingByDayUpchargeFeeIndex >= 0) { + // remove pricing by day upcharge if it already was in store supportingItems.splice(pricingByDayUpchargeFeeIndex, 1); } } From 5454d941a8c95bb2c482ca6905c33367c1b218df Mon Sep 17 00:00:00 2001 From: Minojhini Valaiyapathi Date: Tue, 8 Apr 2025 09:44:53 -0400 Subject: [PATCH 30/31] CASH-474 - upon confirmation page refresh, updated the logic to add another donation --- src/layouts/confirmation/confirmation.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 40fa73dbe..af6f9e5ab 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -237,6 +237,9 @@ export default { vm.shouldHideRecalibration = shouldHideRecalibration(); vm.shouldDisplayFosterLove = hasFosterLoveExperiment; vm.donationAmount = donationAmount; + vm.showDonationSuccess = lineItemsFromSubmittedOrder.supportingItems?.some( + (item) => item.partType === partNumberStrings.DONATION + ); }); }, data() { From b2f6528aeae73be66028d12352a695d7385cff73 Mon Sep 17 00:00:00 2001 From: Scott Kiener Date: Tue, 8 Apr 2025 09:58:54 -0400 Subject: [PATCH 31/31] CASH-374 | Remove mocking, clean up code --- src/constants/endpoints.js | 4 + src/store/index.js | 154 +++++++++++-------------------------- 2 files changed, 49 insertions(+), 109 deletions(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 594227f7b..f99ea660d 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -192,6 +192,10 @@ const endpoints = { url: "/account/api/v1/account/bill-to-account-number", method: "GET", }, + AddDonationPart: { + url: "/order/api/v1/order/add-donation-part", + method: "POST", + }, }; export { endpoints }; diff --git a/src/store/index.js b/src/store/index.js index 36a459d80..97a31068e 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1899,96 +1899,48 @@ export const actions = { pageNameToLog: pageNameToLog, }); }, - submitDonationPartToSV2( + async submitDonationPartToSV2( context, { payload: { donationAmount, submittedOrder }, pageNameToLog } ) { - donationAmount = parseInt(donationAmount); - /* Request contract - { - "donationAmount": 5, - "savedSessionId": "96b1a16e-410a-4d08-8421-fe36e82b2275", - "paymentInfo": { - "parentAccountNumber": 167132, - "billToAccountNumber": 87291, - "providerNumber": "005819", - "carId": "CR00069266", - "make": "Acura", - "model": "MDX", - "year": 2020, - "eon": "S1820397", - "zipCode": "43015", - "state": "OH", - "referralNumber": "1821895", - "referralDate": "2025-03-20T16:27:38.93", - "referralSequenceNumber": "1821895", - "serviceZipCode": "43015", - "isReplacement": true, - "deductible": 0, - "coverageStatus": null, - "coverageSubStatus": null, - "serverData": "ZtCNOF1tCLQBAx2NRKHE/n/fqD8zUxRfYtDuTu7uUiPpeg7i6TmwXwggssX5KsXVQbeft+PN+vXYfBFJytLVYgbafNDR0JH3izVTIOh7KGTeB6YaPuCJmodF4SfgVVDHD9LEmEH9wNzM9j3pFjgfXehOFH11SH9dNwTkXIbsGzAeu64DRyJsDdpamM/BPOxlJj60S/R8vnUM8mjyM7B9a63NskFI6BCVIh5mxDE4cSMUgb4zFtwvDgTPxJSwXqKShtoY6ryB8n5UPNkG/Z5tjVuJ7/8RV7WrURM7PN7xLfp6pVEeipWyeFnVEK33G9JOuB6yH75jPO6vMCYRNi0p0pg6laasFDy3hmfuy2W/N0qtcJLVa5N0bUMFFuPQusyEeqsEZ/zx1Srlvsk7i0DF8pTyBcm3JTF5BOWm60wg3ntEOqfRuQqzFc5updILwLAIp39CwJG/fs5Mj3HCDcUKwYlK70fAARtJwFu7wI0vqW5bUSUvJkvm1JRPlyWJ8JNY4Oq1apYqhZS9bps5ofgiOYJbBhPEboEnVukoTkQiYjgbMtBwVGKGL2nNEd77osoEg1KXhEQS+0KD3PoUu/bZkGub6FNGE6iKeFPt9gDSs+S21s22rVSaZkgaoC6SkufPpN6aV78Jx69nMIDd4go4pj2IJX4kS1pD1NEOSWjN4bgVKAtV6/bxBvhNJwnqUE+mE8eAmULsezub4LMhPqA58y/ZlO44jt/qkAw9nuVDRPBve+TdJTotID5dIqJJd6/vkDoHTVaSrbkCBbdG6d9By8AEbKuVrQS/+VurUnYEd2TGahPbOyRdNlud8RB4+4af0ZRFmiKkr6ppa5IbHbTIZ2qtyeOSbIOkv8O7xK/GL6e6Iaaz0wDHaQZC4Ea8FczjpFOlQgixfYcYJBb/W2db+uRvZ3lftVyJ/d082CGbYplOa+aTxymVcQSjBRbXzs6GZ2ytDqRYcRe94F9x/XSVj7g+mih7VS+YH0eOEp0ViTuWP8B1dVnOV5yTkdMbr8n9Q82G4v5brtQdiMDMY3HS6mxPb1IiKiqFX6Jgju8sIMxkJFZQ3iIkAJuOqUYkG1ZW7s4uI6hT46bRqzYaQA18CFu56qaMblOBFuxlJIsYsnMePh2xAH89oay5Kc88xwT2T/4+dzYQ0CqhQ4MTBB7nXelav2rMCjaLQ/V/a5r1TnLr2n0GbvODQeNl97qzi5lDYKlnuF8nOfOqZNOsPSsrsk3UZJJYZwNxDZaweHIeeg5P2ZW5agswPx/U5DkU1MzE1VAQ+DQAenaE2SLo4dSPBHMmt2gLpgu0LaCuzTR2IL/EM+Tpdn/Pcv1E7lPJIycIIwO7QGJcVkwCx8CJ/WCo6xDMq+9zjSVbqAaL5MzySZCeFCMyZxvEk7qXig6rflB3K3Jay4qSFjBxBXhOEuT6zKXyhR41IXRtZRmtPkscypFEUXvR5nJV7AQUIbljGEcikOLmSiCEnl8dI2Ny9xCHLOro8UXqVUy8dHGmTRGTE/mS1JNZ3y4XaZSyHcABVWbZcR3KIXVxd6rtUA/pBvWpbq8nH3WWlJGqkoxUVEridtXqcBuzTKg3/i6vLs0/pHGwdM38XizKcIxykvJrur3vEQ==" - } - } - */ + const state = JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ); + const order = state.order; + const payload = { + donationAmount: parseInt(donationAmount), + savedSessionId: state.applicationUser.savedSessionId, + paymentInfo: { + parentAccountNumber: order.payment.parentAccountNumber, + billToAccountNumber: order.payment.billToAccountNumber, + providerNumber: order.serviceLocation.provider.providerNumber, + carId: order.vehicle.carId, + make: order.vehicle.make, + model: order.vehicle.model, + year: order.vehicle.year, + eon: order.eon, + zipCode: order.serviceLocation.zipCode, + state: order.serviceLocation.state, + referralNumber: order.referralNumber, + referralDate: order.referralDate, + referralSequenceNumber: order.referralSequenceNumber, + serviceZipCode: order.serviceLocation.zipCode, + isReplacement: !order.damage.isRepair, + deductible: order.policy.currentDeductible, + coverageStatus: order.payment.insuranceCoverage.coverageStatus, + coverageSubStatus: order.payment.insuranceCoverage.coverageSubStatus, + serverData: order.lineItems.serverData, + }, + }; - /* Uncomment and use when endpoint integration is finalized - return globalMethods.callHttpClient({ + const response = await globalMethods.callHttpClient({ method: endpoints.AddDonationPart.method, endpoint: endpoints.AddDonationPart.url, - payload: { - donationAmount: donationAmount, - savedSessionId: "96b1a16e-410a-4d08-8421-fe36e82b2275", - paymentInfo: { - parentAccountNumber: submittedSessionData.parentAccountNumber, - billToAccountNumber: submittedSessionData.billToAccountNumber, - providerNumber: submittedSessionData.providerNumber, - carId: "CR00069266", - make: "Acura", - model: "MDX", - year: 2020, - eon: "S1820397", - zipCode: "43015", - state: "OH", - referralNumber: "1821895", - referralDate: "2025-03-20T16:27:38.93", - referralSequenceNumber: "1821895", - serviceZipCode: "43015", - isReplacement: true, - deductible: 0, - coverageStatus: null, - coverageSubStatus: null, - serverData: "ZtCNOF1tCLQBAx2NRKHE/n/fqD8zUxRfYtDuTu7uUiPpeg7i6TmwXwggssX5KsXVQbeft+PN+vXYfBFJytLVYgbafNDR0JH3izVTIOh7KGTeB6YaPuCJmodF4SfgVVDHD9LEmEH9wNzM9j3pFjgfXehOFH11SH9dNwTkXIbsGzAeu64DRyJsDdpamM/BPOxlJj60S/R8vnUM8mjyM7B9a63NskFI6BCVIh5mxDE4cSMUgb4zFtwvDgTPxJSwXqKShtoY6ryB8n5UPNkG/Z5tjVuJ7/8RV7WrURM7PN7xLfp6pVEeipWyeFnVEK33G9JOuB6yH75jPO6vMCYRNi0p0pg6laasFDy3hmfuy2W/N0qtcJLVa5N0bUMFFuPQusyEeqsEZ/zx1Srlvsk7i0DF8pTyBcm3JTF5BOWm60wg3ntEOqfRuQqzFc5updILwLAIp39CwJG/fs5Mj3HCDcUKwYlK70fAARtJwFu7wI0vqW5bUSUvJkvm1JRPlyWJ8JNY4Oq1apYqhZS9bps5ofgiOYJbBhPEboEnVukoTkQiYjgbMtBwVGKGL2nNEd77osoEg1KXhEQS+0KD3PoUu/bZkGub6FNGE6iKeFPt9gDSs+S21s22rVSaZkgaoC6SkufPpN6aV78Jx69nMIDd4go4pj2IJX4kS1pD1NEOSWjN4bgVKAtV6/bxBvhNJwnqUE+mE8eAmULsezub4LMhPqA58y/ZlO44jt/qkAw9nuVDRPBve+TdJTotID5dIqJJd6/vkDoHTVaSrbkCBbdG6d9By8AEbKuVrQS/+VurUnYEd2TGahPbOyRdNlud8RB4+4af0ZRFmiKkr6ppa5IbHbTIZ2qtyeOSbIOkv8O7xK/GL6e6Iaaz0wDHaQZC4Ea8FczjpFOlQgixfYcYJBb/W2db+uRvZ3lftVyJ/d082CGbYplOa+aTxymVcQSjBRbXzs6GZ2ytDqRYcRe94F9x/XSVj7g+mih7VS+YH0eOEp0ViTuWP8B1dVnOV5yTkdMbr8n9Q82G4v5brtQdiMDMY3HS6mxPb1IiKiqFX6Jgju8sIMxkJFZQ3iIkAJuOqUYkG1ZW7s4uI6hT46bRqzYaQA18CFu56qaMblOBFuxlJIsYsnMePh2xAH89oay5Kc88xwT2T/4+dzYQ0CqhQ4MTBB7nXelav2rMCjaLQ/V/a5r1TnLr2n0GbvODQeNl97qzi5lDYKlnuF8nOfOqZNOsPSsrsk3UZJJYZwNxDZaweHIeeg5P2ZW5agswPx/U5DkU1MzE1VAQ+DQAenaE2SLo4dSPBHMmt2gLpgu0LaCuzTR2IL/EM+Tpdn/Pcv1E7lPJIycIIwO7QGJcVkwCx8CJ/WCo6xDMq+9zjSVbqAaL5MzySZCeFCMyZxvEk7qXig6rflB3K3Jay4qSFjBxBXhOEuT6zKXyhR41IXRtZRmtPkscypFEUXvR5nJV7AQUIbljGEcikOLmSiCEnl8dI2Ny9xCHLOro8UXqVUy8dHGmTRGTE/mS1JNZ3y4XaZSyHcABVWbZcR3KIXVxd6rtUA/pBvWpbq8nH3WWlJGqkoxUVEridtXqcBuzTKg3/i6vLs0/pHGwdM38XizKcIxykvJrur3vEQ==" - } - }, + payload: payload, logApiCall: true, pageNameToLog: pageNameToLog, }); - */ - - /* Response contract - { - "wasSuccessful": true, - "wasLocked": true - } - */ - let result; - - switch (donationAmount) { - case 1: - result = { wasSuccessful: true, wasLocked: false }; - break; - case 3: - result = { wasSuccessful: false, wasLocked: true }; - break; - case 5: - result = { wasSuccessful: false, wasLocked: false }; - break; - default: - result = { wasSuccessful: null, wasLocked: null }; // Default case if amount doesn't match - } - - return result; + return response.data; }, getPartFromCapabilityQuestionAnswer(context, { payload, pageNameToLog }) { @@ -3302,38 +3254,22 @@ export const actions = { }, addDonationToSubmittedState(context, donationAmount) { - console.log("running addDonationToSubmittedOrder()... donationAmount: ", donationAmount); - const submittedOrder = deepClone(baseMixin.methods.getSubmittedOrder()); const submittedApplicationUser = deepClone(baseMixin.methods.getSubmittedApplicationUser()); - if (donationAmount > 0) { - console.log( - "running addDonationToSubmittedOrder()... adding donation to supportingItems in session storage " - ); - submittedOrder.lineItems.supportingItems.push({ - partNumber: `DONATION_${donationAmount}`, - description: `DONATION $${donationAmount}`, - partType: partTypeStrings.DONATION, - isInsurable: false, - isChildPart: false, - laborAmount: 0, - sellingPrice: donationAmount, - kitPrice: 0, - salesTax: 0, - id: `donation-${donationAmount}`, - }); - } else { - // filter out all donations - console.log( - "running addDonationToSubmittedOrder()... removing all donation items in supportingItems in session storage " - ); + submittedOrder.lineItems.supportingItems.push({ + partNumber: `DONATION_${donationAmount}`, + description: `DONATION $${donationAmount}`, + partType: partTypeStrings.DONATION, + isInsurable: false, + isChildPart: false, + laborAmount: 0, + sellingPrice: donationAmount, + kitPrice: 0, + salesTax: 0, + }); - const nonDonationItems = submittedOrder.lineItems.supportingItems.filter((item) => { - return item.partType !== "DONATION"; - }); - submittedOrder.lineItems.supportingItems = nonDonationItems; - } + addGuidToLineItemsIfNotAlreadyThere(submittedOrder.lineItems.supportingItems); const submittedState = { order: submittedOrder,