diff --git a/src/layouts/service-packages/service-package-helper/service-package-helper.js b/src/layouts/service-packages/service-package-helper/service-package-helper.js new file mode 100644 index 00000000..eb7a2bd6 --- /dev/null +++ b/src/layouts/service-packages/service-package-helper/service-package-helper.js @@ -0,0 +1,41 @@ +export const allGlassPartsAndItemsHavePrices = (lineItems) => { + if (lineItems.glassParts && Array.isArray(lineItems.glassParts)) { + if(!processLineItems(lineItems.glassParts)) + { + return false; + } + }; + + if (lineItems.supportingItems && Array.isArray(lineItems.supportingItems)) { + if(!processLineItems(lineItems.supportingItems)) + { + return false; + } + }; + + if (lineItems.vaps && Array.isArray(lineItems.vaps)) { + if(!processLineItems(lineItems.vaps)) + { + return false; + } + }; + + return true; +}; + +const processLineItems = (lineItems) => { + let returnVal = true; + lineItems.forEach( lineItem => { + if (!hasPrice(lineItem)) { + returnVal = false; + }; + }); + return returnVal; +} + +const hasPrice = (lineItem) => { + const value = (!!lineItem?.kitPrice && lineItem.kitPrice != 0) || + (!!lineItem?.laborAmount && lineItem.laborAmount != 0) || + (!!lineItem?.sellingPrice && lineItem.sellingPrice != 0); + return value; +}; \ No newline at end of file diff --git a/src/layouts/service-packages/service-package-helper/service-package-helper.spec.js b/src/layouts/service-packages/service-package-helper/service-package-helper.spec.js new file mode 100644 index 00000000..ed36b93d --- /dev/null +++ b/src/layouts/service-packages/service-package-helper/service-package-helper.spec.js @@ -0,0 +1,19 @@ +import { allGlassPartsAndItemsHavePrices } from './service-package-helper'; + +it("service package helper should return false when line item has missing price", () => { + // Arrange + const mockData = { glassParts: [{partNumber: 'DW01571GBNNOEE', sellingPrice: 25}], supportingItems: [{ laborAmount: 0 }] } + // Act + const actual = allGlassPartsAndItemsHavePrices(mockData); + // Assert + expect(actual).toEqual(false); +}); + +it("service package helper should return true when line item has all prices", () => { + // Arrange + const mockData = { glassParts: [{partNumber: 'DW01571GBNNOEE', sellingPrice: 25}], laborAmount: [{ sellingPrice: 10 }] } + // Act + const actual = allGlassPartsAndItemsHavePrices(mockData); + // Assert + expect(actual).toBeTruthy(); +}); \ No newline at end of file diff --git a/src/layouts/service-packages/service-package-question/service-package-question.vue b/src/layouts/service-packages/service-package-question/service-package-question.vue index 53a6cd7b..ecfa647b 100644 --- a/src/layouts/service-packages/service-package-question/service-package-question.vue +++ b/src/layouts/service-packages/service-package-question/service-package-question.vue @@ -13,9 +13,10 @@ import buttonQuestion from '@/digital-components/button-question/button-question'; import { processIfStatements } from '@/helpers/cms-content-helper'; import { damageLocationsSelected as glassLocations } from '@/constants/damage-locations-selected'; - import servicePackageRadio from './service-package-radio/service-package-radio'; + import servicePackageRadio from '@/layouts/service-packages/service-package-question/service-package-radio/service-package-radio'; import { partTypeStrings } from '@/constants/part-type-strings'; import { useMainStore } from '@/store'; + import { allGlassPartsAndItemsHavePrices } from '@/layouts/service-packages/service-package-helper/service-package-helper' const packageNames = { TIER_ONE: 'TierOne', @@ -43,7 +44,7 @@ }, watch: { availableLineItems() { - if (this.allGlassPartsAndItemsHavePrices(store.order.lineItems)) { + if (allGlassPartsAndItemsHavePrices(store.order.lineItems)) { this.selectDefaultPackage(); } }, @@ -170,7 +171,7 @@ }, getPackagePriceString(packageName) { const formattedPriceFloat = parseFloat(this.getPackagePrice(packageName)).toFixed(2); - return '$' + formattedPriceFloat; + return '$' + formattedPriceFloat + '*'; }, getPackagePrice(packageName) { let priceFloat = 0; @@ -312,37 +313,6 @@ return null; } }, - allGlassPartsAndItemsHavePrices() { - if (this.pricedGlassParts) { - for (let i = 0; i < this.pricedGlassParts.length; i++) { - if (this.priceIsNullOrZero(this.pricedGlassParts[i])) { - return false; - } - } - } - if (this.supportingItems) { - for (let i = 0; i < this.supportingItems.length; i++) { - if (this.priceIsNullOrZero(this.supportingItems[i])) { - return false; - } - } - } - if (this.selectedVaps) { - for (let i = 0; i < this.selectedVaps.length; i++) { - if (this.priceIsNullOrZero(this.selectedVaps[i])) { - return false; - } - } - } - return true; - }, - priceIsNullOrZero(lineItem) { - return ( - (lineItem.kitPrice == null || lineItem.kitPrice == 0) && - (lineItem.laborAmount == null || lineItem.laborAmount == 0) && - (lineItem.sellingPrice == null || lineItem.sellingPrice == 0) - ); - }, getLineItemsContainingPartType(partType) { const partTypeMatches = this.nullSafeAvailableLineItems.filter( (lineItem) => lineItem.partType.toUpperCase() === partType diff --git a/src/layouts/service-packages/service-packages.vue b/src/layouts/service-packages/service-packages.vue index b990f2d0..b09e5276 100644 --- a/src/layouts/service-packages/service-packages.vue +++ b/src/layouts/service-packages/service-packages.vue @@ -1,36 +1,40 @@ @@ -50,6 +54,7 @@ import { required } from '@/helpers/validation-rules'; import { errorMessages } from '@/constants/error-messages'; import { Form, defineRule } from 'vee-validate'; + import { allGlassPartsAndItemsHavePrices } from '@/layouts/service-packages/service-package-helper/service-package-helper' defineRule('option-required', required(errorMessages.OPTION_REQUIRED)); @@ -113,6 +118,11 @@ pricedGlassParts: [] }; }, + computed: { + PriceDisclaimerText() { + return this.getCmsContent("PriceDisclaimerWidget", "Text"); + }, + }, methods: { openModalAction(modalName) { this.$refs[modalName.args].openModal(); @@ -134,7 +144,8 @@ this.$router.navigate(this.navigationScenarios.CLICKED_BACK, this.$route); }, forwardButtonAction() { - if (!this.$ref.servicePackage.allGlassPartsAndItemsHavePrices()) { + const parts = { glassParts: this.pricedGlassParts, supportingItems: this.supportingItems, vaps: this.selectedVaps }; + if (!allGlassPartsAndItemsHavePrices(parts)) { console.error('One or more items have no price assigned!'); } if (this.pricedGlassParts.length > 0) { @@ -158,4 +169,19 @@ contentGroupModal } }; - \ No newline at end of file + + \ No newline at end of file