added combined discount for consumer so codes can be calculated on the fly for any monitor
This commit is contained in:
1 parent
e9632470fd
commit
4c1033057a
3 files changed
+141
-2
No files matched your search
@@ -347,6 +347,11 @@ def convert_product_to_mongo(product: Product) -> dict:
|
||||
"customizationIndex": metadata["customization_index"],
|
||||
"memberNonMemberComparison": metadata["member_non_member_comparison"],
|
||||
"overstockText": metadata["overstock_text"],
|
||||
"affiliateUrl": metadata["affiliate_url"],
|
||||
"promoCode": metadata["promo_code"],
|
||||
"promoPercentage": metadata["promo_percentage"],
|
||||
"promoDollarOff": metadata["promo_dollar_off"],
|
||||
"promoMinSpend": metadata["promo_min_spend"],
|
||||
"startDate": timing["start_date"],
|
||||
"endDate": timing["end_date"],
|
||||
"priceBeforeDrop": pricing["price_before_drop"],
|
||||
|
||||
@@ -116,6 +116,27 @@ async def setup_config(
|
||||
return category_names, config["channels"], collection
|
||||
|
||||
|
||||
def combined_discount(base_percentage: int, promo_percentage: int | None) -> int:
|
||||
"""Combine an on-sale discount with a percentage code applied at checkout.
|
||||
|
||||
A "extra N% off" code discounts the already-reduced sale price, so the two
|
||||
compound rather than add: 20% off then an extra 30% code is 44% off list,
|
||||
not 50%. Returns base_percentage unchanged when there is no percentage code.
|
||||
|
||||
Args:
|
||||
base_percentage: The on-sale discount off list, as a whole percent.
|
||||
promo_percentage: The code's advertised percent off, or None.
|
||||
|
||||
Returns:
|
||||
The combined discount off list, rounded to a whole percent.
|
||||
"""
|
||||
|
||||
if not promo_percentage:
|
||||
return base_percentage
|
||||
|
||||
return round(100 - (100 - base_percentage) * (100 - promo_percentage) / 100)
|
||||
|
||||
|
||||
def build_product_details(
|
||||
product: dict,
|
||||
min_percentage: int,
|
||||
@@ -148,7 +169,11 @@ def build_product_details(
|
||||
|
||||
percentage = int(((original_price - current_price) / original_price) * 100)
|
||||
price_drop = original_price - current_price
|
||||
passes_percentage = percentage >= min_percentage
|
||||
# A percentage code compounds onto the sale price, so an item can clear the
|
||||
# threshold on the combined discount even when the base discount would not.
|
||||
# Dollar codes do not map to a percent and never affect the threshold.
|
||||
effective_percentage = combined_discount(percentage, product.get("promoPercentage"))
|
||||
passes_percentage = effective_percentage >= min_percentage
|
||||
passes_price_drop = min_price_drop is not None and price_drop >= min_price_drop
|
||||
if not passes_percentage and not passes_price_drop:
|
||||
return
|
||||
@@ -164,6 +189,10 @@ def build_product_details(
|
||||
overstock_text=product["overstockText"],
|
||||
percentage=percentage,
|
||||
affiliate_url=product.get("affiliateUrl"),
|
||||
promo_code=product.get("promoCode"),
|
||||
promo_percentage=product.get("promoPercentage"),
|
||||
promo_dollar_off=product.get("promoDollarOff"),
|
||||
promo_min_spend=product.get("promoMinSpend"),
|
||||
),
|
||||
timing=ProductTiming(
|
||||
discovered_date=product["discoveredDate"],
|
||||
@@ -351,7 +380,7 @@ async def execute_pagination(
|
||||
|
||||
async def fetch_page(page_index: int):
|
||||
"""Fetch a single page or offset, optionally under the shared semaphore."""
|
||||
async with (semaphore or nullcontext()):
|
||||
async with semaphore or nullcontext():
|
||||
if stop_event.is_set():
|
||||
return
|
||||
|
||||
|
||||
Reference in new issue
Block a user