From f8e4e2f7d48accf9bb520655f16c2a69bd219243 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Tue, 12 Mar 2024 13:07:29 -0500 Subject: [PATCH 1/7] SSR-1101 Enable Paypal --- src/constants/query-strings.js | 1 + src/helpers/order-helper.js | 10 ++-- src/layouts/payment-return/payment-return.vue | 1 + src/store/index.js | 9 ++-- src/store/store.spec.js | 47 ++++++++++++------- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/constants/query-strings.js b/src/constants/query-strings.js index 576d1e5b..81d5ba7d 100644 --- a/src/constants/query-strings.js +++ b/src/constants/query-strings.js @@ -9,6 +9,7 @@ const queryStrings = Object.freeze({ CARD_TYPE: 'sgcardtype', DISPLAY_PAY_IN_ADVANCE_ALERT: 'displayPayInAdvanceAlert', ERROR: 'error', + TOKEN: 'token', LAST_FOUR: 'last_four', REFERENCE_NUMBER: 'req_reference_number', REFERRAL_SEQ_NUM: 'referralseqnum', diff --git a/src/helpers/order-helper.js b/src/helpers/order-helper.js index 33e7d3c4..8daf4b36 100644 --- a/src/helpers/order-helper.js +++ b/src/helpers/order-helper.js @@ -4,8 +4,8 @@ import { updateOrCreateISSCookie } from '@/helpers/cookie-helper'; /* Encapsulates asynchronous Save Session logic inside a promise to allow for Save Session queuing */ -async function saveSessionHelper(store) { - const savedSessionInfo = await store.saveSession(); +async function saveSessionHelper(store, options) { + const savedSessionInfo = await store.saveSession(options); if (savedSessionInfo) { store.setSaveSessionInfo(savedSessionInfo.data); } @@ -17,11 +17,11 @@ async function saveSessionHelper(store) { This will also set Referral information in the store after saving, and then update the cookie. To force synchronous behavior pass in 'true' for shouldAwaitSaveSessionQueue */ -export async function saveSession({ shouldAwaitSaveSessionQueue = false }) { +export async function saveSession({ shouldAwaitSaveSessionQueue = false, submitAfterSave = false }) { const store = useMainStore(); const saveSessionPromise = store.applicationUser.saveSessionPromise - ? store.applicationUser.saveSessionPromise.then(() => saveSessionHelper(store)) - : saveSessionHelper(store); + ? store.applicationUser.saveSessionPromise.then(() => saveSessionHelper(store, { submitAfterSave })) + : saveSessionHelper(store, { submitAfterSave }); store.setSaveSessionPromise(saveSessionPromise); diff --git a/src/layouts/payment-return/payment-return.vue b/src/layouts/payment-return/payment-return.vue index 8e5d3de6..4a29f2ea 100644 --- a/src/layouts/payment-return/payment-return.vue +++ b/src/layouts/payment-return/payment-return.vue @@ -74,6 +74,7 @@ export default { await this.processCreditCardResponse(); break; case paymentMethods.PAYPAL: + await this.processPaypalResponse(); break; default: console.log(`Unknown pay in advance type: ${payInAdvanceType}`); diff --git a/src/store/index.js b/src/store/index.js index 7f0a595b..840994a5 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1145,7 +1145,7 @@ export const useMainStore = defineStore({ this.applicationUser.crmCustomerId = response.crmCustomerId.toString(); }, - saveSession() { + saveSession(options) { const { vehicle, damage, policy, customer, contactInfo, payment, lineItems, serviceLocation, schedule } = this.order; @@ -1233,7 +1233,9 @@ export const useMainStore = defineStore({ coverageStatus: payment.insuranceCoverage?.coverageStatus, claimNumber: payment.insuranceCoverage?.claimNumber }, - parentAccountNumber: this.issConfig.parentAccountNumber + parentAccountNumber: this.issConfig.parentAccountNumber, + paypalToken: payment.paypalToken, + isPaypal: payment.payInAdvanceType === paymentMethods.PAYPAL }, serviceLocation: { address: { @@ -1274,7 +1276,8 @@ export const useMainStore = defineStore({ referralSequenceNumber: this.order.referralSequenceNumber, eon: this.order.eon, submitToMainframe: !!this.order.referralNumber, - loadedFromDupeCheck + loadedFromDupeCheck, + submitAfterSave: !!options.submitAfterSave }, additionalSuccessEventDataHandler: () => `Email provided: ${customer.emailAddress ? 'true' : 'false'}` diff --git a/src/store/store.spec.js b/src/store/store.spec.js index 3a44c37e..2faa74f8 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -503,7 +503,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -517,7 +517,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve(response)); // Act - const result = store.saveSession(); + const result = store.saveSession({}); // Asserts await expect(result).resolves.toBe(response); @@ -537,7 +537,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -570,7 +570,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -612,7 +612,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -659,7 +659,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -708,7 +708,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -742,7 +742,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -769,7 +769,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -802,7 +802,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -838,7 +838,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -861,7 +861,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -875,7 +875,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Assert expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -888,7 +888,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -904,7 +904,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -927,7 +927,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.resolve({})); // Act - await store.saveSession(); + await store.saveSession({}); // Asserts expect(globalMethods.callHttpClient).toHaveBeenCalledWith(expect.objectContaining({ @@ -947,7 +947,7 @@ describe('Store', () => { globalMethods.callHttpClient = jest.fn().mockReturnValue(Promise.reject(error)); // Act - await store.saveSession().catch((e) => { + await store.saveSession({}).catch((e) => { expect(e).toEqual(error); }); @@ -1887,4 +1887,17 @@ describe('Store', () => { expect(store.order.payment.payInAdvanceType).toEqual(paymentMethod); }); }); + + describe('updatePaypalToken method', () => { + it('paypalToken is valid when set', () => { + // Arrange + const paypalToken = getRandomString(6, 6); + + // Act + store.updatePaypalToken(paypalToken); + + // Assert + expect(store.order.payment.paypalToken).toEqual(paypalToken); + }); + }); }); From b0a053c48a9beca5e087f66d255eb15d1b013b45 Mon Sep 17 00:00:00 2001 From: Josh Dassinger Date: Wed, 13 Mar 2024 10:23:52 -0500 Subject: [PATCH 2/7] SSR-1011 cleanup & fix deductible pricing --- src/mixins/base-mixin.js | 4 ++++ src/store/index.js | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index 0cbeec5b..3816d5c2 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -67,6 +67,10 @@ export default { }); }, getAmountDue(lineItems) { + if (!useMainStore().isNoComp && !useMainStore().policy.isITAC) { + return useMainStore().order.currentDeductible; + } + let amountDue = 0; if (lineItems.glassParts) { amountDue += this.getTotalPriceOfAllLineItemsAndChildParts( diff --git a/src/store/index.js b/src/store/index.js index 840994a5..a93d5b3d 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1145,7 +1145,7 @@ export const useMainStore = defineStore({ this.applicationUser.crmCustomerId = response.crmCustomerId.toString(); }, - saveSession(options) { + saveSession({ submitAfterSave }) { const { vehicle, damage, policy, customer, contactInfo, payment, lineItems, serviceLocation, schedule } = this.order; @@ -1277,7 +1277,7 @@ export const useMainStore = defineStore({ eon: this.order.eon, submitToMainframe: !!this.order.referralNumber, loadedFromDupeCheck, - submitAfterSave: !!options.submitAfterSave + submitAfterSave: !!submitAfterSave }, additionalSuccessEventDataHandler: () => `Email provided: ${customer.emailAddress ? 'true' : 'false'}` From 1b2935ebacededcf79bf6479f9efd2c4fc0966c6 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 14 Mar 2024 12:56:14 -0400 Subject: [PATCH 3/7] Cleaning up styling --- .../cart-dropdown/cart-dropdown.spec.js | 52 +++++++ .../cart-dropdown/cart-dropdown.vue | 131 ++++++++++++------ src/styles/ux-variables.scss | 1 + 3 files changed, 139 insertions(+), 45 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 16a35951..8ef2cd50 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -121,6 +121,58 @@ describe('cart-dropdown component', () => { // Assert expect(cartBasePrice.exists()).toBeTruthy(); }); + test('cart footer', () => { + // Arrange + const reference = '#cart-footer'; + const isExpanded = true; + const initialData = { isExpanded }; + const { wrapper } = getMountedComponent({}, {}, initialData); + + // Act + const cartFooter = wrapper.find(reference); + + // Assert + expect(cartFooter.exists()).toBeTruthy(); + }); + test('subtotal', () => { + // Arrange + const reference = '#cart-subtotal'; + const isExpanded = true; + const initialData = { isExpanded }; + const { wrapper } = getMountedComponent({}, {}, initialData); + + // Act + const subtotal = wrapper.find(reference); + + // Assert + expect(subtotal.exists()).toBeTruthy(); + }); + test('tax', () => { + // Arrange + const reference = '#cart-sales-tax'; + const isExpanded = true; + const initialData = { isExpanded }; + const { wrapper } = getMountedComponent({}, {}, initialData); + + // Act + const salesTax = wrapper.find(reference); + + // Assert + expect(salesTax.exists()).toBeTruthy(); + }); + test('bottom amount due', () => { + // Arrange + const reference = '#bottom-amount-due'; + const isExpanded = true; + const initialData = { isExpanded }; + const { wrapper } = getMountedComponent({}, {}, initialData); + + // Act + const bottomAmountDue = wrapper.find(reference); + + // Assert + expect(bottomAmountDue.exists()).toBeTruthy(); + }); }); describe('does not display', () => { test('cart deductible when showDeductibleLineItem is false', () => { diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index f636e511..e1a8cb59 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -1,5 +1,5 @@