braintree 2.4.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +4 -0
- data/lib/braintree.rb +43 -32
- data/lib/braintree/add_on.rb +4 -0
- data/lib/braintree/address.rb +18 -72
- data/lib/braintree/address_gateway.rb +76 -0
- data/lib/braintree/advanced_search.rb +31 -13
- data/lib/braintree/base_module.rb +6 -0
- data/lib/braintree/configuration.rb +57 -39
- data/lib/braintree/credit_card.rb +75 -129
- data/lib/braintree/credit_card_gateway.rb +133 -0
- data/lib/braintree/credit_card_verification.rb +8 -0
- data/lib/braintree/customer.rb +70 -123
- data/lib/braintree/customer_gateway.rb +121 -0
- data/lib/braintree/digest.rb +2 -2
- data/lib/braintree/discount.rb +4 -0
- data/lib/braintree/error_codes.rb +50 -5
- data/lib/braintree/error_result.rb +4 -18
- data/lib/braintree/errors.rb +1 -2
- data/lib/braintree/exceptions.rb +11 -16
- data/lib/braintree/gateway.rb +39 -0
- data/lib/braintree/http.rb +30 -26
- data/lib/braintree/modification.rb +23 -0
- data/lib/braintree/resource_collection.rb +1 -1
- data/lib/braintree/subscription.rb +29 -129
- data/lib/braintree/subscription_gateway.rb +122 -0
- data/lib/braintree/subscription_search.rb +6 -7
- data/lib/braintree/successful_result.rb +1 -12
- data/lib/braintree/test/credit_card_numbers.rb +4 -2
- data/lib/braintree/test/transaction_amounts.rb +3 -0
- data/lib/braintree/transaction.rb +83 -243
- data/lib/braintree/transaction/credit_card_details.rb +4 -4
- data/lib/braintree/transaction_gateway.rb +124 -0
- data/lib/braintree/transaction_search.rb +5 -3
- data/lib/braintree/transparent_redirect.rb +19 -112
- data/lib/braintree/transparent_redirect_gateway.rb +105 -0
- data/lib/braintree/util.rb +4 -0
- data/lib/braintree/validation_error.rb +1 -0
- data/lib/braintree/validation_error_collection.rb +5 -23
- data/lib/braintree/version.rb +2 -2
- data/lib/braintree/xml/parser.rb +1 -1
- data/lib/braintree/xml/rexml.rb +2 -2
- data/spec/integration/braintree/advanced_search_spec.rb +532 -0
- data/spec/integration/braintree/credit_card_spec.rb +5 -8
- data/spec/integration/braintree/http_spec.rb +53 -39
- data/spec/integration/braintree/subscription_spec.rb +678 -213
- data/spec/integration/braintree/transaction_search_spec.rb +318 -43
- data/spec/integration/braintree/transaction_spec.rb +134 -3
- data/spec/integration/braintree/transparent_redirect_spec.rb +1 -1
- data/spec/spec_helper.rb +55 -4
- data/spec/unit/braintree/address_spec.rb +8 -8
- data/spec/unit/braintree/base_module_spec.rb +1 -1
- data/spec/unit/braintree/configuration_spec.rb +34 -29
- data/spec/unit/braintree/credit_card_spec.rb +14 -12
- data/spec/unit/braintree/credit_card_verification_spec.rb +16 -0
- data/spec/unit/braintree/customer_spec.rb +10 -8
- data/spec/unit/braintree/digest_spec.rb +8 -17
- data/spec/unit/braintree/error_result_spec.rb +12 -2
- data/spec/unit/braintree/http_spec.rb +2 -2
- data/spec/unit/braintree/subscription_search_spec.rb +77 -0
- data/spec/unit/braintree/subscription_spec.rb +16 -8
- data/spec/unit/braintree/transaction_spec.rb +17 -12
- data/spec/unit/braintree/transparent_redirect_spec.rb +12 -12
- data/spec/unit/braintree/util_spec.rb +24 -0
- data/spec/unit/braintree/xml/parser_spec.rb +1 -1
- data/spec/unit/braintree_spec.rb +1 -1
- metadata +16 -5
@@ -0,0 +1,122 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SubscriptionGateway # :nodoc:
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
end
|
7
|
+
|
8
|
+
def cancel(subscription_id)
|
9
|
+
response = @config.http.put "/subscriptions/#{subscription_id}/cancel"
|
10
|
+
if response[:subscription]
|
11
|
+
SuccessfulResult.new(:subscription => Subscription._new(@gateway, response[:subscription]))
|
12
|
+
elsif response[:api_error_response]
|
13
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
14
|
+
else
|
15
|
+
raise UnexpectedError, "expected :subscription or :api_error_response"
|
16
|
+
end
|
17
|
+
rescue NotFoundError
|
18
|
+
raise NotFoundError, "subscription with id #{subscription_id.inspect} not found"
|
19
|
+
end
|
20
|
+
|
21
|
+
def create(attributes)
|
22
|
+
Util.verify_keys(SubscriptionGateway._create_signature, attributes)
|
23
|
+
_do_create "/subscriptions", :subscription => attributes
|
24
|
+
end
|
25
|
+
|
26
|
+
def find(id)
|
27
|
+
response = @config.http.get "/subscriptions/#{id}"
|
28
|
+
Subscription._new(@gateway, response[:subscription])
|
29
|
+
rescue NotFoundError
|
30
|
+
raise NotFoundError, "subscription with id #{id.inspect} not found"
|
31
|
+
end
|
32
|
+
|
33
|
+
def search(&block)
|
34
|
+
search = SubscriptionSearch.new
|
35
|
+
block.call(search) if block
|
36
|
+
|
37
|
+
response = @config.http.post "/subscriptions/advanced_search_ids", {:search => search.to_hash}
|
38
|
+
ResourceCollection.new(response) { |ids| _fetch_subscriptions(search, ids) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def update(subscription_id, attributes)
|
42
|
+
Util.verify_keys(SubscriptionGateway._update_signature, attributes)
|
43
|
+
response = @config.http.put "/subscriptions/#{subscription_id}", :subscription => attributes
|
44
|
+
if response[:subscription]
|
45
|
+
SuccessfulResult.new(:subscription => Subscription._new(@gateway, response[:subscription]))
|
46
|
+
elsif response[:api_error_response]
|
47
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
48
|
+
else
|
49
|
+
raise UnexpectedError, "expected :subscription or :api_error_response"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self._create_signature # :nodoc:
|
54
|
+
[
|
55
|
+
:billing_day_of_month,
|
56
|
+
:first_billing_date,
|
57
|
+
:id,
|
58
|
+
:merchant_account_id,
|
59
|
+
:never_expires,
|
60
|
+
:number_of_billing_cycles,
|
61
|
+
:payment_method_token,
|
62
|
+
:plan_id,
|
63
|
+
:price,
|
64
|
+
:trial_duration,
|
65
|
+
:trial_duration_unit,
|
66
|
+
:trial_period,
|
67
|
+
{:options => [:do_not_inherit_add_ons_or_discounts, :start_immediately]},
|
68
|
+
] + _add_on_discount_signature
|
69
|
+
end
|
70
|
+
|
71
|
+
def self._update_signature # :nodoc:
|
72
|
+
[
|
73
|
+
:id,
|
74
|
+
:merchant_account_id,
|
75
|
+
:never_expires,
|
76
|
+
:number_of_billing_cycles,
|
77
|
+
:payment_method_token,
|
78
|
+
:plan_id,
|
79
|
+
:price,
|
80
|
+
{:options => [:prorate_charges, :replace_all_add_ons_and_discounts]},
|
81
|
+
] + _add_on_discount_signature
|
82
|
+
end
|
83
|
+
|
84
|
+
def self._add_on_discount_signature # :nodoc:
|
85
|
+
[
|
86
|
+
{
|
87
|
+
:add_ons => [
|
88
|
+
{:add => [:amount, :inherited_from_id, :never_expires, :number_of_billing_cycles, :quantity]},
|
89
|
+
{:update => [:amount, :existing_id, :never_expires, :number_of_billing_cycles, :quantity]},
|
90
|
+
{:remove => [:_any_key_]}
|
91
|
+
]
|
92
|
+
},
|
93
|
+
{
|
94
|
+
:discounts => [
|
95
|
+
{:add => [:amount, :inherited_from_id, :never_expires, :number_of_billing_cycles, :quantity]},
|
96
|
+
{:update => [:amount, :existing_id, :never_expires, :number_of_billing_cycles, :quantity]},
|
97
|
+
{:remove => [:_any_key_]}
|
98
|
+
]
|
99
|
+
}
|
100
|
+
]
|
101
|
+
end
|
102
|
+
|
103
|
+
def _do_create(url, params) # :nodoc:
|
104
|
+
response = @config.http.post url, params
|
105
|
+
if response[:subscription]
|
106
|
+
SuccessfulResult.new(:subscription => Subscription._new(@gateway, response[:subscription]))
|
107
|
+
elsif response[:api_error_response]
|
108
|
+
ErrorResult.new(@gateway, response[:api_error_response])
|
109
|
+
else
|
110
|
+
raise UnexpectedError, "expected :subscription or :api_error_response"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def _fetch_subscriptions(search, ids) # :nodoc:
|
115
|
+
search.ids.in ids
|
116
|
+
response = @config.http.post "/subscriptions/advanced_search", {:search => search.to_hash}
|
117
|
+
attributes = response[:subscriptions]
|
118
|
+
Util.extract_attribute_as_array(attributes, :subscription).map { |attrs| Subscription._new(@gateway, attrs) }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
@@ -1,11 +1,10 @@
|
|
1
1
|
module Braintree
|
2
|
-
class SubscriptionSearch < AdvancedSearch
|
2
|
+
class SubscriptionSearch < AdvancedSearch # :nodoc:
|
3
3
|
multiple_value_field :ids
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
]
|
4
|
+
text_fields :id
|
5
|
+
multiple_value_or_text_field :plan_id
|
6
|
+
multiple_value_field :status, :allows => Subscription::Status::All
|
7
|
+
multiple_value_field :merchant_account_id
|
8
|
+
range_fields :price, :days_past_due, :billing_cycles_remaining
|
10
9
|
end
|
11
10
|
end
|
@@ -1,16 +1,5 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
# validations pass. It will provide access to the created resource.
|
4
|
-
# For example, when creating a customer, SuccessfulResult will
|
5
|
-
# respond to +customer+ like so:
|
6
|
-
#
|
7
|
-
# result = Customer.create(:first_name => "John")
|
8
|
-
# if result.success?
|
9
|
-
# # have a SuccessfulResult
|
10
|
-
# puts "Created customer #{result.customer.id}
|
11
|
-
# else
|
12
|
-
# # have an ErrorResult
|
13
|
-
# end
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/general/result_objects
|
14
3
|
class SuccessfulResult
|
15
4
|
include BaseModule
|
16
5
|
|
@@ -3,6 +3,8 @@ module Braintree
|
|
3
3
|
# The constants contained in the Braintree::Test::CreditCardNumbers module provide
|
4
4
|
# credit card numbers that should be used when working in the sandbox environment. The sandbox
|
5
5
|
# will not accept any credit card numbers other than the ones listed below.
|
6
|
+
#
|
7
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/reference/sandbox
|
6
8
|
module CreditCardNumbers
|
7
9
|
AmExes = %w[
|
8
10
|
378282246310005
|
@@ -30,7 +32,7 @@ module Braintree
|
|
30
32
|
4009348888881881
|
31
33
|
4012888888881881
|
32
34
|
4111111111111111
|
33
|
-
|
35
|
+
4000111111111115
|
34
36
|
]
|
35
37
|
Unknowns = %w[
|
36
38
|
1000000000000008
|
@@ -40,7 +42,7 @@ module Braintree
|
|
40
42
|
AmEx = "378734493671000"
|
41
43
|
Discover = "6011000990139424"
|
42
44
|
MasterCard = "5105105105105100"
|
43
|
-
Visa = "
|
45
|
+
Visa = "4000111111111115"
|
44
46
|
Numbers = [AmEx, Discover, MasterCard, Visa]
|
45
47
|
end
|
46
48
|
|
@@ -2,9 +2,12 @@ module Braintree
|
|
2
2
|
module Test # :nodoc:
|
3
3
|
# The constants in this module can be used to create transactions with
|
4
4
|
# the desired status in the sandbox environment.
|
5
|
+
#
|
6
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/reference/sandbox
|
5
7
|
module TransactionAmounts
|
6
8
|
Authorize = "1000.00"
|
7
9
|
Decline = "2000.00"
|
10
|
+
Fail = "3000.00"
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -1,125 +1,5 @@
|
|
1
1
|
module Braintree
|
2
|
-
#
|
3
|
-
#
|
4
|
-
# At minimum, an amount, credit card number, and credit card expiration date are required. Minimalistic
|
5
|
-
# example:
|
6
|
-
# Braintree::Transaction.sale!(
|
7
|
-
# :amount => "100.00",
|
8
|
-
# :credit_card => {
|
9
|
-
# :number => "5105105105105100",
|
10
|
-
# :expiration_date => "05/2012"
|
11
|
-
# }
|
12
|
-
# )
|
13
|
-
#
|
14
|
-
# Full example:
|
15
|
-
#
|
16
|
-
# Braintree::Transaction.sale!(
|
17
|
-
# :amount => "100.00",
|
18
|
-
# :order_id => "123",
|
19
|
-
# :credit_card => {
|
20
|
-
# # if :token is omitted, the gateway will generate a token
|
21
|
-
# :token => "credit_card_123",
|
22
|
-
# :number => "5105105105105100",
|
23
|
-
# :expiration_date => "05/2011",
|
24
|
-
# :cvv => "123"
|
25
|
-
# },
|
26
|
-
# :customer => {
|
27
|
-
# # if :id is omitted, the gateway will generate an id
|
28
|
-
# :id => "customer_123",
|
29
|
-
# :first_name => "Dan",
|
30
|
-
# :last_name => "Smith",
|
31
|
-
# :company => "Braintree Payment Solutions",
|
32
|
-
# :email => "dan@example.com",
|
33
|
-
# :phone => "419-555-1234",
|
34
|
-
# :fax => "419-555-1235",
|
35
|
-
# :website => "http://braintreepaymentsolutions.com"
|
36
|
-
# },
|
37
|
-
# :billing => {
|
38
|
-
# :first_name => "Carl",
|
39
|
-
# :last_name => "Jones",
|
40
|
-
# :company => "Braintree",
|
41
|
-
# :street_address => "123 E Main St",
|
42
|
-
# :extended_address => "Suite 403",
|
43
|
-
# :locality => "Chicago",
|
44
|
-
# :region => "IL",
|
45
|
-
# :postal_code => "60622",
|
46
|
-
# :country_name => "United States of America"
|
47
|
-
# },
|
48
|
-
# :shipping => {
|
49
|
-
# :first_name => "Andrew",
|
50
|
-
# :last_name => "Mason",
|
51
|
-
# :company => "Braintree",
|
52
|
-
# :street_address => "456 W Main St",
|
53
|
-
# :extended_address => "Apt 2F",
|
54
|
-
# :locality => "Bartlett",
|
55
|
-
# :region => "IL",
|
56
|
-
# :postal_code => "60103",
|
57
|
-
# :country_name => "United States of America"
|
58
|
-
# },
|
59
|
-
# :custom_fields => {
|
60
|
-
# :birthdate => "11/13/1954"
|
61
|
-
# }
|
62
|
-
# )
|
63
|
-
#
|
64
|
-
# == Storing in the Vault
|
65
|
-
#
|
66
|
-
# The customer and credit card information used for
|
67
|
-
# a transaction can be stored in the vault by setting
|
68
|
-
# <tt>transaction[options][store_in_vault]</tt> to true.
|
69
|
-
#
|
70
|
-
# transaction = Braintree::Transaction.sale!(
|
71
|
-
# :customer => {
|
72
|
-
# :first_name => "Adam",
|
73
|
-
# :last_name => "Williams"
|
74
|
-
# },
|
75
|
-
# :credit_card => {
|
76
|
-
# :number => "5105105105105100",
|
77
|
-
# :expiration_date => "05/2012"
|
78
|
-
# },
|
79
|
-
# :options => {
|
80
|
-
# :store_in_vault => true
|
81
|
-
# }
|
82
|
-
# )
|
83
|
-
# transaction.customer_details.id
|
84
|
-
# # => "865534"
|
85
|
-
# transaction.credit_card_details.token
|
86
|
-
# # => "6b6m"
|
87
|
-
#
|
88
|
-
# To also store the billing address in the vault, pass the
|
89
|
-
# +add_billing_address_to_payment_method+ option.
|
90
|
-
#
|
91
|
-
# Braintree::Transaction.sale!(
|
92
|
-
# # ...
|
93
|
-
# :options => {
|
94
|
-
# :store_in_vault => true
|
95
|
-
# :add_billing_address_to_payment_method => true
|
96
|
-
# }
|
97
|
-
# )
|
98
|
-
#
|
99
|
-
# == Submitting for Settlement
|
100
|
-
#
|
101
|
-
# This can only be done when the transction's
|
102
|
-
# status is +authorized+. If +amount+ is not specified, the full authorized amount will be
|
103
|
-
# settled. If you would like to settle less than the full authorized amount, pass the
|
104
|
-
# desired amount. You cannot settle more than the authorized amount.
|
105
|
-
#
|
106
|
-
# A transaction can be submitted for settlement when created by setting
|
107
|
-
# transaction[options][submit_for_settlement] to true.
|
108
|
-
#
|
109
|
-
# transaction = Braintree::Transaction.sale!(
|
110
|
-
# :amount => "100.00",
|
111
|
-
# :credit_card => {
|
112
|
-
# :number => "5105105105105100",
|
113
|
-
# :expiration_date => "05/2012"
|
114
|
-
# },
|
115
|
-
# :options => {
|
116
|
-
# :submit_for_settlement => true
|
117
|
-
# }
|
118
|
-
# )
|
119
|
-
#
|
120
|
-
# == More Information
|
121
|
-
#
|
122
|
-
# For more detailed documentation on Transactions, see http://www.braintreepaymentsolutions.com/gateway/transaction-api
|
2
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/overview
|
123
3
|
class Transaction
|
124
4
|
include BaseModule
|
125
5
|
|
@@ -130,9 +10,9 @@ module Braintree
|
|
130
10
|
|
131
11
|
module GatewayRejectionReason
|
132
12
|
AVS = "avs"
|
133
|
-
|
13
|
+
AVSAndCVV = "avs_and_cvv"
|
134
14
|
CVV = "cvv"
|
135
|
-
|
15
|
+
Duplicate = "duplicate"
|
136
16
|
end
|
137
17
|
|
138
18
|
module Status
|
@@ -176,6 +56,7 @@ module Braintree
|
|
176
56
|
# The response text from the processor.
|
177
57
|
attr_reader :processor_response_text
|
178
58
|
attr_reader :refund_id, :refunded_transaction_id
|
59
|
+
attr_reader :settlement_batch_id
|
179
60
|
# See Transaction::Status
|
180
61
|
attr_reader :status
|
181
62
|
attr_reader :status_history
|
@@ -183,102 +64,98 @@ module Braintree
|
|
183
64
|
# Will either be "sale" or "credit"
|
184
65
|
attr_reader :type
|
185
66
|
attr_reader :updated_at
|
67
|
+
attr_reader :add_ons, :discounts
|
186
68
|
|
69
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create
|
187
70
|
def self.create(attributes)
|
188
|
-
|
189
|
-
_do_create "/transactions", :transaction => attributes
|
71
|
+
Configuration.gateway.transaction.create(attributes)
|
190
72
|
end
|
191
73
|
|
74
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create
|
192
75
|
def self.create!(attributes)
|
193
76
|
return_object_or_raise(:transaction) { create(attributes) }
|
194
77
|
end
|
195
78
|
|
79
|
+
# Deprecated. Use Braintree::TransparentRedirect.confirm
|
80
|
+
#
|
81
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_tr
|
196
82
|
def self.create_from_transparent_redirect(query_string)
|
197
83
|
warn "[DEPRECATED] Transaction.create_from_transparent_redirect is deprecated. Please use TransparentRedirect.confirm"
|
198
|
-
|
199
|
-
_do_create("/transactions/all/confirm_transparent_redirect_request", :id => params[:id])
|
84
|
+
Configuration.gateway.transaction.create_from_transparent_redirect(query_string)
|
200
85
|
end
|
201
86
|
|
202
|
-
#
|
87
|
+
# Deprecated. Use Braintree::TransparentRedirect.url
|
88
|
+
#
|
89
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create_tr
|
203
90
|
def self.create_transaction_url
|
204
91
|
warn "[DEPRECATED] Transaction.create_transaction_url is deprecated. Please use TransparentRedirect.url"
|
205
|
-
|
92
|
+
Configuration.gateway.transaction.create_transaction_url
|
206
93
|
end
|
207
94
|
|
208
|
-
# Creates a credit transaction.
|
209
95
|
def self.credit(attributes)
|
210
|
-
|
96
|
+
Configuration.gateway.transaction.credit(attributes)
|
211
97
|
end
|
212
98
|
|
213
99
|
def self.credit!(attributes)
|
214
100
|
return_object_or_raise(:transaction) { credit(attributes) }
|
215
101
|
end
|
216
102
|
|
217
|
-
#
|
218
|
-
# if the transaction cannot be found.
|
103
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/search
|
219
104
|
def self.find(id)
|
220
|
-
|
221
|
-
new(response[:transaction])
|
222
|
-
rescue NotFoundError
|
223
|
-
raise NotFoundError, "transaction with id #{id.inspect} not found"
|
105
|
+
Configuration.gateway.transaction.find(id)
|
224
106
|
end
|
225
107
|
|
226
|
-
#
|
108
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/refund
|
109
|
+
def self.refund(id, amount = nil)
|
110
|
+
Configuration.gateway.transaction.refund(id, amount)
|
111
|
+
end
|
112
|
+
|
113
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create
|
227
114
|
def self.sale(attributes)
|
228
|
-
|
115
|
+
Configuration.gateway.transaction.sale(attributes)
|
229
116
|
end
|
230
117
|
|
118
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/create
|
231
119
|
def self.sale!(attributes)
|
232
120
|
return_object_or_raise(:transaction) { sale(attributes) }
|
233
121
|
end
|
234
122
|
|
235
|
-
#
|
236
|
-
# If <tt>query</tt> is a string, the search will be a basic search.
|
237
|
-
# If <tt>query</tt> is a hash, the search will be an advanced search.
|
238
|
-
# See: http://www.braintreepaymentsolutions.com/gateway/transaction-api#searching
|
123
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/search
|
239
124
|
def self.search(&block)
|
240
|
-
search
|
241
|
-
block.call(search) if block
|
242
|
-
|
243
|
-
response = Http.post "/transactions/advanced_search_ids", {:search => search.to_hash}
|
244
|
-
ResourceCollection.new(response) { |ids| _fetch_transactions(search, ids) }
|
125
|
+
Configuration.gateway.transaction.search(&block)
|
245
126
|
end
|
246
127
|
|
247
|
-
#
|
128
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/submit_for_settlement
|
248
129
|
def self.submit_for_settlement(transaction_id, amount = nil)
|
249
|
-
|
250
|
-
response = Http.put "/transactions/#{transaction_id}/submit_for_settlement", :transaction => {:amount => amount}
|
251
|
-
if response[:transaction]
|
252
|
-
SuccessfulResult.new(:transaction => new(response[:transaction]))
|
253
|
-
elsif response[:api_error_response]
|
254
|
-
ErrorResult.new(response[:api_error_response])
|
255
|
-
else
|
256
|
-
raise UnexpectedError, "expected :transaction or :response"
|
257
|
-
end
|
130
|
+
Configuration.gateway.transaction.submit_for_settlement(transaction_id, amount)
|
258
131
|
end
|
259
132
|
|
133
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/submit_for_settlement
|
260
134
|
def self.submit_for_settlement!(transaction_id, amount = nil)
|
261
135
|
return_object_or_raise(:transaction) { submit_for_settlement(transaction_id, amount) }
|
262
136
|
end
|
263
137
|
|
264
|
-
#
|
138
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/void
|
265
139
|
def self.void(transaction_id)
|
266
|
-
|
267
|
-
if response[:transaction]
|
268
|
-
SuccessfulResult.new(:transaction => new(response[:transaction]))
|
269
|
-
elsif response[:api_error_response]
|
270
|
-
ErrorResult.new(response[:api_error_response])
|
271
|
-
else
|
272
|
-
raise UnexpectedError, "expected :transaction or :api_error_response"
|
273
|
-
end
|
140
|
+
Configuration.gateway.transaction.void(transaction_id)
|
274
141
|
end
|
275
142
|
|
143
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/void
|
276
144
|
def self.void!(transaction_id)
|
277
145
|
return_object_or_raise(:transaction) { void(transaction_id) }
|
278
146
|
end
|
279
147
|
|
280
|
-
def initialize(attributes) # :nodoc:
|
281
|
-
|
148
|
+
def initialize(gateway, attributes) # :nodoc:
|
149
|
+
@gateway = gateway
|
150
|
+
set_instance_variables_from_hash(attributes)
|
151
|
+
@amount = Util.to_big_decimal(amount)
|
152
|
+
@credit_card_details = CreditCardDetails.new(@credit_card)
|
153
|
+
@customer_details = CustomerDetails.new(@customer)
|
154
|
+
@billing_details = AddressDetails.new(@billing)
|
155
|
+
@shipping_details = AddressDetails.new(@shipping)
|
156
|
+
@status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
|
157
|
+
add_ons.map! { |attrs| AddOn._new(attrs) } if add_ons
|
158
|
+
discounts.map! { |attrs| Discount._new(attrs) } if discounts
|
282
159
|
end
|
283
160
|
|
284
161
|
# True if <tt>other</tt> is a Braintree::Transaction with the same id.
|
@@ -300,16 +177,17 @@ module Braintree
|
|
300
177
|
"#<#{self.class} #{nice_attributes.join(', ')}>"
|
301
178
|
end
|
302
179
|
|
303
|
-
#
|
180
|
+
# Deprecated. Use Braintree::Transaction.refund
|
181
|
+
#
|
182
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/refund
|
304
183
|
def refund(amount = nil)
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
ErrorResult.new(response[:api_error_response])
|
184
|
+
warn "[DEPRECATED] refund as an instance method is deprecated. Please use CreditCard.refund"
|
185
|
+
result = @gateway.transaction.refund(id, amount)
|
186
|
+
|
187
|
+
if result.success?
|
188
|
+
SuccessfulResult.new(:new_transaction => result.transaction)
|
311
189
|
else
|
312
|
-
|
190
|
+
result
|
313
191
|
end
|
314
192
|
end
|
315
193
|
|
@@ -318,20 +196,23 @@ module Braintree
|
|
318
196
|
!@refund_id.nil?
|
319
197
|
end
|
320
198
|
|
321
|
-
#
|
199
|
+
# Deprecated. Use Braintree::Transaction.submit_for_settlement
|
200
|
+
#
|
201
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/submit_for_settlement
|
322
202
|
def submit_for_settlement(amount = nil)
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
elsif response[:api_error_response]
|
328
|
-
ErrorResult.new(response[:api_error_response])
|
329
|
-
else
|
330
|
-
raise UnexpectedError, "expected transaction or api_error_response"
|
203
|
+
warn "[DEPRECATED] submit_for_settlement as an instance method is deprecated. Please use CreditCard.submit_for_settlement"
|
204
|
+
result = @gateway.transaction.submit_for_settlement(id, amount)
|
205
|
+
if result.success?
|
206
|
+
copy_instance_variables_from_object result.transaction
|
331
207
|
end
|
208
|
+
result
|
332
209
|
end
|
333
210
|
|
211
|
+
# Deprecated. Use Braintree::Transaction.submit_for_settlement!
|
212
|
+
#
|
213
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/submit_for_settlement
|
334
214
|
def submit_for_settlement!(amount = nil)
|
215
|
+
warn "[DEPRECATED] submit_for_settlement! as an instance method is deprecated. Please use CreditCard.submit_for_settlement!"
|
335
216
|
return_object_or_raise(:transaction) { submit_for_settlement(amount) }
|
336
217
|
end
|
337
218
|
|
@@ -341,7 +222,7 @@ module Braintree
|
|
341
222
|
# on vault_billing_address may not match the attributes on billing_details.
|
342
223
|
def vault_billing_address
|
343
224
|
return nil if billing_details.id.nil?
|
344
|
-
|
225
|
+
@gateway.address.find(customer_details.id, billing_details.id)
|
345
226
|
end
|
346
227
|
|
347
228
|
# If this transaction was stored in the vault, or created from vault records,
|
@@ -350,7 +231,7 @@ module Braintree
|
|
350
231
|
# on vault_credit_card may not match the attributes on credit_card_details.
|
351
232
|
def vault_credit_card
|
352
233
|
return nil if credit_card_details.token.nil?
|
353
|
-
|
234
|
+
@gateway.credit_card.find(credit_card_details.token)
|
354
235
|
end
|
355
236
|
|
356
237
|
# If this transaction was stored in the vault, or created from vault records,
|
@@ -359,7 +240,7 @@ module Braintree
|
|
359
240
|
# on vault_customer may not match the attributes on customer_details.
|
360
241
|
def vault_customer
|
361
242
|
return nil if customer_details.id.nil?
|
362
|
-
|
243
|
+
@gateway.customer.find(customer_details.id)
|
363
244
|
end
|
364
245
|
|
365
246
|
# If this transaction was stored in the vault, or created from vault records,
|
@@ -368,23 +249,26 @@ module Braintree
|
|
368
249
|
# on vault_shipping_address may not match the attributes on shipping_details.
|
369
250
|
def vault_shipping_address
|
370
251
|
return nil if shipping_details.id.nil?
|
371
|
-
|
252
|
+
@gateway.address.find(customer_details.id, shipping_details.id)
|
372
253
|
end
|
373
254
|
|
374
|
-
#
|
255
|
+
# Deprecated. Use Braintree::Transaction.void
|
256
|
+
#
|
257
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/void
|
375
258
|
def void
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
elsif response[:api_error_response]
|
381
|
-
ErrorResult.new(response[:api_error_response])
|
382
|
-
else
|
383
|
-
raise UnexpectedError, "expected :transaction or :api_error_response"
|
259
|
+
warn "[DEPRECATED] void as an instance method is deprecated. Please use CreditCard.void"
|
260
|
+
result = @gateway.transaction.void(id)
|
261
|
+
if result.success?
|
262
|
+
copy_instance_variables_from_object result.transaction
|
384
263
|
end
|
264
|
+
result
|
385
265
|
end
|
386
266
|
|
267
|
+
# Deprecated. Use Braintree::Transaction.void!
|
268
|
+
#
|
269
|
+
# See http://www.braintreepaymentsolutions.com/docs/ruby/transactions/void
|
387
270
|
def void!
|
271
|
+
warn "[DEPRECATED] void! as an instance method is deprecated. Please use CreditCard.void!"
|
388
272
|
return_object_or_raise(:transaction) { void }
|
389
273
|
end
|
390
274
|
|
@@ -395,52 +279,8 @@ module Braintree
|
|
395
279
|
end
|
396
280
|
end
|
397
281
|
|
398
|
-
def self._do_create(url, params=nil) # :nodoc:
|
399
|
-
response = Http.post url, params
|
400
|
-
if response[:transaction]
|
401
|
-
SuccessfulResult.new(:transaction => new(response[:transaction]))
|
402
|
-
elsif response[:api_error_response]
|
403
|
-
ErrorResult.new(response[:api_error_response])
|
404
|
-
else
|
405
|
-
raise UnexpectedError, "expected :transaction or :api_error_response"
|
406
|
-
end
|
407
|
-
end
|
408
|
-
|
409
282
|
def self._attributes # :nodoc:
|
410
283
|
[:amount, :created_at, :credit_card_details, :customer_details, :id, :status, :type, :updated_at]
|
411
284
|
end
|
412
|
-
|
413
|
-
def self._create_signature # :nodoc:
|
414
|
-
[
|
415
|
-
:amount, :customer_id, :merchant_account_id, :order_id, :payment_method_token, :type,
|
416
|
-
{:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number]},
|
417
|
-
{:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
|
418
|
-
{
|
419
|
-
:billing => Address._shared_signature
|
420
|
-
},
|
421
|
-
{
|
422
|
-
:shipping => Address._shared_signature
|
423
|
-
},
|
424
|
-
{:options => [:store_in_vault, :submit_for_settlement, :add_billing_address_to_payment_method, :store_shipping_address_in_vault]},
|
425
|
-
{:custom_fields => :_any_key_}
|
426
|
-
]
|
427
|
-
end
|
428
|
-
|
429
|
-
def self._fetch_transactions(search, ids)
|
430
|
-
search.ids.in ids
|
431
|
-
response = Http.post "/transactions/advanced_search", {:search => search.to_hash}
|
432
|
-
attributes = response[:credit_card_transactions]
|
433
|
-
Util.extract_attribute_as_array(attributes, :transaction).map { |attrs| _new(attrs) }
|
434
|
-
end
|
435
|
-
|
436
|
-
def _init(attributes) # :nodoc:
|
437
|
-
set_instance_variables_from_hash(attributes)
|
438
|
-
@amount = Util.to_big_decimal(amount)
|
439
|
-
@credit_card_details = CreditCardDetails.new(@credit_card)
|
440
|
-
@customer_details = CustomerDetails.new(@customer)
|
441
|
-
@billing_details = AddressDetails.new(@billing)
|
442
|
-
@shipping_details = AddressDetails.new(@shipping)
|
443
|
-
@status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
|
444
|
-
end
|
445
285
|
end
|
446
286
|
end
|