-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
free_shipping.rb
58 lines (49 loc) · 1.61 KB
/
free_shipping.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# frozen_string_literal: true
module Spree
class Promotion < Spree::Base
module Actions
class FreeShipping < Spree::PromotionAction
def perform(payload = {})
order = payload[:order]
promotion_code = payload[:promotion_code]
created_adjustments = order.shipments.map do |shipment|
next if promotion_credit_exists?(shipment)
shipment.adjustments.create!(
order: shipment.order,
amount: compute_amount(shipment),
source: self,
promotion_code: promotion_code,
label: label
)
end
# Did we actually end up creating any adjustments?
# If so, then this action should be classed as 'successful'
created_adjustments.any?
end
def label
"#{I18n.t('spree.promotion')} (#{promotion.name})"
end
def compute_amount(shipment)
shipment.cost * -1
end
# Removes any adjustments generated by this action from the order's
# shipments.
# @param order [Spree::Order] the order to remove the action from.
# @return [void]
def remove_from(order)
order.shipments.each do |shipment|
shipment.adjustments.each do |adjustment|
if adjustment.source == self
shipment.adjustments.destroy(adjustment)
end
end
end
end
private
def promotion_credit_exists?(shipment)
shipment.adjustments.where(source: self).exists?
end
end
end
end
end