Extract & refactor service package logic to helper class.
This commit is contained in:
parent
043202a1d4
commit
af6809256e
2 changed files with 1306 additions and 0 deletions
252
src/helpers/service-package-helper.js
Normal file
252
src/helpers/service-package-helper.js
Normal file
|
|
@ -0,0 +1,252 @@
|
|||
import { partTypeStrings } from "@/constants/part-type-strings";
|
||||
import { damageLocationsSelected as glassLocations } from "@/constants/damage-locations-selected";
|
||||
|
||||
export const packageNames = {
|
||||
TIER_ONE: "TierOne",
|
||||
TIER_TWO: "TierTwo",
|
||||
TIER_THREE: "TierThree",
|
||||
};
|
||||
|
||||
export function containsLineItemWithPartType(typeToFind, itemsToSearch) {
|
||||
const partTypeMatches = findLineItemsWithPartType(typeToFind, itemsToSearch);
|
||||
return !!partTypeMatches.length;
|
||||
}
|
||||
|
||||
export function findLineItemsWithPartType(typeToFind, itemsToSearch) {
|
||||
const partTypeMatches = itemsToSearch.filter(
|
||||
(lineItem) => lineItem.partType.toUpperCase() === typeToFind.toUpperCase()
|
||||
);
|
||||
|
||||
return partTypeMatches;
|
||||
}
|
||||
|
||||
export function getVapsLineItems(availableLineItems, vapTypes) {
|
||||
let lineItems = [];
|
||||
|
||||
for (let i = 0; i < vapTypes.length; i++) {
|
||||
lineItems.push(...findLineItemsWithPartType(vapTypes[i], availableLineItems));
|
||||
}
|
||||
|
||||
return lineItems;
|
||||
}
|
||||
|
||||
export function containsGlassPieceWithLocation(locationToFind, glassPiecesToSearch) {
|
||||
const glassLocationMatches = glassPiecesToSearch.filter(
|
||||
(glassPiece) => glassPiece.glassLocation.toUpperCase() === locationToFind.toUpperCase()
|
||||
);
|
||||
|
||||
return !!glassLocationMatches.length;
|
||||
}
|
||||
|
||||
export function getAvailablePackages(glassToReplace, availableLineItems, isRepair) {
|
||||
let tierOneVaps = getPackageContents(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_ONE
|
||||
);
|
||||
let tierTwoVaps = getPackageContents(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_TWO
|
||||
);
|
||||
let tierThreeVaps = getPackageContents(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_THREE
|
||||
);
|
||||
|
||||
if (tierTwoVaps.length === 0) {
|
||||
return [
|
||||
{
|
||||
packageName: packageNames.TIER_ONE,
|
||||
vapTypes: tierOneVaps,
|
||||
},
|
||||
{
|
||||
packageName: packageNames.TIER_THREE,
|
||||
vapTypes: tierThreeVaps,
|
||||
},
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
{
|
||||
packageName: packageNames.TIER_ONE,
|
||||
vapTypes: tierOneVaps,
|
||||
},
|
||||
{
|
||||
packageName: packageNames.TIER_TWO,
|
||||
vapTypes: tierTwoVaps,
|
||||
},
|
||||
{
|
||||
packageName: packageNames.TIER_THREE,
|
||||
vapTypes: tierThreeVaps,
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
export function getPackageContents(glassToReplace, availableLineItems, isRepair, targetTier) {
|
||||
let vaps = [];
|
||||
|
||||
if (shouldFrontWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
|
||||
vaps.push(partTypeStrings.FRONT_WIPER);
|
||||
}
|
||||
if (shouldRearWipersBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
|
||||
vaps.push(partTypeStrings.REAR_WIPER);
|
||||
}
|
||||
if (shouldRainDefenseBeAvailable(glassToReplace, availableLineItems, isRepair, targetTier)) {
|
||||
vaps.push(partTypeStrings.RAIN_DEFENSE);
|
||||
}
|
||||
|
||||
return vaps;
|
||||
}
|
||||
|
||||
export function shouldFrontWipersBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
targetTier
|
||||
) {
|
||||
const frontWiperIsAvailable = containsLineItemWithPartType(
|
||||
partTypeStrings.FRONT_WIPER,
|
||||
availableLineItems
|
||||
);
|
||||
const isFrontWindshieldTask =
|
||||
isRepair || containsGlassPieceWithLocation(glassLocations.WINDSHIELD, glassToReplace);
|
||||
|
||||
switch (targetTier) {
|
||||
case packageNames.TIER_TWO:
|
||||
return frontWiperIsAvailable && isFrontWindshieldTask;
|
||||
case packageNames.TIER_THREE:
|
||||
return frontWiperIsAvailable;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function shouldRearWipersBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
targetTier
|
||||
) {
|
||||
const rearWiperIsAvailable = containsLineItemWithPartType(
|
||||
partTypeStrings.REAR_WIPER,
|
||||
availableLineItems
|
||||
);
|
||||
const frontWiperIsAvailable = containsLineItemWithPartType(
|
||||
partTypeStrings.FRONT_WIPER,
|
||||
availableLineItems
|
||||
);
|
||||
const isRearWindshieldTask = containsGlassPieceWithLocation(
|
||||
glassLocations.REAR,
|
||||
glassToReplace
|
||||
);
|
||||
|
||||
switch (targetTier) {
|
||||
case packageNames.TIER_TWO:
|
||||
return rearWiperIsAvailable && isRearWindshieldTask;
|
||||
case packageNames.TIER_THREE:
|
||||
return rearWiperIsAvailable && (isRearWindshieldTask || !frontWiperIsAvailable);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export function shouldRainDefenseBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
targetTier
|
||||
) {
|
||||
const isTierThree = targetTier === packageNames.TIER_THREE;
|
||||
const rainDefenseIsAvailable = containsLineItemWithPartType(
|
||||
partTypeStrings.RAIN_DEFENSE,
|
||||
availableLineItems
|
||||
);
|
||||
const frontWipersInTierTwo = shouldFrontWipersBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_TWO
|
||||
);
|
||||
const frontWipersInTierThree = shouldFrontWipersBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_THREE
|
||||
);
|
||||
const rearWipersInTierTwo = shouldRearWipersBeAvailable(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
packageNames.TIER_TWO
|
||||
);
|
||||
|
||||
return (
|
||||
isTierThree &&
|
||||
rainDefenseIsAvailable &&
|
||||
!(rearWipersInTierTwo && !frontWipersInTierTwo && frontWipersInTierThree)
|
||||
);
|
||||
}
|
||||
|
||||
export function getLowestTierForType(glassToReplace, availableLineItems, isRepair, partType) {
|
||||
const packages = getAvailablePackages(glassToReplace, availableLineItems, isRepair);
|
||||
for (let i = 0; i < packages.length; i++) {
|
||||
for (let j = 0; j < packages[i].vapTypes.length; j++) {
|
||||
if (packages[i].vapTypes[j].toUpperCase() === partType.toUpperCase()) {
|
||||
return packages[i].packageName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return packageNames.TIER_ONE;
|
||||
}
|
||||
|
||||
export function getHighestRequiredTier(glassToReplace, availableLineItems, isRepair, vaps) {
|
||||
let currentHighestTier = packageNames.TIER_ONE;
|
||||
for (let i = 0; i < vaps.length; i++) {
|
||||
const lowestTierForItem = getLowestTierForType(
|
||||
glassToReplace,
|
||||
availableLineItems,
|
||||
isRepair,
|
||||
vaps[i].partType
|
||||
);
|
||||
|
||||
currentHighestTier = maxTier(currentHighestTier, lowestTierForItem);
|
||||
}
|
||||
|
||||
return currentHighestTier;
|
||||
}
|
||||
|
||||
export function getHighestFullySatisfiedTier(glassToReplace, availableLineItems, isRepair, vaps) {
|
||||
const packages = getAvailablePackages(glassToReplace, availableLineItems, isRepair);
|
||||
let highestSatisfiedPackage = packageNames.TIER_ONE;
|
||||
|
||||
for (let i = 0; i < packages.length; i++) {
|
||||
let isPackageSatisfied = true;
|
||||
for (let j = 0; j < packages[i].vapTypes.length; j++) {
|
||||
isPackageSatisfied =
|
||||
isPackageSatisfied && containsLineItemWithPartType(packages[i].vapTypes[j], vaps);
|
||||
}
|
||||
if (isPackageSatisfied) {
|
||||
highestSatisfiedPackage = packages[i].packageName;
|
||||
}
|
||||
}
|
||||
|
||||
return highestSatisfiedPackage;
|
||||
}
|
||||
|
||||
function maxTier(tierA, tierB) {
|
||||
if (tierA === packageNames.TIER_THREE || tierB === packageNames.TIER_THREE) {
|
||||
return packageNames.TIER_THREE;
|
||||
}
|
||||
|
||||
if (tierA === packageNames.TIER_TWO || tierB === packageNames.TIER_TWO) {
|
||||
return packageNames.TIER_TWO;
|
||||
}
|
||||
|
||||
return packageNames.TIER_ONE;
|
||||
}
|
||||
1054
src/helpers/service-package-helper.spec.js
Normal file
1054
src/helpers/service-package-helper.spec.js
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue