/
spree_core_charges.rb
76 lines (53 loc) · 2.13 KB
/
spree_core_charges.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
require 'spree_core'
require 'core_charges_overrides'
module SpreeCoreCharges
class Engine < Rails::Engine
def self.activate
Adjustment.class_eval do
scope :core, lambda { where('label like ?',"#{I18n.t(:core_charge)}%") }
end
LineItem.class_eval do
def update_adjustment(adjustment, source)
adjustment.amount = if adjustment.order(true).line_items.include? source
calculate_core_charge
else
0
end
end
def calculate_core_charge
return unless product.core_amount
self.quantity * product.core_amount
end
end
Order.register_update_hook('create_core_charges')
Order.class_eval do
has_many :core_charges,
:dependent => :destroy,
:class_name => 'Adjustment',
:conditions => "source_type='LineItem'"
private
def create_core_charges
CoreCharge.skip_callback :save, :after, :update_order
line_items(true).collect{|item| item if item.variant.product.core_amount }.compact.each do |item|
adjustments << CoreCharge.create({
:label => I18n.t(:core_charge) + " [#{item.variant.sku || item.variant.name}]",
:source => item,
:order => self,
:originator => item,
:amount => item.calculate_core_charge
}) unless core_charges.find(:first, :conditions => {:source_id => item.id, :originator_id => item.id})
end
CoreCharge.set_callback :save, :after, :update_order
self.update!
end
end
methodz = CoreCharge._save_callbacks.select{|c| c.raw_filter.class == Symbol}
CoreCharge.reset_callbacks :save
methodz.each do |methud|
CoreCharge.set_callback :save, methud.kind, methud.raw_filter
end
end
config.autoload_paths += %W(#{config.root}/lib)
config.to_prepare &method(:activate).to_proc
end
end