327 lines
14 KiB
Vue
327 lines
14 KiB
Vue
<template>
|
|
<buttonQuestion
|
|
:answers="servicePackageAnswers"
|
|
:groupName="groupName"
|
|
buttonTypeString="servicePackageRadio"
|
|
:buttonTypeObject="servicePackageRadio"
|
|
v-model="selectedPackageName"
|
|
isRequired />
|
|
</template>
|
|
|
|
<script>
|
|
import buttonQuestion from "@/common-components/button-question/button-question";
|
|
import baseMixin from "@/mixins/base-mixin.js";
|
|
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 { partTypeStrings } from "@/constants/part-type-strings";
|
|
|
|
const packageNames = {
|
|
TIER_ONE: "TierOne",
|
|
TIER_TWO: "TierTwo",
|
|
TIER_THREE: "TierThree",
|
|
};
|
|
|
|
export default {
|
|
name: "servicePackageQuestion",
|
|
props: {
|
|
groupName: String,
|
|
cashCmsWidgetName: String,
|
|
insuranceCmsWidgetName: String,
|
|
isInsuranceSelected: Boolean,
|
|
availableLineItems: null,
|
|
},
|
|
data() {
|
|
return {
|
|
servicePackageRadio: servicePackageRadio,
|
|
selectedPackageName: null,
|
|
};
|
|
},
|
|
watch: {
|
|
availableLineItems() {
|
|
if (this.$store.getters.lineItems.supportingItems) {
|
|
this.selectDefaultPackage();
|
|
}
|
|
},
|
|
selectedPackageName(newValue) {
|
|
const VapsProductsInSelectedPackage = this.getVapsLineItemsForSelectedPackage(newValue);
|
|
this.$emit("vapsItemsSelected", VapsProductsInSelectedPackage);
|
|
},
|
|
},
|
|
computed: {
|
|
nullSafeAvailableLineItems() {
|
|
return this.availableLineItems ?? [];
|
|
},
|
|
servicePackageAnswers() {
|
|
const cmsWidgetName = this.isInsuranceSelected
|
|
? this.insuranceCmsWidgetName
|
|
: this.cashCmsWidgetName;
|
|
let cmsAnswersContent = this.getCmsContent(cmsWidgetName, "Answers");
|
|
if (!cmsAnswersContent) {
|
|
return null;
|
|
}
|
|
if (!this.shouldDisplayTierTwoPackage) {
|
|
cmsAnswersContent = cmsAnswersContent.filter(
|
|
(answer) => answer.Name != packageNames.TIER_TWO
|
|
);
|
|
}
|
|
const modifiedAnswers = cmsAnswersContent.map((answer) => ({
|
|
value: answer.Name,
|
|
buttonLabel: this.getHeaderTextFromCms(answer.SubWidgetName),
|
|
buttonLabelSubCopy: this.getSubheaderTextFromCms(answer.SubWidgetName),
|
|
buttonBodyCopy: this.getBodyTextFromCms(answer.SubWidgetName),
|
|
buttonAuxillaryCopy: this.getPackagePriceString(answer.Name),
|
|
buttonFooterCopy: this.getFooterTextFromCms(answer.SubWidgetName),
|
|
}));
|
|
return modifiedAnswers;
|
|
},
|
|
isRecalibrationOnOrder() {
|
|
return this.lineItemsContainsPartType(partTypeStrings.RECALIBRATION);
|
|
},
|
|
frontWipersApplicableForTierTwo() {
|
|
const frontWipersAreAvailable = this.lineItemsContainsPartType(
|
|
partTypeStrings.FRONT_WIPER
|
|
);
|
|
const isRepair = this.$store.getters.order.damage.isRepair;
|
|
const glassToReplaceContainsWindshield = this.glassToReplaceContainsGlassLocation(
|
|
glassLocations.WINDSHIELD
|
|
);
|
|
if (frontWipersAreAvailable) {
|
|
if (isRepair) {
|
|
return true;
|
|
} else {
|
|
if (glassToReplaceContainsWindshield) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
rearWiperApplicableForTierTwo() {
|
|
const rearWiperIsAvailable = this.lineItemsContainsPartType(partTypeStrings.REAR_WIPER);
|
|
return (
|
|
this.glassToReplaceContainsGlassLocation(glassLocations.REAR) &&
|
|
rearWiperIsAvailable
|
|
);
|
|
},
|
|
frontWipersApplicableForTierThree() {
|
|
const frontWipersAreAvailable = this.lineItemsContainsPartType(
|
|
partTypeStrings.FRONT_WIPER
|
|
);
|
|
return frontWipersAreAvailable;
|
|
},
|
|
rearWiperApplicableForTierThree() {
|
|
const rearWiperIsAvailable = this.lineItemsContainsPartType(partTypeStrings.REAR_WIPER);
|
|
return (
|
|
this.glassToReplaceContainsGlassLocation(glassLocations.REAR) &&
|
|
rearWiperIsAvailable
|
|
);
|
|
},
|
|
rainDefenseApplicableForTierThree() {
|
|
const frontWipersAreAvailable = this.lineItemsContainsPartType(
|
|
partTypeStrings.FRONT_WIPER
|
|
);
|
|
const glassToReplaceContainsWindshield = this.glassToReplaceContainsGlassLocation(
|
|
glassLocations.WINDSHIELD
|
|
);
|
|
const glassToReplaceContainsRearGlass = this.glassToReplaceContainsGlassLocation(
|
|
glassLocations.REAR
|
|
);
|
|
if (this.frontWipersApplicableForTierTwo) {
|
|
return true;
|
|
} else if (!frontWipersAreAvailable) {
|
|
return true;
|
|
} else if (!glassToReplaceContainsWindshield && !glassToReplaceContainsRearGlass) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
},
|
|
shouldDisplayTierTwoPackage() {
|
|
return this.frontWipersApplicableForTierTwo || this.rearWiperApplicableForTierTwo;
|
|
},
|
|
},
|
|
methods: {
|
|
processIfStatements,
|
|
getHeaderTextFromCms(cmsWidgetName) {
|
|
return this.getCmsContent(cmsWidgetName, "HeaderText");
|
|
},
|
|
getSubheaderTextFromCms(cmsWidgetName) {
|
|
return this.getCmsContent(cmsWidgetName, "SubheaderText");
|
|
},
|
|
getBodyTextFromCms(cmsWidgetName) {
|
|
const bodyText = this.getCmsContent(cmsWidgetName, "BodyText");
|
|
return this.processIfStatements(bodyText, "custom", this.getCustomValueFromString);
|
|
},
|
|
getFooterTextFromCms(cmsWidgetName) {
|
|
const footerText = this.getCmsContent(cmsWidgetName, "FooterText");
|
|
return this.processIfStatements(footerText, "custom", this.getCustomValueFromString);
|
|
},
|
|
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(this.nullSafeAvailableLineItems);
|
|
if (packageName === packageNames.TIER_TWO) {
|
|
priceFloat += this.getTierTwoPackageVapsPrice();
|
|
} else if (packageName === packageNames.TIER_THREE) {
|
|
priceFloat += this.getTierThreePackageVapsPrice();
|
|
}
|
|
return priceFloat;
|
|
},
|
|
getTierTwoPackageVapsPrice() {
|
|
let vapsPrice = 0;
|
|
const priceFrontWipers = this.frontWipersApplicableForTierTwo;
|
|
const priceRearWipers = this.rearWiperApplicableForTierTwo;
|
|
this.nullSafeAvailableLineItems.forEach((item) => {
|
|
if (
|
|
(priceFrontWipers &&
|
|
item.partType.toUpperCase() === partTypeStrings.FRONT_WIPER) ||
|
|
(priceRearWipers && item.partType.toUpperCase() === partTypeStrings.REAR_WIPER)
|
|
) {
|
|
vapsPrice += item.price;
|
|
}
|
|
});
|
|
return vapsPrice;
|
|
},
|
|
getTierThreePackageVapsPrice() {
|
|
let vapsPrice = 0;
|
|
const priceFrontWipers = this.frontWipersApplicableForTierThree;
|
|
const priceRearWipers = this.rearWiperApplicableForTierThree;
|
|
const priceRainDefense = this.rainDefenseApplicableForTierThree;
|
|
this.nullSafeAvailableLineItems.forEach((item) => {
|
|
if (
|
|
(priceFrontWipers &&
|
|
item.partType.toUpperCase() === partTypeStrings.FRONT_WIPER) ||
|
|
(priceRearWipers &&
|
|
item.partType.toUpperCase() === partTypeStrings.REAR_WIPER) ||
|
|
(priceRainDefense &&
|
|
item.partType.toUpperCase() === partTypeStrings.RAIN_DEFENSE)
|
|
) {
|
|
vapsPrice += item.price;
|
|
}
|
|
});
|
|
return vapsPrice;
|
|
},
|
|
selectDefaultPackage() {
|
|
const vapsFromStore = this.$store.getters.lineItems.vaps;
|
|
let lowestTierForPackage = packageNames.TIER_ONE;
|
|
vapsFromStore.every((vapsItem) => {
|
|
let lowestTierForThisItem = this.getLowestTierForThisItem(vapsItem);
|
|
if (lowestTierForThisItem === packageNames.TIER_THREE) {
|
|
lowestTierForPackage = packageNames.TIER_THREE;
|
|
return false;
|
|
} else if (lowestTierForThisItem === packageNames.TIER_TWO) {
|
|
lowestTierForPackage = packageNames.TIER_TWO;
|
|
return true;
|
|
} else {
|
|
return true;
|
|
}
|
|
});
|
|
this.selectedPackageName = lowestTierForPackage;
|
|
},
|
|
getLowestTierForThisItem(vapsItem) {
|
|
let lowestTierForThisItem = null;
|
|
switch (vapsItem.partType) {
|
|
case partTypeStrings.FRONT_WIPER:
|
|
if (this.frontWipersApplicableForTierThree) {
|
|
lowestTierForThisItem = packageNames.TIER_THREE;
|
|
}
|
|
if (this.frontWipersApplicableForTierTwo) {
|
|
lowestTierForThisItem = packageNames.TIER_TWO;
|
|
}
|
|
break;
|
|
case partTypeStrings.REAR_WIPER:
|
|
if (this.rearWiperApplicableForTierThree) {
|
|
lowestTierForThisItem = packageNames.TIER_THREE;
|
|
}
|
|
if (this.rearWiperApplicableForTierTwo) {
|
|
lowestTierForThisItem = packageNames.TIER_TWO;
|
|
}
|
|
break;
|
|
case partTypeStrings.RAIN_DEFENSE:
|
|
if (this.rainDefenseApplicableForTierThree) {
|
|
lowestTierForThisItem = packageNames.TIER_THREE;
|
|
}
|
|
break;
|
|
}
|
|
return lowestTierForThisItem;
|
|
},
|
|
getVapsLineItemsForSelectedPackage(packageName) {
|
|
const vapsLineItemsForSelectedPackage = [];
|
|
if (packageName === packageNames.TIER_TWO) {
|
|
if (this.frontWipersApplicableForTierTwo) {
|
|
vapsLineItemsForSelectedPackage.push(
|
|
...this.getLineItemsContainingPartType(partTypeStrings.FRONT_WIPER)
|
|
);
|
|
}
|
|
if (this.rearWiperApplicableForTierTwo) {
|
|
vapsLineItemsForSelectedPackage.push(
|
|
...this.getLineItemsContainingPartType(partTypeStrings.REAR_WIPER)
|
|
);
|
|
}
|
|
} else if (packageName === packageNames.TIER_THREE) {
|
|
if (this.frontWipersApplicableForTierThree) {
|
|
vapsLineItemsForSelectedPackage.push(
|
|
...this.getLineItemsContainingPartType(partTypeStrings.FRONT_WIPER)
|
|
);
|
|
}
|
|
if (this.rearWiperApplicableForTierThree) {
|
|
vapsLineItemsForSelectedPackage.push(
|
|
...this.getLineItemsContainingPartType(partTypeStrings.REAR_WIPER)
|
|
);
|
|
}
|
|
if (this.rainDefenseApplicableForTierThree) {
|
|
vapsLineItemsForSelectedPackage.push(
|
|
...this.getLineItemsContainingPartType(partTypeStrings.RAIN_DEFENSE)
|
|
);
|
|
}
|
|
}
|
|
return vapsLineItemsForSelectedPackage;
|
|
},
|
|
getCustomValueFromString(str) {
|
|
switch (str) {
|
|
case "isRecalibrationOnOrder":
|
|
return this.isRecalibrationOnOrder;
|
|
case "frontWipersApplicableForTierTwo":
|
|
return this.frontWipersApplicableForTierTwo;
|
|
case "rearWiperApplicableForTierTwo":
|
|
return this.rearWiperApplicableForTierTwo;
|
|
case "frontWipersApplicableForTierThree":
|
|
return this.frontWipersApplicableForTierThree;
|
|
case "rearWiperApplicableForTierThree":
|
|
return this.rearWiperApplicableForTierThree;
|
|
case "rainDefenseApplicableForTierThree":
|
|
return this.rainDefenseApplicableForTierThree;
|
|
default:
|
|
return null;
|
|
}
|
|
},
|
|
getLineItemsContainingPartType(partType) {
|
|
const partTypeMatches = this.nullSafeAvailableLineItems.filter(
|
|
(lineItem) => lineItem.partType.toUpperCase() === partType
|
|
);
|
|
return partTypeMatches;
|
|
},
|
|
lineItemsContainsPartType(partType) {
|
|
const partTypeMatches = this.getLineItemsContainingPartType(partType);
|
|
return !!partTypeMatches.length;
|
|
},
|
|
glassToReplaceContainsGlassLocation(glassLocation) {
|
|
const glassLocationMatches = this.$store.getters.order.damage.glassToReplace.filter(
|
|
(glassToReplace) => glassToReplace.glassLocation === glassLocation
|
|
);
|
|
return !!glassLocationMatches.length;
|
|
},
|
|
},
|
|
components: {
|
|
buttonQuestion,
|
|
},
|
|
};
|
|
</script>
|