From cb01a4234114269dfed7ad7cbe62b88f69211c55 Mon Sep 17 00:00:00 2001 From: Leah Schumann Date: Wed, 18 Oct 2023 09:10:53 -0400 Subject: [PATCH] Cart now calculating tax, there may be other issues in the cart that may effect calculation --- .../add-vaps-modal-buttons.vue | 10 +-- src/fmg-components/cart/cart.vue | 83 ++++++++++++------- src/helpers/service-package-helper.js | 5 ++ src/layouts/payment-method/payment-method.vue | 24 +++++- src/mixins/base-mixin.js | 1 + src/store/index.js | 21 ++--- 6 files changed, 96 insertions(+), 48 deletions(-) diff --git a/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue b/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue index d894f2ee8..eafd1322a 100644 --- a/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue +++ b/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue @@ -91,11 +91,11 @@ export default { answer.SubText = "+$" + this.wipersPrice; answers.push(answer); } - if (this.showAddRainDefense) { - const answer = getAnswer("ADD RAIN DEFENSE", this.answersCmsData); - answer.SubText = "+$" + this.rainDefensePrice; - answers.push(answer); - } + // if (this.showAddRainDefense) { + // const answer = getAnswer("ADD RAIN DEFENSE", this.answersCmsData); + // answer.SubText = "+$" + this.rainDefensePrice; + // answers.push(answer); + // } return answers; }, diff --git a/src/fmg-components/cart/cart.vue b/src/fmg-components/cart/cart.vue index 7107e64e8..f0ab45cf8 100644 --- a/src/fmg-components/cart/cart.vue +++ b/src/fmg-components/cart/cart.vue @@ -7,12 +7,12 @@ @click="toggleClass()">
Amount Due{{ amountDue }} + >{{ currencyFormatter.format(amountDue) }}
- {{ packagePrice }} + {{ currencyFormatter.format(packagePrice) }}
@@ -35,7 +35,7 @@ {{ lineItem.price }} @@ -45,9 +45,15 @@ >{{ recycleFee }}
-
Subtotal$320
-
Sales tax$1
-
Amount due$321
+
+ Subtotal{{ currencyFormatter.format(subTotal) }} +
+
+ Sales tax{{ currencyFormatter.format(salesTax) }} +
+
+ Amount due{{ currencyFormatter.format(amountDue) }} +
@@ -76,28 +82,16 @@ export default { return { isActive: false, packageWithVAPS: false, - amountDue: this.getAmountDue(), + currencyFormatter: new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + }), }; }, methods: { toggleClass: function (event) { this.isActive = !this.isActive; }, - getPackagePriceString(packageName) { - const formattedPriceFloat = parseFloat(this.getPackagePrice(packageName)).toFixed(2); - return (this.isInsuranceSelected ? "As little as $" : "$") + formattedPriceFloat; - }, - getPackagePrice(packageName) { - let priceFloat = this.isInsuranceSelected - ? 0 - : baseMixin.methods.getTierOnePackagePrice( - baseMixin.methods.filterOutFees(this.availableLineItems) - ); - - priceFloat += this.getVapsPrice(packageName); - - return priceFloat; - }, getVapsPrice(packageName) { const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); @@ -157,19 +151,24 @@ export default { this.isRepair, this.vaps ); + return tier; }, packagePrice() { - let packagePriceString; - if (this.packageLevel.length > 0) { - packagePriceString = this.getPackagePriceString(this.packageLevel); - } - return packagePriceString; - // return (packagePriceString.length > 0) ? packagePriceString : "Test String"; + let packagePrice = this.isInsuranceSelected + ? 0 + : baseMixin.methods.getTierOnePackagePrice( + baseMixin.methods.filterOutFees(this.availableLineItems) + ); + + packagePrice += this.getVapsPrice(this.packageLevel); + + return packagePrice; }, displayedPackageLineItems() { const displayedPackageLineItems = []; const packageLineItems = this.getVapsLineItemsForSelectedPackage(this.packageLevel); + // TODO Determine if we could get the same list from this.lineItems? packageLineItems?.forEach((item) => { let price = item.sellingPrice + item.kitPrice + item.laborAmount; @@ -181,6 +180,7 @@ export default { }; displayedPackageLineItems.push(packageLineItem); }); + return displayedPackageLineItems; }, displayedNonPackageLineItems() { @@ -229,6 +229,9 @@ export default { const supportingItems = this.lineItems?.supportingItems; return supportingItems?.length > 0 ? supportingItems : []; }, + removeLinkText() { + return "Remove"; // TODO: get from CMS + }, recycleLabel() { return "Recycling"; }, @@ -244,6 +247,28 @@ export default { // } return true; }, + subTotal() { + let subTotal = 0; + + this.lineItems.forEach((lineItem) => { + subTotal += (lineItem.kitPrice ?? 0) + + (lineItem.laborAmount ?? 0) + + (lineItem.sellingPrice ?? 0); + }); + + return subTotal; + }, + salesTax() { + let salesTax = 0; + this.lineItems.forEach((lineItem) => { + salesTax += lineItem.salesTax; + }); + + return salesTax; + }, + amountDue() { + return this.subTotal + this.salesTax; + }, }, components: { textBlock, diff --git a/src/helpers/service-package-helper.js b/src/helpers/service-package-helper.js index 089e2e596..cab883cc6 100644 --- a/src/helpers/service-package-helper.js +++ b/src/helpers/service-package-helper.js @@ -39,12 +39,14 @@ export function getAvailablePackages(glassToReplace, availableLineItems, isRepai isRepair, packageNames.TIER_ONE ); + let tierTwoVaps = getPackageContents( glassToReplace, availableLineItems, isRepair, packageNames.TIER_TWO ); + let tierThreeVaps = getPackageContents( glassToReplace, availableLineItems, @@ -87,9 +89,11 @@ export function getPackageContents(glassToReplace, availableLineItems, isRepair, if (shouldFrontWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { vaps.push(partTypeStrings.FRONT_WIPER); } + if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { vaps.push(partTypeStrings.REAR_WIPER); } + if (shouldRainDefenseBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { vaps.push(partTypeStrings.RAIN_DEFENSE); } @@ -107,6 +111,7 @@ export function shouldFrontWipersBeAvailable( partTypeStrings.FRONT_WIPER, availableLineItems ); + const isFrontWindshieldTask = isRepair || containsGlassPieceWithLocation(glassLocations.WINDSHIELD, glassToReplace); diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index c8e54d9cf..492b6ebf7 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -96,7 +96,6 @@ export default { null, "payment-method" ); - console.log("rainDefensePromise: ", rainDefensePromise); const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging( storeActions.GET_SUPPORTING_ITEMS, @@ -125,7 +124,7 @@ export default { const resultMap = await settleAllPromises(promiseResultMap); - const glassParts = (await store.getters.order.lineItems.glassParts) ?? []; + const glassParts = store.getters.order.lineItems.glassParts ?? []; const availableLineItems = [ resultMap.rainDefense, @@ -142,7 +141,24 @@ export default { "payment-method", false ); - const lineItems = store.getters.lineItems; + + const lineItems = store.getters.order.lineItems; + + const combinedLineItems = [...glassParts, ...lineItems.supportingItems, ...lineItems.vaps]; + + const taxedLineItems = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA, + { + billToAccountNumber: "87291", + providerNumber: store.getters.order.serviceLocation.provider.providerNumber, + appointmentType: store.getters.order.serviceLocation.appointmentType, + serviceLocationState: store.getters.order.serviceLocation.state, + serviceLocationZipCode: store.getters.order.serviceLocation.zipCode, + pricedLineItems: combinedLineItems, + }, + "payment-method", + false + ); const cartItems = [...glassParts, ...lineItems.supportingItems, ...lineItems.vaps]; // TOBEREMOVED BY AJC IN CSR-1384 @@ -152,7 +168,7 @@ export default { vm.setCmsContent(resultMap.cmsContent); vm.availableLineItems = pricedAvailableLineItems; - vm.lineItems = lineItems; + vm.lineItems = taxedLineItems; }); }, data() { diff --git a/src/mixins/base-mixin.js b/src/mixins/base-mixin.js index df03693ee..c33715c2b 100644 --- a/src/mixins/base-mixin.js +++ b/src/mixins/base-mixin.js @@ -88,6 +88,7 @@ export default { lineItem.partType != partTypeStrings.RAIN_DEFENSE ); }); + let totalPrice = this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice); return totalPrice; }, diff --git a/src/store/index.js b/src/store/index.js index 32395696e..9b2e31781 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -2115,14 +2115,13 @@ export const actions = { pageNameToLog, } ) { - const flattenedLineItemsWithChildParts = - getFlattenedArrayOfLineItemsWithChildParts(pricedLineItems); - - const lineItemsWithOnlyPriceInfo = flattenedLineItemsWithChildParts.map((lineItem) => ({ + // const flattenedLineItemsWithChildParts = + // getFlattenedArrayOfLineItemsWithChildParts(pricedLineItems); + const lineItemsWithOnlyPriceInfo = pricedLineItems.map((lineItem) => ({ partNumber: lineItem.partNumber, - laborAmount: lineItem.laborAmount, - kitPrice: lineItem.kitPrice, - sellingPrice: lineItem.sellingPrice, + laborAmount: lineItem.laborAmount ?? 0, + kitPrice: lineItem.kitPrice ?? 0, + sellingPrice: lineItem.sellingPrice ?? 0, })); const pricedLineItemsFormattedForRequest = @@ -2470,13 +2469,15 @@ function addPricesToLineItems(lineItems, pricingLineItems) { lineItem.laborAmount = pricedLineItem.laborAmount; lineItem.sellingPrice = pricedLineItem.sellingPrice; lineItem.kitPrice = pricedLineItem.kitPrice; + lineItem.salesTax = pricedLineItem.salesTax; }); return pricedLineItems; } function addTaxesToPricedLineItems(lineItems, taxingLineItems) { - lineItems.forEach((lineItem) => { + const taxedLineItems = deepClone(lineItems); + taxedLineItems.forEach((lineItem) => { let lineItemIndex = taxingLineItems.findIndex( (taxingLineItem) => taxingLineItem.partNumber === lineItem.partNumber ); @@ -2486,10 +2487,10 @@ function addTaxesToPricedLineItems(lineItems, taxingLineItems) { } let taxedLineItem = taxingLineItems.splice(lineItemIndex, 1)[0]; - lineItem.SalesTax = taxedLineItem.SalesTax; + lineItem.salesTax = taxedLineItem.salesTax; }); - return lineItems; + return taxedLineItems; } function getArrayOfAllLineItems(lineItems) {