Merge branch 'develop' into feature/CSR-1809

This commit is contained in:
CarlNation 2023-11-20 14:47:05 -05:00
commit ac20a48504
9 changed files with 110 additions and 31 deletions

View file

@ -89,22 +89,46 @@ export default {
// Call APIs // Call APIs
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_WIPERS,
{
serviceZipCode: store.getters.submittedOrder.serviceLocation.zipCode,
carId: store.getters.submittedOrder.vehicle.carId,
},
"confirmation"
);
const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_RAIN_DEFENSE,
null,
"confirmation"
);
// Settle promises and get results // Settle promises and get results
const promiseResultMap = [ const promiseResultMap = [
{ {
resultKey: "cmsContent", resultKey: "cmsContent",
promise: cmsContentPromise, promise: cmsContentPromise,
}, },
{
resultKey: "wipers",
promise: wipersPromise,
},
{
resultKey: "rainDefense",
promise: rainDefensePromise,
},
]; ];
const resultMap = await settleAllPromises(promiseResultMap); const resultMap = await settleAllPromises(promiseResultMap);
const availableVaps = [resultMap.rainDefense, ...resultMap.wipers];
const lineItemsFromSubmittedOrder = deepClone(store.getters.submittedOrder.lineItems); const lineItemsFromSubmittedOrder = deepClone(store.getters.submittedOrder.lineItems);
// Call the "next" function to complete the transition to this page. // Call the "next" function to complete the transition to this page.
next((vm) => { next((vm) => {
vm.setCmsContent(resultMap.cmsContent); vm.setCmsContent(resultMap.cmsContent);
vm.lineItems = lineItemsFromSubmittedOrder; vm.lineItems = lineItemsFromSubmittedOrder;
vm.vaps = lineItemsFromSubmittedOrder.vaps; vm.vaps = availableVaps;
}); });
}, },
data() { data() {
@ -231,7 +255,7 @@ export default {
return store.getters.submittedOrder?.vehicle.imageUrl; return store.getters.submittedOrder?.vehicle.imageUrl;
}, },
damageInfo() { damageInfo() {
return store.getters.damage; return store.getters.submittedOrder.damage;
}, },
isPia() { isPia() {
return store.getters.submittedOrder?.payment.isPia; return store.getters.submittedOrder?.payment.isPia;

View file

@ -123,7 +123,10 @@ export default {
const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_WIPERS, storeActions.GET_WIPERS,
null, {
serviceZipCode: store.getters.order.serviceLocation.zipCode,
carId: store.getters.vehicle.carId,
},
"payment-method" "payment-method"
); );

View file

@ -25,6 +25,7 @@
<hr /> <hr />
<cart <cart
ref="cart"
:damage="damageInfo" :damage="damageInfo"
:availableVaps="availableVaps" :availableVaps="availableVaps"
:allowItemRemoval="false" :allowItemRemoval="false"
@ -227,7 +228,7 @@ export default {
invoiceNumber: this.getInvoiceNumber(), invoiceNumber: this.getInvoiceNumber(),
totalAmount: this.getAmountDue(), totalAmount: this.getAmountDue(),
displayAmount: this.getDisplayAmountDue(), displayAmount: this.getDisplayAmountDue(),
piaLineItems: this.getPiaLineItems(), piaLineItems: "",
paypalPayment: this.isPaypal(), paypalPayment: this.isPaypal(),
lineItems: [], lineItems: [],
availableVaps: [], availableVaps: [],
@ -257,7 +258,10 @@ export default {
const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_WIPERS, storeActions.GET_WIPERS,
null, {
serviceZipCode: store.getters.order.serviceLocation.zipCode,
carId: store.getters.vehicle.carId,
},
"payment" "payment"
); );
@ -357,11 +361,18 @@ export default {
// Call the "next" function to complete the transition to this page. // Call the "next" function to complete the transition to this page.
next(async (vm) => { next(async (vm) => {
vm.setCmsContent(resultMap.cmsContent); vm.setCmsContent(resultMap.cmsContent);
vm.fetchSignatureInfo(resultMap.signature);
vm.setIFrameListener();
vm.availableVaps = taxedVaps; vm.availableVaps = taxedVaps;
vm.lineItems = lineItems; vm.lineItems = lineItems;
vm.$nextTick(() => {
if (vm.$refs.cart) {
const cartItems = vm.$refs.cart.cartItems;
vm.getPiaLineItems(cartItems);
}
vm.fetchSignatureInfo(resultMap.signature);
vm.setIFrameListener();
});
}); });
}, },
computed: { computed: {
@ -506,27 +517,23 @@ export default {
return store.getters.payment.piaType; return store.getters.payment.piaType;
} }
}, },
getPiaLineItems() { getPiaLineItems(cartItems) {
const itemMap = new Map();
const glassParts = store.getters.order.lineItems.glassParts; const glassParts = store.getters.order.lineItems.glassParts;
const supportingItems = store.getters.order.lineItems.supportingItems; let lineItems = [];
const vaps = store.getters.order.lineItems.vaps;
const items = [...(glassParts ?? []), ...(supportingItems ?? []), ...(vaps ?? [])];
for (const item of items) { if (glassParts === null) {
const amount = item.laborAmount + item.sellingPrice; lineItems = ["Labor|0|1", "Repair supplies|0|1"];
const key = `${item.partType}|${amount}`; } else {
lineItems = ["Parts and labor|0|1"];
if (itemMap.has(key)) {
itemMap.get(key).quantity++;
} else {
itemMap.set(key, { partType: item.partType, amount, quantity: 1 });
}
} }
return Array.from(itemMap.values()) cartItems.forEach((item) => {
.map((item) => `${item.partType}|${item.amount}|${item.quantity}`) if (item.name !== null) {
.join("||"); lineItems.push(`${item.name}|${(item.salesTax + item.subTotal).toFixed(2)}|1`);
}
});
this.piaLineItems = lineItems.join("||");
}, },
getAmountDue() { getAmountDue() {
return baseMixin.methods.getAmountDue(store.getters.order.lineItems); return baseMixin.methods.getAmountDue(store.getters.order.lineItems);

View file

@ -266,6 +266,13 @@ describe("quote.vue", () => {
glassParts: ["item", "item2"], glassParts: ["item", "item2"],
}, },
payment: {}, payment: {},
serviceLocation: {
zipCode: "12345",
zipCodeCtu: "value",
},
},
vehicle: {
cardId: "123",
}, },
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
@ -304,6 +311,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
wrapper.vm.$route = { query: { isInsurance: "true" } }; wrapper.vm.$route = { query: { isInsurance: "true" } };
@ -336,6 +346,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
wrapper.vm.$route = { query: { isInsurance: "false" } }; wrapper.vm.$route = { query: { isInsurance: "false" } };
@ -369,6 +382,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
// Ensure that query param isn't overriding selection // Ensure that query param isn't overriding selection
@ -402,6 +418,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
// Ensure that query param isn't overriding selection // Ensure that query param isn't overriding selection
@ -436,6 +455,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
mockTierOnePrice = 200; mockTierOnePrice = 200;
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
@ -472,6 +494,9 @@ describe("quote.vue", () => {
state: null, state: null,
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
mockTierOnePrice = 505; mockTierOnePrice = 505;
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
@ -507,6 +532,9 @@ describe("quote.vue", () => {
state: "AZ", state: "AZ",
}, },
}, },
vehicle: {
cardId: "123",
},
}; };
const { wrapper } = setupMocks({}); const { wrapper } = setupMocks({});
wrapper.vm.$route = { query: null }; wrapper.vm.$route = { query: null };

View file

@ -96,7 +96,10 @@ export default {
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_WIPERS, storeActions.GET_WIPERS,
null, {
serviceZipCode: store.getters.order.serviceLocation.zipCode,
carId: store.getters.vehicle.carId,
},
"quote" "quote"
); );
const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging( const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging(

View file

@ -15,6 +15,7 @@ import {
import { settleAllPromises } from "@/helpers/layout-helper"; import { settleAllPromises } from "@/helpers/layout-helper";
import baseMixin from "@/mixins/base-mixin.js"; import baseMixin from "@/mixins/base-mixin.js";
import { storeActions } from "@/constants/store-actions"; import { storeActions } from "@/constants/store-actions";
import store from "@/store";
export default { export default {
name: "service-package-review", name: "service-package-review",
@ -34,7 +35,10 @@ export default {
loadInitialData() { loadInitialData() {
const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging( const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_WIPERS, storeActions.GET_WIPERS,
null, {
serviceZipCode: store.getters.order.serviceLocation.zipCode,
carId: store.getters.vehicle.carId,
},
"review" "review"
); );
const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging( const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging(

View file

@ -12,6 +12,7 @@
<funnelSubHeader cmsWidgetName="FunnelSubHeaderWidget" class="mt-5" /> <funnelSubHeader cmsWidgetName="FunnelSubHeaderWidget" class="mt-5" />
<serviceZipModalQuestion <serviceZipModalQuestion
editScreenReaderTextCmsWidgetName="ScreenReaderZipEditWidget"
v-model="serviceZipCodeQuestion" v-model="serviceZipCodeQuestion"
ref="serviceZipCodeQuestion" ref="serviceZipCodeQuestion"
:mobileFeePart="mobileFeePart" :mobileFeePart="mobileFeePart"

View file

@ -6,7 +6,11 @@
linkType="text" linkType="text"
:text="serviceZipLinkText" :text="serviceZipLinkText"
href="#!" href="#!"
@click-event="openModal" /> @click-event="openModal">
<template v-slot:after-text v-if="editScreenReaderTextCmsWidgetName">
<span class="sr-only"> {{ screenReaderOnlyText }} </span>
</template>
</textLink>
</div> </div>
</div> </div>
<modal <modal
@ -68,8 +72,12 @@ export default {
}, },
linkWidgetName: String, linkWidgetName: String,
modalWidgetName: String, modalWidgetName: String,
editScreenReaderTextCmsWidgetName: String,
}, },
computed: { computed: {
screenReaderOnlyText() {
return this.getCmsContent(this.editScreenReaderTextCmsWidgetName, "Text");
},
serviceZipLinkText() { serviceZipLinkText() {
if (this.modelValue.zipCode && this.modelValue.zipCode.length > 0) { if (this.modelValue.zipCode && this.modelValue.zipCode.length > 0) {
return this.modelValue.state + ", " + this.modelValue.zipCode; return this.modelValue.state + ", " + this.modelValue.zipCode;

View file

@ -1304,9 +1304,10 @@ export const actions = {
return response; return response;
}, },
async getWipers(context, { pageNameToLog }) { async getWipers(context, { payload, pageNameToLog }) {
const carId = context.getters.vehicle.carId; const carId = payload.carId;
const serviceZipCode = context.getters.order.serviceLocation.zipCode; const serviceZipCode = payload.serviceZipCode;
const response = await globalMethods const response = await globalMethods
.callHttpClient({ .callHttpClient({
method: endpoints.GetWipers.method, method: endpoints.GetWipers.method,