Class: Spree::Promotion::Actions::CreateQuantityAdjustments
 Inherits:

CreateItemAdjustments
 Object
 ActiveRecord::Base
 Base
 Spree::PromotionAction
 CreateItemAdjustments
 Spree::Promotion::Actions::CreateQuantityAdjustments
 Defined in:
 app/models/spree/promotion/actions/create_quantity_adjustments.rb
Defined Under Namespace
Classes: PartialLineItem
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 CreateItemAdjustments
#perform, #preload_relations, #remove_from
Methods included from AdjustmentSource
#remove_adjustments_from_incomplete_orders
Methods included from CalculatedAdjustments
#calculator_type, #calculator_type=
Methods inherited from Spree::PromotionAction
#perform, #preload_relations, #remove_from, #to_partial_path
Methods inherited from Base
Methods included from Core::Permalinks
#generate_permalink, #save_permalink
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 rules for this specific adjustment are as follows:
Setup
We have a quantity group promotion on tshirts. If a user orders 3 tshirts, 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 11
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 nonzero. 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.
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 
# File 'app/models/spree/promotion/actions/create_quantity_adjustments.rb', line 58 def compute_amount(line_item) adjustment_amount = calculator.compute(PartialLineItem.new(line_item)) adjustment_amount = BigDecimal(0) adjustment_amount = adjustment_amount.abs order = line_item.order line_items = actionable_line_items(order) actioned_line_items = order.line_item_adjustments.reload. select { adjustment adjustment.source == self && adjustment.amount < 0 }. map(&:adjustable) other_line_items = actioned_line_items  [line_item] applicable_quantity = total_applicable_quantity(line_items) used_quantity = total_used_quantity(other_line_items) usable_quantity = [ applicable_quantity  used_quantity, line_item.quantity ].min persist_quantity(usable_quantity, line_item) amount = adjustment_amount * usable_quantity [line_item.amount, amount].min * 1 end 