From db86be9bf9961fb9886c308ae33a510c82b1bb0b Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 28 Mar 2024 16:53:42 -0400 Subject: [PATCH 1/9] Removing unnecessary computed --- .../__snapshots__/cart-dropdown.spec.js.snap | 2 ++ src/iss-components/cart-dropdown/cart-dropdown.vue | 13 ++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap index ae4e42e9..a8925b2e 100644 --- a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap +++ b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap @@ -6,6 +6,8 @@ Object { "deductible": null, "glassToReplace": Array [], "isExpanded": false, + "isITAC": false, + "isNoComp": false, "isRepair": null, "vapsInOrder": Array [], "widget": Object { diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index a41683e5..b0cfd872 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -23,7 +23,7 @@ id="cart-deductible-or-base-price" class="cart-item cart-gray">
{{ deductibleLabel }} @@ -178,6 +178,8 @@ export default { const { supportingItems, glassParts, otherParts, vaps } = useMainStore().lineItems; return { + isNoComp: useMainStore().isNoComp, + isITAC: useMainStore().policy.isITAC, isRepair, glassToReplace: glassToReplace ?? [], vapsInOrder: vaps ?? [], @@ -205,15 +207,12 @@ export default { baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems); }, - showDeductibleLineItem() { - return !useMainStore().isNoComp && !useMainStore().policy.isITAC; - }, isUnverified() { - return this.showDeductibleLineItem + return !this.isNoComp && !this.isITAC && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); }, subTotal() { - const basePrice = this.showDeductibleLineItem + const basePrice = !this.isNoComp && !this.isITAC ? this.deductible : this.baseServicePrice; return basePrice + this.packagePrice; @@ -332,7 +331,7 @@ export default { this.isExpanded = !this.isExpanded; }, getDisplayed(amount) { - return this.isUnverified && this.showDeductibleLineItem + return this.isUnverified && !this.isNoComp && !this.isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, From 43f48c55714c9d323a80084217edc6fadab5d646 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 28 Mar 2024 16:55:38 -0400 Subject: [PATCH 2/9] Removing unnecessary method --- .../cart-dropdown/cart-dropdown.spec.js | 62 ------------------- 1 file changed, 62 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 3c3c5774..67701a5c 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -323,68 +323,6 @@ describe('cart-dropdown component', () => { }); }); describe('computed', () => { - describe('showDeductibleLineItem', () => { - test.each([[true], [false]])('returns false when isNoComp true', (isItac) => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: isItac, - noCoverage: true - } - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.showDeductibleLineItem; - - // Assert - expect(result).toBeFalsy(); - }); - test.each([ - [coverageStatuses.NO_COMP], - [coverageStatuses.PENDING]])('returns false when isITAC true', (coverageStatus) => { - // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus - } - }, - policy: { - isITAC: true - } - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.showDeductibleLineItem; - - // Assert - expect(result).toBeFalsy(); - }); - test('returns true when isNoComp false and isITAC false', () => { - // Arrange - const storeData = { - order: { - policy: { - isITAC: false, - noCoverage: false - } - } - }; - const { wrapper } = getMountedComponent(storeData); - - // Act - const result = wrapper.vm.showDeductibleLineItem; - - // Assert - expect(result).toBeTruthy(); - }); - }); describe('isUnverified', () => { test('returns false when no comp', () => { // Arrange From c696a7e82ac2d08c81c50ca72ed2a0fab79a77ea Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 28 Mar 2024 16:57:17 -0400 Subject: [PATCH 3/9] Removing unused ref --- src/iss-components/cart-dropdown/cart-dropdown.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index b0cfd872..62912d2f 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -61,7 +61,6 @@ {{ item?.name ?? '' }} Date: Fri, 29 Mar 2024 10:26:05 -0400 Subject: [PATCH 4/9] Making adjustments based on PR comments --- src/constants/part-number-strings.js | 5 +++++ src/constants/part-type-strings.js | 1 - .../__snapshots__/cart-dropdown.spec.js.snap | 2 -- .../cart-dropdown/cart-dropdown.spec.js | 7 ++++--- .../cart-dropdown/cart-dropdown.vue | 19 +++++++++++-------- 5 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 src/constants/part-number-strings.js diff --git a/src/constants/part-number-strings.js b/src/constants/part-number-strings.js new file mode 100644 index 00000000..85e3398d --- /dev/null +++ b/src/constants/part-number-strings.js @@ -0,0 +1,5 @@ +const partNumberStrings = Object.freeze({ + RECYCLE_FEE: 'RECYCLE FEE' +}); + +export default partNumberStrings; diff --git a/src/constants/part-type-strings.js b/src/constants/part-type-strings.js index 52a3a2c7..786a069d 100644 --- a/src/constants/part-type-strings.js +++ b/src/constants/part-type-strings.js @@ -4,7 +4,6 @@ RAIN_DEFENSE: 'RAIN DEFENSE', RECALIBRATION: 'RECALIBRATION', REPLACE_FEE: 'REPLACE FEE', - RECYCLE_FEE: 'RECYCLE FEE', MOBILE_FEE: 'MOBILE FEE', REPAIR_FEE: 'REPAIR FEE' }); diff --git a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap index a8925b2e..ae4e42e9 100644 --- a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap +++ b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap @@ -6,8 +6,6 @@ Object { "deductible": null, "glassToReplace": Array [], "isExpanded": false, - "isITAC": false, - "isNoComp": false, "isRepair": null, "vapsInOrder": Array [], "widget": Object { diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index 67701a5c..a123f42e 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -8,6 +8,7 @@ import { useMainStore } from '@/store'; import coverageStatuses from '@/constants/coverage-statuses'; import { formatAmountInDollars } from '@/helpers/text-helper.js'; import partTypeStrings from '@/constants/part-type-strings'; +import partNumberStrings from '@/constants/part-number-strings'; import { getHighestFullySatisfiedTier, getPackageContents } from '@/helpers/service-package-helper.js'; import getPriceOfLineItems from '@/helpers/price-calculator.js'; @@ -187,7 +188,7 @@ describe('cart-dropdown component', () => { order: { lineItems: { supportingItems: [{ - partNumber: partTypeStrings.RECYCLE_FEE + partNumber: partNumberStrings.RECYCLE_FEE }] } } @@ -887,7 +888,7 @@ describe('cart-dropdown component', () => { const storeData = { order: { lineItems: { - supportingItems: [{ partType: 'not recycle' }] + supportingItems: [{ partNumber: 'not recycle' }] } } }; @@ -916,7 +917,7 @@ describe('cart-dropdown component', () => { const storeData = { order: { lineItems: { - supportingItems: [{ partNumber: partTypeStrings.RECYCLE_FEE }] + supportingItems: [{ partNumber: partNumberStrings.RECYCLE_FEE }] } } }; diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 62912d2f..e6e09442 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -23,7 +23,7 @@ id="cart-deductible-or-base-price" class="cart-item cart-gray">
{{ deductibleLabel }} @@ -154,6 +154,7 @@ import { getHighestFullySatisfiedTier, getPackageContents } from '@/helpers/serv // Constants import partTypeStrings from '@/constants/part-type-strings.js'; +import partNumberStrings from '@/constants/part-number-strings.js'; import widgetFields from '@/constants/cms-widget-fields.js'; const VERIFYING_COVERAGE = 'Verifying coverage'; @@ -177,8 +178,6 @@ export default { const { supportingItems, glassParts, otherParts, vaps } = useMainStore().lineItems; return { - isNoComp: useMainStore().isNoComp, - isITAC: useMainStore().policy.isITAC, isRepair, glassToReplace: glassToReplace ?? [], vapsInOrder: vaps ?? [], @@ -203,15 +202,18 @@ export default { }; }, computed: { + showDeductibleCartItem() { + return !useMainStore().isNoComp && !useMainStore().policy.isITAC; + }, baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems); }, isUnverified() { - return !this.isNoComp && !this.isITAC + return !useMainStore().isNoComp && !useMainStore().policy.isITAC && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); }, subTotal() { - const basePrice = !this.isNoComp && !this.isITAC + const basePrice = !useMainStore().isNoComp && !useMainStore().policy.isITAC ? this.deductible : this.baseServicePrice; return basePrice + this.packagePrice; @@ -301,10 +303,9 @@ export default { return currentPackage?.SubWidgetName ?? ''; }, - // TODO there is something weird with recycling in the backend where partType is Replace instead of recycle recycleFeeCartItem() { const recycleFeeLineItem = useMainStore().lineItems.supportingItems - ?.find((lineItem) => lineItem.partNumber === partTypeStrings.RECYCLE_FEE); + ?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE); return recycleFeeLineItem ? this.getCartItem( this.getCmsContent(this.widget.recycleFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), @@ -330,7 +331,9 @@ export default { this.isExpanded = !this.isExpanded; }, getDisplayed(amount) { - return this.isUnverified && !this.isNoComp && !this.isITAC + return this.isUnverified + && !useMainStore().isNoComp + && !useMainStore().policy.isITAC ? VERIFYING_COVERAGE : formatAmountInDollars(amount); }, From 5b92962624161788202c0c602f199f3f856b2ee6 Mon Sep 17 00:00:00 2001 From: Bill Richardson Date: Mon, 1 Apr 2024 08:37:09 -0400 Subject: [PATCH 5/9] add in PIA alert to payment-method page --- src/layouts/payment-method/payment-method.vue | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 34e1ed67..db73e424 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -26,7 +26,12 @@ servicePackageTitleWidgetName="ServicePackageTitle" :availableVaps="availableVaps" />
-
Pia Alert Placeholder
+ Date: Mon, 1 Apr 2024 14:56:28 -0400 Subject: [PATCH 6/9] Update tests and add tests for alert --- .../payment-method/payment-method.spec.js | 71 +++++++++++++------ src/layouts/payment-method/payment-method.vue | 1 + 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index 01e06a1e..476c9f59 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -5,39 +5,70 @@ import paymentMethod from '@/layouts/payment-method/payment-method.vue'; import { shallowMount } from '@vue/test-utils'; import { getMountOptions } from '@/helpers/unit-test-helper.js'; import { useMainStore } from '@/store'; +import issPageValues from '@/router/router-constants/issPage-values'; import { paymentMethods } from '@/constants/payment-method-constants'; +import queryStrings from '@/constants/query-strings'; -function setupMocks() { - const mountOptions = getMountOptions(); +function setupMocks({ customMountOptions = {}, queryString }) { + const mountOptions = getMountOptions({ + ...customMountOptions, + route: { query: { issPage: issPageValues.PAYMENT_METHOD, ...queryString }, params: {} } + }); const wrapper = shallowMount(paymentMethod, mountOptions); - return { wrapper }; + return wrapper; } describe('payment-method.vue', () => { - test('getting payment method when method is pay later', async () => { + describe('Payment Method Type', () => { + test('getting payment method when method is pay later', async () => { // Arrange - const { wrapper } = setupMocks(); - const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; - useMainStore().savePaymentMethodChoice(payLaterPaymentMethod); + const wrapper = setupMocks({}); + const payLaterPaymentMethod = paymentMethods.PAY_AT_TIME_OF_SERVICE; + useMainStore().savePaymentMethodChoice(payLaterPaymentMethod); - // Act - const paymethod = wrapper.vm.getPaymentMethodFromStore(); + // Act + const paymethod = wrapper.vm.getPaymentMethodFromStore(); - // Assert - expect(paymethod).toBe(payLaterPaymentMethod); + // Assert + 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); + + // Act + const paymethod = wrapper.vm.getPaymentMethodFromStore(); + + // Assert + expect(paymethod).not.toBe(payInAdvancePaymentMethod); + }); }); - test('getting payment method when method is pay in advance', async () => { - // Arrange - const { wrapper } = setupMocks(); - const payInAdvancePaymentMethod = paymentMethods.CREDIT_CARD; - useMainStore().savePaymentMethodChoice(payInAdvancePaymentMethod); - // Act - const paymethod = wrapper.vm.getPaymentMethodFromStore(); + describe('Pay In Advance Error Alert', () => { + test('show pay in advance error alert when contained in querystring', () => { + // Arrange + const queryString = { + [queryStrings.DISPLAY_PAY_IN_ADVANCE_ALERT]: paymentMethods.AFTERPAY + }; + const wrapper = setupMocks({ queryString }); - // Assert - expect(paymethod).not.toBe(payInAdvancePaymentMethod); + // Assert + const payInAdvanceErrorAlert = wrapper.find('[name="payInAdvanceErrorAlert"]'); + expect(payInAdvanceErrorAlert.exists()).toBeTruthy(); + expect(payInAdvanceErrorAlert.isVisible()).toBeTruthy(); + }); + + test('hide pay in advance error alert when not contained in querystring', () => { + // Arrange + const wrapper = setupMocks({}); + + // Assert + const payInAdvanceErrorAlert = wrapper.find('[name="payInAdvanceErrorAlert"]'); + expect(payInAdvanceErrorAlert.exists()).toBeFalsy(); + }); }); }); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index db73e424..a3f97d78 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -28,6 +28,7 @@
Date: Mon, 1 Apr 2024 17:21:08 -0400 Subject: [PATCH 7/9] SSR-1146. Payment Method page: Add sales tax to the cart-dropdown component. (#604) --- .eslintrc.js | 3 +- .../__snapshots__/cart-dropdown.spec.js.snap | 5 - .../cart-dropdown/cart-dropdown.spec.js | 226 +++++++++++++++--- .../cart-dropdown/cart-dropdown.vue | 59 +++-- src/layouts/payment-method/payment-method.vue | 2 + src/store/index.js | 23 +- 6 files changed, 260 insertions(+), 58 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 440245f9..33b69824 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -44,7 +44,8 @@ module.exports = { math: 'always' }], 'import/extensions': ['error', 'always', { js: 'ignorePackages' }], - 'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['item'] }] + 'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['item'] }], + 'no-restricted-syntax': ['off', 'ForOfStatement'] }, settings: { 'import/resolver': { diff --git a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap index ae4e42e9..5baa028a 100644 --- a/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap +++ b/src/iss-components/cart-dropdown/__snapshots__/cart-dropdown.spec.js.snap @@ -2,12 +2,7 @@ exports[`cart-dropdown component initial data rendered as expected 1`] = ` Object { - "baseServiceLineItems": Array [], - "deductible": null, - "glassToReplace": Array [], "isExpanded": false, - "isRepair": null, - "vapsInOrder": Array [], "widget": Object { "amountDue": "AmountDueTextWidget", "basePrice": "BasePriceWidget", diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index a123f42e..fdb2362d 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -4,7 +4,7 @@ import cartDropdown from '@/iss-components/cart-dropdown/cart-dropdown.vue'; // Supporting Files import { getMountOptions } from '@/helpers/unit-test-helper.js'; -import { useMainStore } from '@/store'; +import { useMainStore, getDefaultState } from '@/store'; import coverageStatuses from '@/constants/coverage-statuses'; import { formatAmountInDollars } from '@/helpers/text-helper.js'; import partTypeStrings from '@/constants/part-type-strings'; @@ -455,7 +455,193 @@ describe('cart-dropdown component', () => { // TODO when method implemented }); describe('salesTax', () => { - // TODO when method implemented + test('salesTax is treated as 0 when line items are null', () => { + // Arrange + const storeData = getDefaultState(); + storeData.order.lineItems.glassParts = null; + storeData.order.lineItems.otherParts = null; + storeData.order.lineItems.supportingItems = null; + storeData.order.lineItems.vaps = null; + + const { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(0); + }); + + test("salesTax is treated as 0 when null or undefined is set as the line item's sales tax.", () => { + // Arrange + const storeData = getDefaultState(); + storeData.order.lineItems.glassParts = [ + { partType: 'mock', salesTax: null }, + { partType: 'mock', salesTax: undefined } + ]; + storeData.order.lineItems.supportingItems = [ + { partType: 'mock', salesTax: null }, + { partType: 'mock', salesTax: undefined } + ]; + storeData.order.lineItems.vaps = [ + { partType: 'mock', salesTax: null }, + { partType: 'mock', salesTax: undefined } + ]; + + const { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(0); + }); + + test('Returns 0 as sales tax when coverage is unverified and order does not contain vaps.', () => { + // Arrange + const storeData = getDefaultState(); + storeData.order.lineItems.glassParts = [ + { partType: 'mock', salesTax: 10 } + ]; + storeData.order.lineItems.vaps = []; + storeData.order.payment.insuranceCoverage.isVerified = false; + + const { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(0); + }); + + test('Returns sum of vaps sales tax when coverage is unverified and order has vaps.', () => { + // Arrange + const storeData = getDefaultState(); + 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 { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(3); + }); + + test('Returns Recycle Fee tax when coverage is Verified-Deductible, replace service, and no vaps.', () => { + // Arrange + const storeData = getDefaultState(); + 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 { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(10); + }); + + test('Returns sum of vaps + recycle fee sales tax when Verified-Deductible, replace service, and has vaps.', () => { + // Arrange + const storeData = getDefaultState(); + 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 { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(15); + }); + + test('Returns sum of sales tax when Verified-ITAC.', () => { + // Arrange + const storeData = getDefaultState(); + 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 { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(35); + }); + + test('Returns sum of sales tax when Verified-NoComp.', () => { + // Arrange + const storeData = getDefaultState(); + 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 { wrapper } = getMountedComponent(storeData); + + // Act + const result = wrapper.vm.salesTax; + + // Assert + expect(result).toBe(35); + }); }); describe('availableLineItems', () => { test('returns expected when glassParts null', async () => { @@ -997,19 +1183,11 @@ describe('cart-dropdown component', () => { describe('getDisplayed', () => { test('returns "Verifying coverage" when not no comp, not itac, and deductible null', () => { // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.VERIFIED - } - }, - policy: { - isITAC: false - }, - currentDeductible: null - } - }; + const storeData = getDefaultState(); + storeData.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.VERIFIED; + storeData.order.policy.isITAC = false; + storeData.order.currentDeductible = null; + const { wrapper } = getMountedComponent(storeData); const amount = 123; @@ -1021,19 +1199,11 @@ describe('cart-dropdown component', () => { }); test('returns "Verifying coverage" when not no comp, not itac, and coverage status PENDING', () => { // Arrange - const storeData = { - order: { - payment: { - insuranceCoverage: { - coverageStatus: coverageStatuses.PENDING - } - }, - policy: { - isITAC: false - }, - currentDeductible: 321 - } - }; + const storeData = getDefaultState(); + storeData.order.payment.insuranceCoverage.coverageStatus = coverageStatuses.PENDING; + storeData.order.policy.isITAC = false; + storeData.order.currentDeductible = 321; + const { wrapper } = getMountedComponent(storeData); const amount = 123; diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index e6e09442..59e661f3 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -173,20 +173,7 @@ export default { availableVaps: Array }, data() { - const { currentDeductible } = useMainStore().order; - const { glassToReplace, isRepair } = useMainStore().damage; - const { supportingItems, glassParts, otherParts, vaps } = useMainStore().lineItems; - return { - isRepair, - glassToReplace: glassToReplace ?? [], - vapsInOrder: vaps ?? [], - baseServiceLineItems: [ - ...(supportingItems ?? []), - ...(glassParts ?? []), - ...(otherParts ?? []) - ], - deductible: currentDeductible, isExpanded: false, widget: { amountDue: 'AmountDueTextWidget', @@ -202,9 +189,20 @@ export default { }; }, computed: { + deductible() { + // Note: added as computed so it can be used in the template. + return useMainStore().order.currentDeductible; + }, showDeductibleCartItem() { return !useMainStore().isNoComp && !useMainStore().policy.isITAC; }, + baseServiceLineItems() { + return [ + ...(useMainStore().lineItems.supportingItems ?? []), + ...(useMainStore().lineItems.glassParts ?? []), + ...(useMainStore().lineItems.otherParts ?? []) + ]; + }, baseServicePrice() { return getPriceOfLineItems(this.baseServiceLineItems); }, @@ -219,7 +217,26 @@ export default { return basePrice + this.packagePrice; }, salesTax() { - return 0; // TODO + function sumTax(lineItems) { + return lineItems?.reduce((accumulator, lineItem) => accumulator + (lineItem.salesTax ?? 0), 0) ?? 0; + } + + let result = 0; + + if (useMainStore().payment.insuranceCoverage.isVerified + && (useMainStore().isITAC || useMainStore().isNoComp)) { + result += sumTax(this.baseServiceLineItems); + } else { + // deductible or non-verified still need to show tax for Recycle Fee or Mobile Fee + const recycleFeeLineItem = useMainStore().lineItems.supportingItems + ?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE); + + result += recycleFeeLineItem != null ? recycleFeeLineItem.salesTax : 0; + } + + result += sumTax(useMainStore().lineItems.vaps ?? []); + + return result; }, amountDue() { return this.showAsPaid @@ -236,17 +253,17 @@ export default { }, servicePackageTier() { return getHighestFullySatisfiedTier( - this.glassToReplace, + useMainStore().damage.glassToReplace ?? [], this.availableLineItems, - this.isRepair, - this.vapsInOrder + useMainStore().damage.isRepair, + useMainStore().lineItems.vaps ?? [] ); }, servicePackageCartItems() { const packageContentTypes = getPackageContents( - this.glassToReplace, + useMainStore().damage.glassToReplace ?? [], this.availableLineItems, - this.isRepair, + useMainStore().damage.isRepair, this.servicePackageTier ) ?? []; const items = []; @@ -271,7 +288,7 @@ export default { return this.getCartItemForVapsPart(partTypeStrings.RAIN_DEFENSE); }, packagePrice() { - return getPriceOfLineItems(this.vapsInOrder); + return getPriceOfLineItems(useMainStore().lineItems.vaps ?? []); }, amountDueLabel() { return this.getCmsContent(this.widget.amountDue, widgetFields.TEXT_BLOCK_WIDGET.TEXT); @@ -355,7 +372,7 @@ export default { }, getCartItemForVapsPart(partType) { const label = this.getCmsContentForVapsType(partType); - const lineItems = this.vapsInOrder + const lineItems = useMainStore().lineItems.vaps ?.filter((vapsLineItem) => vapsLineItem.partType === partType); return this.getCartItem(label, lineItems); }, diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index a3f97d78..43c56607 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -115,6 +115,8 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); + await useMainStore().setPriceAndSalesTaxForOrderLineItems(); + const unpricedVaps = [...resultMap.wipers, resultMap.rainDefense]; let hasBailedOut = false; diff --git a/src/store/index.js b/src/store/index.js index 5add699d..f2b17519 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -54,7 +54,7 @@ function getTimeSlotsAdditionalEventData( return `FirstAvailableAppointment:${numberOfDays},Zip:${zipCode},ProvisionalTriggers:${provisionalTriggers.join(',')}`; } -const getDefaultState = () => ({ +export const getDefaultState = () => ({ order: { vehicle: { policyVehicleId: null, @@ -1556,11 +1556,28 @@ export const useMainStore = defineStore({ this.order.lineItems.mobileFee = mobileFee; }, + async setPriceAndSalesTaxForOrderLineItems() { + const lineItemsToTax = [ + ...(this.order.lineItems.supportingItems ?? []), + ...(this.order.lineItems.glassParts ?? []), + ...(this.order.lineItems.otherParts ?? []), + ...(this.order.lineItems.vaps ?? []) + ]; + + if (this.order.lineItems.mobileFee != null) { + lineItemsToTax.push(this.order.lineItems.mobileFee); + } + + const pricedLineItemsToTax = await this.getPriceOrderItems(lineItemsToTax); + + this.taxOrderItemsAndSaveServerData(pricedLineItemsToTax); + }, + updateVehicle(vehicle) { // Assuming that the method caller pass all the properties. // otherwise need to check for undefined for every property. - this.vehicle.policyVehicleId = vehicle.policyVehicleId; - this.vehicle.carId = vehicle.carId; + this.order.vehicle.policyVehicleId = vehicle.policyVehicleId; + this.order.vehicle.carId = vehicle.carId; this.order.vehicle.category = vehicle.category; this.order.vehicle.year = vehicle.year; this.order.vehicle.make = vehicle.make; From 3424dc617965bc5917feeb49ee76320d3bedad16 Mon Sep 17 00:00:00 2001 From: Johan Gunawan Date: Tue, 2 Apr 2024 08:44:29 -0400 Subject: [PATCH 8/9] SSR-1146. Only show recycle fee tax on verified (#607) --- .../cart-dropdown/cart-dropdown.spec.js | 3 +++ .../cart-dropdown/cart-dropdown.vue | 17 +++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.spec.js b/src/iss-components/cart-dropdown/cart-dropdown.spec.js index fdb2362d..5d69dec5 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.spec.js +++ b/src/iss-components/cart-dropdown/cart-dropdown.spec.js @@ -503,6 +503,9 @@ describe('cart-dropdown component', () => { storeData.order.lineItems.glassParts = [ { partType: 'mock', salesTax: 10 } ]; + storeData.order.lineItems.supportingItems = [ + { partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 } + ]; storeData.order.lineItems.vaps = []; storeData.order.payment.insuranceCoverage.isVerified = false; diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 59e661f3..54031ec5 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -223,15 +223,16 @@ export default { let result = 0; - if (useMainStore().payment.insuranceCoverage.isVerified - && (useMainStore().isITAC || useMainStore().isNoComp)) { - result += sumTax(this.baseServiceLineItems); - } else { - // deductible or non-verified still need to show tax for Recycle Fee or Mobile Fee - const recycleFeeLineItem = useMainStore().lineItems.supportingItems - ?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE); + if (useMainStore().payment.insuranceCoverage.isVerified) { + if (useMainStore().isITAC || useMainStore().isNoComp) { + result += sumTax(this.baseServiceLineItems); + } else { + // deductible-case need to show tax for Recycle Fee + const recycleFeeLineItem = useMainStore().lineItems.supportingItems + ?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE); - result += recycleFeeLineItem != null ? recycleFeeLineItem.salesTax : 0; + result += recycleFeeLineItem != null ? recycleFeeLineItem.salesTax : 0; + } } result += sumTax(useMainStore().lineItems.vaps ?? []); From 8cc59d93d7dab518f2b7ce1f18e732702e3c4b50 Mon Sep 17 00:00:00 2001 From: Katie Kroell Date: Tue, 2 Apr 2024 09:38:15 -0400 Subject: [PATCH 9/9] update endpoint name --- src/constants/endpoints.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants/endpoints.js b/src/constants/endpoints.js index 8f21cdd9..770048e3 100644 --- a/src/constants/endpoints.js +++ b/src/constants/endpoints.js @@ -113,7 +113,7 @@ const endpoints = Object.freeze({ method: 'GET' }, GetAccountInfo: { - url: `${ACCOUNT_BASE_URL}/`, + url: `${ACCOUNT_BASE_URL}/account-details/`, method: 'GET' }, TaxOrderItems: {