From ff9cc2476e9646a3f029ab943610fd3aa2da6733 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Fri, 8 Mar 2024 15:10:02 -0500 Subject: [PATCH 01/21] little updates --- .../cart-dropdown/cart-dropdown.vue | 18 ++++++++++++++++-- src/layouts/payment-method/payment-method.vue | 7 ++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 92fbc3c8..dce39e7d 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -38,6 +38,14 @@ {{ getDisplayed(baseServicePrice) }} + @@ -56,7 +64,8 @@ export default { showAsPaid: Boolean, amountDueLabel: String, deductibleLabel: String, - basePriceLabel: String + basePriceLabel: String, + serviceLabel: String }, data() { const { currentDeductible } = useMainStore().order; @@ -94,6 +103,10 @@ export default { return this.showAsPaid ? 0 : this.subTotal + this.salesTax; + }, + // TODO + serviceValue() { + return 25; } }, methods: { @@ -104,7 +117,8 @@ export default { return this.isUnverified && this.showDeductibleLineItem ? VERIFYING_COVERAGE : formatAmountInDollars(amount); - } + }, + formatAmountInDollars } }; diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 6f8a6010..8d3b9481 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -23,7 +23,8 @@ :showAsPaid="false" :amountDueLabel="amountDueText" :deductibleLabel="deductibleLabel" - :basePriceLabel="basePriceLabel" /> + :basePriceLabel="basePriceLabel" + :serviceLabel="serviceLabel" />
Pia Alert Placeholder
Date: Sun, 10 Mar 2024 23:48:51 -0400 Subject: [PATCH 02/21] Uncommenting --- src/iss-components/cart-dropdown/cart-dropdown.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index a8c8eef9..a6093cac 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -38,14 +38,14 @@ {{ getDisplayed(baseServicePrice) }} - + From a881fe932ae9d176d47a0fdf6e4389b32de7aa80 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Thu, 14 Mar 2024 11:35:56 -0400 Subject: [PATCH 03/21] partial work --- src/constants/cart-item-categories.js | 8 + src/constants/cart-item-types.js | 15 + src/helpers/service-package-helper.js | 13 +- src/helpers/service-package-helper.spec.js | 1007 +++++++++++++++++ .../cart-dropdown/cart-dropdown.vue | 182 ++- src/layouts/payment-method/payment-method.vue | 3 +- src/mixins/base-mixin.js | 11 + 7 files changed, 1219 insertions(+), 20 deletions(-) create mode 100644 src/constants/cart-item-categories.js create mode 100644 src/constants/cart-item-types.js create mode 100644 src/helpers/service-package-helper.spec.js diff --git a/src/constants/cart-item-categories.js b/src/constants/cart-item-categories.js new file mode 100644 index 00000000..509cc626 --- /dev/null +++ b/src/constants/cart-item-categories.js @@ -0,0 +1,8 @@ +const cartItemCategories = { + VAPS: "vaps", + GLASS_PARTS: "glassParts", + SUPPORTING_ITEMS: "supportingItems", + PROMOS: "promos", +}; + +export { cartItemCategories }; diff --git a/src/constants/cart-item-types.js b/src/constants/cart-item-types.js new file mode 100644 index 00000000..342a4e67 --- /dev/null +++ b/src/constants/cart-item-types.js @@ -0,0 +1,15 @@ +const cartItemTypes = { + FRONT_WIPERS: "FRONT WIPERS", + REAR_WIPERS: "REAR WIPERS", + SUPPORTING_ITEMS: "SUPPORTING ITEMS", + GLASS_PARTS: "GLASS PARTS", + RAIN_DEFENSE: "RAIN DEFENSE", + RECYCLE_FEE: "RECYCLE FEE", + REPLACE_FEE: "REPLACE FEE", + MOBILE_FEE: "MOBILE FEE", + PROMOS: "PROMOS", + EARLY_BIRD: "EARLY BIRD", + SUPPLIES_REPAIR: "SUPPLIES-REPAIR", +}; + +export { cartItemTypes }; diff --git a/src/helpers/service-package-helper.js b/src/helpers/service-package-helper.js index 539bdeb3..128fd7b1 100644 --- a/src/helpers/service-package-helper.js +++ b/src/helpers/service-package-helper.js @@ -3,8 +3,8 @@ import damageLocationsSelected from '@/constants/damage-locations-selected'; import packageNames from '@/constants/package-names'; export function findLineItemsWithPartType(typeToFind, itemsToSearch) { - const partTypeMatches = itemsToSearch?.filter((lineItem) => lineItem.partType.toUpperCase() === typeToFind.toUpperCase()); - return partTypeMatches; + return itemsToSearch + ?.filter((lineItem) => lineItem.partType.toUpperCase() === typeToFind.toUpperCase()); } export function containsLineItemWithPartType(typeToFind, itemsToSearch) { @@ -55,7 +55,6 @@ export function shouldFrontWipersBeAvailable( export function shouldRearWipersBeAvailable( glassToReplace, availableLineItems, - isRepair, targetTier ) { const rearWiperIsAvailable = containsLineItemWithPartType( @@ -103,11 +102,13 @@ export function shouldRainDefenseBeAvailable( const rearWipersInTierTwo = shouldRearWipersBeAvailable( glassToReplace, availableLineItems, - isRepair, packageNames.TIER_TWO ); - return isTierThree && !(rearWipersInTierTwo && !frontWipersInTierTwo && frontWipersInTierThree); + return isTierThree + && !(rearWipersInTierTwo + && !frontWipersInTierTwo + && frontWipersInTierThree); } export function getPackageContents(glassToReplace, availableLineItems, isRepair, targetTier) { @@ -117,7 +118,7 @@ export function getPackageContents(glassToReplace, availableLineItems, isRepair, vaps.push(partTypeStrings.FRONT_WIPER); } - if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { + if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, targetTier)) { vaps.push(partTypeStrings.REAR_WIPER); } diff --git a/src/helpers/service-package-helper.spec.js b/src/helpers/service-package-helper.spec.js new file mode 100644 index 00000000..878132dc --- /dev/null +++ b/src/helpers/service-package-helper.spec.js @@ -0,0 +1,1007 @@ +import * as servicePackageHelper from '@/helpers/service-package-helper'; +import partTypeStrings from '@/constants/part-type-strings.js'; +import damageLocationsSelected from '@/constants/damage-locations-selected.js'; +import packageNames from '@/constants/package-names.js'; + +const recalLineItem = { + partNumber: 'RECAL STATIC', + Description: 'Recalibration', + partType: 'recalibration', + Quantity: '1', + price: 150.0 +}; + +const driverFrontWiperLineItem = { + partNumber: 'SBB16', + description: 'SAFELITE BEAM BLADE 16', + partType: 'FRONT WIPER', + price: 32.64 +}; + +const passengerFrontWiperLineItem = { + partNumber: 'SBB26', + description: 'SAFELITE BEAM BLADE 26', + partType: 'FRONT WIPER', + price: 53.04 +}; + +const rearWiperLineItem = { + partNumber: 'SBBR12A', + description: 'SAFELITE REAR BLADE 12A', + partType: 'REAR WIPER', + price: 24.48 +}; + +const rainDefenseLineItem = { + partNumber: 'RAIN DEFENSE', + description: null, + partType: 'RAIN DEFENSE', + price: 35.5 +}; + +const frontWindshieldGlass = { + glassLocation: 'Windshield' +}; + +const rearWindshieldGlass = { + glassLocation: 'Rear' +}; + +const sideGlass = { + glassLocation: 'Driver' +}; + +describe('service-package-helper.js', () => { + describe('findLineItemsWithPartType', () => { + it('Returns an item of the same type when present', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + const partType = partTypeStrings.RAIN_DEFENSE; + + // Act + const result = servicePackageHelper.findLineItemsWithPartType(partType, lineItems); + + // Assert + expect(result.length).toBe(1); + expect(result[0].partType).toEqual(partType); + }); + + it('Returns an empty array when no matching items are present', () => { + // Arrange + const lineItems = [ + recalLineItem, + passengerFrontWiperLineItem, + driverFrontWiperLineItem + ]; + const partType = partTypeStrings.RAIN_DEFENSE; + + // Act + const result = servicePackageHelper.findLineItemsWithPartType(partType, lineItems); + + // Assert + expect(result.length).toBe(0); + }); + + it('Returns all matching items when multiple are present', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + const partType = partTypeStrings.FRONT_WIPER; + + // Act + const result = servicePackageHelper.findLineItemsWithPartType(partType, lineItems); + + // Assert + expect(result.length).toBe(2); + expect(result[0].partType).toEqual(partType); + expect(result[1].partType).toEqual(partType); + expect(result[0].partNumber).not.toEqual(result[1].partNumber); + }); + + it('Is not case sensitive', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + const partType = 'rAin DEfenSe'; + + // Act + const result = servicePackageHelper.findLineItemsWithPartType(partType, lineItems); + + // Assert + expect(result.length).toBe(1); + expect(result[0].partType).toEqual(partTypeStrings.RAIN_DEFENSE); + }); + }); + + describe('containsLineItemWithPartType', () => { + it('Returns true when type is present', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + const partType = partTypeStrings.RAIN_DEFENSE; + + // Act + const result = servicePackageHelper.containsLineItemWithPartType(partType, lineItems); + + // Assert + expect(result).toBe(true); + }); + + it('Returns true when type is present multiple times', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + const partType = partTypeStrings.FRONT_WIPER; + + // Act + const result = servicePackageHelper.containsLineItemWithPartType(partType, lineItems); + + // Assert + expect(result).toBe(true); + }); + + it('Returns false when type is not present', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem + ]; + const partType = partTypeStrings.RAIN_DEFENSE; + + // Act + const result = servicePackageHelper.containsLineItemWithPartType(partType, lineItems); + + // Assert + expect(result).toBe(false); + }); + + it('Returns false with empty array', () => { + // Arrange + const lineItems = []; + const partType = partTypeStrings.RAIN_DEFENSE; + + // Act + const result = servicePackageHelper.containsLineItemWithPartType(partType, lineItems); + + // Assert + expect(result).toBe(false); + }); + }); + + describe('getVapsLineItems', () => { + it('Returns line items matching given types', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + + const vapTypes = [partTypeStrings.RAIN_DEFENSE]; + + // Act + const result = servicePackageHelper.getVapsLineItems(lineItems, vapTypes); + + // Assert + expect(result.length).toBe(1); + expect(result[0].partType).toEqual(partTypeStrings.RAIN_DEFENSE); + }); + + it('Returns all matching line items, when multiple match a single type', () => { + // Arrange + const lineItems = [ + recalLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + + const vapTypes = [partTypeStrings.FRONT_WIPER]; + + // Act + const result = servicePackageHelper.getVapsLineItems(lineItems, vapTypes); + + // Assert + expect(result.length).toBe(2); + expect(result[0].partType).toEqual(partTypeStrings.FRONT_WIPER); + expect(result[1].partType).toEqual(partTypeStrings.FRONT_WIPER); + expect(result[0].partNumber).not.toEqual(result[1].partNumber); + }); + + it('Returns only line items in the given set', () => { + // Arrange + const lineItems = [recalLineItem, passengerFrontWiperLineItem, rainDefenseLineItem]; + + const vapTypes = [partTypeStrings.FRONT_WIPER]; + + // Act + const result = servicePackageHelper.getVapsLineItems(lineItems, vapTypes); + + // Assert + expect(result.length).toBe(1); + expect(result[0].partType).toEqual(partTypeStrings.FRONT_WIPER); + expect(result[0].partNumber).toEqual(passengerFrontWiperLineItem.partNumber); + }); + + it('Returns all matching items when multiple vap types are requested', () => { + // Arrange + const lineItems = [recalLineItem, passengerFrontWiperLineItem, rainDefenseLineItem]; + + const vapTypes = [partTypeStrings.FRONT_WIPER, partTypeStrings.RAIN_DEFENSE]; + + // Act + const result = servicePackageHelper.getVapsLineItems(lineItems, vapTypes); + + // Assert + expect(result.length).toBe(2); + expect(result[0].partType).not.toEqual(result[1].partType); + }); + }); + + describe('containsGlassPieceWithLocation', () => { + it('Returns true when location is present', () => { + // Arrange + const locations = [frontWindshieldGlass, sideGlass]; + + const locationName = damageLocationsSelected.WINDSHIELD; + + // Act + const result = servicePackageHelper.containsGlassPieceWithLocation( + locationName, + locations + ); + + // Assert + expect(result).toBe(true); + }); + + it('Returns true when location is present multiple times', () => { + // Arrange + const locations = [frontWindshieldGlass, frontWindshieldGlass, sideGlass]; + + const locationName = damageLocationsSelected.WINDSHIELD; + + // Act + const result = servicePackageHelper.containsGlassPieceWithLocation( + locationName, + locations + ); + + // Assert + expect(result).toBe(true); + }); + + it('Returns false when location is not present', () => { + // Arrange + const locations = [frontWindshieldGlass, sideGlass]; + + const locationName = damageLocationsSelected.REAR; + + // Act + const result = servicePackageHelper.containsGlassPieceWithLocation( + locationName, + locations + ); + + // Assert + expect(result).toBe(false); + }); + + it('Returns false with empty array', () => { + // Arrange + const locations = []; + + const locationName = damageLocationsSelected.WINDSHIELD; + + // Act + const result = servicePackageHelper.containsGlassPieceWithLocation( + locationName, + locations + ); + + // Assert + expect(result).toBe(false); + }); + + it('Is not case sensitive', () => { + // Arrange + const locations = [frontWindshieldGlass, sideGlass]; + + const locationName = 'windShieLd'; + + // Act + const result = servicePackageHelper.containsGlassPieceWithLocation( + locationName, + locations + ); + + // Assert + expect(result).toBe(true); + }); + }); + + describe('getAvailablePackages', () => { + it('Returns two packages when there is not a viable tier-two option.', () => { + // Arrange + const damageLocations = [sideGlass]; + + const availableLineItems = [rainDefenseLineItem]; + + // Act + const results = servicePackageHelper.getAvailablePackages( + damageLocations, + availableLineItems, + false + ); + + // Assert + expect(results.length).toBe(2); + expect(results[0].packageName).toEqual(packageNames.TIER_ONE); + expect(results[1].packageName).toEqual(packageNames.TIER_THREE); + }); + + it('Returns three packages when wipers are available in tier two', () => { + // Arrange + const damageLocations = [rearWindshieldGlass]; + + const availableLineItems = [ + driverFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + + // Act + const results = servicePackageHelper.getAvailablePackages( + damageLocations, + availableLineItems, + true + ); + + // Assert + expect(results.length).toBe(3); + expect(results[0].packageName).toEqual(packageNames.TIER_ONE); + expect(results[1].packageName).toEqual(packageNames.TIER_TWO); + expect(results[2].packageName).toEqual(packageNames.TIER_THREE); + }); + }); + + // TODO write tests + describe('getPackageContents', () => { + describe('Match figma cases', () => { + test.todo('Implement specific cases.'); + }); + }); + + describe('shouldFrontWipersBeAvailable', () => { + it('Should be available in tier 2 and 3 if windshield damage and available', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + const isRepair = false; + + // Act + const resultTwo = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(resultTwo).toBe(true); + expect(resultThree).toBe(true); + }); + + it('Should be available in tier 2 and 3 if repair and available', () => { + // Arrange + const damageLocations = []; + const availableLineItems = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + const isRepair = true; + + // Act + const resultTwo = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(resultTwo).toBe(true); + expect(resultThree).toBe(true); + }); + + it('Should not be available in tier 2 if not windshield damage or repair', () => { + // Arrange + const damageLocations = []; + const availableLineItems = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + const isRepair = false; + + // Act + const result = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_TWO + ); + + // Assert + expect(result).toBe(false); + }); + + it('Should be available in tier 3 even if not windshield repair or replace', () => { + // Arrange + const damageLocations = []; + const availableLineItems = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + const isRepair = false; + + // Act + const result = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(result).toBe(true); + }); + + it('Should not be available in any tier if not available.', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = []; + const isRepair = true; + + // Act + const resultOne = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_ONE + ); + const resultTwo = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(resultOne).toBe(false); + expect(resultTwo).toBe(false); + expect(resultThree).toBe(false); + }); + + it('Should not be available in tier 1', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + const isRepair = true; + + // Act + const result = servicePackageHelper.shouldFrontWipersBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_ONE + ); + + // Assert + expect(result).toBe(false); + }); + }); + + describe('shouldRearWipersBeAvailable', () => { + it('Should be available in tier 2 and 3 if rear damage and available', () => { + // Arrange + const damageLocations = [rearWindshieldGlass]; + const availableLineItems = [rearWiperLineItem]; + + // Act + const resultTwo = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_THREE + ); + + // Assert + expect(resultTwo).toBe(true); + expect(resultThree).toBe(true); + }); + + it('Should not be available in tier 2 if not rear damage', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [rearWiperLineItem]; + + // Act + const result = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_TWO + ); + + // Assert + expect(result).toBe(false); + }); + + it('Should be available in tier 3 without rear damage, if available and no front wipers available', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [rearWiperLineItem]; + + // Act + const result = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_THREE + ); + + // Assert + expect(result).toBe(true); + }); + + it('Should not be available in tier 3 without rear damage if front wipers are available', () => { + // Arrange + const damageLocations = []; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem + ]; + + // Act + const result = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_THREE + ); + + // Assert + expect(result).toBe(false); + }); + + it('Should not be available in any tier if not available', () => { + // Arrange + const damageLocations = [rearWindshieldGlass]; + const availableLineItems = []; + + // Act + const resultOne = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_ONE + ); + const resultTwo = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_THREE + ); + + // Assert + expect(resultOne).toBe(false); + expect(resultTwo).toBe(false); + expect(resultThree).toBe(false); + }); + + it('Should not be available in tier 1', () => { + // Arrange + const damageLocations = [rearWindshieldGlass]; + const availableLineItems = [rearWiperLineItem]; + + // Act + const result = servicePackageHelper.shouldRearWipersBeAvailable( + damageLocations, + availableLineItems, + packageNames.TIER_ONE + ); + + // Assert + expect(result).toBe(false); + }); + }); + + describe('shouldRainDefenseBeAvailable', () => { + it('Should generally be available only in tier 3', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + rainDefenseLineItem, + driverFrontWiperLineItem, + rearWiperLineItem, + recalLineItem + ]; + const isRepair = false; + + // Act + const resultOne = servicePackageHelper.shouldRainDefenseBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_ONE + ); + const resultTwo = servicePackageHelper.shouldRainDefenseBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_TWO + ); + const resultThree = servicePackageHelper.shouldRainDefenseBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(resultOne).toBe(false); + expect(resultTwo).toBe(false); + expect(resultThree).toBe(true); + }); + + it('Should not be available in a specific scenario', () => { + // Arrange + // SPECIFICALLY: no front windshield + const damageLocations = [rearWindshieldGlass]; + const availableLineItems = [ + rainDefenseLineItem, + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem + ]; + // SPECIFICALLY: not repair + const isRepair = false; + + // Act + const result = servicePackageHelper.shouldRainDefenseBeAvailable( + damageLocations, + availableLineItems, + isRepair, + packageNames.TIER_THREE + ); + + // Assert + expect(result).toBe(false); + }); + }); + + describe('getLowestTierForType', () => { + it('Should return the tier for items available in one tier only', () => { + // Arrange + const damageLocations = [frontWindshieldGlass, rearWindshieldGlass]; + + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + + const isRepair = false; + + // Act + const result = servicePackageHelper.getLowestTierForType( + damageLocations, + availableLineItems, + isRepair, + partTypeStrings.RAIN_DEFENSE + ); + + // Assert + expect(result).toEqual(packageNames.TIER_THREE); + }); + + it('Should return tier 2 for items in tier 2 and 3', () => { + // Arrange + const damageLocations = [frontWindshieldGlass, rearWindshieldGlass]; + + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + + const isRepair = false; + + // Act + const resultFront = servicePackageHelper.getLowestTierForType( + damageLocations, + availableLineItems, + isRepair, + partTypeStrings.FRONT_WIPER + ); + const resultRear = servicePackageHelper.getLowestTierForType( + damageLocations, + availableLineItems, + isRepair, + partTypeStrings.REAR_WIPER + ); + + // Assert + expect(resultFront).toEqual(packageNames.TIER_TWO); + expect(resultRear).toEqual(packageNames.TIER_TWO); + }); + + it('Should return tier 1 for any item not in any tier', () => { + // Arrange + const damageLocations = [rearWindshieldGlass]; + + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem + ]; + + const isRepair = false; + + // Act + const resultFront = servicePackageHelper.getLowestTierForType( + damageLocations, + availableLineItems, + isRepair, + partTypeStrings.RAIN_DEFENSE + ); + + // Assert + expect(resultFront).toEqual(packageNames.TIER_ONE); + }); + }); + + describe('getHighestRequiredTier', () => { + it('Should return the highest tier among items', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem + ]; + + // Act + const result = servicePackageHelper.getHighestRequiredTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_THREE); + }); + + it('Should not return a higher tier than items require', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + + // Act + const result = servicePackageHelper.getHighestRequiredTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_TWO); + }); + + it('Should return tier 1 for empty set', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = []; + + // Act + const result = servicePackageHelper.getHighestRequiredTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_ONE); + }); + + it('Should return tier 1 if no vaps are part of tiers', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [recalLineItem]; + + // Act + const result = servicePackageHelper.getHighestRequiredTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_ONE); + }); + }); + + describe('getHighestSatisfiedTier', () => { + it('Should return the highest tier if multiple are satisfied', () => { + // Arrange + const damageLocations = [frontWindshieldGlass, rearWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rainDefenseLineItem, + rearWiperLineItem + ]; + + // Act + const result = servicePackageHelper.getHighestFullySatisfiedTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_THREE); + }); + + it('Should only return *satisfied* tier', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [driverFrontWiperLineItem, passengerFrontWiperLineItem]; + + // Act + const result = servicePackageHelper.getHighestFullySatisfiedTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_TWO); + }); + + it('Should not return a tier if it is only partially satisfied', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = [rainDefenseLineItem]; + + // Act + const result = servicePackageHelper.getHighestFullySatisfiedTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_ONE); + }); + + it('Should return tier 1 if no vaps are selected.', () => { + // Arrange + const damageLocations = [frontWindshieldGlass]; + const availableLineItems = [ + driverFrontWiperLineItem, + passengerFrontWiperLineItem, + rearWiperLineItem, + rainDefenseLineItem + ]; + const isRepair = false; + const vaps = []; + + // Act + const result = servicePackageHelper.getHighestFullySatisfiedTier( + damageLocations, + availableLineItems, + isRepair, + vaps + ); + + // Assert + expect(result).toEqual(packageNames.TIER_ONE); + }); + }); +}); diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index a6093cac..674c49c7 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -18,7 +18,7 @@ class="cart-table">
+ class="mt-4 cart-line-item color-gray-100">
- {{ serviceLabel }} - {{ formatAmountInDollars(serviceValue) }} + id="cart-service-package" + class="cart-line-item"> +
+ {{ servicePackageLabel }} + {{ formatAmountInDollars(packagePrice) }} + Remove +
+ +
+ Wiper blades + Remove +
@@ -54,6 +70,12 @@ import { useMainStore } from '@/store'; import getPriceOfLineItems from '@/helpers/price-calculator.js'; import { formatAmountInDollars } from '@/helpers/text-helper.js'; +import { getHighestFullySatisfiedTier, getAvailablePackages } from '@/helpers/service-package-helper.js'; + +// Constants +import partTypeStrings from '@/constants/part-type-strings.js'; +import cartItemCategories from '@/constants/cart-item-categories.js'; +import cartItemTypes from '@/constants/cart-item-types.js'; const VERIFYING_COVERAGE = 'Verifying coverage'; @@ -65,20 +87,23 @@ export default { amountDueLabel: String, deductibleLabel: String, basePriceLabel: String, - serviceLabel: String + servicePackageLabel: String, + readOnly: Boolean + // TODO add allowRemoveItems }, data() { const { currentDeductible } = useMainStore().order; - const { supportingItems, glassParts, otherParts } = useMainStore().lineItems; + const { supportingItems, glassParts, otherParts, vaps } = useMainStore().lineItems; const baseServiceLineItems = [ ...(supportingItems ?? []), ...(glassParts ?? []), ...(otherParts ?? []) ]; return { + vaps: vaps ?? [], deductible: currentDeductible, baseServiceLineItems, - isExpanded: false + isExpanded: true// false }; }, computed: { @@ -102,11 +127,141 @@ export default { amountDue() { return this.showAsPaid ? 0 - : this.subTotal + this.salesTax; + : this.subTotal + this.packagePrice + this.salesTax; + }, + + // frontWiperCartItemName() { + // return this.getCmsContentForVapsType(partTypeStrings.FRONT_WIPER); + // }, + // frontWipersCartItem() { + // let cartItem = null; + + // const frontWiperLineItems = this.vaps.filter((vapsLineItem) => vapsLineItem.partType == partTypeStrings.FRONT_WIPER); + + // if (frontWiperLineItems.length > 0) { + // cartItem = { + // name: this.frontWiperCartItemName, + // category: cartItemCategories.VAPS, + // cartItemType: cartItemTypes.FRONT_WIPERS, + // isDisplayed: true, + // isRemovable: true, + // subTotal: 0, + // salesTax: 0, + // lineItems: [] + // }; + + // frontWiperLineItems.forEach((lineItem) => { + // lineItem.cartItemType = cartItem.cartItemType; + // cartItem.lineItems.push(lineItem); + + // cartItem.subTotal + // += (lineItem.kitPrice ?? 0) + // + (lineItem.laborAmount ?? 0) + // + (lineItem.sellingPrice ?? 0); + + // cartItem.salesTax += lineItem.salesTax ?? 0; + // }); + // } + + // return cartItem; + // }, + // rearWiperCartItemName() { + // return this.getCmsContentForVapsType(partTypeStrings.REAR_WIPER); + // }, + // rearWipersCartItem() { + // let cartItem = null; + + // const rearWiperLineItems = this.vaps.filter((vapsLineItem) => vapsLineItem.partType == partTypeStrings.REAR_WIPER); + + // if (rearWiperLineItems.length > 0) { + // cartItem = { + // name: this.rearWiperCartItemName, + // category: cartItemCategories.VAPS, + // cartItemType: cartItemTypes.REAR_WIPERS, + // isDisplayed: true, + // isRemovable: true, + // subTotal: 0, + // salesTax: 0, + // lineItems: [] + // }; + + // rearWiperLineItems.forEach((lineItem) => { + // lineItem.cartItemType = cartItem.cartItemType; + // cartItem.lineItems.push(lineItem); + + // cartItem.subTotal + // += (lineItem.kitPrice ?? 0) + // + (lineItem.laborAmount ?? 0) + // + (lineItem.sellingPrice ?? 0); + + // cartItem.salesTax += lineItem.salesTax ?? 0; + // }); + // } + + // return cartItem; + // }, + rainDefenseCartItemName() { + return this.getCmsContentForVapsType(partTypeStrings.RAIN_DEFENSE); + }, + rainDefenseCartItem() { + let cartItem = null; + + const rainDefenseLineItem = this.vaps.find((vapsLineItem) => vapsLineItem.partType === partTypeStrings.RAIN_DEFENSE); + rainDefenseLineItem.cartItemType = cartItemTypes.RAIN_DEFENSE; + if (rainDefenseLineItem) { + cartItem = { + name: this.rainDefenseCartItemName, + category: cartItemCategories.VAPS, + cartItemType: cartItemTypes.RAIN_DEFENSE, + isDisplayed: true, + isRemovable: true, + subTotal: getPriceOfLineItems([rainDefenseLineItem]), + salesTax: rainDefenseLineItem.salesTax ?? 0, + lineItems: [rainDefenseLineItem] + }; + } + return cartItem; + }, + + servicePackageLabelCalc() { + // If just rain, "Rain" + return ''; + }, + packageLevel() { + const tier = getHighestFullySatisfiedTier( + this.glassToReplace, + this.baseServiceLineItems, + this.isRepair, + this.vaps + ); + + return tier; + }, + packagePrice() { + return getPriceOfLineItems(this.packageLineItems); }, // TODO - serviceValue() { - return 25; + packageLineItems() { + return this.vaps; + }, + // TODO finish + servicePackageRemovable() { + // If valid package level then false + // otherwise true + return false; + }, + // TODO finish + isValidPackageLevel() { + const availablePackages = getAvailablePackages( + // TODO what is glass to replace + this.glassToReplace, + // TODO what are available line items + this.availableLineItems, + this.isRepair + ); + availablePackages.find((servicePackage) => servicePackage.forEach() == this.vaps); + + return false; } }, methods: { @@ -135,6 +290,7 @@ export default { } .cart-line-item { + padding: 0.25rem 1.5rem; color: $darker-gray; } diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index 8d3b9481..b71e9155 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -24,7 +24,8 @@ :amountDueLabel="amountDueText" :deductibleLabel="deductibleLabel" :basePriceLabel="basePriceLabel" - :serviceLabel="serviceLabel" /> + :servicePackageLabel="serviceLabel" + :readOnly="false" />
Pia Alert Placeholder
( + // lineItem.partType !== partTypeStrings.FRONT_WIPER + // && lineItem.partType !== partTypeStrings.REAR_WIPER + // && lineItem.partType !== partTypeStrings.RAIN_DEFENSE + // )); + + // return this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice, false); + // }, getTotalPriceOfAllLineItemsAndChildParts(lineItems, includeTax) { let totalPrice = 0; lineItems.forEach((lineItem) => { From afde96f0f1252913a65a2d9503ed352fa75c6b05 Mon Sep 17 00:00:00 2001 From: Michaela Brydon Date: Mon, 25 Mar 2024 12:54:53 -0400 Subject: [PATCH 04/21] Finishing initial work --- .../cart-dropdown/cart-dropdown.vue | 342 +++++++++--------- src/layouts/payment-method/payment-method.vue | 73 ++-- .../service-package-review.vue | 1 + 3 files changed, 206 insertions(+), 210 deletions(-) diff --git a/src/iss-components/cart-dropdown/cart-dropdown.vue b/src/iss-components/cart-dropdown/cart-dropdown.vue index 43b8f62a..13d6a1d9 100644 --- a/src/iss-components/cart-dropdown/cart-dropdown.vue +++ b/src/iss-components/cart-dropdown/cart-dropdown.vue @@ -39,15 +39,51 @@ +
+
+ + {{ formatAmountInDollars(packagePrice) }} +
+
+
+
+ {{ item.name }} + + + +
+
+
+
{{ mobileFeeCartItem.name }} @@ -56,18 +92,18 @@
+ linkType="text" + :text="recycleFeeCartItem.name" + href="javascript:void(0)" + @clickEvent="openModal(recyclingModalCmsWidgetName)" /> {{ getDisplayed(recycleFeeCartItem.subTotal) }}
@@ -100,30 +136,6 @@
-
-
- {{ servicePackageLabel }} - {{ formatAmountInDollars(packagePrice) }} - Remove -
- -
- Wiper blades - Remove -
-
@@ -140,12 +152,10 @@ import textBlock from '@/digital-components/text-block/text-block.vue'; import textLink from '@/ux-components/text-link/text-link.vue'; import getPriceOfLineItems from '@/helpers/price-calculator.js'; import { formatAmountInDollars } from '@/helpers/text-helper.js'; -import { getHighestFullySatisfiedTier, getAvailablePackages } from '@/helpers/service-package-helper.js'; +import { getHighestFullySatisfiedTier, getPackageContents } from '@/helpers/service-package-helper.js'; // Constants import partTypeStrings from '@/constants/part-type-strings.js'; -import cartItemCategories from '@/constants/cart-item-categories.js'; -import cartItemTypes from '@/constants/cart-item-types.js'; import widgetFields from '@/constants/cms-widget-fields.js'; const VERIFYING_COVERAGE = 'Verifying coverage'; @@ -159,24 +169,26 @@ export default { }, props: { showAsPaid: Boolean, - // servicePackageLabel: String, readOnly: Boolean, - // TODO add allowRemoveItems - recyclingModalCmsWidgetName: String + recyclingModalCmsWidgetName: String, + availableVaps: Array }, data() { const { currentDeductible } = useMainStore().order; + const { glassToReplace, isRepair } = useMainStore().damage; const { supportingItems, glassParts, otherParts, vaps } = useMainStore().lineItems; - const baseServiceLineItems = [ - ...(supportingItems ?? []), - ...(glassParts ?? []), - ...(otherParts ?? []) - ]; + return { - vaps: vaps ?? [], + isRepair, + glassToReplace: glassToReplace ?? [], + vapsInOrder: vaps ?? [], + baseServiceLineItems: [ + ...(supportingItems ?? []), + ...(glassParts ?? []), + ...(otherParts ?? []) + ], deductible: currentDeductible, - baseServiceLineItems, - isExpanded: false, + isExpanded: true, // false, widget: { amountDue: 'AmountDueTextWidget', deductible: 'DeductibleWidget', @@ -184,7 +196,8 @@ export default { subtotal: 'SubtotalWidget', salesTax: 'SalesTaxWidget', recycleFee: 'RecycleFeeWidget', - mobileFee: 'MobileServiceWidget' + mobileFee: 'MobileServiceWidget', + servicePackage: 'ServicePackageTitle' } }; }, @@ -209,141 +222,64 @@ export default { amountDue() { return this.showAsPaid ? 0 - : this.subTotal + this.packagePrice + this.salesTax; + : this.subTotal + this.salesTax; + }, + availableLineItems() { + const { glassParts, supportingItems } = useMainStore().lineItems; + return [ + ...(glassParts ?? []), + ...(supportingItems ?? []), + ...this.availableVaps + ]; + }, + servicePackageTier() { + return getHighestFullySatisfiedTier( + this.glassToReplace, + this.availableLineItems, + this.isRepair, + this.vapsInOrder + ); + }, + servicePackageCartItems() { + const packageContentTypes = getPackageContents( + this.glassToReplace, + this.availableLineItems, + this.isRepair, + this.servicePackageTier + ) ?? []; + const items = []; + if (packageContentTypes.includes(partTypeStrings.FRONT_WIPER)) { + items.push(this.frontWipersCartItem); + } + if (packageContentTypes.includes(partTypeStrings.REAR_WIPER)) { + items.push(this.rearWipersCartItem); + } + if (packageContentTypes.includes(partTypeStrings.RAIN_DEFENSE)) { + items.push(this.rainDefenseCartItem); + } + return items; }, - // frontWiperCartItemName() { - // return this.getCmsContentForVapsType(partTypeStrings.FRONT_WIPER); - // }, - // frontWipersCartItem() { - // let cartItem = null; - - // const frontWiperLineItems = this.vaps.filter((vapsLineItem) => vapsLineItem.partType == partTypeStrings.FRONT_WIPER); - - // if (frontWiperLineItems.length > 0) { - // cartItem = { - // name: this.frontWiperCartItemName, - // category: cartItemCategories.VAPS, - // cartItemType: cartItemTypes.FRONT_WIPERS, - // isDisplayed: true, - // isRemovable: true, - // subTotal: 0, - // salesTax: 0, - // lineItems: [] - // }; - - // frontWiperLineItems.forEach((lineItem) => { - // lineItem.cartItemType = cartItem.cartItemType; - // cartItem.lineItems.push(lineItem); - - // cartItem.subTotal - // += (lineItem.kitPrice ?? 0) - // + (lineItem.laborAmount ?? 0) - // + (lineItem.sellingPrice ?? 0); - - // cartItem.salesTax += lineItem.salesTax ?? 0; - // }); - // } - - // return cartItem; - // }, - // rearWiperCartItemName() { - // return this.getCmsContentForVapsType(partTypeStrings.REAR_WIPER); - // }, - // rearWipersCartItem() { - // let cartItem = null; - - // const rearWiperLineItems = this.vaps.filter((vapsLineItem) => vapsLineItem.partType == partTypeStrings.REAR_WIPER); - - // if (rearWiperLineItems.length > 0) { - // cartItem = { - // name: this.rearWiperCartItemName, - // category: cartItemCategories.VAPS, - // cartItemType: cartItemTypes.REAR_WIPERS, - // isDisplayed: true, - // isRemovable: true, - // subTotal: 0, - // salesTax: 0, - // lineItems: [] - // }; - - // rearWiperLineItems.forEach((lineItem) => { - // lineItem.cartItemType = cartItem.cartItemType; - // cartItem.lineItems.push(lineItem); - - // cartItem.subTotal - // += (lineItem.kitPrice ?? 0) - // + (lineItem.laborAmount ?? 0) - // + (lineItem.sellingPrice ?? 0); - - // cartItem.salesTax += lineItem.salesTax ?? 0; - // }); - // } - - // return cartItem; - // }, - rainDefenseCartItemName() { - return this.getCmsContentForVapsType(partTypeStrings.RAIN_DEFENSE); + frontWipersCartItem() { + const frontWipersLabel = this.getCmsContentForVapsType(partTypeStrings.FRONT_WIPER); + const frontWipersLineItems = this.vapsInOrder + .filter((vapsLineItem) => vapsLineItem.partType === partTypeStrings.FRONT_WIPER); + return this.getCartItem(frontWipersLabel, frontWipersLineItems); + }, + rearWipersCartItem() { + const rearWipersLabel = this.getCmsContentForVapsType(partTypeStrings.REAR_WIPER); + const rearWipersLineItems = this.vapsInOrder + .filter((vapsLineItem) => vapsLineItem.partType === partTypeStrings.REAR_WIPER); + return this.getCartItem(rearWipersLabel, rearWipersLineItems); }, rainDefenseCartItem() { - let cartItem = null; - - const rainDefenseLineItem = this.vaps.find((vapsLineItem) => vapsLineItem.partType === partTypeStrings.RAIN_DEFENSE); - rainDefenseLineItem.cartItemType = cartItemTypes.RAIN_DEFENSE; - if (rainDefenseLineItem) { - cartItem = { - name: this.rainDefenseCartItemName, - category: cartItemCategories.VAPS, - cartItemType: cartItemTypes.RAIN_DEFENSE, - isDisplayed: true, - isRemovable: true, - subTotal: getPriceOfLineItems([rainDefenseLineItem]), - salesTax: rainDefenseLineItem.salesTax ?? 0, - lineItems: [rainDefenseLineItem] - }; - } - return cartItem; - }, - - servicePackageLabelCalc() { - // If just rain, "Rain" - return ''; - }, - packageLevel() { - const tier = getHighestFullySatisfiedTier( - this.glassToReplace, - this.baseServiceLineItems, - this.isRepair, - this.vaps - ); - - return tier; + const rainDefenseLabel = this.getCmsContentForVapsType(partTypeStrings.RAIN_DEFENSE); + const rainDefenseLineItem = this.vapsInOrder + .find((vapsLineItem) => vapsLineItem.partType === partTypeStrings.RAIN_DEFENSE); + return this.getCartItem(rainDefenseLabel, [rainDefenseLineItem]); }, packagePrice() { - return getPriceOfLineItems(this.packageLineItems); - }, - // TODO - packageLineItems() { - return this.vaps; - }, - // TODO finish - servicePackageRemovable() { - // If valid package level then false - // otherwise true - return false; - }, - // TODO finish - isValidPackageLevel() { - const availablePackages = getAvailablePackages( - // TODO what is glass to replace - this.glassToReplace, - // TODO what are available line items - this.availableLineItems, - this.isRepair - ); - availablePackages.find((servicePackage) => servicePackage.forEach() === this.vaps); - - return false; + return getPriceOfLineItems(this.vapsInOrder); }, amountDueLabel() { return this.getCmsContent(this.widget.amountDue, widgetFields.TEXT_BLOCK_WIDGET.TEXT); @@ -360,16 +296,33 @@ export default { salesTaxLabel() { return this.getCmsContent(this.widget.salesTax, widgetFields.TEXT_BLOCK_WIDGET.TEXT); }, + // TODO confirm what happens when servicePackageNames is null with test + servicePackageNames() { + return this.getCmsContent( + this.widget.servicePackage, + widgetFields.INPUT_QUESTION_WIDGET.ANSWERS + ); + }, + servicePackageLabelWidget() { + if (!this.servicePackageNames) { + console.log('no service package names'); + return ''; + } + const currentPackage = this.servicePackageNames + ?.find((entry) => entry.Name === this.servicePackageTier); + + return currentPackage.SubWidgetName ?? ''; + }, recycleFeeCartItem() { return this.getCartItem( this.getCmsContent(this.widget.recycleFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), - useMainStore().order.lineItems.supportingItems.find((lineItem) => lineItem.partType === partTypeStrings.REPLACE_FEE) + [useMainStore().lineItems.supportingItems.find((lineItem) => lineItem.partType === partTypeStrings.REPLACE_FEE)] ); }, mobileFeeCartItem() { return this.getCartItem( this.getCmsContent(this.widget.mobileFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), - useMainStore().order.lineItems.mobileFee + [useMainStore().lineItems.mobileFee] ); } }, @@ -386,18 +339,33 @@ export default { : formatAmountInDollars(amount); }, formatAmountInDollars, - getCartItem(label, lineItem) { + getCartItem(label, lineItems) { let cartItem = null; - if (lineItem) { + if (lineItems) { cartItem = { name: label, - subTotal: this.getTotalLineItemPrice(lineItem, false), - salesTax: lineItem.salesTax ?? 0 + subTotal: getPriceOfLineItems(lineItems), + salesTax: lineItems.salesTax ?? 0 }; } return cartItem; + }, + removeItem() { + // TODO in later ticket + }, + getCmsContentForVapsType(vapsType) { + // TODO make strings constants + const vapsItemDescriptions = this.getCmsContent('VapsItemDescriptions', 'Answers'); + + if (!vapsItemDescriptions) { + return ''; + } + + const vapsTypeName = vapsItemDescriptions.find((entry) => entry.Name === vapsType); + + return vapsTypeName.Text; } } }; @@ -407,6 +375,10 @@ export default {