126 lines
4.1 KiB
JavaScript
126 lines
4.1 KiB
JavaScript
import store from "@/store";
|
|
import { storeActions } from "@/constants/store-actions";
|
|
import { partTypeStrings } from "@/constants/part-type-strings";
|
|
import baseMixin from "@/mixins/base-mixin.js";
|
|
|
|
export const promoPartNumberStrings = {
|
|
WIPER_DISCOUNT_PART_NUMBER: "WIPER DISCOUNT",
|
|
RAIN_DEFENSE_DISCOUNT_PART_NUMBER: "DISC RAIN DEFEN",
|
|
GLASS_DISCOUNT_PART_NUMBER: "DISCOUNT",
|
|
GLASS_CLEANER_DISCOUNT_PART_NUMBER: "DISC GLASS CLN",
|
|
};
|
|
|
|
export const addableVapsPromoPartNumbers = [
|
|
promoPartNumberStrings.RAIN_DEFENSE_DISCOUNT_PART_NUMBER,
|
|
promoPartNumberStrings.WIPER_DISCOUNT_PART_NUMBER,
|
|
];
|
|
|
|
export const pagesToStripPromoQueryStringFrom = ["quote", "payment-method"];
|
|
|
|
export function getPromosWithAddableVaps(promoList) {
|
|
if (!promoList.length) {
|
|
return [];
|
|
}
|
|
|
|
return promoList.filter((promo) => addableVapsPromoPartNumbers.includes(promo.partNumber));
|
|
}
|
|
|
|
export function getLineItemsThatMatchPromos(promos, availableLineItems) {
|
|
const matchingLineItems = [];
|
|
promos.forEach((promo) => {
|
|
promo.discountedLineItemIds.forEach((discountedLineItemId) => {
|
|
matchingLineItems.push(
|
|
...availableLineItems.filter((lineItem) => lineItem.id === discountedLineItemId)
|
|
);
|
|
});
|
|
});
|
|
return matchingLineItems;
|
|
}
|
|
|
|
export function getAddableVapsFromAvailableLineItems(availableLineItems) {
|
|
const addableVaps = [];
|
|
addableVaps.push(...findLineItemsWithPartType(partTypeStrings.FRONT_WIPER, availableLineItems));
|
|
addableVaps.push(
|
|
...findLineItemsWithPartType(partTypeStrings.RAIN_DEFENSE, availableLineItems)
|
|
);
|
|
return addableVaps;
|
|
}
|
|
|
|
export function removeVapsPromosFromPromoArray(promoArray) {
|
|
if (!promoArray) {
|
|
return [];
|
|
}
|
|
const filteredPromoArray = promoArray.filter((promo) => {
|
|
return (
|
|
promo.partNumber != promoPartNumberStrings.WIPER_DISCOUNT_PART_NUMBER &&
|
|
promo.partNumber != promoPartNumberStrings.RAIN_DEFENSE_DISCOUNT_PART_NUMBER &&
|
|
promo.partNumber != promoPartNumberStrings.GLASS_CLEANER_DISCOUNT_PART_NUMBER
|
|
);
|
|
});
|
|
return filteredPromoArray;
|
|
}
|
|
|
|
export async function revalidatePromosAndValidateNewPromo(
|
|
newPromo,
|
|
pricedLineItems,
|
|
pageNameToLog
|
|
) {
|
|
const hasActivePromos = store.getters.order.lineItems.promos;
|
|
const hasHasInactivePromos = store.getters.order.lineItems.inactivePromos;
|
|
const hasNewPromo = !!newPromo;
|
|
const addableVaps = getAddableVapsFromAvailableLineItems(pricedLineItems);
|
|
|
|
let validatePromoResponse = null;
|
|
let revalidatePromoResponse = null;
|
|
|
|
if (hasActivePromos || hasHasInactivePromos) {
|
|
revalidatePromoResponse = await baseMixin.methods.dispatchStoreActionWithLogging(
|
|
storeActions.REVALIDATE_ORDER_PROMOS_AND_UPDATE_STORE,
|
|
null,
|
|
pageNameToLog,
|
|
false
|
|
);
|
|
}
|
|
if (hasNewPromo) {
|
|
validatePromoResponse = await baseMixin.methods.dispatchStoreActionWithLogging(
|
|
storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA,
|
|
{
|
|
promoCode: newPromo,
|
|
addableVaps: addableVaps,
|
|
},
|
|
pageNameToLog,
|
|
false
|
|
);
|
|
}
|
|
|
|
return { validatePromoResponse, revalidatePromoResponse };
|
|
}
|
|
|
|
export function getPromosThatMatchLineItemsOnOrder(promos, lineItemsOnOrder) {
|
|
const matchingPromos = [];
|
|
promos.forEach((promo) => {
|
|
let allIdsMatch = true;
|
|
promo.discountedLineItemIds.forEach((id) => {
|
|
if (lineItemsOnOrder.filter((x) => x.id === id).length === 0) {
|
|
allIdsMatch = false;
|
|
return;
|
|
}
|
|
});
|
|
if (allIdsMatch) {
|
|
matchingPromos.push(promo);
|
|
}
|
|
});
|
|
return matchingPromos;
|
|
}
|
|
|
|
export function shouldStripPromoQueryString(fmgPageQueryValue) {
|
|
return pagesToStripPromoQueryStringFrom.includes(fmgPageQueryValue);
|
|
}
|
|
|
|
// private methods
|
|
function findLineItemsWithPartType(typeToFind, itemsToSearch) {
|
|
const partTypeMatches = itemsToSearch?.filter(
|
|
(lineItem) => lineItem.partType.toUpperCase() === typeToFind.toUpperCase()
|
|
);
|
|
return partTypeMatches;
|
|
}
|