Skip to content

Commit ed56090

Browse files
authored
Merge pull request #6369 from mamhoff/faster-discount-order
`DiscountOrder`: Use `#filter_map` everywhere
2 parents 3395334 + 9d073d0 commit ed56090

File tree

3 files changed

+37
-43
lines changed

3 files changed

+37
-43
lines changed

promotions/app/models/solidus_promotions/benefit.rb

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -181,30 +181,28 @@ def available_calculators
181181
# @param dry_run [Boolean] whether to collect detailed eligibility information
182182
# @return [Boolean] true when all applicable conditions are eligible
183183
def eligible_by_applicable_conditions?(promotable, dry_run: false)
184-
applicable_conditions = conditions.select do |condition|
185-
condition.applicable?(promotable)
186-
end
187-
188-
applicable_conditions.map do |applicable_condition|
189-
eligible = applicable_condition.eligible?(promotable)
190-
191-
break [false] if !eligible && !dry_run
192-
193-
if dry_run
194-
if applicable_condition.eligibility_errors.details[:base].first
195-
code = applicable_condition.eligibility_errors.details[:base].first[:error_code]
196-
message = applicable_condition.eligibility_errors.full_messages.first
184+
conditions.filter_map do |condition|
185+
condition.applicable?(promotable) && begin
186+
eligible = condition.eligible?(promotable)
187+
188+
break [false] if !eligible && !dry_run
189+
190+
if dry_run
191+
if condition.eligibility_errors.details[:base].first
192+
code = condition.eligibility_errors.details[:base].first[:error_code]
193+
message = condition.eligibility_errors.full_messages.first
194+
end
195+
promotion.eligibility_results.add(
196+
item: promotable,
197+
condition: condition,
198+
success: eligible,
199+
code: eligible ? nil : (code || :coupon_code_unknown_error),
200+
message: eligible ? nil : (message || I18n.t(:coupon_code_unknown_error, scope: [:solidus_promotions, :eligibility_errors]))
201+
)
197202
end
198-
promotion.eligibility_results.add(
199-
item: promotable,
200-
condition: applicable_condition,
201-
success: eligible,
202-
code: eligible ? nil : (code || :coupon_code_unknown_error),
203-
message: eligible ? nil : (message || I18n.t(:coupon_code_unknown_error, scope: [:solidus_promotions, :eligibility_errors]))
204-
)
205-
end
206203

207-
eligible
204+
eligible
205+
end
208206
end.all?
209207
end
210208

promotions/app/models/solidus_promotions/order_adjuster/discount_order.rb

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,22 @@ def call
3232
private
3333

3434
def perform_order_benefits(lane_benefits, lane)
35-
lane_benefits.select { |benefit| benefit.respond_to?(:perform) }.each do |benefit|
36-
benefit.perform(order)
35+
lane_benefits.filter_map do |benefit|
36+
benefit.respond_to?(:perform) && benefit.perform(order)
3737
end
3838

39-
automated_line_items = order.line_items.select(&:managed_by_order_benefit)
40-
return if automated_line_items.empty?
41-
42-
ineligible_line_items = automated_line_items.select do |line_item|
43-
line_item.managed_by_order_benefit.promotion.lane == lane && !line_item.managed_by_order_benefit.in?(lane_benefits)
44-
end
45-
46-
ineligible_line_items.each do |line_item|
47-
line_item.managed_by_order_benefit.remove_from(order)
39+
order.line_items.filter_map do |line_item|
40+
line_item.managed_by_order_benefit &&
41+
line_item.managed_by_order_benefit.promotion.lane == lane &&
42+
!line_item.managed_by_order_benefit.in?(lane_benefits) &&
43+
line_item.managed_by_order_benefit.remove_from(order)
4844
end
4945
end
5046

5147
def adjust_line_items(benefits)
52-
order.discountable_line_items.select do |line_item|
53-
line_item.variant.product.promotionable?
54-
end.map do |line_item|
48+
order.discountable_line_items.filter_map do |line_item|
49+
next unless line_item.variant.product.promotionable?
50+
5551
discounts = generate_discounts(benefits, line_item)
5652
chosen_item_discounts = SolidusPromotions.config.discount_chooser_class.new(discounts).call
5753
[line_item, chosen_item_discounts]
@@ -67,7 +63,9 @@ def adjust_shipments(benefits)
6763
end
6864

6965
def adjust_shipping_rates(benefits)
70-
order.shipments.flat_map(&:shipping_rates).select(&:cost).map do |rate|
66+
order.shipments.flat_map(&:shipping_rates).filter_map do |rate|
67+
next unless rate.cost
68+
7169
discounts = generate_discounts(benefits, rate)
7270
chosen_item_discounts = SolidusPromotions.config.discount_chooser_class.new(discounts).call
7371
[rate, chosen_item_discounts]
@@ -82,11 +80,9 @@ def eligible_benefits_for_promotable(possible_benefits, promotable)
8280

8381
def generate_discounts(possible_benefits, item)
8482
eligible_benefits = eligible_benefits_for_promotable(possible_benefits, item)
85-
eligible_benefits.select do |benefit|
86-
benefit.can_discount?(item)
87-
end.map do |benefit|
88-
benefit.discount(item)
89-
end.compact
83+
eligible_benefits.filter_map do |benefit|
84+
benefit.can_discount?(item) && benefit.discount(item)
85+
end
9086
end
9187
end
9288
end

promotions/spec/models/solidus_promotions/order_adjuster/discount_order_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@
195195
expect(promotion.eligibility_results.success?).to be false
196196
end
197197

198-
it "can tell us about all the errors", :pending do
198+
it "can tell us about all the errors" do
199199
subject
200200
expect(promotion.eligibility_results.error_messages).to eq(
201201
[

0 commit comments

Comments
 (0)