Cart now calculating tax, there may be other issues in the cart that may effect calculation

This commit is contained in:
Leah Schumann 2023-10-18 09:10:53 -04:00
parent 1e20dd96d5
commit cb01a42341
6 changed files with 96 additions and 48 deletions

View file

@ -91,11 +91,11 @@ export default {
answer.SubText = "+$" + this.wipersPrice; answer.SubText = "+$" + this.wipersPrice;
answers.push(answer); answers.push(answer);
} }
if (this.showAddRainDefense) { // if (this.showAddRainDefense) {
const answer = getAnswer("ADD RAIN DEFENSE", this.answersCmsData); // const answer = getAnswer("ADD RAIN DEFENSE", this.answersCmsData);
answer.SubText = "+$" + this.rainDefensePrice; // answer.SubText = "+$" + this.rainDefensePrice;
answers.push(answer); // answers.push(answer);
} // }
return answers; return answers;
}, },

View file

@ -7,12 +7,12 @@
@click="toggleClass()"> @click="toggleClass()">
<div class="col d-flex justify-content-between"> <div class="col d-flex justify-content-between">
<span class="label">Amount Due</span <span class="label">Amount Due</span
><span class="label amount-due">{{ amountDue }}</span> ><span class="label amount-due">{{ currencyFormatter.format(amountDue) }}</span>
</div> </div>
</div> </div>
<div class="price-table"> <div class="price-table">
<div class="service-type" :class="{ packageWithVAPS: packageWithVAPS }"> <div class="service-type" :class="{ packageWithVAPS: packageWithVAPS }">
<textBlock :cmsWidgetName="packageNameWidget" /><span>{{ packagePrice }}</span> <textBlock :cmsWidgetName="packageNameWidget" /><span>{{ currencyFormatter.format(packagePrice) }}</span>
</div> </div>
<div <div
v-for="(lineItem, i) in displayedPackageLineItems" v-for="(lineItem, i) in displayedPackageLineItems"
@ -22,7 +22,7 @@
<textLink <textLink
ref="removeLink" ref="removeLink"
linkType="text" linkType="text"
text="showMoreShopsLinkText" text="removeLinkText"
href="#!" href="#!"
@click-event="removeItem(lineItem)" /> @click-event="removeItem(lineItem)" />
</div> </div>
@ -35,7 +35,7 @@
<textLink <textLink
ref="removeLink" ref="removeLink"
linkType="text" linkType="text"
text="showMoreShopsLinkText" text="removeLinkText"
href="#!" href="#!"
@click-event="removeItem(lineItem)" /> @click-event="removeItem(lineItem)" />
<span>{{ lineItem.price }}</span> <span>{{ lineItem.price }}</span>
@ -45,9 +45,15 @@
><span>{{ recycleFee }}</span> ><span>{{ recycleFee }}</span>
</div> </div>
<!-- Sub total, sales tax, total columns --> <!-- Sub total, sales tax, total columns -->
<div class="sub-total"><span>Subtotal</span><span>$320</span></div> <div class="sub-total">
<div class="sales-tax"><span>Sales tax</span><span>$1</span></div> <span>Subtotal</span><span>{{ currencyFormatter.format(subTotal) }}</span>
<div class="amount-due"><span>Amount due</span><span>$321</span></div> </div>
<div class="sales-tax">
<span>Sales tax</span><span>{{ currencyFormatter.format(salesTax) }}</span>
</div>
<div class="amount-due">
<span>Amount due</span><span>{{ currencyFormatter.format(amountDue) }}</span>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -76,28 +82,16 @@ export default {
return { return {
isActive: false, isActive: false,
packageWithVAPS: false, packageWithVAPS: false,
amountDue: this.getAmountDue(), currencyFormatter: new Intl.NumberFormat("en-US", {
style: "currency",
currency: "USD",
}),
}; };
}, },
methods: { methods: {
toggleClass: function (event) { toggleClass: function (event) {
this.isActive = !this.isActive; 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) { getVapsPrice(packageName) {
const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName); const vapsItems = this.getVapsLineItemsForSelectedPackage(packageName);
@ -157,19 +151,24 @@ export default {
this.isRepair, this.isRepair,
this.vaps this.vaps
); );
return tier; return tier;
}, },
packagePrice() { packagePrice() {
let packagePriceString; let packagePrice = this.isInsuranceSelected
if (this.packageLevel.length > 0) { ? 0
packagePriceString = this.getPackagePriceString(this.packageLevel); : baseMixin.methods.getTierOnePackagePrice(
} baseMixin.methods.filterOutFees(this.availableLineItems)
return packagePriceString; );
// return (packagePriceString.length > 0) ? packagePriceString : "Test String";
packagePrice += this.getVapsPrice(this.packageLevel);
return packagePrice;
}, },
displayedPackageLineItems() { displayedPackageLineItems() {
const displayedPackageLineItems = []; const displayedPackageLineItems = [];
const packageLineItems = this.getVapsLineItemsForSelectedPackage(this.packageLevel); const packageLineItems = this.getVapsLineItemsForSelectedPackage(this.packageLevel);
// TODO Determine if we could get the same list from this.lineItems? // TODO Determine if we could get the same list from this.lineItems?
packageLineItems?.forEach((item) => { packageLineItems?.forEach((item) => {
let price = item.sellingPrice + item.kitPrice + item.laborAmount; let price = item.sellingPrice + item.kitPrice + item.laborAmount;
@ -181,6 +180,7 @@ export default {
}; };
displayedPackageLineItems.push(packageLineItem); displayedPackageLineItems.push(packageLineItem);
}); });
return displayedPackageLineItems; return displayedPackageLineItems;
}, },
displayedNonPackageLineItems() { displayedNonPackageLineItems() {
@ -229,6 +229,9 @@ export default {
const supportingItems = this.lineItems?.supportingItems; const supportingItems = this.lineItems?.supportingItems;
return supportingItems?.length > 0 ? supportingItems : []; return supportingItems?.length > 0 ? supportingItems : [];
}, },
removeLinkText() {
return "Remove"; // TODO: get from CMS
},
recycleLabel() { recycleLabel() {
return "Recycling"; return "Recycling";
}, },
@ -244,6 +247,28 @@ export default {
// } // }
return true; 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: { components: {
textBlock, textBlock,

View file

@ -39,12 +39,14 @@ export function getAvailablePackages(glassToReplace, availableLineItems, isRepai
isRepair, isRepair,
packageNames.TIER_ONE packageNames.TIER_ONE
); );
let tierTwoVaps = getPackageContents( let tierTwoVaps = getPackageContents(
glassToReplace, glassToReplace,
availableLineItems, availableLineItems,
isRepair, isRepair,
packageNames.TIER_TWO packageNames.TIER_TWO
); );
let tierThreeVaps = getPackageContents( let tierThreeVaps = getPackageContents(
glassToReplace, glassToReplace,
availableLineItems, availableLineItems,
@ -87,9 +89,11 @@ export function getPackageContents(glassToReplace, availableLineItems, isRepair,
if (shouldFrontWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { if (shouldFrontWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
vaps.push(partTypeStrings.FRONT_WIPER); vaps.push(partTypeStrings.FRONT_WIPER);
} }
if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
vaps.push(partTypeStrings.REAR_WIPER); vaps.push(partTypeStrings.REAR_WIPER);
} }
if (shouldRainDefenseBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) { if (shouldRainDefenseBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
vaps.push(partTypeStrings.RAIN_DEFENSE); vaps.push(partTypeStrings.RAIN_DEFENSE);
} }
@ -107,6 +111,7 @@ export function shouldFrontWipersBeAvailable(
partTypeStrings.FRONT_WIPER, partTypeStrings.FRONT_WIPER,
availableLineItems availableLineItems
); );
const isFrontWindshieldTask = const isFrontWindshieldTask =
isRepair || containsGlassPieceWithLocation(glassLocations.WINDSHIELD, glassToReplace); isRepair || containsGlassPieceWithLocation(glassLocations.WINDSHIELD, glassToReplace);

View file

@ -96,7 +96,6 @@ export default {
null, null,
"payment-method" "payment-method"
); );
console.log("rainDefensePromise: ", rainDefensePromise);
const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging( const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_SUPPORTING_ITEMS, storeActions.GET_SUPPORTING_ITEMS,
@ -125,7 +124,7 @@ export default {
const resultMap = await settleAllPromises(promiseResultMap); const resultMap = await settleAllPromises(promiseResultMap);
const glassParts = (await store.getters.order.lineItems.glassParts) ?? []; const glassParts = store.getters.order.lineItems.glassParts ?? [];
const availableLineItems = [ const availableLineItems = [
resultMap.rainDefense, resultMap.rainDefense,
@ -142,7 +141,24 @@ export default {
"payment-method", "payment-method",
false 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 const cartItems = [...glassParts, ...lineItems.supportingItems, ...lineItems.vaps]; // TOBEREMOVED BY AJC IN CSR-1384
@ -152,7 +168,7 @@ export default {
vm.setCmsContent(resultMap.cmsContent); vm.setCmsContent(resultMap.cmsContent);
vm.availableLineItems = pricedAvailableLineItems; vm.availableLineItems = pricedAvailableLineItems;
vm.lineItems = lineItems; vm.lineItems = taxedLineItems;
}); });
}, },
data() { data() {

View file

@ -88,6 +88,7 @@ export default {
lineItem.partType != partTypeStrings.RAIN_DEFENSE lineItem.partType != partTypeStrings.RAIN_DEFENSE
); );
}); });
let totalPrice = this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice); let totalPrice = this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice);
return totalPrice; return totalPrice;
}, },

View file

@ -2115,14 +2115,13 @@ export const actions = {
pageNameToLog, pageNameToLog,
} }
) { ) {
const flattenedLineItemsWithChildParts = // const flattenedLineItemsWithChildParts =
getFlattenedArrayOfLineItemsWithChildParts(pricedLineItems); // getFlattenedArrayOfLineItemsWithChildParts(pricedLineItems);
const lineItemsWithOnlyPriceInfo = pricedLineItems.map((lineItem) => ({
const lineItemsWithOnlyPriceInfo = flattenedLineItemsWithChildParts.map((lineItem) => ({
partNumber: lineItem.partNumber, partNumber: lineItem.partNumber,
laborAmount: lineItem.laborAmount, laborAmount: lineItem.laborAmount ?? 0,
kitPrice: lineItem.kitPrice, kitPrice: lineItem.kitPrice ?? 0,
sellingPrice: lineItem.sellingPrice, sellingPrice: lineItem.sellingPrice ?? 0,
})); }));
const pricedLineItemsFormattedForRequest = const pricedLineItemsFormattedForRequest =
@ -2470,13 +2469,15 @@ function addPricesToLineItems(lineItems, pricingLineItems) {
lineItem.laborAmount = pricedLineItem.laborAmount; lineItem.laborAmount = pricedLineItem.laborAmount;
lineItem.sellingPrice = pricedLineItem.sellingPrice; lineItem.sellingPrice = pricedLineItem.sellingPrice;
lineItem.kitPrice = pricedLineItem.kitPrice; lineItem.kitPrice = pricedLineItem.kitPrice;
lineItem.salesTax = pricedLineItem.salesTax;
}); });
return pricedLineItems; return pricedLineItems;
} }
function addTaxesToPricedLineItems(lineItems, taxingLineItems) { function addTaxesToPricedLineItems(lineItems, taxingLineItems) {
lineItems.forEach((lineItem) => { const taxedLineItems = deepClone(lineItems);
taxedLineItems.forEach((lineItem) => {
let lineItemIndex = taxingLineItems.findIndex( let lineItemIndex = taxingLineItems.findIndex(
(taxingLineItem) => taxingLineItem.partNumber === lineItem.partNumber (taxingLineItem) => taxingLineItem.partNumber === lineItem.partNumber
); );
@ -2486,10 +2487,10 @@ function addTaxesToPricedLineItems(lineItems, taxingLineItems) {
} }
let taxedLineItem = taxingLineItems.splice(lineItemIndex, 1)[0]; let taxedLineItem = taxingLineItems.splice(lineItemIndex, 1)[0];
lineItem.SalesTax = taxedLineItem.SalesTax; lineItem.salesTax = taxedLineItem.salesTax;
}); });
return lineItems; return taxedLineItems;
} }
function getArrayOfAllLineItems(lineItems) { function getArrayOfAllLineItems(lineItems) {