Last active
August 9, 2022 12:55
-
-
Save dsomel21/2bd400b3bacc056136dccf4993b41f12 to your computer and use it in GitHub Desktop.
Before I quit working for the Canadian Shopify Agency OnlyGrowth, the boss, James Corr from Kitchener, (who never paid me), made me write scripts.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
PAID_ITEM_COUNT = 2 | |
DISCOUNTED_ITEM_COUNT = 1 | |
def discounted_items_to_find(total_items_seen, discounted_items_seen) | |
Integer(total_items_seen / (PAID_ITEM_COUNT + DISCOUNTED_ITEM_COUNT) * DISCOUNTED_ITEM_COUNT) - discounted_items_seen | |
end | |
def partition(cart, line_items) | |
# Sort the items by price from high to low | |
sorted_items = line_items.sort_by{|line_item| line_item.variant.price}.reverse | |
# Create an array of items to return | |
discounted_items = [] | |
# Keep counters of items seen and discounted, to avoid having to recalculate on each iteration | |
total_items_seen = 0 | |
discounted_items_seen = 0 | |
# Loop over all the items and find those to be discounted | |
sorted_items.each do |line_item| | |
total_items_seen += line_item.quantity | |
# After incrementing total_items_seen, see if any items must be discounted | |
count = discounted_items_to_find(total_items_seen, discounted_items_seen) | |
# If there are none, skip to the next item | |
next if count <= 0 | |
if count >= line_item.quantity | |
# If the full item quantity must be discounted, add it to the items to return | |
# and increment the count of discounted items | |
discounted_items.push(line_item) | |
discounted_items_seen += line_item.quantity | |
else | |
# If only part of the item must be discounted, split the item | |
discounted_item = line_item.split(take: count) | |
# Insert the newly-created item in the cart, right after the original item | |
position = cart.line_items.find_index(line_item) | |
cart.line_items.insert(position + 1, discounted_item) | |
# Add it to the list of items to return | |
discounted_items.push(discounted_item) | |
discounted_items_seen += discounted_item.quantity | |
end | |
end | |
# Return the items to be discounted | |
discounted_items | |
end | |
eligible_items = Input.cart.line_items.select do |line_item| | |
product = line_item.variant.product | |
!product.gift_card? && product.id == 592406273 | |
end | |
discounted_line_items = partition(Input.cart, eligible_items) | |
discounted_line_items.each do |line_item| | |
line_item.change_line_price(Money.zero, message: "Buy 2 get 1 free") | |
end | |
Output.cart = Input.cart |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment