Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore: Make checks on price approval reusable #142

Merged
merged 2 commits into from
Dec 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 67 additions & 5 deletions src/pricing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@ type PriceComponent = NonNullable<CompositePriceItemDto['item_components']>[numb
export const isCompositePrice = (priceItem: PriceItemDto | CompositePriceItemDto): priceItem is CompositePriceItemDto =>
Boolean(priceItem.is_composite_price || priceItem._price?.is_composite_price);

const isCompositePriceItem = (priceItem: PriceItem | CompositePriceItem): priceItem is CompositePriceItem =>
Boolean(priceItem.is_composite_price || priceItem._price?.is_composite_price);

export const computePriceComponent = (
priceItemComponent: PriceItemDto,
priceItem: CompositePriceItemDto,
Expand Down Expand Up @@ -382,7 +385,7 @@ export const computeAggregatedAndPriceTotals = (priceItems: PriceItemsDto): Pric
externalFeeMapping,
});

const updatedTotals = isUnitAmountApproved(
const updatedTotals = isOnRequestUnitAmountApproved(
priceItem,
priceItemToAppend?._price?.price_display_in_journeys ?? price?.price_display_in_journeys,
undefined,
Expand Down Expand Up @@ -637,7 +640,7 @@ const recomputeDetailTotalsFromCompositePrice = (
};

return (compositePriceItem.item_components ?? []).reduce((detailTotals, itemComponent) => {
const updatedTotals = isUnitAmountApproved(
const updatedTotals = isOnRequestUnitAmountApproved(
itemComponent,
itemComponent._price?.price_display_in_journeys,
compositePriceItem,
Expand Down Expand Up @@ -1141,7 +1144,37 @@ const getPriceRecurrenceByTax = (
);
};

const isUnitAmountApproved = (
/**
* Determines if a price item is approved based on its display mode and approval property.
*
* If price item has a parent item, it is always cosidered approved if the display mode is not 'show_as_on_request'.
*
* @param priceItem - The price item to check, which can be either a `PriceItem` or a `CompositePriceItem`.
* @param parentPriceItem - An optional parent composite price item, used for additional context when checking unit amounts.
* @returns `true` if the price item is approved, `false` otherwise.
*/
export const isPriceItemApproved = (
priceItem: PriceItem | CompositePriceItem,
parentPriceItem?: CompositePriceItem,
) => {
if (isCompositePriceItem(priceItem)) {
const hasHiddenPriceComponents = (priceItem.item_components ?? []).some(isDisplayModeRequiringApproval);

return hasHiddenPriceComponents
? Boolean(priceItem.on_request_approved)
: Boolean(!isDisplayModeRequiringApproval(priceItem) || priceItem?.on_request_approved);
} else {
if (parentPriceItem) {
return Boolean(
priceItem._price?.price_display_in_journeys !== 'show_as_on_request' || parentPriceItem?.on_request_approved,
);
}

return Boolean(!isDisplayModeRequiringApproval(priceItem) || priceItem?.on_request_approved);
}
};

const isOnRequestUnitAmountApproved = (
priceItem: PriceItem,
priceDisplayInJourneys?: Price['price_display_in_journeys'],
parentPriceItem?: CompositePriceItem,
Expand All @@ -1153,13 +1186,42 @@ const isUnitAmountApproved = (
const parentPriceIsHiddenPrice = parentPriceItem._price?.price_display_in_journeys === 'show_as_on_request';

if (parentHasHiddenPriceComponents || parentPriceIsHiddenPrice) {
return parentPriceItem?.on_request_approved;
return Boolean(parentPriceItem?.on_request_approved);
}

return true;
}

return priceDisplayInJourneys !== 'show_as_on_request' || priceItem?.on_request_approved;
return Boolean(priceDisplayInJourneys !== 'show_as_on_request' || priceItem?.on_request_approved);
};

/**
* Determines if a price item or composite price item requires approval.
*
* This function checks if the given price item or any of its components (if it is a composite price)
* require approval based on their display mode.
*
* @param priceItem - The price item or composite price item to check.
* @returns `true` if the price item or any of its components require approval, otherwise `false`.
*/
export const isRequiringApproval = (priceItem: PriceItem | CompositePriceItem): boolean => {
const isRequiringApproval = isDisplayModeRequiringApproval(priceItem);

if (isCompositePriceItem(priceItem)) {
return (
isRequiringApproval ||
Boolean(priceItem.item_components?.some((component) => isDisplayModeRequiringApproval(component)))
);
}

return isRequiringApproval;
};

const isDisplayModeRequiringApproval = (priceItem: PriceItem | CompositePriceItem): boolean => {
return (
priceItem._price?.price_display_in_journeys === 'show_as_on_request' ||
priceItem._price?.price_display_in_journeys === 'show_as_starting_price'
);
};

export const computeQuantities = (price: Price | undefined, quantity: number, priceMapping?: PriceInputMapping) => {
Expand Down
Loading