Class: Payment
- Inherits:
-
Object
- Object
- Payment
- Includes:
- ActiveModel::Validations
- Defined in:
- app/models/payment.rb
Overview
Payment subclasses should not involve Artful.ly classes in the internals of ActiveMerchant.
Errors should be commincated to callers with the errors Array
Direct Known Subclasses
Constant Summary collapse
- @@payment_methods =
Subclasses should call payment_method :type to get hooked up to the factory
For example, a subclass called WonkaPayment can call payment_method :wonka Then callers can instantiate a WonkaPayment by calling Payment.create :wonka
This will also define an instance method called “payment_method” on the subclass which will return a stringification of the symbol
HashWithIndifferentAccess.new
Instance Attribute Summary collapse
-
#amount ⇒ Object
Returns the value of attribute amount.
-
#customer ⇒ Object
This is named customer as it analogizes the “customer” record on a remote payment system (Braintree, for instance).
-
#transaction_id ⇒ Object
Returns the value of attribute transaction_id.
-
#user_agreement ⇒ Object
Returns the value of attribute user_agreement.
Class Method Summary collapse
-
.create(type, params = {}) ⇒ Object
Call this method to create sub-classes of Payment.
- .payment_method(names) ⇒ Object
Instance Method Summary collapse
- #authorize(options = {}) ⇒ Object
- #build_address_from(params) ⇒ Object
- #build_customer_from(params) ⇒ Object
- #capture(transaction_id, options = {}) ⇒ Object
- #payment_phone_number ⇒ Object
- #per_item_processing_charge ⇒ Object
-
#purchase(options = {}) ⇒ Object
Subclasses that need to actually process something should override these methods.
- #reduce_amount_by(amount_in_cents) ⇒ Object
- #refund(refund_amount, transaction_id, options = {}) ⇒ Object
-
#refundable? ⇒ Boolean
Likewise with payments that need to refund.
- #requires_authorization? ⇒ Boolean
- #requires_settlement? ⇒ Boolean
- #void(transaction_id, options = {}) ⇒ Object
Instance Attribute Details
#amount ⇒ Object
Returns the value of attribute amount.
8 9 10 |
# File 'app/models/payment.rb', line 8 def amount @amount end |
#customer ⇒ Object
This is named customer as it analogizes the “customer” record on a remote payment system (Braintree, for instance). It is just a Person object.
12 13 14 |
# File 'app/models/payment.rb', line 12 def customer @customer end |
#transaction_id ⇒ Object
Returns the value of attribute transaction_id.
8 9 10 |
# File 'app/models/payment.rb', line 8 def transaction_id @transaction_id end |
#user_agreement ⇒ Object
Returns the value of attribute user_agreement.
8 9 10 |
# File 'app/models/payment.rb', line 8 def user_agreement @user_agreement end |
Class Method Details
.create(type, params = {}) ⇒ Object
Call this method to create sub-classes of Payment. params will be passed through to the child class
47 48 49 50 51 52 53 54 55 |
# File 'app/models/payment.rb', line 47 def self.create(type, params = {}) type = type.parameterize.underscore.to_sym if type.is_a? String c = @@payment_methods[type] if c c.new(params) else raise "No payment method registered for [#{type}], did you call payment_method in the subclass?" end end |
.payment_method(names) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/models/payment.rb', line 27 def self.payment_method names names = Array.wrap(names) names.each do |name| @@payment_methods[name] = self end self.class_eval(<<-EOS, __FILE__, __LINE__) def payment_method "#{names[0].to_s.gsub('_',' ').capitalize}" end def self.payment_method "#{names[0].to_s.gsub('_',' ').capitalize}" end EOS end |
Instance Method Details
#authorize(options = {}) ⇒ Object
81 82 83 |
# File 'app/models/payment.rb', line 81 def ( = {}) true end |
#build_address_from(params) ⇒ Object
65 66 67 68 69 70 71 72 |
# File 'app/models/payment.rb', line 65 def build_address_from(params) unless params.fetch(:customer, {}).fetch(:address, {}).blank? self.customer.address = Address.new(:address1 => params[:customer][:address][:address1], :city => params[:customer][:address][:city], :state => params[:customer][:address][:state], :zip => params[:customer][:address][:zip]) end end |
#build_customer_from(params) ⇒ Object
57 58 59 60 61 62 63 |
# File 'app/models/payment.rb', line 57 def build_customer_from(params) self.customer.first_name = params.fetch(:customer, {}).fetch(:first_name, "") self.customer.last_name = params.fetch(:customer, {}).fetch(:last_name, "") self.customer.email = params.fetch(:customer, {}).fetch(:email, "") self.customer.phones << Phone.new(:number => params.fetch(:customer, {}).fetch(:phone, "")) unless params[:customer].blank? || params[:customer][:phone].blank? end |
#capture(transaction_id, options = {}) ⇒ Object
85 86 |
# File 'app/models/payment.rb', line 85 def capture(transaction_id, = {}) end |
#payment_phone_number ⇒ Object
110 111 112 |
# File 'app/models/payment.rb', line 110 def payment_phone_number nil end |
#per_item_processing_charge ⇒ Object
118 119 120 |
# File 'app/models/payment.rb', line 118 def per_item_processing_charge lambda { |item| item.realized_price * 0.035 } end |
#purchase(options = {}) ⇒ Object
Subclasses that need to actually process something should override these methods
77 78 79 |
# File 'app/models/payment.rb', line 77 def purchase( = {}) true end |
#reduce_amount_by(amount_in_cents) ⇒ Object
114 115 116 |
# File 'app/models/payment.rb', line 114 def reduce_amount_by(amount_in_cents) self.amount= self.amount - amount_in_cents end |
#refund(refund_amount, transaction_id, options = {}) ⇒ Object
98 99 100 |
# File 'app/models/payment.rb', line 98 def refund(refund_amount, transaction_id, = {}) true end |
#refundable? ⇒ Boolean
Likewise with payments that need to refund
94 95 96 |
# File 'app/models/payment.rb', line 94 def refundable? true end |
#requires_authorization? ⇒ Boolean
102 103 104 |
# File 'app/models/payment.rb', line 102 def false end |
#requires_settlement? ⇒ Boolean
106 107 108 |
# File 'app/models/payment.rb', line 106 def requires_settlement? false end |
#void(transaction_id, options = {}) ⇒ Object
88 89 |
# File 'app/models/payment.rb', line 88 def void(transaction_id, = {}) end |