Class: SolidusPromotions::Benefits::AdjustLineItemQuantityGroups
- Inherits:
-
AdjustLineItem
- Object
- Spree::Base
- SolidusPromotions::Benefit
- AdjustLineItem
- SolidusPromotions::Benefits::AdjustLineItemQuantityGroups
- Defined in:
- app/models/solidus_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
Methods included from LineItemBenefit
Methods inherited from SolidusPromotions::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_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 |applicable_line_item| [-applicable_line_item.quantity, applicable_line_item.id] end.flat_map do |applicable_line_item| Array.new(applicable_line_item.quantity) do Item.new(applicable_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 |