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/constants/session-storage.js b/src/constants/session-storage.js new file mode 100644 index 000000000..589dd6b71 --- /dev/null +++ b/src/constants/session-storage.js @@ -0,0 +1,3 @@ +export const sessionStorageKeyConstants = { + SUBMITTED_STATE: "submittedState", +}; 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/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; diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 1cc1bb484..2a715bc93 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/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/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 12415226b..40fa73dbe 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -63,11 +63,9 @@ :isExpandedOnLoad="false" :isItac="isItac" :isNoComp="isNoComp" - :isMSRFeeApplicable="isMSRFeeApplicable" - :donationAmount="donationAmount" - @update-donation-amount="updateDonationAmount" /> + :isMSRFeeApplicable="isMSRFeeApplicable" /> -
+
({ @@ -147,6 +146,9 @@ beforeEach(() => { jest.restoreAllMocks(); jest.clearAllMocks(); store.getters = { + applicationUser: { + experiments: [], + }, order: { schedule: { date: "2019-01-01", diff --git a/src/layouts/schedule/schedule.vue b/src/layouts/schedule/schedule.vue index fcd20ace1..2fd06d312 100644 --- a/src/layouts/schedule/schedule.vue +++ b/src/layouts/schedule/schedule.vue @@ -269,6 +269,8 @@ 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; @@ -276,7 +278,7 @@ export default { const pricingByDayUpchargeFeeIndex = supportingItemsFromStore?.findIndex( (item) => item.partType == PRICING_BY_DAY_PART_TYPE ); - if (pricingByDayUpchargeFeeIndex > -1) { + if (pricingByDayUpchargeFeeIndex > -1 && !isInsurance) { includePricingByDayUpcharge = true; } } @@ -630,26 +632,25 @@ 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); } } diff --git a/src/layouts/service-location/service-location.spec.js b/src/layouts/service-location/service-location.spec.js index fb34f3921..7dccc1b1e 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..3346970cf 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/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..b29eae8c1 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,10 +199,26 @@ export default { } }, getSubmittedOrder() { - return JSON.parse(window.sessionStorage.getItem("submittedOrder")); + return JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + )?.order; }, hasSubmittedOrder() { - return window.sessionStorage.getItem("submittedOrder") !== null; + 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; + }, + hasSubmittedApplicationUser() { + const submittedState = window.sessionStorage.getItem( + sessionStorageKeyConstants.SUBMITTED_STATE + ); + return submittedState !== null && submittedState.applicationUser !== null; }, }, computed: { diff --git a/src/mixins/experiment-mixin.js b/src/mixins/experiment-mixin.js index 11b573683..474945a54 100644 --- a/src/mixins/experiment-mixin.js +++ b/src/mixins/experiment-mixin.js @@ -1,17 +1,36 @@ import store from "@/store"; +import * as experimentHelper from "../helpers/experiment-helper"; + +/* + This is a wrapper around experiment-helper.js methods that allows an override + to provide a custom list of experiments. At the time of implementation this + was necessary for checking submittedState for experiments +*/ export default { methods: { - hasSettingEqualTo(settingName, settingValue) { - return store.getters.experimentSettings[settingName] == settingValue; + hasSettingEqualTo( + settingName, + settingValue, + experimentList = store.getters.applicationUser.experiments + ) { + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + return experimentHelper.hasSettingEqualTo( + settingName, + settingValue, + experimentSettings + ); }, - hasSetting(settingName) { - return Object.hasOwn(store.getters.experimentSettings, settingName); + hasSetting(settingName, experimentList = store.getters.applicationUser.experiments) { + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + return experimentHelper.hasSetting(settingName, experimentSettings); }, - getSettingValue(settingName) { - return this.hasSetting(settingName) - ? store.getters.experimentSettings[settingName] - : null; + getSettingValue(settingName, experimentList = store.getters.applicationUser.experiments) { + const experimentSettings = + experimentHelper.getExperimentSettingsFromExperimentList(experimentList); + return experimentHelper.getSettingValue(settingName, experimentSettings); }, }, }; diff --git a/src/mixins/experiment-mixin.spec.js b/src/mixins/experiment-mixin.spec.js index 1b2bff2f5..8dc3df2b6 100644 --- a/src/mixins/experiment-mixin.spec.js +++ b/src/mixins/experiment-mixin.spec.js @@ -135,6 +135,15 @@ function setupMocks({ experimentSettings }) { store.getters = { experimentSettings: experimentSettings ?? testExperimentSettings, + applicationUser: { + experiments: [ + { + isActive: true, + isExposed: true, + settings: experimentSettings ?? testExperimentSettings, + }, + ], + }, }; const mockComponent = { diff --git a/src/router/index.js b/src/router/index.js index 668a18217..d421ea4ad 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"; @@ -98,10 +99,15 @@ 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(sessionStorageKeyConstants.SUBMITTED_STATE) !== + null + ) { if (to.query.fmgPage !== funnelStartPageName) { to.query.fmgPage = fmgPageValues.CONFIRMATION; - log(" --has submittedOrder go to confirmation"); + log( + ` --has ${sessionStorageKeyConstants.SUBMITTED_STATE} 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..97a31068e 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"; @@ -20,6 +21,10 @@ import { } from "@/constants/schedule-constants"; import { getQuerystringParameter } from "@/helpers/querystring-helper"; import { deepClone } from "@/helpers/object-helper"; +import { + getExperimentSettingsFromExperimentList, + hasSettingEqualTo, +} from "../helpers/experiment-helper"; import { queryStrings } from "@/constants/query-strings"; import { partTypeStrings } from "@/constants/part-type-strings"; import { @@ -822,8 +827,10 @@ export const getters = { }, coverageIsVerified: (state) => { let order; - if (window.sessionStorage.getItem("submittedOrder") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedOrder")); + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { + order = JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ).order; } else { order = state.order; } @@ -850,31 +857,34 @@ export const getters = { isRecalibrationOnOrder: (state) => { return getHasRecalibrationPart(state); }, - isRecalibrationOnSubmittedOrder: (state) => { - if (window.sessionStorage.getItem("submittedOrder") !== null) { + isRecalibrationOnSubmittedState: (state) => { + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { return getHasRecalibrationPart({ - order: JSON.parse(window.sessionStorage.getItem("submittedOrder")), + order: JSON.parse( + window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) + ).order, }); } - return false; }, shouldHideRecalibration: (state) => { - var order; - if (window.sessionStorage.getItem("submittedOrder") !== null) { - order = JSON.parse(window.sessionStorage.getItem("submittedOrder")); - } else { - order = state.order; + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== null) { + 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) + hasSettingEqualTo( + experimentSettings.RECAL_PRICE_REMOVE, + "true", + getExperimentSettingsFromExperimentList(applicationUser.experiments) + ) && getters.isRecalibrationOnOrder(state) ); }, areRearWipersOnOrder: (state) => { @@ -974,10 +984,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 @@ -1892,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 }) { @@ -3257,19 +3216,25 @@ export const actions = { return false; }, - createSubmittedOrder(context) { - if (window.sessionStorage.getItem("submittedOrder") !== null) { + createSubmittedState(context) { + if (window.sessionStorage.getItem(sessionStorageKeyConstants.SUBMITTED_STATE) !== 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( + sessionStorageKeyConstants.SUBMITTED_STATE, + JSON.stringify(submittedState) + ); window.sessionStorage.setItem("createNewSessionForHeritage", true); // clear vuex @@ -3288,45 +3253,38 @@ export const actions = { context.commit(storeMutations.UPDATE_AFFILIATE_COOKIES, affiliateCookies); }, - addDonationToSubmittedOrder(context, donationAmount) { - console.log("running addDonationToSubmittedOrder()... donationAmount: ", donationAmount); - + addDonationToSubmittedState(context, 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, + applicationUser: submittedApplicationUser, + }; // set to local storage - window.sessionStorage.setItem("submittedOrder", JSON.stringify(submittedOrder)); + window.sessionStorage.setItem( + sessionStorageKeyConstants.SUBMITTED_STATE, + JSON.stringify(submittedState) + ); }, - resetSubmittedOrder(context) { + resetSubmittedState(context) { // clear from local storage - window.sessionStorage.removeItem("submittedOrder"); + window.sessionStorage.removeItem(sessionStorageKeyConstants.SUBMITTED_STATE); }, resetExternalParameterState(context) { if (context.getters.isExternalParameter) {