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
77
78
79
80
81
82
83
84
85
|
# File 'lib/model_extensions.rb', line 13
def payable(*args)
class_eval "def self.payable?; true end"
config = {:name => nil,
:user => :user,
:value => :value,
:callback => nil,
:bill_status => :bill_status}
config.update(args.)
has_many :gateway_payments, :as => :payable, :class_name => "Payable::GatewayPayment"
has_one :gateway_payment, :as => :payable, :class_name => "Payable::GatewayPayment", :conditions => "status <> 'canceled'"
state_machine config[:bill_status], :namespace => "bill", :initial => :open do
state :open
state :waiting
state :payed
state :canceled
after_transition :on => :cancel do |payable, transition|
payable.gateway_payment.cancel
end
after_transition :on => :checkout do |payable, transition|
payable.gateway_payment.checkout
end
after_transition :on => :pay do |payable, transition|
payable.gateway_payment.pay
end
event :cancel do
transition :open => :canceled
end
event :checkout do
transition :open => :waiting
end
event :pay do
transition [:waiting, :open] => :payed
end
end
before_save :verify_gateway_payment
define_method :verify_gateway_payment do
self.gateway_payments.build if !self.bill_canceled? && (self.gateway_payments.size.zero? || self.gateway_payments.all?(&:canceled?))
end
define_method :payable_value do
get_config_param(config[:value])
end
define_method :payable_user do
get_config_param(config[:user])
end
define_method :payable_name do
get_config_param(config[:user]) || self.class.name
end
define_method :payable_callback do
get_config_param(config[:callback])
end
define_method :payable_token do
return unless self.gateway_payment.present?
self.gateway_payment.config ||= {}
self.gateway_payment.config[:token]
end
end
|