Class: SolidusFriendlyPromotions::Benefits::AdjustLineItemQuantityGroups
- Inherits:
-
AdjustLineItem
- Object
- Spree::Base
- SolidusFriendlyPromotions::Benefit
- AdjustLineItem
- SolidusFriendlyPromotions::Benefits::AdjustLineItemQuantityGroups
- Defined in:
- app/models/solidus_friendly_promotions/benefits/adjust_line_item_quantity_groups.rb
Defined Under Namespace
Classes: Item
Instance Method Summary collapse
-
#compute_amount(line_item) ⇒ Object
Computes the amount for the adjustment based on the line item and any other applicable items in the order.
Methods inherited from AdjustLineItem
#can_discount?, #level, #possible_conditions
Methods inherited from SolidusFriendlyPromotions::Benefit
#adjustment_label, #applicable_line_items, #available_calculators, #available_conditions, #can_discount?, #discount, #eligible_by_applicable_conditions?, #level, #possible_conditions, #preload_relations, #to_partial_path
Instance Method Details
#compute_amount(line_item) ⇒ Object
Computes the amount for the adjustment based on the line item and any other applicable items in the order. The conditions for this specific adjustment are as follows:
Setup
We have a quantity group promotion on t-shirts. If a user orders 3 t-shirts, they get $5 off of each. The shirts come in one size and three colours: red, blue, and white.
Scenario 1
User has 2 red shirts, 1 white shirt, and 1 blue shirt in their order. We want to compute the adjustment amount for the white shirt.
Result: -$5
Reasoning: There are a total of 4 items that are eligible for the promotion. Since that is greater than 3, we can discount the items. The white shirt has a quantity of 1, therefore it will get discounted by adjustment_amount * 1 or $5.
Scenario 1-1
What about the blue shirt? How much does it get discounted?
Result: $0
Reasoning: We have a total quantity of 4. However, we only apply the adjustment to groups of 3. Assuming the white and red shirts have already had their adjustment calculated, that means 3 units have been discounted. Leaving us with a lonely blue shirt that isn’t part of a group of 3. Therefore, it does not receive the discount.
Scenario 2
User has 4 red shirts in their order. What is the amount?
Result: -$15
Reasoning: The total quantity of eligible items is 4, so we the adjustment will be non-zero. However, we only apply it to groups of 3, therefore there is one extra item that is not eligible for the adjustment. adjustment_amount * 3 or $15.
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'app/models/solidus_friendly_promotions/benefits/adjust_line_item_quantity_groups.rb', line 54 def compute_amount(line_item) adjustment_amount = calculator.compute(Item.new(line_item)) return BigDecimal("0") if adjustment_amount.nil? || adjustment_amount.zero? adjustment_amount = adjustment_amount.abs order = line_item.order line_items = applicable_line_items(order) item_units = line_items.sort_by do |line_item| [-line_item.quantity, line_item.id] end.flat_map do |line_item| Array.new(line_item.quantity) do Item.new(line_item) end end item_units_in_groups = item_units.in_groups_of(preferred_group_size, false) item_units_in_groups.select! { |group| group.length == preferred_group_size } usable_quantity = item_units_in_groups.flatten.count { |item_unit| item_unit.line_item == line_item } amount = adjustment_amount * usable_quantity [line_item.discountable_amount, amount].min * -1 end |