From 73969b4352db50fbbc4124171cf174f2475d5bfc Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Wed, 10 Apr 2024 15:44:23 -0400 Subject: [PATCH 01/19] Initial changes --- .../cart-dropdown/cart-dropdown.vue | 9 +++++---- .../coverage-statement/coverage-statement.vue | 8 ++++---- src/layouts/entry-page/entry-page.vue | 4 ++++ src/layouts/payment-method/payment-method.vue | 16 ++++++++-------- src/layouts/tpa-submit/tpa-submit.vue | 3 ++- src/store/index.js | 11 ++++++----- 6 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 54031ec5..3e6c9cb0 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -207,8 +207,9 @@ export default { return getPriceOfLineItems(this.baseServiceLineItems); }, isUnverified() { - return !useMainStore().isNoComp && !useMainStore().policy.isITAC - && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); + return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + || (!useMainStore().isNoComp && !useMainStore().policy.isITAC + && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus)); }, subTotal() { const basePrice = !useMainStore().isNoComp && !useMainStore().policy.isITAC @@ -350,8 +351,8 @@ export default { }, getDisplayed(amount) { return this.isUnverified - && !useMainStore().isNoComp - && !useMainStore().policy.isITAC + // && ((useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + // || (!useMainStore().isNoComp && !useMainStore().policy.isITAC)) ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index bd1e0162..9f866e2f 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -208,11 +208,11 @@ export default { }, data() { const { isRepair } = useMainStore().damage; - const { policyLookupSuccessful, noCoverage } = useMainStore().policy; + const { policyLookupSuccessful } = useMainStore().policy; return { isRepair, policyLookupSuccessful, - isNoComp: noCoverage ?? false, + isNoComp: useMainStore().isNoComp, baseServiceLineItems: [], selectedProvider: '', deductibleText: 'Your deductible is', @@ -292,7 +292,7 @@ export default { return useMainStore().payment.insuranceCoverage.isVerified; }, verifiedNoComp() { - return this.policyLookupSuccessful && this.isNoComp; + return this.policyLookupSuccessful && this.isNoComp && useMainStore().issConfig.enableNoCompQuote; }, verifiedITAC() { return this.policyLookupSuccessful @@ -300,7 +300,7 @@ export default { && this.deductibleValue > this.totalServicePrice; }, coveredAndServicePriceAboveOrEqualDeductible() { - return !this.verifiedNoComp && this.totalServicePrice >= this.deductibleValue; + return !this.isNoComp && this.totalServicePrice >= this.deductibleValue; }, verifiedDeductible() { return useMainStore().isClaimRegistrationRequired diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index a060ab39..b2da8ab2 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -117,6 +117,10 @@ export default { if (clientFlags.ClaimRegistrationRequired) { this.mainStore.issConfig.isClaimRegistrationRequired = true; } + + if (clientFlags.EnableNoCompQuote) { + this.mainStore.issConfig.enableNoCompQuote = true; + } } } catch (e) { console.error(`Error parsing client flags: ${e}`); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index c5014290..1fbd3d62 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -129,12 +129,10 @@ export default { let hasBailedOut = false; const pricedVaps = await useMainStore().getPriceOrderItems(unpricedVaps) .catch((err) => { - useMainStore().setBailout( - bailoutMessage.pricingResponseError( - unpricedVaps.map((li) => li.partNumber), - { code: err.code, message: err.message, data: err.data } - ) - ); + useMainStore().setBailout(bailoutMessage.pricingResponseError( + unpricedVaps.map((li) => li.partNumber), + { code: err.code, message: err.message, data: err.data } + )); hasBailedOut = true; next(`/?issPage=${issPageValues.BAILOUT_PAGE}`); }); @@ -182,8 +180,10 @@ export default { return !isEnabled || this.isUnverified; }, isUnverified() { - return !useMainStore().isNoComp && !useMainStore().isITAC - && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus); + return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) + || (!useMainStore().isNoComp + && !useMainStore().isITAC + && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus)); }, paymentMethod() { return this.paymentMethodInternalModel; diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index 590a4645..dc19a8d8 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -192,7 +192,8 @@ export default { return this.getCmsContent(this.widget.footer, widgetFields.FOOTER_WIDGET.FORWARD_BUTTON_TEXT); }, isVerified() { - return useMainStore().order.payment.insuranceCoverage.isVerified; + return !(useMainStore().isNoComp && !useMainStore().enableNoCompQuote) + && useMainStore().order.payment.insuranceCoverage.isVerified; }, currentDeductible() { return useMainStore().order.currentDeductible; diff --git a/src/store/index.js b/src/store/index.js index e4e129ec..03d2f8f2 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,7 +23,7 @@ import { } from '@/helpers/policy-vehicle-helper'; import partTypeStrings from '@/constants/part-type-strings'; import bailoutMessage from '@/constants/bailoutMessage'; -import bailoutCode from "@/constants/bailoutCode"; +import bailoutCode from '@/constants/bailoutCode'; const storeId = 'main'; @@ -238,7 +238,8 @@ export const getDefaultState = () => ({ policyZipCode: null, dateOfLoss: null }, - siteType: null + siteType: null, + enableNoCompQuote: false } }); @@ -265,7 +266,7 @@ export const useMainStore = defineStore({ isClaimAlreadyRegistered: (state) => state.order.payment.insuranceCoverage.claimNumber !== null, isBailout: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE] != null, bailoutCode: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE]?.bailoutCode, - isNoComp: (state) => !!state.order.policy.noCoverage, + isNoComp: (s) => !!s.order.policy.noCoverage, isITAC: (state) => !!state.order.policy.isITAC, isVerifiedCoverageStatus: (state) => state.order.payment.insuranceCoverage.coverageStatus === coverageStatuses.VERIFIED, eventBusItem: (state) => (eventCategory, eventSubCategory) => { @@ -2262,13 +2263,13 @@ export const useMainStore = defineStore({ setBailout(bailoutData) { const params = new URL(document.location.toString()).searchParams; - const currentPage = params.get('issPage'); + const currentPage = params.get('issPage'); this.updatePageData({ page: issPageValues.BAILOUT_PAGE, data: { url: window.location.href, - page: currentPage || 'Unknown Page', + page: currentPage || 'Unknown Page', bailoutCode: bailoutData.code, errorMessage: bailoutData.message, submit: false From b2cb23ca18a13be8c15866aff18c6740c89f321d Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Wed, 10 Apr 2024 17:35:21 -0400 Subject: [PATCH 02/19] Tidying coverage statement again --- .../coverage-statement-page-variations.js | 8 + .../cart-dropdown/cart-dropdown.vue | 7 +- .../coverage-statement.spec.js | 173 ++++++++++++------ .../coverage-statement/coverage-statement.vue | 156 +++++++++------- 4 files changed, 224 insertions(+), 120 deletions(-) create mode 100644 src/constants/coverage-statement-page-variations.js diff --git a/src/constants/coverage-statement-page-variations.js b/src/constants/coverage-statement-page-variations.js new file mode 100644 index 00000000..1f2039e2 --- /dev/null +++ b/src/constants/coverage-statement-page-variations.js @@ -0,0 +1,8 @@ +const coverageStatementPageVariations = Object.freeze({ + DEDUCTIBLE: 0, + ITAC: 1, + NO_COMP: 2, + UNVERIFIED: 3 +}); + +export default coverageStatementPageVariations; diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e4a85022..11559fb3 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -212,6 +212,7 @@ export default { baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems) ?? 0; }, + // TODO update tests isUnverified() { return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) || (!useMainStore().isNoComp && !useMainStore().isITAC @@ -248,7 +249,7 @@ export default { let result = 0; - if (useMainStore().payment.insuranceCoverage.isVerified) { + if (!this.isUnverified) { if (useMainStore().isITAC || useMainStore().isNoComp) { result += sumTax(this.baseServiceLineItems); } else { @@ -413,10 +414,6 @@ export default { }, getDisplayed(amount) { return this.isUnverified - // && ((useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - // || (!useMainStore().isNoComp && !useMainStore().policy.isITAC)) - // && !useMainStore().isNoComp - // && !useMainStore().isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 91ac7ab7..8bbcde26 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -10,7 +10,7 @@ import navigationScenarios from '@/router/router-constants/navigation-scenarios. import { getRandomString, getRandomInt } from '@/helpers/data-generation.js'; import settleAllPromises from '@/helpers/layout-helper.js'; import { fetchCmsContentForPage } from '@/helpers/cms-content-helper'; -import { useMainStore } from '@/store/index.js'; +import { useMainStore, getDefaultState } from '@/store'; import getPriceOfLineItems from '@/helpers/price-calculator.js'; jest.mock('@/helpers/layout-helper.js', () => jest.fn()); @@ -90,6 +90,14 @@ function getMountedComponent(mainInitialState = {}, initialData = {}, methodToRu return { wrapper }; } +beforeEach(() => { + const store = useMainStore(); + const defaultState = getDefaultState(); + Object.keys(defaultState).forEach((key) => { + store[key] = defaultState[key]; + }); +}); + describe('coverageStatement.vue-working', () => { test('returns the initial data', () => { // Arrange @@ -164,43 +172,67 @@ describe('coverageStatement.vue-working', () => { }); describe('Computed', () => { describe('verifiedNoComp', () => { - test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { - // Arrange - const mainInitialState = { - order: { - policy: { - noCoverage: isNoComp, - policyLookupSuccessful: false - } - } - }; - const { wrapper } = getMountedComponent(mainInitialState); + describe('isNoCompQuoteVisible true', () => { + const enableNoCompQuote = true; + test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: isNoComp, + policyLookupSuccessful: false + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); - // Act - const result = wrapper.vm.verifiedNoComp; + // Act + const result = wrapper.vm.isNoCompQuoteVisible; - // Assert - expect(result).toBeFalsy(); + // Assert + expect(result).toBeFalsy(); + }); + test.each([true, false])('returns false when isNoComp false', (policyLookupSuccessful) => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: false, + policyLookupSuccessful + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isNoCompQuoteVisible; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when policyLookupSuccessful true, noCoverage true, and enableNoCompQuote true', () => { + // Arrange + const mainInitialState = { + order: { + policy: { + noCoverage: true, + policyLookupSuccessful: true + } + }, + issConfig: { enableNoCompQuote } + }; + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isNoCompQuoteVisible; + + // Assert + expect(result).toBeTruthy(); + }); }); - test.each([true, false])('returns false when isNoComp false', (policyLookupSuccessful) => { - // Arrange - const mainInitialState = { - order: { - policy: { - noCoverage: false, - policyLookupSuccessful - } - } - }; - const { wrapper } = getMountedComponent(mainInitialState); - - // Act - const result = wrapper.vm.verifiedNoComp; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns true when policyLookupSuccessful true and policyLookupSuccessful true', () => { + test('returns false when policyLookupSuccessful true, noCoverage true and enableNoCompQuote false', () => { // Arrange const mainInitialState = { order: { @@ -208,18 +240,21 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: false } }; const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedNoComp; + const result = wrapper.vm.isNoCompQuoteVisible; // Assert - expect(result).toBeTruthy(); + expect(result).toBeFalsy(); }); }); - describe('verifiedITAC', () => { + describe('isITACQuoteVisible', () => { const priceOfLineItems = 213; test.each([true, false])('returns false when policyLookupSuccessful false', (isNoComp) => { // Arrange @@ -236,7 +271,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -256,7 +291,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -281,7 +316,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -308,7 +343,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeFalsy(); @@ -329,13 +364,13 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedITAC; + const result = wrapper.vm.isITACQuoteVisible; // Assert expect(result).toBeTruthy(); }); }); - describe('verifiedDeductible', () => { + describe('isDeductibleVisible', () => { const servicePrice = 123; describe('claim registration required', () => { const issConfig = { isClaimRegistrationRequired: true }; @@ -351,7 +386,7 @@ describe('coverageStatement.vue-working', () => { }, policy: { noCoverage: false, - policyLookupSuccessful: false + policyLookupSuccessful: true }, currentDeductible: servicePrice - 1 } @@ -365,7 +400,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -377,7 +412,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -387,7 +422,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(verifiedDeductibleStoreState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeTruthy(); @@ -420,7 +455,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(mainInitialState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -430,7 +465,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(verifiedDeductibleStoreState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeTruthy(); @@ -459,7 +494,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(storeState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -486,7 +521,7 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(storeState); // Act - const result = wrapper.vm.verifiedDeductible; + const result = wrapper.vm.isDeductibleVisible; // Assert expect(result).toBeFalsy(); @@ -683,7 +718,7 @@ describe('coverageStatement.vue-working', () => { // Assert expect(result).toBeFalsy(); }); - test('returns true when isNoComp true', () => { + test('returns false when isNoComp true and enableNoCompQuote false', () => { // Arrange const mainInitialState = { order: { @@ -692,6 +727,32 @@ describe('coverageStatement.vue-working', () => { noCoverage: true }, currentDeductible: priceOfLineItems + }, + issConfig: { + enableNoCompQuote: false + } + }; + getPriceOfLineItems.mockImplementationOnce(() => priceOfLineItems); + const { wrapper } = getMountedComponent(mainInitialState); + + // Act + const result = wrapper.vm.isQuoteDisplayed; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when isNoComp true and enableNoCompQuote true', () => { + // Arrange + const mainInitialState = { + order: { + policy: { + policyLookupSuccessful: true, + noCoverage: true + }, + currentDeductible: priceOfLineItems + }, + issConfig: { + enableNoCompQuote: true } }; getPriceOfLineItems.mockImplementationOnce(() => priceOfLineItems); @@ -1010,6 +1071,9 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: true } }; const { wrapper } = getMountedComponent(mainInitialState); @@ -1038,6 +1102,9 @@ describe('coverageStatement.vue-working', () => { noCoverage: true, policyLookupSuccessful: true } + }, + issConfig: { + enableNoCompQuote: true } }; const { wrapper } = getMountedComponent(mainInitialState); diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 9f866e2f..86162da5 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -33,23 +33,23 @@ v-html="secondaryText">
- {{ deductibleForDisplay }} + {{ formatAmountInDollars(deductibleValue) }}
- {{ servicePriceForDisplay }} + {{ formatAmountInDollars(totalServicePrice) }}
{{ deductibleText }}  - {{ deductibleForDisplay }} + {{ formatAmountInDollars(deductibleValue) }}
this.totalServicePrice) { + return pageVariations.ITAC; + } + + if (isClaimRegistrationRequired) { + if (registerClaimSuccessful) { + return pageVariations.DEDUCTIBLE; + } + return pageVariations.UNVERIFIED; + } + return pageVariations.DEDUCTIBLE; + }, coverageStatementSubHeader() { return this.getTextFromCmsWithCustomIfStatements( this.widget.subheader, @@ -249,10 +292,14 @@ export default { ); }, verifiedItacAlertBody() { + const itacCostSavings = this.deductibleValue - this.totalServicePrice; return this.getCmsContent( this.widget.verifiedItacAlert, widgetFields.ALERT_WIDGET.BODY_TEXT - )?.replaceAll('{custom:costSavings}', this.itacCostSavingsForDisplay); + )?.replaceAll( + '{custom:costSavings}', + formatAmountInDollars(itacCostSavings) + ); }, secondaryText() { return this.getTextFromCmsWithCustomIfStatements( @@ -285,50 +332,25 @@ export default { deductibleValue() { return useMainStore().order.currentDeductible; }, - deductibleForDisplay() { - return formatAmountInDollars(this.deductibleValue); + isNoCompQuoteVisible() { + return this.pageVariation === pageVariations.NO_COMP; }, - registerClaimSuccessful() { - return useMainStore().payment.insuranceCoverage.isVerified; + isITACQuoteVisible() { + return this.pageVariation === pageVariations.ITAC; }, - verifiedNoComp() { - return this.policyLookupSuccessful && this.isNoComp && useMainStore().issConfig.enableNoCompQuote; + isDeductibleVisible() { + return this.pageVariation === pageVariations.DEDUCTIBLE; }, - verifiedITAC() { - return this.policyLookupSuccessful - && !this.isNoComp - && this.deductibleValue > this.totalServicePrice; - }, - coveredAndServicePriceAboveOrEqualDeductible() { - return !this.isNoComp && this.totalServicePrice >= this.deductibleValue; - }, - verifiedDeductible() { - return useMainStore().isClaimRegistrationRequired - ? this.registerClaimSuccessful - && this.coveredAndServicePriceAboveOrEqualDeductible - && this.deductibleValue !== null - : this.policyLookupSuccessful - && this.coveredAndServicePriceAboveOrEqualDeductible; - }, - unverified() { - return !this.verifiedDeductible && !this.verifiedITAC && !this.verifiedNoComp; + isUnverifiedVisible() { + return this.pageVariation === pageVariations.UNVERIFIED; }, isADAS() { - const parts = useMainStore().order.lineItems.glassParts; - return parts !== null && !!parts.find((part) => part.requiresRecalibration); + const { glassParts } = useMainStore().order.lineItems; + return glassParts !== null && !!glassParts.find((part) => part.requiresRecalibration); }, totalServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems); }, - servicePriceForDisplay() { - return formatAmountInDollars(this.totalServicePrice); - }, - itacCostSavings() { - return this.deductibleValue - this.totalServicePrice; - }, - itacCostSavingsForDisplay() { - return formatAmountInDollars(this.itacCostSavings); - }, serviceProviderQuestionText() { return this.getCmsContent( this.widget.serviceProviderQuestion, @@ -342,15 +364,23 @@ export default { ); }, isQuoteDisplayed() { - return this.verifiedITAC || this.verifiedNoComp; + return this.isITACQuoteVisible || this.isNoCompQuoteVisible; }, + // TODO can we simplify this shouldRegisterClaim() { - return this.policyLookupSuccessful - && useMainStore().vehicle.policyVehicleId != null - && useMainStore().vehicle.policyVehicleId >= 0 - && useMainStore().isClaimRegistrationRequired - && !useMainStore().isClaimAlreadyRegistered - && (this.coveredAndServicePriceAboveOrEqualDeductible || this.verifiedITAC); + const { + policy, + vehicle, + isClaimRegistrationRequired, + isClaimAlreadyRegistered + } = useMainStore(); + const { policyVehicleId } = vehicle; + return policy.policyLookupSuccessful + && policyVehicleId != null + && policyVehicleId >= 0 + && isClaimRegistrationRequired + && !isClaimAlreadyRegistered + && (this.isDeductibleVisible || this.isITACQuoteVisible); } }, watch: { @@ -373,8 +403,9 @@ export default { return !!useMainStore().vehicle.carId; }, async initializeComponent() { - useMainStore().updatePolicyITACFlag(this.verifiedITAC); - const coverageStatus = this.verifiedITAC || this.verifiedNoComp + useMainStore().updatePolicyITACFlag(this.isITACQuoteVisible); + // TODO how should coverage status be updated + const coverageStatus = this.isITACQuoteVisible || this.isNoCompQuoteVisible ? coverageStatuses.VERIFIED : coverageStatuses.PENDING; useMainStore().updateCoverageStatus(coverageStatus); @@ -384,10 +415,10 @@ export default { this.$refs.loadingModal.hideModal(); }, async navigateForward() { - if (this.unverified || this.verifiedDeductible) { + if (this.isUnverifiedVisible || this.isDeductibleVisible) { useMainStore().updateSupportingItems(this.supportingItems); this.navigateWithScenario(navigationScenarios.CLICKED_FORWARD); - } else if (this.verifiedITAC || this.verifiedNoComp) { + } else if (this.isITACQuoteVisible || this.isNoCompQuoteVisible) { useMainStore().updateIsSafeliteProvider(this.selectedProvider === SAFELITE_PROVIDER); if (this.selectedProvider === SAFELITE_PROVIDER) { useMainStore().updateSupportingItems(this.supportingItems); @@ -411,13 +442,13 @@ export default { getCustomValueFromString(str) { switch (str) { case 'coverageUnverified': - return this.unverified; + return this.isUnverifiedVisible; case 'verifiedDeductible': - return this.verifiedDeductible; + return this.isDeductibleVisible; case 'verifiedITAC': - return this.verifiedITAC; + return this.isITACQuoteVisible; case 'verifiedNoComp': - return this.verifiedNoComp; + return this.isNoCompQuoteVisible; case 'ADASReplace': return !this.isRepair && this.isADAS; case 'nonADASReplace': @@ -425,9 +456,9 @@ export default { case 'nonADASRepair': return this.isRepair; case 'deductibleOverZero': - return this.verifiedDeductible && this.deductibleValue !== 0; // TODO what if deductible is negative? + return this.isDeductibleVisible && this.deductibleValue !== 0; // TODO what if deductible is negative? case 'isDeductibleZero': - return this.verifiedDeductible && this.deductibleValue === 0; + return this.isDeductibleVisible && this.deductibleValue === 0; default: return null; } @@ -437,7 +468,8 @@ export default { }, setBaseServiceLineItems(lineItems) { this.baseServiceLineItems = lineItems; - } + }, + formatAmountInDollars } }; From 1c6b56b4e9e62d82ea319e0aa8165c6100e4c79c Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Thu, 11 Apr 2024 09:53:33 -0500 Subject: [PATCH 03/19] SSR-1125 Update Phone Numbers --- .../contact-details/contact-details.spec.js | 80 +++++++++++++++---- .../contact-details/contact-details.vue | 18 ++++- .../order-confirmation.spec.js | 2 +- .../order-confirmation/order-confirmation.vue | 2 +- src/layouts/payment-page/payment-page.spec.js | 2 +- src/layouts/payment-page/payment-page.vue | 4 +- .../contact-details-drawer.spec.js | 10 ++- .../contact-details-drawer.vue | 15 ++-- src/layouts/tpa-submit/tpa-submit.spec.js | 8 +- src/layouts/tpa-submit/tpa-submit.vue | 4 +- src/store/index.js | 38 ++++++--- src/store/store.spec.js | 36 +++++++-- 12 files changed, 163 insertions(+), 56 deletions(-) diff --git a/src/layouts/contact-details/contact-details.spec.js b/src/layouts/contact-details/contact-details.spec.js index 7930b319..58d16b8e 100644 --- a/src/layouts/contact-details/contact-details.spec.js +++ b/src/layouts/contact-details/contact-details.spec.js @@ -160,14 +160,16 @@ describe('contactDetails.vue', () => { const firstName = getRandomString(4, 15); const lastName = getRandomString(4, 15); const emailAddress = getRandomString(10, 20); - const phoneNumber = getRandomInt(1000000000, 9999999999); + const servicePhone = getRandomInt(1000000000, 9999999999).toString(); const mainInitialState = { order: { customer: { firstName, lastName, - emailAddress, - phoneNumber + emailAddress + }, + contactInfo: { + servicePhone } } }; @@ -185,7 +187,7 @@ describe('contactDetails.vue', () => { expect(wrapper.vm.firstName).toBe(firstName); expect(wrapper.vm.lastName).toBe(lastName); expect(wrapper.vm.emailAddress).toBe(emailAddress); - expect(wrapper.vm.phoneNumber).toBe(phoneNumber); + expect(wrapper.vm.phoneNumber).toBe(servicePhone); }); test('Mock store with contact info yields expected data', () => { // Arrange @@ -199,7 +201,7 @@ describe('contactDetails.vue', () => { firstName: getRandomString(4, 15), lastName: getRandomString(4, 15), emailAddress: getRandomString(10, 20), - phoneNumber: getRandomInt(1000000000, 9999999999), + servicePhone: getRandomInt(1000000000, 9999999999), requestTextUpdates: getRandomBoolean(), notesForTechnician: getRandomString(50, 100) }; @@ -224,7 +226,7 @@ describe('contactDetails.vue', () => { expect(wrapper.vm.firstName).toBe(contactInfo.firstName); expect(wrapper.vm.lastName).toBe(contactInfo.lastName); expect(wrapper.vm.emailAddress).toBe(contactInfo.emailAddress); - expect(wrapper.vm.phoneNumber).toBe(contactInfo.phoneNumber); + expect(wrapper.vm.phoneNumber).toBe(contactInfo.servicePhone); expect(wrapper.vm.requestTextUpdates).toBe(contactInfo.requestTextUpdates); expect(wrapper.vm.notesForTechnician).toBe(contactInfo.notesForTechnician); }); @@ -315,7 +317,7 @@ describe('contactDetails.vue', () => { const firstName = getRandomString(4, 15); const lastName = getRandomString(4, 15); const emailAddress = getRandomString(10, 20); - const phoneNumber = getRandomInt(1000000000, 9999999999); + const phoneNumber = getRandomInt(1000000000, 9999999999).toString(); const requestTextUpdates = getRandomBoolean(); const notesForTechnician = getRandomString(1, 100); wrapper.setData({ @@ -335,11 +337,60 @@ describe('contactDetails.vue', () => { firstName, lastName, emailAddress, - phoneNumber, requestTextUpdates, notesForTechnician }); }); + + test('Forward button click updates phone numbers request text updates', () => { + // Arrange + const mountOptions = getMountOptions({ + router: { + navigate: jest.fn() + } + }); + const wrapper = shallowMount(contactDetails, mountOptions); + const phoneNumber = getRandomInt(1000000000, 9999999999).toString(); + const requestTextUpdates = true; + wrapper.setData({ + phoneNumber, + requestTextUpdates + }); + + // Act + wrapper.vm.forwardButtonAction(); + + // Assert + expect(useMainStore().updatePhoneNumbers).toHaveBeenCalledWith({ + service: phoneNumber, + alternative: phoneNumber + }); + }); + + test('Forward button click updates phone numbers dot not request text updates', () => { + // Arrange + const mountOptions = getMountOptions({ + router: { + navigate: jest.fn() + } + }); + const wrapper = shallowMount(contactDetails, mountOptions); + const phoneNumber = getRandomInt(1000000000, 9999999999).toString(); + const requestTextUpdates = false; + wrapper.setData({ + phoneNumber, + requestTextUpdates + }); + + // Act + wrapper.vm.forwardButtonAction(); + + // Assert + expect(useMainStore().updatePhoneNumbers).toHaveBeenCalledWith({ + home: phoneNumber, + service: phoneNumber + }); + }); }); test('Mocked store with no contact info yields expected data', () => { @@ -349,20 +400,19 @@ describe('contactDetails.vue', () => { const firstName = getRandomString(4, 15); const lastName = getRandomString(4, 15); const emailAddress = getRandomString(10, 20); - const phoneNumber = getRandomInt(1000000000, 9999999999); + const servicePhone = getRandomInt(1000000000, 9999999999); const mainInitialState = { order: { customer: { firstName, lastName, - emailAddress, - phoneNumber + emailAddress }, contactInfo: { firstName: null, lastName: null, emailAddress: null, - phoneNumber: null, + servicePhone, requestTextUpdates: null, notesForTechnician: null } @@ -382,7 +432,7 @@ describe('contactDetails.vue', () => { expect(wrapper.vm.firstName).toBe(firstName); expect(wrapper.vm.lastName).toBe(lastName); expect(wrapper.vm.emailAddress).toBe(emailAddress); - expect(wrapper.vm.phoneNumber).toBe(phoneNumber); + expect(wrapper.vm.phoneNumber).toBe(servicePhone); }); test('Mock store with contact info yields expected data', () => { @@ -397,7 +447,7 @@ describe('contactDetails.vue', () => { firstName: getRandomString(4, 15), lastName: getRandomString(4, 15), emailAddress: getRandomString(10, 20), - phoneNumber: getRandomInt(1000000000, 9999999999), + servicePhone: getRandomInt(1000000000, 9999999999), requestTextUpdates: getRandomBoolean(), notesForTechnician: getRandomString(50, 100) }; @@ -422,7 +472,7 @@ describe('contactDetails.vue', () => { expect(wrapper.vm.firstName).toBe(contactInfo.firstName); expect(wrapper.vm.lastName).toBe(contactInfo.lastName); expect(wrapper.vm.emailAddress).toBe(contactInfo.emailAddress); - expect(wrapper.vm.phoneNumber).toBe(contactInfo.phoneNumber); + expect(wrapper.vm.phoneNumber).toBe(contactInfo.servicePhone); expect(wrapper.vm.requestTextUpdates).toBe(contactInfo.requestTextUpdates); expect(wrapper.vm.notesForTechnician).toBe(contactInfo.notesForTechnician); }); diff --git a/src/layouts/contact-details/contact-details.vue b/src/layouts/contact-details/contact-details.vue index dcca28ee..ceec1259 100644 --- a/src/layouts/contact-details/contact-details.vue +++ b/src/layouts/contact-details/contact-details.vue @@ -139,14 +139,14 @@ export default { const { firstName, lastName, emailAddress, - phoneNumber, + servicePhone, requestTextUpdates, notesForTechnician } = useMainStore().contactInfo; return { firstName, lastName, emailAddress, - phoneNumber, + phoneNumber: servicePhone, requestTextUpdates, notesForTechnician, widget: { @@ -196,11 +196,23 @@ export default { firstName: this.firstName, lastName: this.lastName, emailAddress: this.emailAddress, - phoneNumber: this.phoneNumber, requestTextUpdates: this.requestTextUpdates, notesForTechnician: this.notesForTechnician }; useMainStore().updateContactInfo(contactInfo); + + if (this.requestTextUpdates) { + useMainStore().updatePhoneNumbers({ + service: this.phoneNumber, + alternative: this.phoneNumber + }); + } else { + useMainStore().updatePhoneNumbers({ + home: this.phoneNumber, + service: this.phoneNumber + }); + } + const scenario = useMainStore().order.serviceLocation.IsSafeliteProvider === false ? this.navigationScenarios.CLICKED_FORWARD_WITH_NON_SAFELITE_SHOP : this.navigationScenarios.CLICKED_FORWARD_WITH_SAFELITE_SHOP; diff --git a/src/layouts/order-confirmation/order-confirmation.spec.js b/src/layouts/order-confirmation/order-confirmation.spec.js index c38a062e..2eb8208e 100644 --- a/src/layouts/order-confirmation/order-confirmation.spec.js +++ b/src/layouts/order-confirmation/order-confirmation.spec.js @@ -76,7 +76,7 @@ const initialStore = { contactInfo: { firstName: 'Test', lastName: 'Test', - phoneNumber: '111-111-1111', + servicePhone: '111-111-1111', emailAddress: 'test@email.com' } } diff --git a/src/layouts/order-confirmation/order-confirmation.vue b/src/layouts/order-confirmation/order-confirmation.vue index c045f651..b7e1af75 100644 --- a/src/layouts/order-confirmation/order-confirmation.vue +++ b/src/layouts/order-confirmation/order-confirmation.vue @@ -318,7 +318,7 @@ export default { const contactInfoReqs = !!( contactInfo.firstName && contactInfo.lastName - && contactInfo.phoneNumber + && contactInfo.servicePhone && contactInfo.emailAddress ); diff --git a/src/layouts/payment-page/payment-page.spec.js b/src/layouts/payment-page/payment-page.spec.js index 2e2f62ef..661d656c 100644 --- a/src/layouts/payment-page/payment-page.spec.js +++ b/src/layouts/payment-page/payment-page.spec.js @@ -183,7 +183,7 @@ describe('payment-page.vue', () => { firstName: 'first', lastName: 'last', emailAddress: 'builddigitaltest@safelite.com', - phoneNumber: '555-555-5555' + servicePhone: '555-555-5555' }, damage: { isRepair: false, diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue index d8b6d3b5..2642ccca 100644 --- a/src/layouts/payment-page/payment-page.vue +++ b/src/layouts/payment-page/payment-page.vue @@ -500,7 +500,7 @@ export default { zipCode: this.getZipCode(), firstName: useMainStore().order.contactInfo.firstName, lastName: useMainStore().order.contactInfo.lastName, - phoneNumber: useMainStore().order.contactInfo.phoneNumber, + phoneNumber: useMainStore().order.contactInfo.servicePhone, ctu: useMainStore().order.serviceLocation.zipCodeCtu, referralCorrelationId: useMainStore().order.referralCorrelationId, workOrderNumber: this.getWorkOrderNumber(), @@ -597,7 +597,7 @@ export default { const contactInfoReqs = !!( contactInfo.firstName && contactInfo.lastName - && contactInfo.phoneNumber + && contactInfo.servicePhone && contactInfo.emailAddress ); diff --git a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.spec.js b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.spec.js index e814af3d..9c579dbc 100644 --- a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.spec.js +++ b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.spec.js @@ -35,14 +35,14 @@ describe('contact-details-drawer', () => { const firstName = 'Frederick'; const lastName = 'Taylor'; const emailAddress = 'fred.tay@gmail.com'; - const phoneNumber = '606-009-2943'; + const servicePhone = '606-009-2943'; const mainInitialState = { order: { contactInfo: { firstName, lastName, emailAddress, - phoneNumber + servicePhone } } }; @@ -81,7 +81,7 @@ describe('contact-details-drawer', () => { firstName: 'Frederick', lastName: 'Taylor', emailAddress: 'fred.tay@gmail.com', - phoneNumber: '606-009-2943' + servicePhone: '606-009-2943' } } }; @@ -96,7 +96,9 @@ describe('contact-details-drawer', () => { // Assert expect(wrapper.emitted()['update-contact-details']).toBeTruthy(); expect(useMainStore().updateContactInfo).toBeCalledTimes(1); - expect(useMainStore().updateContactInfo).toBeCalledWith({ firstName, lastName, emailAddress, phoneNumber }); + expect(useMainStore().updateContactInfo).toBeCalledWith({ firstName, lastName, emailAddress }); + expect(useMainStore().updatePhoneNumbers).toBeCalledTimes(1); + expect(useMainStore().updatePhoneNumbers).toBeCalledWith({ home: phoneNumber, service: phoneNumber }); } ); }); diff --git a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue index 5f1b0b6f..3a690b75 100644 --- a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue +++ b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue @@ -67,13 +67,13 @@ export default { const { firstName, lastName, emailAddress, - phoneNumber } = useMainStore().contactInfo; + servicePhone } = useMainStore().contactInfo; return { isModalOpened: false, firstName, lastName, emailAddress, - phoneNumber, + phoneNumber: servicePhone, widget: { title: 'ContactDetailsDrawerHeaderWidget', firstNameQuestion: 'FirstNameQuestionWidget', @@ -119,21 +119,24 @@ export default { const contactInfo = { firstName: this.firstName, lastName: this.lastName, - emailAddress: this.emailAddress, - phoneNumber: this.phoneNumber + emailAddress: this.emailAddress }; useMainStore().updateContactInfo(contactInfo); + useMainStore().updatePhoneNumbers({ + home: this.phoneNumber, + service: this.phoneNumber + }); this.$emit('update-contact-details'); }, resetFormValues() { const { firstName, lastName, emailAddress, - phoneNumber } = useMainStore().contactInfo; + homePhone } = useMainStore().contactInfo; this.firstName = firstName; this.lastName = lastName; this.emailAddress = emailAddress; - this.phoneNumber = phoneNumber; + this.phoneNumber = homePhone; }, openModal() { this.modal.openModal(); diff --git a/src/layouts/tpa-submit/tpa-submit.spec.js b/src/layouts/tpa-submit/tpa-submit.spec.js index aaadc048..d3bece6b 100644 --- a/src/layouts/tpa-submit/tpa-submit.spec.js +++ b/src/layouts/tpa-submit/tpa-submit.spec.js @@ -499,14 +499,14 @@ describe('tpa-submit', () => { const firstName = 'Jones'; const lastName = 'Eddison'; const emailAddress = 'myname@gmail.com'; - const phoneNumber = '0001112222'; + const servicePhone = '0001112222'; const initialStore = { order: { contactInfo: { firstName, lastName, emailAddress, - phoneNumber + servicePhone } } }; @@ -514,7 +514,7 @@ describe('tpa-submit', () => { const expectedLine1 = 'Jones Eddison'; const expectedLine2 = emailAddress; const expectedLine3 = 'some value returned'; - toDisplayPhoneNumber.mockImplementation((number) => (number === phoneNumber ? expectedLine3 : '')); + toDisplayPhoneNumber.mockImplementation((number) => (number === servicePhone ? expectedLine3 : '')); const contactInfoSectionIndex = 3; // Act @@ -530,7 +530,7 @@ describe('tpa-submit', () => { expect(contactInfoSection.lines[0]).toBe(expectedLine1); expect(contactInfoSection.lines[1]).toBe(expectedLine2); expect(contactInfoSection.lines[2]).toBe(expectedLine3); - expect(toDisplayPhoneNumber).toHaveBeenCalledWith(phoneNumber); + expect(toDisplayPhoneNumber).toHaveBeenCalledWith(servicePhone); }); }); describe('computed', () => { diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index 590a4645..fda79826 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -236,11 +236,11 @@ export default { return [toTitleCase(this.companyName ?? ''), displayAddress, displayPhoneNumber]; }, getContactInfoLines() { - const { firstName, lastName, emailAddress, phoneNumber } = useMainStore().contactInfo; + const { firstName, lastName, emailAddress, servicePhone } = useMainStore().contactInfo; return [ `${firstName} ${lastName}`, emailAddress ?? '', - toDisplayPhoneNumber(phoneNumber) + toDisplayPhoneNumber(servicePhone) ]; } }, diff --git a/src/store/index.js b/src/store/index.js index e4e129ec..4651f17f 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -23,7 +23,7 @@ import { } from '@/helpers/policy-vehicle-helper'; import partTypeStrings from '@/constants/part-type-strings'; import bailoutMessage from '@/constants/bailoutMessage'; -import bailoutCode from "@/constants/bailoutCode"; +import bailoutCode from '@/constants/bailoutCode'; const storeId = 'main'; @@ -120,7 +120,7 @@ export const getDefaultState = () => ({ firstName: null, lastName: null, emailAddress: null, - phoneNumber: null + homePhone: null }, serviceLocation: { address: null, @@ -182,7 +182,9 @@ export const getDefaultState = () => ({ firstName: null, lastName: null, emailAddress: null, - phoneNumber: null, + homePhone: null, + alternativePhone: null, + servicePhone: null, requestTextUpdates: false, notesForTechnician: '' }, @@ -308,7 +310,9 @@ export const useMainStore = defineStore({ firstName: s.order.contactInfo.firstName ?? s.order.customer.firstName, lastName: s.order.contactInfo.lastName ?? s.order.customer.lastName, emailAddress: s.order.contactInfo.emailAddress ?? s.order.customer.emailAddress, - phoneNumber: s.order.contactInfo.phoneNumber ?? s.order.customer.phoneNumber, + homePhone: s.order.contactInfo.homePhone, + alternativePhone: s.order.contactInfo.alternativePhone, + servicePhone: s.order.contactInfo.servicePhone, requestTextUpdates: s.order.contactInfo.requestTextUpdates ?? false, notesForTechnician: s.order.contactInfo.notesForTechnician }), @@ -1228,8 +1232,10 @@ export const useMainStore = defineStore({ emailAddress: contactInfo.emailAddress || customer.emailAddress, firstName: contactInfo.firstName || customer.firstName, lastName: contactInfo.lastName || customer.lastName, - phoneNumber: contactInfo.phoneNumber, - optInSms: contactInfo.requestTextUpdates ?? false + homePhone: contactInfo.homePhone, + servicePhone: contactInfo.servicePhone, + alternativePhone: contactInfo.alternativePhone, + isSmsOptIn: contactInfo.requestTextUpdates ?? false }, lineItems: { glassParts: lineItems.glassParts, @@ -1336,7 +1342,8 @@ export const useMainStore = defineStore({ order.contactInfo.firstName = data?.customer?.firstName; order.contactInfo.lastName = data?.customer?.lastName; order.contactInfo.emailAddress = data?.customer?.emailAddress; - order.contactInfo.phoneNumber = data?.customer?.phoneNumber; + order.contactInfo.homePhone = data?.customer?.phoneNumber; + order.contactInfo.servicephone = data?.customer?.phoneNumber; order.contactInfo.requestTextUpdates = data?.customer?.isSmsOptIn; order.payment.insuranceCoverage.isVerified = data?.payment?.insuranceCoverage?.isVerified; @@ -1777,6 +1784,10 @@ export const useMainStore = defineStore({ this.order.policy.isDamageGlassOnly = welcomePageModel?.isDamageGlassOnly; this.order.customer.phoneNumber = welcomePageModel?.phoneNumber; this.order.customer.emailAddress = welcomePageModel?.email; + this.updatePhoneNumbers({ + home: welcomePageModel?.phoneNumber, + service: welcomePageModel?.phoneNumber + }); }, updatePolicyHolderDetails(customerQuestions) { this.order.customer.address.streetAddress = customerQuestions.addressQuestions.streetAddress; @@ -2123,11 +2134,17 @@ export const useMainStore = defineStore({ this.order.contactInfo.firstName = contactInfo?.firstName ?? ''; this.order.contactInfo.lastName = contactInfo?.lastName ?? ''; this.order.contactInfo.emailAddress = contactInfo?.emailAddress ?? ''; - this.order.contactInfo.phoneNumber = contactInfo?.phoneNumber ?? ''; this.order.contactInfo.requestTextUpdates = contactInfo?.requestTextUpdates ?? false; this.order.contactInfo.notesForTechnician = contactInfo?.notesForTechnician ?? ''; }, + updatePhoneNumbers(phoneNumbers) { + const contact = this.order.contactInfo; + contact.homePhone = phoneNumbers.home !== undefined ? phoneNumbers.home : contact.homePhone; + contact.alternativePhone = phoneNumbers.alternative !== undefined ? phoneNumbers.alternative : contact.alternativePhone; + contact.servicePhone = phoneNumbers.service !== undefined ? phoneNumbers.service : contact.servicePhone; + }, + GetExperimentsByUser(userId) { return globalMethods.callHttpClient({ method: endpoints.GetExperimentsByUser.method, @@ -2279,8 +2296,11 @@ export const useMainStore = defineStore({ setBailoutContactInfo(contact) { this.order.customer.firstName = contact.firstName; this.order.customer.lastName = contact.lastName; - this.order.customer.phoneNumber = contact.phoneNumber; this.order.customer.emailAddress = contact.email; + this.updatePhoneNumbers({ + home: contact.phoneNumber, + service: contact.phoneNumber + }); this.pageData(issPageValues.BAILOUT_PAGE).submit = true; }, diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 29c5c538..be6a3ab8 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -478,7 +478,6 @@ describe('Store', () => { const firstName = getRandomString(4, 10); const lastName = getRandomString(5, 15); const emailAddress = false; - const phoneNumber = getRandomInt(1000000000, 9999999999); const requestTextUpdates = getRandomBoolean(); const notesForTechnician = getRandomString(50, 150); @@ -486,7 +485,6 @@ describe('Store', () => { store.updateContactInfo({ firstName, lastName, emailAddress, - phoneNumber, requestTextUpdates, notesForTechnician }); @@ -494,10 +492,27 @@ describe('Store', () => { expect(store.contactInfo.firstName).toEqual(firstName); expect(store.contactInfo.lastName).toEqual(lastName); expect(store.contactInfo.emailAddress).toEqual(emailAddress); - expect(store.contactInfo.phoneNumber).toEqual(phoneNumber); expect(store.contactInfo.requestTextUpdates).toEqual(requestTextUpdates); expect(store.contactInfo.notesForTechnician).toEqual(notesForTechnician); }); + it('updatePhoneNumbers updates phone info in store', () => { + // Arrange + const homePhone = getRandomInt(1000000000, 9999999999); + const servicePhone = getRandomInt(1000000000, 9999999999); + const altPhone = getRandomInt(1000000000, 9999999999); + + // Act + store.updatePhoneNumbers({ + home: homePhone, + service: servicePhone, + alternative: altPhone + }); + + // Assert + expect(store.contactInfo.homePhone).toEqual(homePhone); + expect(store.contactInfo.servicePhone).toEqual(servicePhone); + expect(store.contactInfo.alternativePhone).toEqual(altPhone); + }); it('All null values => contact info set in store to all nulls', () => { // Act store.updateContactInfo({}); @@ -506,7 +521,6 @@ describe('Store', () => { expect(store.contactInfo.firstName).toEqual(''); expect(store.contactInfo.lastName).toEqual(''); expect(store.contactInfo.emailAddress).toEqual(''); - expect(store.contactInfo.phoneNumber).toEqual(''); expect(store.contactInfo.requestTextUpdates).toEqual(false); expect(store.contactInfo.notesForTechnician).toEqual(''); }); @@ -708,12 +722,16 @@ describe('Store', () => { const contactFirstName = getRandomString(6, 6); const contactLastName = getRandomString(6, 6); const contactEmail = getRandomString(6, 6); - const contactPhoneNumber = getRandomString(6, 6); + const contactHomePhone = getRandomString(6, 6); + const contactServicePhone = getRandomString(6, 6); + const contactAlternativePhone = getRandomString(6, 6); const requestTextUpdates = getRandomBoolean(); store.order.contactInfo.firstName = contactFirstName; store.order.contactInfo.lastName = contactLastName; store.order.contactInfo.emailAddress = contactEmail; - store.order.contactInfo.phoneNumber = contactPhoneNumber; + store.order.contactInfo.homePhone = contactHomePhone; + store.order.contactInfo.servicePhone = contactServicePhone; + store.order.contactInfo.alternativePhone = contactAlternativePhone; store.order.contactInfo.requestTextUpdates = requestTextUpdates; store.order.customer.address.streetAddress = streetAddress; store.order.customer.address.streetAddress2 = streetAddress2; @@ -740,8 +758,10 @@ describe('Store', () => { emailAddress: contactEmail, firstName: contactFirstName, lastName: contactLastName, - phoneNumber: contactPhoneNumber, - optInSms: requestTextUpdates + homePhone: contactHomePhone, + servicePhone: contactServicePhone, + alternativePhone: contactAlternativePhone, + isSmsOptIn: requestTextUpdates }) }) })); From 954a08972108ca6bdc641be8b164327cd6a9ed99 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 14:52:17 -0400 Subject: [PATCH 04/19] Removing unnecessary --- .../coverage-statement/coverage-statement.vue | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 86162da5..697bc088 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -181,7 +181,8 @@ export default { let hasBailedOut = false; let pricingResults = []; - if (useMainStore().policy.policyLookupSuccessful && useMainStore().vehicle.policyVehicleId >= 0) { + const { policy, vehicle } = useMainStore(); + if (policy.policyLookupSuccessful && vehicle.policyVehicleId >= 0) { await useMainStore().getFinalDeductible(); pricingResults = await useMainStore().getPriceOrderItems(availableLineItems) .catch((err) => { @@ -210,12 +211,7 @@ export default { } }, data() { - const { isRepair } = useMainStore().damage; - // const { policyLookupSuccessful } = useMainStore().policy; return { - isRepair, - // policyLookupSuccessful, - isNoComp: useMainStore().isNoComp, baseServiceLineItems: [], selectedProvider: '', deductibleText: 'Your deductible is', @@ -440,6 +436,7 @@ export default { return processIfStatements(rawText, 'custom', this.getCustomValueFromString); }, getCustomValueFromString(str) { + const { isRepair } = useMainStore().damage; switch (str) { case 'coverageUnverified': return this.isUnverifiedVisible; @@ -450,11 +447,11 @@ export default { case 'verifiedNoComp': return this.isNoCompQuoteVisible; case 'ADASReplace': - return !this.isRepair && this.isADAS; + return !isRepair && this.isADAS; case 'nonADASReplace': - return !this.isRepair && !this.isADAS; + return !isRepair && !this.isADAS; case 'nonADASRepair': - return this.isRepair; + return isRepair; case 'deductibleOverZero': return this.isDeductibleVisible && this.deductibleValue !== 0; // TODO what if deductible is negative? case 'isDeductibleZero': From beadf916a2eff6efaba77eec1137397788de7120 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:28:30 -0400 Subject: [PATCH 05/19] Adding is unverified to store --- .../cart-dropdown/cart-dropdown.vue | 10 ++-------- src/layouts/payment-method/payment-method.vue | 8 +------- src/layouts/tpa-submit/tpa-submit.vue | 3 +-- src/store/index.js | 18 ++++++++++++++++++ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 11559fb3..fea8ad4c 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -212,12 +212,6 @@ export default { baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems) ?? 0; }, - // TODO update tests - isUnverified() { - return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - || (!useMainStore().isNoComp && !useMainStore().isITAC - && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus)); - }, subTotal() { const { supportingItems, glassParts, otherParts, vaps, mobileFee } = useMainStore().lineItems; const allLineItems = [ @@ -249,7 +243,7 @@ export default { let result = 0; - if (!this.isUnverified) { + if (!useMainStore().isUnverified) { if (useMainStore().isITAC || useMainStore().isNoComp) { result += sumTax(this.baseServiceLineItems); } else { @@ -413,7 +407,7 @@ export default { this.isExpanded = !this.isExpanded; }, getDisplayed(amount) { - return this.isUnverified + return useMainStore().isUnverified ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 1fbd3d62..a743b180 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -177,13 +177,7 @@ export default { const piaExperience = this.getSettingValue(experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE); const isEnabled = piaExperience === 'true'; - return !isEnabled || this.isUnverified; - }, - isUnverified() { - return (useMainStore().isNoComp && !useMainStore().issConfig.enableNoCompQuote) - || (!useMainStore().isNoComp - && !useMainStore().isITAC - && (useMainStore().order.currentDeductible == null || !useMainStore().isVerifiedCoverageStatus)); + return !isEnabled || useMainStore().isUnverified; }, paymentMethod() { return this.paymentMethodInternalModel; diff --git a/src/layouts/tpa-submit/tpa-submit.vue b/src/layouts/tpa-submit/tpa-submit.vue index dc19a8d8..590a4645 100644 --- a/src/layouts/tpa-submit/tpa-submit.vue +++ b/src/layouts/tpa-submit/tpa-submit.vue @@ -192,8 +192,7 @@ export default { return this.getCmsContent(this.widget.footer, widgetFields.FOOTER_WIDGET.FORWARD_BUTTON_TEXT); }, isVerified() { - return !(useMainStore().isNoComp && !useMainStore().enableNoCompQuote) - && useMainStore().order.payment.insuranceCoverage.isVerified; + return useMainStore().order.payment.insuranceCoverage.isVerified; }, currentDeductible() { return useMainStore().order.currentDeductible; diff --git a/src/store/index.js b/src/store/index.js index 03d2f8f2..3fd9dd4c 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -268,6 +268,24 @@ export const useMainStore = defineStore({ bailoutCode: (state) => state.applicationUser.pageData[issPageValues.BAILOUT_PAGE]?.bailoutCode, isNoComp: (s) => !!s.order.policy.noCoverage, isITAC: (state) => !!state.order.policy.isITAC, + isUnverified: (s) => { + const { policyLookupSuccessful, payment, currentDeductible } = s.order; + const registerClaimSuccessful = payment.insuranceCoverage.isVerified; + if (!policyLookupSuccessful) { + return true; + } + if (s.isNoComp && !s.issConfig.enableNoCompQuote) { + return true; + } + if (!s.isNoComp && currentDeductible == null) { + return true; + } + if (s.isClaimRegistrationRequired && !registerClaimSuccessful) { + return true; + } + return false; + }, + // TODO condense verification logic isVerifiedCoverageStatus: (state) => state.order.payment.insuranceCoverage.coverageStatus === coverageStatuses.VERIFIED, eventBusItem: (state) => (eventCategory, eventSubCategory) => { const matchedEvent = state.applicationUser.eventBus.find(({ category, subCategory }) => category === eventCategory && subCategory === eventSubCategory); From 4747165e16aba6b6fae57d6793c575a6c7057bbe Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:36:25 -0400 Subject: [PATCH 06/19] Reverting --- src/iss-components/cart-dropdown/cart-dropdown.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index fea8ad4c..5d1505e0 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -408,6 +408,8 @@ export default { }, getDisplayed(amount) { return useMainStore().isUnverified + && !useMainStore().isNoComp + && !useMainStore().isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, From e3cb1ef37abb8f28432c578b841536577c7a0d56 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 15:43:12 -0400 Subject: [PATCH 07/19] Removing comment --- src/layouts/entry-page/entry-page.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index 5443ee37..b2da8ab2 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -105,7 +105,6 @@ export default { try { if (data.clientFlags) { const clientFlags = JSON.parse(data.clientFlags); - console.log(clientFlags); if (clientFlags.TPAEnabled) { this.mainStore.issConfig.enableTPAFlow = true; From e3852f2b7b85f828f34db36fa4d170fa83295016 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 11 Apr 2024 16:26:33 -0400 Subject: [PATCH 08/19] Updating shouldRegisterClaim tests --- src/layouts/coverage-statement/coverage-statement.spec.js | 6 +++++- src/layouts/coverage-statement/coverage-statement.vue | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 8bbcde26..36dde95e 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -773,7 +773,10 @@ describe('coverageStatement.vue-working', () => { shouldRegisterClaimStoreStateItac = { order: { payment: { - insuranceCoverage: { claimNumber: null } + insuranceCoverage: { + claimNumber: null, + isVerified: true // Added + } }, policy: { policyLookupSuccessful: true, @@ -862,6 +865,7 @@ describe('coverageStatement.vue-working', () => { // Assert expect(result).toBeFalsy(); }); + test('returns false when insuranceCoverage not verified', () => {}); describe('returns true when policy lookup success, vehicleId set to %p, claim reg req, claim not yet reg', () => { test('and itac', () => { // Arrange diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index 697bc088..d63bc50b 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -362,7 +362,6 @@ export default { isQuoteDisplayed() { return this.isITACQuoteVisible || this.isNoCompQuoteVisible; }, - // TODO can we simplify this shouldRegisterClaim() { const { policy, From 117a5f191e8f5d34062848c0ebabbb90f7c73b5c Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Fri, 12 Apr 2024 08:04:35 -0500 Subject: [PATCH 09/19] SSR-1125 Phone Number PR Changes --- .../contact-details-drawer/contact-details-drawer.vue | 4 ++-- src/store/index.js | 10 +++------- src/store/store.spec.js | 5 +++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue index 3a690b75..334ba86a 100644 --- a/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue +++ b/src/layouts/tpa-submit/contact-details-drawer/contact-details-drawer.vue @@ -132,11 +132,11 @@ export default { const { firstName, lastName, emailAddress, - homePhone } = useMainStore().contactInfo; + servicePhone } = useMainStore().contactInfo; this.firstName = firstName; this.lastName = lastName; this.emailAddress = emailAddress; - this.phoneNumber = homePhone; + this.phoneNumber = servicePhone; }, openModal() { this.modal.openModal(); diff --git a/src/store/index.js b/src/store/index.js index 4651f17f..c3728ae3 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -119,8 +119,7 @@ export const getDefaultState = () => ({ }, firstName: null, lastName: null, - emailAddress: null, - homePhone: null + emailAddress: null }, serviceLocation: { address: null, @@ -558,7 +557,7 @@ export const useMainStore = defineStore({ country: 'US' // TODO set from store }, homePhone: { - number: this.order.customer.phoneNumber?.replaceAll(nonNumberCharRegex, '') ?? '' + number: this.order.customerInfo?.homePhone?.replaceAll(nonNumberCharRegex, '') ?? '' } }, driver: { @@ -1208,7 +1207,7 @@ export const useMainStore = defineStore({ policyHolder: { policyFirstName: customer.firstName, policyLastName: customer.lastName, - policyPhoneNumber: customer.phoneNumber, + policyPhoneNumber: contactInfo.servicePhone, policyEmail: customer.emailAddress, policyState: customer.address.state }, @@ -1331,7 +1330,6 @@ export const useMainStore = defineStore({ order.customer.emailAddress = data.customer?.emailAddress; order.customer.firstName = data.customer?.firstName; order.customer.lastName = data.customer?.lastName; - order.customer.phoneNumber = data?.customer?.phoneNumber; order.customer.address.streetAddress = data.customer?.address?.streetAddress; order.customer.address.streetAddress2 = data.customer?.address?.streetAddress2; @@ -1782,7 +1780,6 @@ export const useMainStore = defineStore({ this.order.policy.damageState = welcomePageModel?.damageState; this.order.policy.damageCity = welcomePageModel?.damageCity; this.order.policy.isDamageGlassOnly = welcomePageModel?.isDamageGlassOnly; - this.order.customer.phoneNumber = welcomePageModel?.phoneNumber; this.order.customer.emailAddress = welcomePageModel?.email; this.updatePhoneNumbers({ home: welcomePageModel?.phoneNumber, @@ -2331,7 +2328,6 @@ export const useMainStore = defineStore({ this.order.policy.damageCity = null; this.order.policy.damageState = null; this.order.policy.isITAC = false; - this.order.customer.phoneNumber = null; this.order.customer.emailAddress = null; this.order.customer.firstName = null; this.order.customer.lastName = null; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index be6a3ab8..8c7382ff 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -680,8 +680,9 @@ describe('Store', () => { store.order.customer.firstName = customerFirstName; store.order.customer.lastName = customerLastName; store.order.customer.emailAddress = customerEmail; - store.order.customer.phoneNumber = customerPhoneNumber; store.order.customer.address.state = customerState; + store.order.contactInfo.homePhone = customerPhoneNumber; + store.order.contactInfo.servicePhone = customerPhoneNumber; store.order.policy.policyNumber = policyNumber; store.order.policy.policyZipCode = policyZipCode; store.order.policy.policyLookupSuccessful = policyLookupSuccessful; @@ -1142,7 +1143,7 @@ describe('Store', () => { expect(store.order.customer.firstName).toBe(customer.firstName); expect(store.order.customer.lastName).toBe(customer.lastName); expect(store.order.customer.emailAddress).toBe(customer.emailAddress); - expect(store.order.customer.phoneNumber).toBe(customer.phoneNumber); + expect(store.order.contactInfo.homePhone).toBe(customer.phoneNumber); }); it('sets expected remaining order data', async () => { // Arrange From 1e80a0b486e02cc67a3e2707f83293de0b827663 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 13:20:49 -0400 Subject: [PATCH 10/19] Adding tests --- .../cart-dropdown/cart-dropdown.spec.js | 330 ++++++++---------- .../payment-method/payment-method.spec.js | 186 +++++++++- src/store/index.js | 2 +- src/store/store.spec.js | 73 ++++ 4 files changed, 387 insertions(+), 204 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 69be39a8..80ee78d9 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -313,115 +313,6 @@ describe('cart-dropdown component', () => { }); }); describe('computed', () => { - describe('isUnverified', () => { - test('returns false when no comp', () => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: false, - noCoverage: true - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns false when itac', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.PENDING - } - }, - policy: { - isITAC: true - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns false when deductible not null and verified coverage status', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.VERIFIED - } - }, - policy: { - isITAC: false - }, - currentDeductible: 23 - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns true when not no comp, not itac, and deductible is null', () => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: false, - noCoverage: false - }, - currentDeductible: null - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeTruthy(); - }); - test('returns true when not no comp, not itac, and coverage status is not verified', () => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.PENDING - } - }, - policy: { - isITAC: false - }, - currentDeductible: 12 - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.isUnverified; - - // Assert - expect(result).toBeTruthy(); - }); - }); describe('amountDue', () => { test('returns 0 when showAsPaid is true', () => { // Arrange @@ -556,15 +447,22 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: null, otherParts: null, supportingItems: null, vaps: null + }, + payment: { + insuranceCoverage: { isVerified: true } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; - const { wrapper } = getMountedComponent(storeData); // Act @@ -578,6 +476,8 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: [ { partType: 'mock', salesTax: null }, @@ -591,7 +491,13 @@ describe('cart-dropdown component', () => { { partType: 'mock', salesTax: null }, { partType: 'mock', salesTax: undefined } ] + }, + payment: { + insuranceCoverage: { isVerified: true } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; const { wrapper } = getMountedComponent(storeData); @@ -606,6 +512,8 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { + policyLookupSuccessful: true, + currentDeductible: 250, lineItems: { glassParts: [{ partType: 'mock', salesTax: 10 }], supportingItems: [ @@ -619,10 +527,11 @@ describe('cart-dropdown component', () => { vaps: [] }, payment: { - insuranceCoverage: { - isVerified: false - } + insuranceCoverage: { isVerified: false } } + }, + issConfig: { + isClaimRegistrationRequired: true } }; const { wrapper } = getMountedComponent(storeData); @@ -636,15 +545,25 @@ describe('cart-dropdown component', () => { test('Returns sum of vaps sales tax when coverage is unverified and order has vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 1 }, - { partType: 'mock', salesTax: 2 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = false; + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10 }], + vaps: [ + { partType: 'mock', salesTax: 1 }, + { partType: 'mock', salesTax: 2 } + ] + }, + payment: { + insuranceCoverage: { isVerified: false } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); @@ -657,16 +576,30 @@ describe('cart-dropdown component', () => { test('Returns Recycle Fee tax when coverage is Verified-Deductible, replace service, and no vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 250; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 150 } - ]; - storeData.order.lineItems.supportingItems = [ - { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 } - ]; - storeData.order.lineItems.vaps = null; - storeData.order.payment.insuranceCoverage.isVerified = true; + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 150 }], + supportingItems: [ + { + partNumber: partNumberStrings.RECYCLE_FEE, + partType: 'mock', + salesTax: 10, + sellingPrice: 39.99 + } + ], + vaps: null + }, + payment: { + insuranceCoverage: { isVerified: true } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); @@ -679,24 +612,30 @@ describe('cart-dropdown component', () => { test('Returns sum of vaps + recycle fee sales tax when Verified-Deductible, replace service, and has vaps.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 250; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 }, - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 2 }, - { partType: 'mock', salesTax: 3 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 250, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [ + { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 }, + { partType: 'mock', salesTax: 10, kitPrice: 100 } + ], + vaps: [ + { partType: 'mock', salesTax: 2 }, + { partType: 'mock', salesTax: 3 } + ] + }, + payment: { + insuranceCoverage: { isVerified: true } + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -708,23 +647,27 @@ describe('cart-dropdown component', () => { test('Returns sum of sales tax when Verified-ITAC.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 0; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 5 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - storeData.order.policy.isITAC = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 0, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + vaps: [{ partType: 'mock', salesTax: 5 }] + }, + payment: { + insuranceCoverage: { isVerified: true } + }, + policy: { + isITAC: true + } + }, + issConfig: { + isClaimRegistrationRequired: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -736,23 +679,28 @@ describe('cart-dropdown component', () => { test('Returns sum of sales tax when Verified-NoComp.', () => { // Arrange - const storeData = useMainStore().$state; - storeData.order.currentDeductible = 0; - storeData.order.lineItems.glassParts = [ - { partType: 'mock', salesTax: 10, sellingPrice: 100 } - ]; - storeData.order.lineItems.otherParts = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.supportingItems = [ - { partType: 'mock', salesTax: 10, kitPrice: 100 } - ]; - storeData.order.lineItems.vaps = [ - { partType: 'mock', salesTax: 5 } - ]; - storeData.order.payment.insuranceCoverage.isVerified = true; - storeData.order.policy.noCoverage = true; - + const storeData = { + order: { + policyLookupSuccessful: true, + currentDeductible: 0, + lineItems: { + glassParts: [{ partType: 'mock', salesTax: 10, sellingPrice: 100 }], + otherParts: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + supportingItems: [{ partType: 'mock', salesTax: 10, kitPrice: 100 }], + vaps: [{ partType: 'mock', salesTax: 5 }] + }, + payment: { + insuranceCoverage: { isVerified: true } + }, + policy: { + noCoverage: true + } + }, + issConfig: { + isClaimRegistrationRequired: true, + enableNoCompQuote: true + } + }; const { wrapper } = getMountedComponent(storeData); // Act @@ -1791,21 +1739,19 @@ describe('cart-dropdown component', () => { // Arrange const storeData = { order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.VERIFIED - } - }, policy: { - isITAC: false + isITAC: false, + isNoComp: false }, - currentDeductible: 321 + currentDeductible: 321, + policyLookupSuccessful: true } }; const { wrapper } = getMountedComponent(storeData); const amount = 123; const dollarAmount = '$84.00'; - formatAmountInDollars.mockImplementationOnce(() => dollarAmount); + formatAmountInDollars + .mockImplementationOnce((value) => (value === amount ? dollarAmount : 1)); // Act const result = wrapper.vm.getDisplayed(amount); diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index 9967aeb7..a3509e14 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -3,20 +3,28 @@ import paymentMethod from '@/layouts/payment-method/payment-method.vue'; // Supporting Files import { shallowMount } from '@vue/test-utils'; +import { createTestingPinia } from '@pinia/testing'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; -import { useMainStore } from '@/store'; +import { useMainStore, getDefaultState } from '@/store'; import issPageValues from '@/router/router-constants/issPage-values'; import { paymentMethods } from '@/constants/payment-method-constants'; import queryStrings from '@/constants/query-strings'; import { experimentSettings } from '@/constants/experiments'; -function setupMocks({ customMountOptions = {}, queryString }) { +function setupMocks({ customMountOptions = {}, queryString }, mainInitialState = {}, customMixin = null) { const mountOptions = getMountOptions({ ...customMountOptions, route: { query: { issPage: issPageValues.PAYMENT_METHOD, ...queryString }, params: {} } }); - const mockMixin = { + const testingPinia = createTestingPinia({ + initialState: { + main: mainInitialState + } + }); + useMainStore(testingPinia); + + const mockMixin = customMixin ?? { methods: { getSettingValue: jest.fn((settingName) => { if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { @@ -28,6 +36,7 @@ function setupMocks({ customMountOptions = {}, queryString }) { } }; + mountOptions.global.plugins = [testingPinia]; mountOptions.global.mixins = [mockMixin]; const wrapper = shallowMount(paymentMethod, mountOptions); @@ -35,13 +44,28 @@ function setupMocks({ customMountOptions = {}, queryString }) { return wrapper; } +beforeEach(() => { + const store = useMainStore(); + const defaultState = getDefaultState(); + Object.keys(defaultState).forEach((key) => { + store[key] = defaultState[key]; + }); +}); + describe('payment-method.vue', () => { describe('Payment Method Type', () => { test('getting payment method when method is pay later', async () => { - // Arrange - const wrapper = setupMocks({}); + // Arrange const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; - useMainStore().savePaymentMethodChoice(payLaterPaymentMethod); + const store = { + order: { + payment: { + isPayInAdvance: true, + payInAdvanceType: payLaterPaymentMethod + } + } + }; + const wrapper = setupMocks({}, store); // Act const paymethod = wrapper.vm.getPaymentMethodFromStore(); @@ -50,16 +74,22 @@ describe('payment-method.vue', () => { expect(paymethod).toBe(payLaterPaymentMethod); }); test('getting payment method when method is pay in advance', async () => { - // Arrange - const wrapper = setupMocks({}); - const payInAdvancePaymentMethod = paymentMethods.CREDIT_CARD; - useMainStore().savePaymentMethodChoice(payInAdvancePaymentMethod); + // Arrange + const store = { + order: { + payment: { + isPayInAdvance: false, + payInAdvanceType: null + } + } + }; + const wrapper = setupMocks({}, store); // Act const paymethod = wrapper.vm.getPaymentMethodFromStore(); // Assert - expect(paymethod).not.toBe(payInAdvancePaymentMethod); + expect(paymethod).toBeNull(); }); }); @@ -86,4 +116,138 @@ describe('payment-method.vue', () => { expect(payInAdvanceErrorAlert.exists()).toBeFalsy(); }); }); + + describe('isPayInAdvanceDisabled', () => { + let store = {}; + let mixin = { + methods: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { + return 'true'; + } + return 'false'; + }) + } + }; + beforeEach(() => { + store = { + order: { + policy: { + isITAC: false, + noCoverage: false + }, + payment: { + insuranceCoverage: { + isVerified: true + } + }, + currentDeductible: 123, + policyLookupSuccessful: true + }, + issConfig: { + isClaimRegistrationRequired: true, + enableNoCompQuote: true + }, + applicationUser: { + experiments: [ + { + settings: { + ISSDisplayPIAInsurance_ISS: 'true' + } + } + ] + } + }; + }); + test('returns true when policyLookupSuccessful false', () => { + // Arrange + store.order.policyLookupSuccessful = false; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when no comp and enableNoCompQuote false', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = false; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when not no comp and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = false; + store.order.currentDeductible = null; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns true when isClaimRegistrationRequired true and insurance coverage not verified', () => { + // Arrange + store.order.payment.insuranceCoverage.isVerified = false; + store.issConfig.isClaimRegistrationRequired = true; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + test('returns false when no comp, enableNoCompQuote true, and currentDeductible null and pia enabled', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = true; + store.order.currentDeductible = null; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns false when not no comp, currentDeductible not null and pia enabled', () => { + // Arrange + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeFalsy(); + }); + test('returns true when pia not enabled', () => { + // Arrange + mixin = { + methods: { + getSettingValue: jest.fn((settingName) => { + if (settingName === experimentSettings.ISS_DISPLAY_PAY_IN_ADVANCE) { + return 'false'; + } + return 'true'; + }) + } + }; + const wrapper = setupMocks({}, store, mixin); + + // Act + const result = wrapper.vm.isPayInAdvanceDisabled; + + // Assert + expect(result).toBeTruthy(); + }); + }); }); diff --git a/src/store/index.js b/src/store/index.js index 3fd9dd4c..01542d04 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -270,7 +270,7 @@ export const useMainStore = defineStore({ isITAC: (state) => !!state.order.policy.isITAC, isUnverified: (s) => { const { policyLookupSuccessful, payment, currentDeductible } = s.order; - const registerClaimSuccessful = payment.insuranceCoverage.isVerified; + const registerClaimSuccessful = !!payment.insuranceCoverage.isVerified; if (!policyLookupSuccessful) { return true; } diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 29c5c538..300ea4ea 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1438,6 +1438,79 @@ describe('Store', () => { }); }); + describe('isUnverified', () => { + beforeEach(() => { + store.order.policy.isITAC = false; + store.order.policy.noCoverage = false; + store.order.payment.insuranceCoverage.isVerified = true; + store.order.currentDeductible = 123; + store.order.policyLookupSuccessful = true; + store.issConfig.isClaimRegistrationRequired = true; + store.issConfig.enableNoCompQuote = true; + }); + it('returns true when policyLookupSuccessful false', () => { + // Arrange + store.order.policyLookupSuccessful = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when no comp and enableNoCompQuote false', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.enableNoCompQuote = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when not no comp and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = false; + store.order.currentDeductible = null; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns true when isClaimRegistrationRequired true and insurance coverage not verified', () => { + // Arrange + store.order.payment.insuranceCoverage.isVerified = false; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeTruthy(); + }); + it('returns false when no comp, enableNoCompQuote true, and currentDeductible null', () => { + // Arrange + store.order.policy.noCoverage = true; + store.order.currentDeductible = null; + store.issConfig.enableNoCompQuote = true; + + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeFalsy(); + }); + it('returns false when not no comp, currentDeductible not null', () => { + // Act + const result = store.isUnverified; + + // Assert + expect(result).toBeFalsy(); + }); + }); + describe('isMobileAppointment', () => { it('Should return true for mobile appointments', () => { // Arrange From 5cfb0581a2482ddc36bb78c89b93ae04692089b5 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 13:48:29 -0400 Subject: [PATCH 11/19] Updating comment with ticket number --- src/layouts/coverage-statement/coverage-statement.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/layouts/coverage-statement/coverage-statement.vue b/src/layouts/coverage-statement/coverage-statement.vue index d63bc50b..b0cba354 100644 --- a/src/layouts/coverage-statement/coverage-statement.vue +++ b/src/layouts/coverage-statement/coverage-statement.vue @@ -172,8 +172,7 @@ export default { const clonedGlassParts = useMainStore().lineItems.glassParts ? JSON.parse(JSON.stringify(useMainStore().lineItems.glassParts)) : []; - // TODO note that recycle fee is being included in this calculation. Assuming - // this is an error + // TODO SSR-1165: Recycle fee needs removed from quote calculation const availableLineItems = [ ...(resultMap.supportingItems ?? []), ...(clonedGlassParts ?? []) From 413bf762bbb2f9b58e3af6b921f8eb18c3d6dc57 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 12 Apr 2024 14:18:39 -0400 Subject: [PATCH 12/19] Fixing bugs --- .../coverage-statement.spec.js.snap | 3 -- .../coverage-statement.spec.js | 16 +++++--- .../payment-method/payment-method.spec.js | 41 ++++++++++--------- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap index c16fcaf5..660043a6 100644 --- a/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap +++ b/src/layouts/coverage-statement/__snapshots__/coverage-statement.spec.js.snap @@ -4,14 +4,11 @@ exports[`coverageStatement.vue-working returns the initial data 1`] = ` Object { "baseServiceLineItems": Array [], "deductibleText": "Your deductible is", - "isNoComp": false, - "isRepair": true, "loadingText": Array [ "Connecting to your insurance company", "Nearly there", "Finishing up", ], - "policyLookupSuccessful": true, "rules": Object { "selectionRequired": "option-required", }, diff --git a/src/layouts/coverage-statement/coverage-statement.spec.js b/src/layouts/coverage-statement/coverage-statement.spec.js index 36dde95e..de23cd1b 100644 --- a/src/layouts/coverage-statement/coverage-statement.spec.js +++ b/src/layouts/coverage-statement/coverage-statement.spec.js @@ -107,8 +107,8 @@ describe('coverageStatement.vue-working', () => { isRepair: true }, policy: { - policyLookupSuccessful: true, - noCoverage: false + noCoverage: false, + policyLookupSuccessful: true } } }; @@ -1237,11 +1237,15 @@ describe('coverageStatement.vue-working', () => { const initialStore = { order: { payment: { - insuranceCoverage: { claimNumber: null } + insuranceCoverage: { + claimNumber: null, + isVerified: true + } }, policy: { - policyLookupSuccessful: true, - noCoverage: false + noCoverage: false, + isITAC: false, + policyLookupSuccessful: true }, vehicle: { policyVehicleId: 1 @@ -1262,6 +1266,8 @@ describe('coverageStatement.vue-working', () => { const { wrapper } = getMountedComponent(initialStore, {}, mockStoreActions); const next = (method) => { method(wrapper.vm); }; + console.log(wrapper.vm.pageVariation); + // Act coverageStatement.beforeRouteEnter.call(wrapper.vm, undefined, undefined, next); for (let i = 0; i < 7; i++) { diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index a3509e14..5d1c4eaf 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -56,25 +56,7 @@ describe('payment-method.vue', () => { describe('Payment Method Type', () => { test('getting payment method when method is pay later', async () => { // Arrange - const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; - const store = { - order: { - payment: { - isPayInAdvance: true, - payInAdvanceType: payLaterPaymentMethod - } - } - }; - const wrapper = setupMocks({}, store); - - // Act - const paymethod = wrapper.vm.getPaymentMethodFromStore(); - - // Assert - expect(paymethod).toBe(payLaterPaymentMethod); - }); - test('getting payment method when method is pay in advance', async () => { - // Arrange + const payLaterMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; const store = { order: { payment: { @@ -89,7 +71,26 @@ describe('payment-method.vue', () => { const paymethod = wrapper.vm.getPaymentMethodFromStore(); // Assert - expect(paymethod).toBeNull(); + expect(paymethod).toBe(payLaterMethod); + }); + test('getting payment method when method is pay in advance', async () => { + // Arrange + const payInAdvanceMethod = paymentMethods.CREDIT_CARD; + const store = { + order: { + payment: { + isPayInAdvance: true, + payInAdvanceType: payInAdvanceMethod + } + } + }; + const wrapper = setupMocks({}, store); + + // Act + const paymethod = wrapper.vm.getPaymentMethodFromStore(); + + // Assert + expect(paymethod).toBe(payInAdvanceMethod); }); }); From b7f0f0f74899bede0b9557261269b69f26f794b8 Mon Sep 17 00:00:00 2001 From: Johan Gunawan Date: Fri, 12 Apr 2024 14:30:04 -0400 Subject: [PATCH 13/19] SSR-659. Replace hard-coded BillToNumber. (#615) --- .eslintrc.js | 3 +- src/constants/application-config.js | 2 -- src/constants/endpoints.js | 18 ++++++---- src/layouts/entry-page/entry-page.vue | 40 ++++++++++++---------- src/layouts/welcome-page/welcome-page.vue | 41 +++++++++++++++++++++++ src/store/index.js | 39 ++++++++++++++------- src/store/store.spec.js | 38 ++++++++++++++++++++- 7 files changed, 141 insertions(+), 40 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 33b69824..7187e7e5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -45,7 +45,8 @@ module.exports = { }], 'import/extensions': ['error', 'always', { js: 'ignorePackages' }], 'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['item'] }], - 'no-restricted-syntax': ['off', 'ForOfStatement'] + 'no-restricted-syntax': ['off', 'ForOfStatement'], + 'no-return-await': 'off' }, settings: { 'import/resolver': { diff --git a/src/constants/application-config.js b/src/constants/application-config.js index f6797d9d..c445bcf4 100644 --- a/src/constants/application-config.js +++ b/src/constants/application-config.js @@ -19,8 +19,6 @@ const applicationConfig = Object.freeze({ SAFELITE_HOP: process.env.VUE_APP_SAFELITE_HOP, ISS_DEV_CMS_DOMAIN: 'https://digitalisscms.dev.safelite.io', CASH_PARENT_ACCOUNT_NUMBER: 167132, - ITAC_FAIR_AND_REASONABLE_BILLTO: '214616', // Lib Mutal FnR BillTo - ITAC_CASH_BILLTO: '283393', // Lib Mutal ITAC Cash BillTo GOOGLE_CALENDAR: 'https://www.google.com/calendar/render?action=TEMPLATE', YAHOO_CALENDAR: 'https://calendar.yahoo.com/?v=60', OUTLOOK_CALENDAR: diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 770048e3..2466392d 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -1,15 +1,15 @@ -const CONTENT_BASE_URL = '/content/api/v1/content'; -const LOCATION_BASE_URL = '/location/api/v1/location'; -const SCHEDULE_BASE_URL = '/schedule/api/v1/schedule'; -const PARTS_BASE_URL = '/parts/api/v1/parts'; -const VEHICLE_BASE_URL = '/vehicle/api/v1/vehicle'; -const PRICE_BASE_URL = '/price/api/v1/price'; const ACCOUNT_BASE_URL = '/account/api/v1/account'; -const EXPERIMENTS_BASE_URL = '/experiments/api/v1/experiments'; const ANALYTICS_BASE_URL = '/analytics/api/v1/analytics'; const CLIENT_AUTH_BASE_URL = '/clientauth/api/v1/clientauth'; +const CONTENT_BASE_URL = '/content/api/v1/content'; const COVERAGE_BASE_URL = '/coverage/api/v1/coverage'; +const EXPERIMENTS_BASE_URL = '/experiments/api/v1/experiments'; +const LOCATION_BASE_URL = '/location/api/v1/location'; const ORDER_BASE_URL = '/order/api/v1/order'; +const PARTS_BASE_URL = '/parts/api/v1/parts'; +const PRICE_BASE_URL = '/price/api/v1/price'; +const SCHEDULE_BASE_URL = '/schedule/api/v1/schedule'; +const VEHICLE_BASE_URL = '/vehicle/api/v1/vehicle'; const endpoints = Object.freeze({ GetRouteInfo: { @@ -24,6 +24,10 @@ const endpoints = Object.freeze({ url: (applicationAbbreviation, pageName) => `${CONTENT_BASE_URL}/${applicationAbbreviation}/${pageName}`, method: 'GET' }, + GetBillToInfo: { + url: `${ACCOUNT_BASE_URL}/bill-to-info`, + method: 'POST' + }, GetAlertReasons: { url: `${LOCATION_BASE_URL}/alert-reasons`, method: 'GET' diff --git a/src/layouts/entry-page/entry-page.vue b/src/layouts/entry-page/entry-page.vue index a060ab39..76eaee1a 100644 --- a/src/layouts/entry-page/entry-page.vue +++ b/src/layouts/entry-page/entry-page.vue @@ -30,8 +30,25 @@ export default { }, computed: { }, - mounted() { - this.validateClientTagOnEntry(); + async mounted() { + const queryStringParams = this.parseQueryParms(); + + const { isAuthorized, clientData } = await this.validateClientTagOnEntry(queryStringParams); + + this.unauthorized = !isAuthorized; + + if (isAuthorized) { + await this.populateISSConfigValues(clientData); + + if (clientData.parameters?.length > 0) { + const finalParams = this.combineClientParameters(clientData.parameters, queryStringParams); + this.populateStoreItemsFromParams(finalParams); + } + + this.mainStore.applicationUser.coverageAttempts = 0; + // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history. + window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`; + } }, methods: { @@ -53,11 +70,11 @@ export default { return queryStringParams; }, - async validateClientTagOnEntry() { - const queryStringParams = this.parseQueryParms(); + async validateClientTagOnEntry(queryStringParams) { const clientTag = queryStringParams.clienttag; const clientTagPresent = !!clientTag; let authorized = false; + let clientData = null; if (clientTagPresent) { const resp = await validateISSClientTag(clientTag); @@ -76,23 +93,12 @@ export default { } if (authorized) { - await this.populateISSConfigValues(resp.data); - - if (resp.data.parameters?.length > 0) { - const finalParams = this.combineClientParameters(resp.data.parameters, queryStringParams); - this.populateStoreItemsFromParams(finalParams); - } + clientData = resp.data; } } } - this.unauthorized = !authorized; - - if (authorized) { - this.mainStore.applicationUser.coverageAttempts = 0; - // Forced full location redirect here. We do not want the entry page as part of the router/flow/path history. - window.location = `/?issPage=${issPageValues.WELCOME_PAGE}`; - } + return { isAuthorized: authorized, clientData }; }, async populateISSConfigValues(data) { this.mainStore.issConfig.clientName = data.accountName; diff --git a/src/layouts/welcome-page/welcome-page.vue b/src/layouts/welcome-page/welcome-page.vue index e8a6bddb..d2b1cd0b 100644 --- a/src/layouts/welcome-page/welcome-page.vue +++ b/src/layouts/welcome-page/welcome-page.vue @@ -197,6 +197,8 @@ import states from '@/constants/states'; import globalRules from '@/constants/global-rules'; import routerParams from '@/router/router-constants/router-params'; import MaskaFormattedMasks from '@/constants/maska-masks'; +import globalMethods from '@/global-methods'; +import { endpoints } from '@/constants/endpoints'; // define validation rules defineRule('damage-option-required', required(errorMessages.DAMAGE_OPTION_REQUIRED)); @@ -323,6 +325,20 @@ export default { .then(async (zipInfo) => { if (zipInfo?.data?.isValid === true) { this.mainStore.updatePolicyData(this.welcomePageModel); + + this.mainStore.order.serviceLocation.zipCodeCtu = zipInfo.data.zipCodeCtu?.toString(); + + const billToInfo = await this.getBillToInfo( + this.mainStore.issConfig.parentAccountNumber, + this.mainStore.order.serviceLocation.zipCodeCtu + ); + + if (billToInfo !== null) { + this.mainStore.issConfig.billToAccountNumber = billToInfo.billToAccountNumber; + this.mainStore.issConfig.itacCashBillToNumber = billToInfo.itacCashBillToNumber; + this.mainStore.issConfig.itacFnrBillToNumber = billToInfo.itacFnrBillToNumber; + } + await this.mainStore.getDuplicateReferrals() .then(() => {}, () => {}) .finally(async () => { @@ -339,6 +355,31 @@ export default { } }); }, + + async getBillToInfo(parentAccountNumber, providerNumber) { + try { + const payload = { + parentAccountNumber: parentAccountNumber.toString(), + providerNumber: providerNumber.toString(), + billToSelectionCriteria: { + typeOfClaim: 'GLASS ONLY', + lineOfBusiness: 'PERSONAL' + } + }; + + const response = await globalMethods.callHttpClient({ + method: endpoints.GetBillToInfo.method, + endpoint: endpoints.GetBillToInfo.url, + payload + }); + + return response.data; + } catch (err) { + console.error(`Error Status Code: ${err.data?.status}: ${err.data?.title}`); + return null; + } + }, + navigateForward() { if (this.mainStore.applicationUser.duplicateOrders?.length > 0 ?? false) { this.$router.navigate( diff --git a/src/store/index.js b/src/store/index.js index c3728ae3..c6a8f713 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -228,6 +228,9 @@ export const getDefaultState = () => ({ clientHeader: {}, styleSheet: '', // Stylesheet used by the client. parentAccountNumber: 0, // Parent account number used by the client. + billToAccountNumber: null, + itacCashBillToNumber: null, + itacFnrBillToNumber: null, isCoverageEnabled: false, // Indicates if we should be calling coverage on this flow. isClaimRegistrationRequired: false, // Indicates if the claim registration call needs to be made for a client to complete coverage verification. isAuthenticated: false, // Indicates if user is authenticated or not. @@ -249,9 +252,20 @@ export const useMainStore = defineStore({ id: storeId, state: () => state, getters: { - hasRecalibrationPart: (state) => getHasRecalibrationPart(state), - vehicle: (state) => state.order.vehicle, - damage: (state) => state.order.damage, + billToNumberToUse(storeState) { + if (this.isITAC) { + return storeState.issConfig.itacCashBillToNumber; + } + + if (this.isNoComp) { + return storeState.issConfig.itacFnrBillToNumber; + } + + return storeState.issConfig.billToAccountNumber; + }, + hasRecalibrationPart: (storeState) => getHasRecalibrationPart(storeState), + vehicle: (storeState) => storeState.order.vehicle, + damage: (storeState) => storeState.order.damage, lineItems: (state) => state.order.lineItems, payment: (state) => state.order.payment, policy: (state) => state.order.policy, @@ -817,7 +831,7 @@ export const useMainStore = defineStore({ startDate, endDate, applicationName: applicationConfig.APPLICATION_NAME, - billToAccountNumber: this.issConfig.parentAccountNumber.toString(), // TODO: MAKE THIS REAL + billToAccountNumber: this.billToNumberToUse, parentAccountNumber: this.issConfig.parentAccountNumber, // this.payment.parentAccountNumber, carId: vehicle.carId, lineItems, @@ -880,7 +894,7 @@ export const useMainStore = defineStore({ endDate, shopAppointmentType, applicationName: applicationConfig.APPLICATION_NAME, - billToAccountNumber: order.policy.isITAC ? applicationConfig.ITAC_CASH_BILLTO : applicationConfig.ITAC_FAIR_AND_REASONABLE_BILLTO, // TODO: MAKE THIS REAL + billToAccountNumber: this.billToNumberToUse, parentAccountNumber: this.issConfig.parentAccountNumber, // this.payment.parentAccountNumber, carId: vehicle.carId, lineItems, @@ -1005,6 +1019,7 @@ export const useMainStore = defineStore({ let queryString = `ParentAccountNumber=${this.order.accountNumber}` + + `&BillToAccountNumber=${this.billToNumberToUse}` + `&CTU=${ctuToUse}` + `&Deductible=${deductibleToUse}` + `&ZipCode=${zipCodeToUse}` @@ -1033,12 +1048,10 @@ export const useMainStore = defineStore({ getMobileFeePart() { const damageType = this.damage.isRepair ? 'Repair' : 'Replace'; - const parentAccountNumber = 167132; // TODO: MAKE THIS REAL - const billToAccountNumber = 87291; // TODO: MAKE THIS REAL return globalMethods.callHttpClient({ method: endpoints.GetMobileFeePart.method, - endpoint: `${endpoints.GetMobileFeePart.url}/${damageType}/${parentAccountNumber}/${billToAccountNumber}` + endpoint: `${endpoints.GetMobileFeePart.url}/${damageType}/${this.order.accountNumber}/${this.billToNumberToUse}` }); }, @@ -1678,6 +1691,9 @@ export const useMainStore = defineStore({ this.issConfig.disabledFields.policyZipCode = false; this.issConfig.disabledFields.dateOfLoss = false; this.issConfig.siteType = null; + this.issConfig.billToAccountNumber = null; + this.issConfig.itacCashBillToNumber = null; + this.issConfig.itacFnrBillToNumber = null; }, disableKeyFields() { @@ -1881,7 +1897,7 @@ export const useMainStore = defineStore({ const { vehicle } = this.order; let queryString = - `ParentAccountNumber=${applicationConfig.CASH_PARENT_ACCOUNT_NUMBER}` + `ParentAccountNumber=${this.order.accountNumber}` + `&CTU=${ctuToUse}` + `&CarId=${vehicle.carId}` + `&Make=${vehicle.make}` @@ -1908,7 +1924,6 @@ export const useMainStore = defineStore({ async taxOrderItemsAndSaveServerData(pricedLineItems) { const { order } = this; const { serviceLocation } = order; - const billToAccountNumber = this.issConfig.parentAccountNumber.toString(); // payment const { providerNumber } = serviceLocation.provider; const { appointmentType } = serviceLocation; const serviceLocationCity = serviceLocation.city; @@ -1934,7 +1949,7 @@ export const useMainStore = defineStore({ || appointmentType === AppointmentTypeStrings.MOBILE_NOT_ITAC_AND_NOT_NOCOMP) { queryString = `ParentAccountNumber=${applicationConfig.CASH_PARENT_ACCOUNT_NUMBER}` - + `&BillToAccountNumber=${billToAccountNumber}` + + `&BillToAccountNumber=${this.billToNumberToUse}` + `&ProviderNumber=${providerNumber}` + `&AppointmentType=${appointmentType}` + `&ServiceLocation.City=${serviceLocationCity}` @@ -1944,7 +1959,7 @@ export const useMainStore = defineStore({ } else { queryString = `ParentAccountNumber=${applicationConfig.CASH_PARENT_ACCOUNT_NUMBER}` - + `&BillToAccountNumber=${billToAccountNumber}` + + `&BillToAccountNumber=${this.billToNumberToUse}` + `&ProviderNumber=${providerNumber}` + `&AppointmentType=${appointmentType}` + `&${pricedLineItemsFormattedForRequest}`; diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 8c7382ff..6499d98a 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -1,5 +1,5 @@ import { setActivePinia, createPinia } from 'pinia'; -import { useMainStore } from '@/store/index.js'; +import { useMainStore, getDefaultState } from '@/store/index.js'; import globalMethods from '@/global-methods.js'; import { getRandomString, getRandomGuid, getRandomInt, getRandomBoolean } from '@/helpers/data-generation.js'; import coverageStatuses from '@/constants/coverage-statuses.js'; @@ -14,7 +14,13 @@ describe('Store', () => { beforeEach(() => { const pinia = createPinia(); setActivePinia(pinia); + store = useMainStore(); + const defaultState = getDefaultState(); + Object.keys(defaultState).forEach((key) => { + store[key] = defaultState[key]; + }); + store.applicationUser.eventBus = []; jest.resetAllMocks(); }); @@ -1969,4 +1975,34 @@ describe('Store', () => { expect(store.order.payment.paypalToken).toEqual(paypalToken); }); }); + + describe('billToNumberToUse getter', () => { + it('returns itacCashBillToNumber when in ITAC flow', () => { + // Arrange + store.order.policy.isITAC = true; + store.issConfig.itacCashBillToNumber = '12345'; + + // Assert + expect(store.billToNumberToUse).toEqual(store.issConfig.itacCashBillToNumber); + }); + + it('returns itacFnrBillToNumber when in NoComp flow', () => { + // Arrange + store.order.policy.noCoverage = true; + store.issConfig.itacFnrBillToNumber = '12345'; + + // Assert + expect(store.billToNumberToUse).toEqual(store.issConfig.itacFnrBillToNumber); + }); + + it('returns billToAccountNumber when not ITAC and not NoComp', () => { + // Arrange + store.order.policy.isITAC = null; + store.order.policy.noCoverage = null; + store.issConfig.billToAccountNumber = '12345'; + + // Assert + expect(store.billToNumberToUse).toEqual(store.issConfig.billToAccountNumber); + }); + }); }); From b7e08c9039d5fc7bc75ad248146063feb299c59f Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Fri, 12 Apr 2024 14:24:09 -0500 Subject: [PATCH 14/19] SSR-1125 Fix Payment Method Pre Reqs --- src/layouts/payment-method/payment-method.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index c5014290..f6ca964f 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -247,14 +247,22 @@ export default { ); // Customer - const { firstName, lastName, phoneNumber, emailAddress } = useMainStore().order.customer; + const { firstName, lastName, emailAddress } = useMainStore().order.customer; const customerReqs = !!( firstName && lastName - && phoneNumber && emailAddress ); + // Contact Info + const { contactInfo } = useMainStore().order; + const contactInfoReqs = !!( + contactInfo.firstName + && contactInfo.lastName + && contactInfo.servicePhone + && contactInfo.emailAddress + ); + return ( vehicleReqs && damageReqs @@ -262,6 +270,7 @@ export default { && serviceLocationReqs && scheduleReqs && customerReqs + && contactInfoReqs ); }, getPaymentMethodFromStore() { From 8b570a7fbc8b437358d816f11fc1fa10560b0539 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Mon, 15 Apr 2024 09:52:24 -0500 Subject: [PATCH 15/19] SSR-1125 Fix Claim Registration --- src/store/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/index.js b/src/store/index.js index c3728ae3..18a0b4e4 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -557,7 +557,7 @@ export const useMainStore = defineStore({ country: 'US' // TODO set from store }, homePhone: { - number: this.order.customerInfo?.homePhone?.replaceAll(nonNumberCharRegex, '') ?? '' + number: this.contactInfo.homePhone?.replaceAll(nonNumberCharRegex, '') ?? '' } }, driver: { From a1a1440a8686d3b150ea60360bc89c74ea8977e5 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Mon, 15 Apr 2024 13:41:36 -0400 Subject: [PATCH 16/19] modifying reset issconfig state --- src/store/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/store/index.js b/src/store/index.js index 01542d04..7bf09725 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1692,6 +1692,7 @@ export const useMainStore = defineStore({ this.issConfig.disabledFields.policyZipCode = false; this.issConfig.disabledFields.dateOfLoss = false; this.issConfig.siteType = null; + this.issConfig.enableNoCompQuote = false; }, disableKeyFields() { From 0fa31168f988e959f9e51f637af37717f49c8d52 Mon Sep 17 00:00:00 2001 From: Johan Gunawan Date: Mon, 15 Apr 2024 15:58:24 -0400 Subject: [PATCH 17/19] SSR-689.2. Fix error when loading payment-page. --- src/layouts/payment-page/payment-page.vue | 34 ----------------------- 1 file changed, 34 deletions(-) diff --git a/src/layouts/payment-page/payment-page.vue b/src/layouts/payment-page/payment-page.vue index 2642ccca..83e878ea 100644 --- a/src/layouts/payment-page/payment-page.vue +++ b/src/layouts/payment-page/payment-page.vue @@ -419,9 +419,6 @@ export default { const paymentSignaturePromise = await useMainStore().getPaymentSignature(); - const wipersPromise = useMainStore().getWipers(); - const rainDefensePromise = useMainStore().getRainDefense(); - // Settle promises and get results const promiseResultMap = [ { @@ -431,41 +428,14 @@ export default { { resultKey: 'paymentSignature', promise: paymentSignaturePromise - }, - { - resultKey: 'wipers', - promise: wipersPromise - }, - { - resultKey: 'rainDefense', - promise: rainDefensePromise } ]; // use resultMap to populate layout content. const resultMap = await settleAllPromises(promiseResultMap); - const lineItemsFromStore = useMainStore().lineItems; - const glassParts = lineItemsFromStore.glassParts ?? []; - const supportingItems = lineItemsFromStore.supportingItems ?? []; - - const lineItemsToTax = [ - resultMap.rainDefense, - ...supportingItems, - ...resultMap.wipers, - ...glassParts - ]; - const availableVaps = [resultMap.rainDefense, ...resultMap.wipers]; - const pricedLineItemsToTax = await useMainStore().priceOrderItemsAndSaveServerData(lineItemsToTax); - const taxedLineItems = await useMainStore().taxOrderItemsAndSaveServerData(pricedLineItemsToTax); - - // Match all line items to the line items as they are in the store - // and rebuild the original structure. - const taxLineItems = useMainStore().mapTaxedLineItemsToStoreFormat(taxedLineItems, lineItemsFromStore); - const taxedVaps = useMainStore().mapTaxedLineItemsToStoreFormat(taxedLineItems, availableVaps); next((vm) => { vm.setCmsContent(resultMap.cmsContent); - vm.setData(taxedVaps, taxLineItems); vm.$nextTick(() => { if (vm.$refs.cart) { @@ -614,10 +584,6 @@ export default { && paymentMethodReqs ); }, - setData(taxedVaps, taxLineItems) { - this.availableVaps = taxedVaps; - this.lineItems = taxLineItems; - }, getWorkOrderNumber() { const { workOrderNumber } = useMainStore().order; if (workOrderNumber) { From 8a7667a1294c3d41f84d9db1030ba28ae0f17164 Mon Sep 17 00:00:00 2001 From: Johan Gunawan Date: Mon, 15 Apr 2024 17:22:41 -0400 Subject: [PATCH 18/19] SSR-659.3. Fix error when Mobile is selected, remove call to non-insurance pricing endpoint (#620) --- src/constants/endpoints.js | 4 -- src/helpers/service-location-helper.js | 8 +++- .../schedule-page/schedule-page.spec.js | 12 ------ src/layouts/schedule-page/schedule-page.vue | 2 +- src/store/index.js | 40 ------------------- 5 files changed, 7 insertions(+), 59 deletions(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 2466392d..8d010784 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -76,10 +76,6 @@ const endpoints = Object.freeze({ url: `${PRICE_BASE_URL}/order-items-with-insurance-pricing`, method: 'GET' }, - GetPriceOrderItems: { - url: `${PRICE_BASE_URL}/order-items`, - method: 'GET' - }, GetProviders: { url: `${LOCATION_BASE_URL}/providers`, method: 'GET' diff --git a/src/helpers/service-location-helper.js b/src/helpers/service-location-helper.js index 63f4c711..2f80d85e 100644 --- a/src/helpers/service-location-helper.js +++ b/src/helpers/service-location-helper.js @@ -16,14 +16,18 @@ export async function getPricedMobileFeePart(serviceZipCode) { if (!serviceZipCode) { return Promise.resolve(null); } - const zipCodeData = await getZipCodeData(serviceZipCode); // Get the Mobile Fee Part const mobileFeePart = await useMainStore().getMobileFeePart(); + + if (mobileFeePart.data == null || mobileFeePart.data === '') { + return Promise.resolve(null); + } + // Get the Mobile Fee Part Price const pricingResults = await useMainStore() - .priceOrderItemsAndSaveServerData([mobileFeePart.data], serviceZipCode, zipCodeData.zipCodeCtu); + .getPriceOrderItems([mobileFeePart.data]); return Promise.resolve(pricingResults[0]); } diff --git a/src/layouts/schedule-page/schedule-page.spec.js b/src/layouts/schedule-page/schedule-page.spec.js index c025ece6..ad18458e 100644 --- a/src/layouts/schedule-page/schedule-page.spec.js +++ b/src/layouts/schedule-page/schedule-page.spec.js @@ -18,18 +18,6 @@ const mockMixin = { getCmsContent: jest.fn().mockImplementation(() => ''), setCmsContent: jest.fn(), dispatchStoreAction: jest.fn().mockImplementation((storeAction) => { - if (storeAction === 'priceOrderItemsAndSaveServerData') { - return Promise.resolve([ - { - partNumber: 'EARLY BIRD', - description: null, - partType: 'EARLY BIRD', - laborAmount: 0, - sellingPrice: 14.99, - kitPrice: 0 - } - ]); - } if (storeAction === 'saveSupportingItemsSuppressingStateResetting') { return Promise.resolve([ { diff --git a/src/layouts/schedule-page/schedule-page.vue b/src/layouts/schedule-page/schedule-page.vue index 4636b834..262d37f2 100644 --- a/src/layouts/schedule-page/schedule-page.vue +++ b/src/layouts/schedule-page/schedule-page.vue @@ -223,7 +223,7 @@ export default { const premiumFeeWithPricePromise = premiumFeePromise.then((result) => { if (result.data) { - return useMainStore().priceOrderItemsAndSaveServerData(result.data); + return useMainStore().getPriceOrderItems(result.data); } return result.data; }); diff --git a/src/store/index.js b/src/store/index.js index e616d1c0..d6d8fa39 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1880,46 +1880,6 @@ export const useMainStore = defineStore({ this.updateCapabilityQuestionAnswers(capabilityQuestionAnswersArray); }, - // Price order actions - async priceOrderItemsAndSaveServerData(availableLineItems, serviceZipCode, serviceZipCodeCtu) { - const zipCodeToUse = serviceZipCode || this.order.serviceLocation.zipCode; - const ctuToUse = serviceZipCodeCtu || this.order.serviceLocation.zipCodeCtu; - const flattenedLineItemsWithChildParts = getFlattenedArrayOfLineItemsWithChildParts(availableLineItems); - const lineItemsWithOnlyPartNumbers = flattenedLineItemsWithChildParts.map((lineItem) => ({ - partNumber: lineItem.partNumber - })); - const availableLineItemsFormattedForRequest = - buildQueryStringParameterFromArrayOfComplexObjects( - lineItemsWithOnlyPartNumbers, - 'lineItems' - ); - - const { vehicle } = this.order; - - let queryString = - `ParentAccountNumber=${this.order.accountNumber}` - + `&CTU=${ctuToUse}` - + `&CarId=${vehicle.carId}` - + `&Make=${vehicle.make}` - + `&Model=${vehicle.model}` - + `&Year=${vehicle.year}` - + `&EON=${this.order.eon}` - + `&ZipCode=${zipCodeToUse}` - + `&${availableLineItemsFormattedForRequest}`; - - const lineItemServerData = this.order.lineItems.serverData; - if (lineItemServerData) { - queryString += `&ServerData=${encodeURIComponent(lineItemServerData)}`; - } - - const response = await globalMethods.callHttpClient({ - method: endpoints.GetPriceOrderItems.method, - endpoint: `${endpoints.GetPriceOrderItems.url}?${queryString}` - }); - - // context.commit(storeMutations.UPDATE_LINE_ITEMS_SERVER_DATA, response.data.serverData); - return addPricesToLineItems(availableLineItems, response.data.lineItems); - }, // Tax order actions async taxOrderItemsAndSaveServerData(pricedLineItems) { const { order } = this; From 803774a8591d7b6e3b55d292b30c4d7ab4c4d049 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Mon, 15 Apr 2024 17:29:32 -0400 Subject: [PATCH 19/19] fixing back navigation bug --- src/layouts/service-location/service-location.vue | 8 +++++++- src/mixins/base-mixin.js | 4 ++-- src/router/router-constants/navigation-scenarios.js | 4 ++++ src/router/router-constants/routing-table.js | 6 +++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/layouts/service-location/service-location.vue b/src/layouts/service-location/service-location.vue index 8d1cfa12..839606f5 100644 --- a/src/layouts/service-location/service-location.vue +++ b/src/layouts/service-location/service-location.vue @@ -87,7 +87,7 @@ class="mt-5" cmsWidgetName="SiteFooterWidget" :isForwardActionDisabled="!meta.valid || displayNoShopsAlert" - @backClicked="navigateBack" + @backClicked="navigateBack(this, navigateBackScenario)" @forwardClicked="forwardButtonAction" /> @@ -327,6 +327,12 @@ export default { }, displayServiceableMobileOnly() { return this.isServiceableMobile && !this.isServiceableInshop; + }, + navigateBackScenario() { + const { isNoComp, isITAC } = useMainStore(); + return isNoComp || isITAC + ? this.navigationScenarios.CLICKED_BACK_CANNOT_REACH_TPA_FLOW + : this.navigationScenarios.CLICKED_BACK_CAN_REACH_TPA_FLOW; } }, methods: { diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 53f316ee..78869119 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -28,10 +28,10 @@ export default { const footerInfoBox = document.querySelector('.footer#infoBox'); return footerInfoBox ? footerInfoBox.offsetHeight : 0; }, - navigateBack(vm) { + navigateBack(vm, scenario = this.navigationScenarios.CLICKED_BACK) { const self = vm ?? this; - self.$router.navigateWithSpinner(this.navigationScenarios.CLICKED_BACK, self.$route); + self.$router.navigateWithSpinner(scenario, self.$route); }, savePageDataToStore(page, data) { useMainStore().updatePageData({ page, data }); diff --git a/src/router/router-constants/navigation-scenarios.js b/src/router/router-constants/navigation-scenarios.js index bd079640..8bc295df 100644 --- a/src/router/router-constants/navigation-scenarios.js +++ b/src/router/router-constants/navigation-scenarios.js @@ -80,6 +80,10 @@ const navigationScenarios = Object.freeze({ EDIT_PREFERRED_SHOP: 'EDIT_PREFERRED_SHOP', EDIT_CONTACT_DETAILS: 'EDIT_CONTACT_DETAILS', + // Service location + CLICKED_BACK_CANNOT_REACH_TPA_FLOW: 'CLICKED_BACK_CANNOT_REACH_TPA_FLOW', + CLICKED_BACK_CAN_REACH_TPA_FLOW: 'CLICKED_BACK_CAN_REACH_TPA_FLOW', + // Provider Preference CLICKED_FORWARD_WITH_SAFELITE: 'CLICKED_FORWARD_WITH_SAFELITE', CLICKED_FORWARD_WITH_TPA_ENABLED: 'CLICKED_FORWARD_WITH_TPA_ENABLED', diff --git a/src/router/router-constants/routing-table.js b/src/router/router-constants/routing-table.js index 405eceea..a005582f 100644 --- a/src/router/router-constants/routing-table.js +++ b/src/router/router-constants/routing-table.js @@ -559,7 +559,11 @@ const routingTable = () => [ issPageValue: issPageValues.SERVICE_LOCATION, maps: [ { - scenario: navigationScenarios.CLICKED_BACK, + scenario: navigationScenarios.CLICKED_BACK_CANNOT_REACH_TPA_FLOW, + destinationIssPageValue: issPageValues.COVERAGE_STATEMENT + }, + { + scenario: navigationScenarios.CLICKED_BACK_CAN_REACH_TPA_FLOW, destinationIssPageValue: issPageValues.PROVIDER_PREFERENCE }, {