Merge pull request #3120 from Safelite/feature/CASH-1689
CASH-1689: MSR fee in cart for insurance
This commit is contained in:
commit
74f4323c38
15 changed files with 336 additions and 7 deletions
|
|
@ -113,6 +113,7 @@ const storeActions = {
|
||||||
SAVE_IS_RECAL_ACKNOWLEDGED_FOR_SCHEDULING: "saveIsRecalAcknowledgedForScheduling",
|
SAVE_IS_RECAL_ACKNOWLEDGED_FOR_SCHEDULING: "saveIsRecalAcknowledgedForScheduling",
|
||||||
SAVE_IS_OEM_GLASS_SELECTED: "saveIsOemGlassSelected",
|
SAVE_IS_OEM_GLASS_SELECTED: "saveIsOemGlassSelected",
|
||||||
SAVE_IS_MSR_FEE_APPLICABLE: "saveIsMSRFeeApplicable",
|
SAVE_IS_MSR_FEE_APPLICABLE: "saveIsMSRFeeApplicable",
|
||||||
|
SAVE_IS_MSR_FEE_COVERED_BY_INSURANCE: "saveIsMSRFeeCoveredByInsurance",
|
||||||
|
|
||||||
CREATE_SUBMITTED_STATE: "createSubmittedState",
|
CREATE_SUBMITTED_STATE: "createSubmittedState",
|
||||||
RESET_SUBMITTED_STATE: "resetSubmittedState",
|
RESET_SUBMITTED_STATE: "resetSubmittedState",
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,7 @@ const storeMutations = {
|
||||||
UPDATE_IS_RECAL_ACKNOWLEDGED_FOR_SCHEDULING: "updateIsRecalAcknowledgedForScheduling",
|
UPDATE_IS_RECAL_ACKNOWLEDGED_FOR_SCHEDULING: "updateIsRecalAcknowledgedForScheduling",
|
||||||
UPDATE_IS_OEM_GLASS_SELECTED: "updateIsOemGlassSelected",
|
UPDATE_IS_OEM_GLASS_SELECTED: "updateIsOemGlassSelected",
|
||||||
UPDATE_IS_MSR_FEE_APPLICABLE: "updateIsMSRFeeApplicable",
|
UPDATE_IS_MSR_FEE_APPLICABLE: "updateIsMSRFeeApplicable",
|
||||||
|
UPDATE_IS_MSR_FEE_COVERED_BY_INSURANCE: "updateIsMSRFeeCoveredByInsurance",
|
||||||
UPDATE_CASH_PRICE_SUBTOTAL: "updateCashPriceSubTotal",
|
UPDATE_CASH_PRICE_SUBTOTAL: "updateCashPriceSubTotal",
|
||||||
|
|
||||||
// EVENT BUS MUTATIONS
|
// EVENT BUS MUTATIONS
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@
|
||||||
i % 2 == 0 ? 'even' : 'odd',
|
i % 2 == 0 ? 'even' : 'odd',
|
||||||
cartItem.isRemovable ? 'removable-cart-item' : '',
|
cartItem.isRemovable ? 'removable-cart-item' : '',
|
||||||
]">
|
]">
|
||||||
<span v-if="cartItem != recycleFeeCartItem">{{ cartItem.name }}</span>
|
<span v-if="!this.shouldShowInfoIcon(cartItem)">{{ cartItem.name }}</span>
|
||||||
<textLink
|
<textLink
|
||||||
v-if="allowItemRemoval && cartItem.isRemovable"
|
v-if="allowItemRemoval && cartItem.isRemovable"
|
||||||
ref="removeLink"
|
ref="removeLink"
|
||||||
|
|
@ -93,6 +93,15 @@
|
||||||
<img :src="infoIcon" alt="Info Icon" class="info-icon" />
|
<img :src="infoIcon" alt="Info Icon" class="info-icon" />
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
|
<span v-if="cartItem == msrFeeCartItem">
|
||||||
|
{{ msrFeeCartItem.name }}
|
||||||
|
<a
|
||||||
|
href="javascript:void(0)"
|
||||||
|
@click="openModal(msrModalCmsWidgetName)"
|
||||||
|
id="msr-fee-cartItem">
|
||||||
|
<img :src="infoIcon" alt="Info Icon" class="info-icon" />
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
<span
|
<span
|
||||||
v-if="
|
v-if="
|
||||||
!showCoverageAsVerified ||
|
!showCoverageAsVerified ||
|
||||||
|
|
@ -138,6 +147,10 @@
|
||||||
:pageName="pageName"
|
:pageName="pageName"
|
||||||
modalWidgetName="PromoModalWidget"
|
modalWidgetName="PromoModalWidget"
|
||||||
@promoAdded="saveVaps" />
|
@promoAdded="saveVaps" />
|
||||||
|
<removeMsrFeeModal
|
||||||
|
modalWidgetName="RemoveMsrFeeModalWidget"
|
||||||
|
ref="removeMsrFeeModal"
|
||||||
|
@switchToInshop="switchToInshop" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|
@ -153,6 +166,10 @@
|
||||||
<contentGroupModal ref="RecycleModal" cmsWidgetName="RecycleModal">
|
<contentGroupModal ref="RecycleModal" cmsWidgetName="RecycleModal">
|
||||||
<textBlock cmsWidgetName="RecycleTextBlock" />
|
<textBlock cmsWidgetName="RecycleTextBlock" />
|
||||||
</contentGroupModal>
|
</contentGroupModal>
|
||||||
|
<contentGroupModal
|
||||||
|
ref="MSRModal"
|
||||||
|
cmsWidgetName="MSRModal"
|
||||||
|
:customBodyText="msrModalTextBlock"></contentGroupModal>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
@ -162,6 +179,7 @@ import textLink from "@/ux-components/text-link/text-link";
|
||||||
import textBlock from "@/digital-components/text-block/text-block";
|
import textBlock from "@/digital-components/text-block/text-block";
|
||||||
import contentGroupModal from "@/fmg-components/content-group-modal/content-group-modal";
|
import contentGroupModal from "@/fmg-components/content-group-modal/content-group-modal";
|
||||||
import promoModalQuestion from "@/fmg-components/promo-modal-question/promo-modal-question";
|
import promoModalQuestion from "@/fmg-components/promo-modal-question/promo-modal-question";
|
||||||
|
import removeMsrFeeModal from "./remove-msr-fee-modal/remove-msr-fee-modal.vue";
|
||||||
|
|
||||||
// Mixins
|
// Mixins
|
||||||
import baseMixin from "@/mixins/base-mixin.js";
|
import baseMixin from "@/mixins/base-mixin.js";
|
||||||
|
|
@ -183,6 +201,7 @@ import {
|
||||||
getSalesTax,
|
getSalesTax,
|
||||||
getAmountDueWithDonation,
|
getAmountDueWithDonation,
|
||||||
} from "@/helpers/pricing-helper.js";
|
} from "@/helpers/pricing-helper.js";
|
||||||
|
import { formatToUSDollar } from "@/helpers/cms-content-helper";
|
||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
import { partTypeStrings } from "@/constants/part-type-strings";
|
import { partTypeStrings } from "@/constants/part-type-strings";
|
||||||
|
|
@ -191,6 +210,7 @@ import { cartItemTypes } from "@/constants/cart-item-types";
|
||||||
import { coverageStatus, cartItemTypesCoveredByInsurance } from "@/constants/insurance";
|
import { coverageStatus, cartItemTypesCoveredByInsurance } from "@/constants/insurance";
|
||||||
import { experimentSettings } from "@/constants/experiments";
|
import { experimentSettings } from "@/constants/experiments";
|
||||||
import { quotePageDiscountTable } from "@/constants/quote-page-discounts";
|
import { quotePageDiscountTable } from "@/constants/quote-page-discounts";
|
||||||
|
import { partNumberStrings } from "@/constants/part-number-strings";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "cart",
|
name: "cart",
|
||||||
|
|
@ -203,6 +223,7 @@ export default {
|
||||||
pageName: String,
|
pageName: String,
|
||||||
allowItemRemoval: Boolean,
|
allowItemRemoval: Boolean,
|
||||||
recyclingModalCmsWidgetName: String,
|
recyclingModalCmsWidgetName: String,
|
||||||
|
msrModalCmsWidgetName: String,
|
||||||
showAsPaid: Boolean,
|
showAsPaid: Boolean,
|
||||||
isInsurance: Boolean,
|
isInsurance: Boolean,
|
||||||
insuranceDeductible: Number,
|
insuranceDeductible: Number,
|
||||||
|
|
@ -214,6 +235,7 @@ export default {
|
||||||
isExpandedOnLoad: Boolean,
|
isExpandedOnLoad: Boolean,
|
||||||
isCollapsible: { type: Boolean, default: true },
|
isCollapsible: { type: Boolean, default: true },
|
||||||
isMSRFeeApplicable: Boolean,
|
isMSRFeeApplicable: Boolean,
|
||||||
|
IsMSRFeeCoveredByInsurance: Boolean,
|
||||||
donationCartItem: Object,
|
donationCartItem: Object,
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
|
|
@ -311,6 +333,10 @@ export default {
|
||||||
},
|
},
|
||||||
|
|
||||||
async removeItem(cartItemType, category) {
|
async removeItem(cartItemType, category) {
|
||||||
|
if (cartItemType == cartItemTypes.MOBILE_FEE && this.isMSRFeeApplicable) {
|
||||||
|
this.$refs.removeMsrFeeModal.openModal();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
this.lineItems[category] = this.lineItems[category].filter(
|
this.lineItems[category] = this.lineItems[category].filter(
|
||||||
(lineItemsToKeep) => lineItemsToKeep.cartItemType != cartItemType
|
(lineItemsToKeep) => lineItemsToKeep.cartItemType != cartItemType
|
||||||
);
|
);
|
||||||
|
|
@ -375,6 +401,12 @@ export default {
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
},
|
},
|
||||||
|
shouldShowInfoIcon(cartItem) {
|
||||||
|
return cartItem == this.recycleFeeCartItem || cartItem == this.msrFeeCartItem;
|
||||||
|
},
|
||||||
|
switchToInshop() {
|
||||||
|
this.$emit("switchToInshop");
|
||||||
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isCartReadyToLoad() {
|
isCartReadyToLoad() {
|
||||||
|
|
@ -490,6 +522,10 @@ export default {
|
||||||
cartItems.push(this.mobileFeeCartItem);
|
cartItems.push(this.mobileFeeCartItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.msrFeeCartItem) {
|
||||||
|
cartItems.push(this.msrFeeCartItem);
|
||||||
|
}
|
||||||
|
|
||||||
if (this.quotePageDiscountCartItem) {
|
if (this.quotePageDiscountCartItem) {
|
||||||
cartItems.push(this.quotePageDiscountCartItem);
|
cartItems.push(this.quotePageDiscountCartItem);
|
||||||
}
|
}
|
||||||
|
|
@ -892,7 +928,9 @@ export default {
|
||||||
let cartItem = null;
|
let cartItem = null;
|
||||||
let showMobileFeeCartItem = false;
|
let showMobileFeeCartItem = false;
|
||||||
const mobileFeeLineItem = this.supportingItems.find(
|
const mobileFeeLineItem = this.supportingItems.find(
|
||||||
(lineItem) => lineItem.partType == partTypeStrings.MOBILE_FEE
|
(lineItem) =>
|
||||||
|
lineItem.partType == partTypeStrings.MOBILE_FEE &&
|
||||||
|
lineItem.partNumber == partTypeStrings.MOBILE_FEE
|
||||||
);
|
);
|
||||||
|
|
||||||
var mobileTotal =
|
var mobileTotal =
|
||||||
|
|
@ -929,6 +967,67 @@ export default {
|
||||||
}
|
}
|
||||||
return cartItem;
|
return cartItem;
|
||||||
},
|
},
|
||||||
|
msrFeeCartItemName() {
|
||||||
|
return this.getCmsContent("MSRFeeTextWidget", "Text");
|
||||||
|
},
|
||||||
|
getMsrFeeLineItem() {
|
||||||
|
return this.supportingItems.find(
|
||||||
|
(lineItem) =>
|
||||||
|
lineItem.partType == partTypeStrings.MOBILE_FEE &&
|
||||||
|
lineItem.partNumber == partNumberStrings.MOBILE_STATIC_RECAL_FEE
|
||||||
|
);
|
||||||
|
},
|
||||||
|
msrFeeCartItem() {
|
||||||
|
let cartItem = null;
|
||||||
|
const msrFeeLineItem = this.getMsrFeeLineItem;
|
||||||
|
const shouldCreateMsrFeeCartItem =
|
||||||
|
this.isInsurance &&
|
||||||
|
!this.IsMSRFeeCoveredByInsurance &&
|
||||||
|
msrFeeLineItem &&
|
||||||
|
this.msrFeeAmount > 0;
|
||||||
|
|
||||||
|
if (shouldCreateMsrFeeCartItem) {
|
||||||
|
cartItem = {
|
||||||
|
name: this.msrFeeCartItemName,
|
||||||
|
category: cartItemCategories.SUPPORTING_ITEMS,
|
||||||
|
cartItemType: cartItemTypes.MOBILE_FEE,
|
||||||
|
isDisplayed: this.isInsurance,
|
||||||
|
isRemovable: true,
|
||||||
|
subTotal: 0,
|
||||||
|
salesTax: 0,
|
||||||
|
lineItems: [],
|
||||||
|
isCoveredByInsurance: this.IsMSRFeeCoveredByInsurance,
|
||||||
|
};
|
||||||
|
msrFeeLineItem.cartItemType = cartItem.cartItemType;
|
||||||
|
cartItem.lineItems.push(msrFeeLineItem);
|
||||||
|
cartItem.subTotal += this.msrFeeAmount;
|
||||||
|
cartItem.salesTax += msrFeeLineItem.salesTax ?? 0;
|
||||||
|
}
|
||||||
|
return cartItem;
|
||||||
|
},
|
||||||
|
msrFeeAmount() {
|
||||||
|
const msrFeeLineItem = this.getMsrFeeLineItem;
|
||||||
|
if (!msrFeeLineItem) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
msrFeeLineItem.laborAmount + msrFeeLineItem.sellingPrice + msrFeeLineItem.kitPrice
|
||||||
|
);
|
||||||
|
},
|
||||||
|
msrModalTextBlock() {
|
||||||
|
let cmsContentText = this.getCmsContent("MSRModal", "BodyText");
|
||||||
|
if (cmsContentText) {
|
||||||
|
cmsContentText = cmsContentText.replaceAll(
|
||||||
|
"{custom:mobileFee}",
|
||||||
|
formatToUSDollar(this.msrFeeAmount)
|
||||||
|
);
|
||||||
|
cmsContentText = cmsContentText.replaceAll(
|
||||||
|
"{custom:submittedOrder.policy.insuranceCompanyName}",
|
||||||
|
this.insuranceCompanyName
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return cmsContentText;
|
||||||
|
},
|
||||||
quotePageDiscountCartItemName() {
|
quotePageDiscountCartItemName() {
|
||||||
return this.getCmsContent("ServicePackageDiscountTextWidget", "Text");
|
return this.getCmsContent("ServicePackageDiscountTextWidget", "Text");
|
||||||
},
|
},
|
||||||
|
|
@ -1189,6 +1288,7 @@ export default {
|
||||||
textLink,
|
textLink,
|
||||||
contentGroupModal,
|
contentGroupModal,
|
||||||
promoModalQuestion,
|
promoModalQuestion,
|
||||||
|
removeMsrFeeModal,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
@ -1289,6 +1389,10 @@ export default {
|
||||||
order: 3;
|
order: 3;
|
||||||
margin-right: 100%;
|
margin-right: 100%;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
|
||||||
|
&#msr-fee-cartItem {
|
||||||
|
margin: 0 0 0 0.2rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.package-type,
|
.package-type,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
<template>
|
||||||
|
<div id="msr-fee-modal-container">
|
||||||
|
<modal
|
||||||
|
:ref="modalName"
|
||||||
|
:headerText="modalHeaderText"
|
||||||
|
suppressPageScroll
|
||||||
|
:onModalClosedCallback="onModalClosed"
|
||||||
|
:footerButtonText="modalFooterText"
|
||||||
|
:isFooterButtonPrimary="true"
|
||||||
|
@footer-button-event="switchToInshop"
|
||||||
|
@isModalOpened="setIsModalOpen">
|
||||||
|
<p class="modal-body-inner" v-html="modalBodyText"></p>
|
||||||
|
<template v-slot:modal-header-slot>
|
||||||
|
<span>{{ modalSubHeaderText }}</span>
|
||||||
|
</template>
|
||||||
|
<template v-slot:modal-footer-slot>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn btn-link"
|
||||||
|
id="cancel-button"
|
||||||
|
:disabled="isLoading"
|
||||||
|
@click="closeModal">
|
||||||
|
{{ buttonText }}
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Supporting files
|
||||||
|
import modal from "@/digital-components/modal/modal";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "remove-msr-fee-modal",
|
||||||
|
props: {
|
||||||
|
cmsWidgetName: String,
|
||||||
|
modalWidgetName: String,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isModalOpen: false,
|
||||||
|
switchedToInshop: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
openModal() {
|
||||||
|
this.modal.openModal();
|
||||||
|
},
|
||||||
|
onModalClosed() {
|
||||||
|
this.$emit("close-remove-msr-fee-modal");
|
||||||
|
this.switchedToInshop = false;
|
||||||
|
},
|
||||||
|
closeModal() {
|
||||||
|
this.modal.closeModal();
|
||||||
|
},
|
||||||
|
getIsModalOpen() {
|
||||||
|
return this.isModalOpen;
|
||||||
|
},
|
||||||
|
setIsModalOpen(isOpen) {
|
||||||
|
this.isModalOpen = isOpen;
|
||||||
|
},
|
||||||
|
switchToInshop() {
|
||||||
|
this.switchedToInshop = true;
|
||||||
|
this.$emit("switchToInshop");
|
||||||
|
this.modal.closeModal();
|
||||||
|
},
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
modalName() {
|
||||||
|
return this.modalWidgetName;
|
||||||
|
},
|
||||||
|
modal() {
|
||||||
|
return this.$refs[this.modalName];
|
||||||
|
},
|
||||||
|
modalSubHeaderText() {
|
||||||
|
return this.getCmsContent(this.modalWidgetName, "SubheaderText");
|
||||||
|
},
|
||||||
|
modalHeaderText() {
|
||||||
|
return this.getCmsContent(this.modalWidgetName, "HeaderText");
|
||||||
|
},
|
||||||
|
modalBodyText() {
|
||||||
|
return this.getCmsContent(this.modalWidgetName, "BodyText");
|
||||||
|
},
|
||||||
|
modalFooterText() {
|
||||||
|
return this.getCmsContent(this.modalWidgetName, "FooterText");
|
||||||
|
},
|
||||||
|
buttonText() {
|
||||||
|
return this.getCmsContent(this.modalWidgetName, "FooterText2");
|
||||||
|
},
|
||||||
|
},
|
||||||
|
components: { modal },
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
#msr-fee-modal-container {
|
||||||
|
.modal-component {
|
||||||
|
@include media-breakpoint-up(md) {
|
||||||
|
.modal-dialog {
|
||||||
|
left: 0;
|
||||||
|
align-content: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
width: 22.063rem;
|
||||||
|
transform: translate(0, 0);
|
||||||
|
|
||||||
|
.modal-content {
|
||||||
|
border-radius: $border-radius-lg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.modal-dialog {
|
||||||
|
.modal-content {
|
||||||
|
.modal-header {
|
||||||
|
flex-direction: column;
|
||||||
|
& > span {
|
||||||
|
color: $red;
|
||||||
|
font-size: $font-size-14;
|
||||||
|
font-weight: $font-weight-600;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-title {
|
||||||
|
font-size: $font-size-20;
|
||||||
|
font-weight: $font-weight-normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.modal-body {
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
|
||||||
|
.modal-body-inner {
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
padding: 1rem;
|
||||||
|
background-color: #f4f4f4;
|
||||||
|
font-size: $font-size-14;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.modal-footer {
|
||||||
|
flex-flow: wrap-reverse;
|
||||||
|
|
||||||
|
#cancel-button {
|
||||||
|
width: 100%;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-top: 1.5rem;
|
||||||
|
font-weight: $font-weight-600;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -26,6 +26,7 @@ export default {
|
||||||
name: "content-group-modal",
|
name: "content-group-modal",
|
||||||
props: {
|
props: {
|
||||||
cmsWidgetName: String,
|
cmsWidgetName: String,
|
||||||
|
customBodyText: String,
|
||||||
footerButtonActionName: {
|
footerButtonActionName: {
|
||||||
type: String,
|
type: String,
|
||||||
default: null,
|
default: null,
|
||||||
|
|
@ -43,6 +44,9 @@ export default {
|
||||||
return this.getCmsContent(this.cmsWidgetName, "SubheaderText");
|
return this.getCmsContent(this.cmsWidgetName, "SubheaderText");
|
||||||
},
|
},
|
||||||
ModalBodyText() {
|
ModalBodyText() {
|
||||||
|
if (this.customBodyText) {
|
||||||
|
return this.customBodyText;
|
||||||
|
}
|
||||||
return this.getCmsContent(this.cmsWidgetName, "BodyText");
|
return this.getCmsContent(this.cmsWidgetName, "BodyText");
|
||||||
},
|
},
|
||||||
ModalSubBodyText() {
|
ModalSubBodyText() {
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import store from "@/store";
|
||||||
import { storeActions } from "@/constants/store-actions";
|
import { storeActions } from "@/constants/store-actions";
|
||||||
import baseMixin from "@/mixins/base-mixin.js";
|
import baseMixin from "@/mixins/base-mixin.js";
|
||||||
import { deepClone } from "@/helpers/object-helper";
|
import { deepClone } from "@/helpers/object-helper";
|
||||||
|
import { partNumberStrings } from "@/constants/part-number-strings";
|
||||||
|
|
||||||
export function getDisplayAmountDue(lineItemsObject, includeTax = true) {
|
export function getDisplayAmountDue(lineItemsObject, includeTax = true) {
|
||||||
return getAmountDue(lineItemsObject, includeTax).toLocaleString("en-US", {
|
return getAmountDue(lineItemsObject, includeTax).toLocaleString("en-US", {
|
||||||
|
|
@ -32,6 +33,10 @@ export function getAmountDue(lineItemsObject, includeTax = true) {
|
||||||
|
|
||||||
if (store.getters.coverageIsVerified && !order.policy.isNoComp && !order.policy.isItac) {
|
if (store.getters.coverageIsVerified && !order.policy.isNoComp && !order.policy.isItac) {
|
||||||
amountDue = order.policy.currentDeductible;
|
amountDue = order.policy.currentDeductible;
|
||||||
|
|
||||||
|
if (order.isMSRFeeApplicable && !order.isMSRFeeCoveredByInsurance) {
|
||||||
|
amountDue += getMSRFeePartPrice(lineItemsObject?.supportingItems, includeTax);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lineItemsObject?.vaps) {
|
if (lineItemsObject?.vaps) {
|
||||||
|
|
@ -100,6 +105,20 @@ export async function getPricingByDayPartWithPrice(pageNameToLog) {
|
||||||
return pricingResults[0];
|
return pricingResults[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getMSRFeePartPrice(supportingItems, includeTax) {
|
||||||
|
let msrFeePrice = 0;
|
||||||
|
const msrFeeLineItem = supportingItems?.find(
|
||||||
|
(lineItem) => lineItem.partNumber === partNumberStrings.MOBILE_STATIC_RECAL_FEE
|
||||||
|
);
|
||||||
|
if (msrFeeLineItem) {
|
||||||
|
msrFeePrice = baseMixin?.methods?.getTotalPriceOfAllLineItemsAndChildParts(
|
||||||
|
[msrFeeLineItem],
|
||||||
|
includeTax
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return msrFeePrice;
|
||||||
|
}
|
||||||
|
|
||||||
export function addPricesToLineItems(lineItems, pricingLineItems) {
|
export function addPricesToLineItems(lineItems, pricingLineItems) {
|
||||||
lineItems.forEach((lineItem) => {
|
lineItems.forEach((lineItem) => {
|
||||||
const lineItemIndex = pricingLineItems.findIndex(
|
const lineItemIndex = pricingLineItems.findIndex(
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@
|
||||||
:showAsPaid="isPia"
|
:showAsPaid="isPia"
|
||||||
servicePackageOptionsCmsName="ServicePackageTitle"
|
servicePackageOptionsCmsName="ServicePackageTitle"
|
||||||
recyclingModalCmsWidgetName="RecycleModal"
|
recyclingModalCmsWidgetName="RecycleModal"
|
||||||
|
msrModalCmsWidgetName="MSRModal"
|
||||||
:isInsurance="isInsurance"
|
:isInsurance="isInsurance"
|
||||||
:insuranceDeductible="currentDeductible"
|
:insuranceDeductible="currentDeductible"
|
||||||
:insuranceCompanyName="insuranceCompanyName"
|
:insuranceCompanyName="insuranceCompanyName"
|
||||||
|
|
@ -70,7 +71,8 @@
|
||||||
:isItac="isItac"
|
:isItac="isItac"
|
||||||
:isNoComp="isNoComp"
|
:isNoComp="isNoComp"
|
||||||
:isExpandedOnLoad="false"
|
:isExpandedOnLoad="false"
|
||||||
:isMSRFeeApplicable="isMSRFeeApplicable" />
|
:isMSRFeeApplicable="isMSRFeeApplicable"
|
||||||
|
:IsMSRFeeCoveredByInsurance="isMSRFeeCoveredByInsurance" />
|
||||||
|
|
||||||
<hr class="mb-5" />
|
<hr class="mb-5" />
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -419,6 +421,9 @@ export default {
|
||||||
isMSRFeeApplicable() {
|
isMSRFeeApplicable() {
|
||||||
return this.submittedOrder?.isMSRFeeApplicable;
|
return this.submittedOrder?.isMSRFeeApplicable;
|
||||||
},
|
},
|
||||||
|
isMSRFeeCoveredByInsurance() {
|
||||||
|
return this.submittedOrder?.isMSRFeeCoveredByInsurance;
|
||||||
|
},
|
||||||
isInsurance() {
|
isInsurance() {
|
||||||
return this.submittedOrder?.payment?.isInsurance;
|
return this.submittedOrder?.payment?.isInsurance;
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
v-model="lineItems"
|
v-model="lineItems"
|
||||||
servicePackageOptionsCmsName="ServicePackageTitle"
|
servicePackageOptionsCmsName="ServicePackageTitle"
|
||||||
recyclingModalCmsWidgetName="RecycleModal"
|
recyclingModalCmsWidgetName="RecycleModal"
|
||||||
|
msrModalCmsWidgetName="MSRModal"
|
||||||
:isInsurance="isInsurance"
|
:isInsurance="isInsurance"
|
||||||
:insuranceDeductible="currentDeductible"
|
:insuranceDeductible="currentDeductible"
|
||||||
:insuranceCompanyName="insuranceCompanyName"
|
:insuranceCompanyName="insuranceCompanyName"
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
pageName="payment-method"
|
pageName="payment-method"
|
||||||
servicePackageOptionsCmsName="ServicePackageTitle"
|
servicePackageOptionsCmsName="ServicePackageTitle"
|
||||||
recyclingModalCmsWidgetName="RecycleModal"
|
recyclingModalCmsWidgetName="RecycleModal"
|
||||||
|
msrModalCmsWidgetName="MSRModal"
|
||||||
:isInsurance="isInsurance"
|
:isInsurance="isInsurance"
|
||||||
:insuranceDeductible="currentDeductible"
|
:insuranceDeductible="currentDeductible"
|
||||||
:insuranceCompanyName="insuranceCompanyName"
|
:insuranceCompanyName="insuranceCompanyName"
|
||||||
|
|
@ -35,7 +36,9 @@
|
||||||
:isNoComp="isNoComp"
|
:isNoComp="isNoComp"
|
||||||
:isExpandedOnLoad="false"
|
:isExpandedOnLoad="false"
|
||||||
:isMSRFeeApplicable="isMSRFeeApplicable"
|
:isMSRFeeApplicable="isMSRFeeApplicable"
|
||||||
@itemRemoved="evaluatePromosAndTaxItemsOnOrder" />
|
:IsMSRFeeCoveredByInsurance="isMSRFeeCoveredByInsurance"
|
||||||
|
@itemRemoved="evaluatePromosAndTaxItemsOnOrder"
|
||||||
|
@switchToInshop="navigateToSchedulePage" />
|
||||||
|
|
||||||
<afterpayBreakout
|
<afterpayBreakout
|
||||||
v-if="isAfterpayBreakoutDisplay"
|
v-if="isAfterpayBreakoutDisplay"
|
||||||
|
|
@ -214,6 +217,7 @@ export default {
|
||||||
name: "paymentMethod",
|
name: "paymentMethod",
|
||||||
props: {
|
props: {
|
||||||
recyclingModalCmsWidgetName: String,
|
recyclingModalCmsWidgetName: String,
|
||||||
|
msrModalCmsWidgetName: String,
|
||||||
},
|
},
|
||||||
async beforeRouteEnter(to, from, next) {
|
async beforeRouteEnter(to, from, next) {
|
||||||
// Call APIs
|
// Call APIs
|
||||||
|
|
@ -607,6 +611,13 @@ export default {
|
||||||
openModal(modalName) {
|
openModal(modalName) {
|
||||||
this.$refs[modalName].openModal();
|
this.$refs[modalName].openModal();
|
||||||
},
|
},
|
||||||
|
async navigateToSchedulePage() {
|
||||||
|
this.$refs.loadingModal.showModal();
|
||||||
|
this.$router.navigateWithSaving(
|
||||||
|
this.navigationScenarios.CLICKED_SWITCH_TO_INSHOP,
|
||||||
|
this.pageName
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
AppointmentType() {
|
AppointmentType() {
|
||||||
|
|
@ -682,6 +693,9 @@ export default {
|
||||||
isMSRFeeApplicable() {
|
isMSRFeeApplicable() {
|
||||||
return this.$store.getters.order.isMSRFeeApplicable;
|
return this.$store.getters.order.isMSRFeeApplicable;
|
||||||
},
|
},
|
||||||
|
isMSRFeeCoveredByInsurance() {
|
||||||
|
return this.$store.getters.order.isMSRFeeCoveredByInsurance;
|
||||||
|
},
|
||||||
isInsurance() {
|
isInsurance() {
|
||||||
return this.hasSubmittedOrder()
|
return this.hasSubmittedOrder()
|
||||||
? this.getSubmittedOrder()?.payment.isInsurance
|
? this.getSubmittedOrder()?.payment.isInsurance
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@
|
||||||
v-model="lineItems"
|
v-model="lineItems"
|
||||||
servicePackageOptionsCmsName="ServicePackageTitle"
|
servicePackageOptionsCmsName="ServicePackageTitle"
|
||||||
recyclingModalCmsWidgetName="RecycleModal"
|
recyclingModalCmsWidgetName="RecycleModal"
|
||||||
|
msrModalCmsWidgetName="MSRModal"
|
||||||
:isInsurance="isInsurance"
|
:isInsurance="isInsurance"
|
||||||
:insuranceDeductible="currentDeductible"
|
:insuranceDeductible="currentDeductible"
|
||||||
:insuranceCompanyName="insuranceCompanyName"
|
:insuranceCompanyName="insuranceCompanyName"
|
||||||
|
|
|
||||||
|
|
@ -1173,6 +1173,13 @@ export default {
|
||||||
isMSRFeeApplicable
|
isMSRFeeApplicable
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
updateAndSaveIsMSRFeeCoveredByInsurance() {
|
||||||
|
const isMSRFeeCoveredByInsurance = this.mobileFeePart?.isInsurable;
|
||||||
|
this.dispatchStoreAction(
|
||||||
|
this.storeActions.SAVE_IS_MSR_FEE_COVERED_BY_INSURANCE,
|
||||||
|
isMSRFeeCoveredByInsurance
|
||||||
|
);
|
||||||
|
},
|
||||||
updateAndSaveSupportingItems() {
|
updateAndSaveSupportingItems() {
|
||||||
let supportingItems = store.getters.lineItems.supportingItems;
|
let supportingItems = store.getters.lineItems.supportingItems;
|
||||||
let shouldSaveSupportingItems = false;
|
let shouldSaveSupportingItems = false;
|
||||||
|
|
@ -1528,6 +1535,7 @@ export default {
|
||||||
|
|
||||||
this.updateAndSaveSupportingItems();
|
this.updateAndSaveSupportingItems();
|
||||||
this.updateAndSaveIsMSRFeeApplicable();
|
this.updateAndSaveIsMSRFeeApplicable();
|
||||||
|
this.updateAndSaveIsMSRFeeCoveredByInsurance();
|
||||||
|
|
||||||
this.updateSupportingItems();
|
this.updateSupportingItems();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,7 @@ export default {
|
||||||
if (!currentPageName) {
|
if (!currentPageName) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder();
|
const hasSubmittedOrder = baseMixin.methods.hasSubmittedOrder();
|
||||||
const submittedOrder = baseMixin.methods.getSubmittedOrder();
|
const submittedOrder = baseMixin.methods.getSubmittedOrder();
|
||||||
const order = hasSubmittedOrder ? submittedOrder : store.getters.order;
|
const order = hasSubmittedOrder ? submittedOrder : store.getters.order;
|
||||||
|
|
@ -934,7 +934,9 @@ function getPageNameFromRouter(useDefaultUrl = false) {
|
||||||
return router.currentRoute.value.name;
|
return router.currentRoute.value.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
return useDefaultUrl ? window.location.search : window.location.href.replace(/\/$/, "").split("/").pop();
|
return useDefaultUrl
|
||||||
|
? window.location.search
|
||||||
|
: window.location.href.replace(/\/$/, "").split("/").pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getValueToLog(value, valueToLogType) {
|
function getValueToLog(value, valueToLogType) {
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ const navigationScenarios = {
|
||||||
CLICKED_PAY_NOW: "CLICKED_PAY_NOW",
|
CLICKED_PAY_NOW: "CLICKED_PAY_NOW",
|
||||||
CLICKED_PAY_NOW_ADYEN: "CLICKED_PAY_NOW_ADYEN",
|
CLICKED_PAY_NOW_ADYEN: "CLICKED_PAY_NOW_ADYEN",
|
||||||
CLICKED_PAY_LATER: "CLICKED_PAY_LATER",
|
CLICKED_PAY_LATER: "CLICKED_PAY_LATER",
|
||||||
|
CLICKED_SWITCH_TO_INSHOP: "CLICKED_SWITCH_TO_INSHOP",
|
||||||
PIA_ERROR: "PIA_ERROR",
|
PIA_ERROR: "PIA_ERROR",
|
||||||
PIA_CC_ERROR: "PIA_CC_ERROR",
|
PIA_CC_ERROR: "PIA_CC_ERROR",
|
||||||
PIA_APPLE_ERROR: "PIA_APPLE_ERROR",
|
PIA_APPLE_ERROR: "PIA_APPLE_ERROR",
|
||||||
|
|
|
||||||
|
|
@ -553,6 +553,10 @@ const routingTable = function () {
|
||||||
scenario: navigationScenarios.CLICKED_INSURANCE,
|
scenario: navigationScenarios.CLICKED_INSURANCE,
|
||||||
destinationPageData: routeData.INSURANCE_COMPANY,
|
destinationPageData: routeData.INSURANCE_COMPANY,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
scenario: navigationScenarios.CLICKED_SWITCH_TO_INSHOP,
|
||||||
|
destinationPageData: routeData.SCHEDULE,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,7 @@ const getDefaultState = () => {
|
||||||
isRecalAckOptIn: false,
|
isRecalAckOptIn: false,
|
||||||
isRecalAcknowledgedForScheduling: "",
|
isRecalAcknowledgedForScheduling: "",
|
||||||
isMSRFeeApplicable: false,
|
isMSRFeeApplicable: false,
|
||||||
|
isMSRFeeCoveredByInsurance: false,
|
||||||
},
|
},
|
||||||
applicationUser: {
|
applicationUser: {
|
||||||
eventBus: [],
|
eventBus: [],
|
||||||
|
|
@ -359,6 +360,9 @@ export const mutations = {
|
||||||
updateIsMSRFeeApplicable(state, isMSRFeeApplicable) {
|
updateIsMSRFeeApplicable(state, isMSRFeeApplicable) {
|
||||||
state.order.isMSRFeeApplicable = isMSRFeeApplicable;
|
state.order.isMSRFeeApplicable = isMSRFeeApplicable;
|
||||||
},
|
},
|
||||||
|
updateIsMSRFeeCoveredByInsurance(state, isMSRFeeCoveredByInsurance) {
|
||||||
|
state.order.isMSRFeeCoveredByInsurance = isMSRFeeCoveredByInsurance;
|
||||||
|
},
|
||||||
updateCashPriceSubTotal(state, cashPriceSubTotal) {
|
updateCashPriceSubTotal(state, cashPriceSubTotal) {
|
||||||
state.order.cashPriceSubTotal =
|
state.order.cashPriceSubTotal =
|
||||||
cashPriceSubTotal === "" ? null : cashPriceSubTotal.toString();
|
cashPriceSubTotal === "" ? null : cashPriceSubTotal.toString();
|
||||||
|
|
@ -1630,7 +1634,6 @@ export const actions = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
logFmgSessionData(
|
logFmgSessionData(
|
||||||
context,
|
context,
|
||||||
{
|
{
|
||||||
|
|
@ -2581,6 +2584,7 @@ export const actions = {
|
||||||
lockToken: order.lockToken,
|
lockToken: order.lockToken,
|
||||||
isRecalAckOptIn: order.isRecalAckOptIn,
|
isRecalAckOptIn: order.isRecalAckOptIn,
|
||||||
isMSRFeeApplicable: order.isMSRFeeApplicable,
|
isMSRFeeApplicable: order.isMSRFeeApplicable,
|
||||||
|
isMSRFeeCoveredByInsurance: order.isMSRFeeCoveredByInsurance,
|
||||||
cashPriceSubTotal: order.cashPriceSubTotal,
|
cashPriceSubTotal: order.cashPriceSubTotal,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -3013,6 +3017,13 @@ export const actions = {
|
||||||
context.commit(storeMutations.UPDATE_IS_MSR_FEE_APPLICABLE, isMSRFeeApplicable);
|
context.commit(storeMutations.UPDATE_IS_MSR_FEE_APPLICABLE, isMSRFeeApplicable);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
saveIsMSRFeeCoveredByInsurance(context, isMSRFeeCoveredByInsurance) {
|
||||||
|
context.commit(
|
||||||
|
storeMutations.UPDATE_IS_MSR_FEE_COVERED_BY_INSURANCE,
|
||||||
|
isMSRFeeCoveredByInsurance
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
saveParentAccountNumber(context, parentAccountNumber) {
|
saveParentAccountNumber(context, parentAccountNumber) {
|
||||||
context.commit(storeMutations.UPDATE_PARENT_ACCT_NUMBER, parentAccountNumber);
|
context.commit(storeMutations.UPDATE_PARENT_ACCT_NUMBER, parentAccountNumber);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue