braintree 4.9.0 → 4.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/braintree/apple_pay_card.rb +2 -0
- data/lib/braintree/customer.rb +4 -1
- data/lib/braintree/dispute.rb +9 -0
- data/lib/braintree/dispute_search.rb +1 -0
- data/lib/braintree/error_codes.rb +6 -0
- data/lib/braintree/gateway.rb +4 -0
- data/lib/braintree/payment_instrument_type.rb +7 -6
- data/lib/braintree/payment_method_gateway.rb +2 -0
- data/lib/braintree/payment_method_nonce_details.rb +3 -0
- data/lib/braintree/payment_method_parser.rb +2 -0
- data/lib/braintree/sepa_direct_debit_account.rb +58 -0
- data/lib/braintree/sepa_direct_debit_account_gateway.rb +25 -0
- data/lib/braintree/sepa_direct_debit_account_nonce_details.rb +28 -0
- data/lib/braintree/test/nonce.rb +2 -0
- data/lib/braintree/transaction/sepa_direct_debit_account_details.rb +27 -0
- data/lib/braintree/transaction.rb +4 -0
- data/lib/braintree/transaction_search.rb +1 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification.rb +1 -0
- data/lib/braintree/webhook_testing_gateway.rb +76 -0
- data/lib/braintree.rb +4 -0
- data/spec/integration/braintree/customer_spec.rb +1 -1
- data/spec/integration/braintree/dispute_search_spec.rb +29 -5
- data/spec/integration/braintree/paypal_account_spec.rb +2 -2
- data/spec/integration/braintree/sepa_direct_debit_account_spec.rb +176 -0
- data/spec/integration/braintree/subscription_spec.rb +1 -1
- data/spec/integration/braintree/transaction_search_spec.rb +34 -2
- data/spec/integration/braintree/transaction_spec.rb +35 -17
- data/spec/integration/spec_helper.rb +6 -0
- data/spec/unit/braintree/apple_pay_card_spec.rb +99 -11
- data/spec/unit/braintree/customer_spec.rb +11 -1
- data/spec/unit/braintree/dispute_search_spec.rb +1 -0
- data/spec/unit/braintree/dispute_spec.rb +8 -0
- data/spec/unit/braintree/payment_method_nonce_details_spec.rb +9 -1
- data/spec/unit/braintree/sepa_debit_account_nonce_details_spec.rb +29 -0
- data/spec/unit/braintree/sepa_debit_account_spec.rb +85 -0
- data/spec/unit/braintree/transaction/deposit_details_spec.rb +1 -1
- data/spec/unit/braintree/transaction/sepa_direct_debit_account_details_spec.rb +33 -0
- data/spec/unit/braintree/transaction_spec.rb +30 -0
- data/spec/unit/braintree/webhook_notification_spec.rb +16 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d00fc1e35be1af3de05492fc2300a27ff643adec2d6c600088240c54f3ce59cf
|
4
|
+
data.tar.gz: 5c8d2d3aa4e16d587dd83cda3aa5d5f0cda4d17414557564a0754857f4ca706b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b289dbe733557dd65754f36c2e8e592160619d3ea0222e3d645cbea2711752933f9b403140eb3b666531b0cb2372a58fc45f5286e37de111d2fb041d87f41d2a
|
7
|
+
data.tar.gz: 4cdc5ed40d74adfd3d6b6cb3ad622670200f6c60bc9a5314c457e8bfb886265284ff8d62645ffa88d82f7bec6b10816e3919959e527238640e3f932b2b57b821
|
@@ -10,6 +10,7 @@ module Braintree
|
|
10
10
|
All = constants.map { |c| const_get(c) }
|
11
11
|
end
|
12
12
|
|
13
|
+
attr_reader :billing_address
|
13
14
|
attr_reader :bin
|
14
15
|
attr_reader :card_type
|
15
16
|
attr_reader :cardholder_name
|
@@ -39,6 +40,7 @@ module Braintree
|
|
39
40
|
def initialize(gateway, attributes) # :nodoc:
|
40
41
|
@gateway = gateway
|
41
42
|
set_instance_variables_from_hash(attributes)
|
43
|
+
@billing_address = attributes[:billing_address] ? Address._new(@gateway, attributes[:billing_address]) : nil
|
42
44
|
@subscriptions = (@subscriptions || []).map { |subscription_hash| Subscription._new(@gateway, subscription_hash) }
|
43
45
|
end
|
44
46
|
|
data/lib/braintree/customer.rb
CHANGED
@@ -19,6 +19,7 @@ module Braintree
|
|
19
19
|
attr_reader :paypal_accounts
|
20
20
|
attr_reader :phone
|
21
21
|
attr_reader :samsung_pay_cards
|
22
|
+
attr_reader :sepa_direct_debit_accounts
|
22
23
|
attr_reader :tax_identifiers
|
23
24
|
attr_reader :updated_at
|
24
25
|
attr_reader :us_bank_accounts
|
@@ -89,6 +90,7 @@ module Braintree
|
|
89
90
|
@venmo_accounts = (@venmo_accounts || []).map { |pm| VenmoAccount._new gateway, pm }
|
90
91
|
@us_bank_accounts = (@us_bank_accounts || []).map { |pm| UsBankAccount._new gateway, pm }
|
91
92
|
@visa_checkout_cards = (@visa_checkout_cards|| []).map { |pm| VisaCheckoutCard._new gateway, pm }
|
93
|
+
@sepa_direct_debit_accounts = (@sepa_debit_accounts || []).map { |pm| SepaDirectDebitAccount._new gateway, pm }
|
92
94
|
@samsung_pay_cards = (@samsung_pay_cards|| []).map { |pm| SamsungPayCard._new gateway, pm }
|
93
95
|
@addresses = (@addresses || []).map { |addr| Address._new gateway, addr }
|
94
96
|
@tax_identifiers = (@tax_identifiers || []).map { |addr| TaxIdentifier._new gateway, addr }
|
@@ -121,7 +123,8 @@ module Braintree
|
|
121
123
|
@venmo_accounts +
|
122
124
|
@us_bank_accounts +
|
123
125
|
@visa_checkout_cards +
|
124
|
-
@samsung_pay_cards
|
126
|
+
@samsung_pay_cards +
|
127
|
+
@sepa_direct_debit_accounts
|
125
128
|
end
|
126
129
|
|
127
130
|
def inspect # :nodoc:
|
data/lib/braintree/dispute.rb
CHANGED
@@ -21,6 +21,7 @@ module Braintree
|
|
21
21
|
attr_reader :merchant_account_id
|
22
22
|
attr_reader :original_dispute_id
|
23
23
|
attr_reader :paypal_messages
|
24
|
+
attr_reader :pre_dispute_program
|
24
25
|
attr_reader :processor_comments
|
25
26
|
attr_reader :protection_level
|
26
27
|
attr_reader :reason
|
@@ -37,6 +38,7 @@ module Braintree
|
|
37
38
|
|
38
39
|
module Status
|
39
40
|
Accepted = "accepted"
|
41
|
+
AutoAccepted = "auto_accepted"
|
40
42
|
Disputed = "disputed"
|
41
43
|
Expired = "expired"
|
42
44
|
Open = "open"
|
@@ -86,6 +88,13 @@ module Braintree
|
|
86
88
|
All = constants.map { |c| const_get(c) }
|
87
89
|
end
|
88
90
|
|
91
|
+
module PreDisputeProgram
|
92
|
+
None = "none"
|
93
|
+
VisaRdr = "visa_rdr"
|
94
|
+
|
95
|
+
All = constants.map { |c| const_get(c) }
|
96
|
+
end
|
97
|
+
|
89
98
|
class << self
|
90
99
|
protected :new
|
91
100
|
def _new(*args) # :nodoc:
|
@@ -13,6 +13,7 @@ module Braintree
|
|
13
13
|
multiple_value_field :protection_level, :allows => Dispute::ProtectionLevel::All
|
14
14
|
multiple_value_field :kind, :allows => Dispute::Kind::All
|
15
15
|
multiple_value_field :merchant_account_id
|
16
|
+
multiple_value_field :pre_dispute_program, :allows => Dispute::PreDisputeProgram::All
|
16
17
|
multiple_value_field :reason, :allows => Dispute::Reason::All
|
17
18
|
multiple_value_field :reason_code
|
18
19
|
multiple_value_field :status, :allows => Dispute::Status::All
|
@@ -203,6 +203,12 @@ module Braintree
|
|
203
203
|
TokenIsInUse = "92906"
|
204
204
|
end
|
205
205
|
|
206
|
+
module SepaDirectDebitAccount
|
207
|
+
SepaDebitAccountPaymentMethodMandateTypeIsNotSupported = "87115"
|
208
|
+
SepaDebitAccountPaymentMethodCustomerIdIsInvalid = "87116"
|
209
|
+
SepaDebitAccountPaymentMethodCustomerIdIsRequired = "87117"
|
210
|
+
end
|
211
|
+
|
206
212
|
module Subscription
|
207
213
|
BillingDayOfMonthCannotBeUpdated = "91918"
|
208
214
|
BillingDayOfMonthIsInvalid = "91914"
|
data/lib/braintree/gateway.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
module Braintree
|
2
2
|
module PaymentInstrumentType
|
3
|
-
PayPalAccount = "paypal_account"
|
4
|
-
CreditCard = "credit_card"
|
5
3
|
ApplePayCard = "apple_pay_card"
|
4
|
+
CreditCard = "credit_card"
|
6
5
|
GooglePayCard = "android_pay_card"
|
7
|
-
VenmoAccount = "venmo_account"
|
8
|
-
UsBankAccount = "us_bank_account"
|
9
|
-
VisaCheckoutCard = "visa_checkout_card"
|
10
|
-
SamsungPayCard = "samsung_pay_card"
|
11
6
|
LocalPayment = "local_payment"
|
7
|
+
PayPalAccount = "paypal_account"
|
12
8
|
PayPalHere = "paypal_here"
|
9
|
+
SamsungPayCard = "samsung_pay_card"
|
10
|
+
SepaDirectDebitAccount = "sepa_debit_account"
|
11
|
+
UsBankAccount = "us_bank_account"
|
12
|
+
VenmoAccount = "venmo_account"
|
13
|
+
VisaCheckoutCard = "visa_checkout_card"
|
13
14
|
end
|
14
15
|
end
|
@@ -50,6 +50,8 @@ module Braintree
|
|
50
50
|
GooglePayCard._new(@gateway, response[:android_pay_card])
|
51
51
|
elsif response.has_key?(:venmo_account)
|
52
52
|
VenmoAccount._new(@gateway, response[:venmo_account])
|
53
|
+
elsif response.has_key?(:sepa_debit_account)
|
54
|
+
SepaDirectDebitAccount._new(@gateway, response[:sepa_debit_account])
|
53
55
|
else
|
54
56
|
UnknownPaymentMethod._new(@gateway, response)
|
55
57
|
end
|
@@ -9,12 +9,14 @@ module Braintree
|
|
9
9
|
attr_reader :is_network_tokenized
|
10
10
|
attr_reader :last_two
|
11
11
|
attr_reader :payer_info
|
12
|
+
attr_reader :sepa_direct_debit_account_nonce_details
|
12
13
|
|
13
14
|
alias_method :is_network_tokenized?, :is_network_tokenized
|
14
15
|
|
15
16
|
def initialize(attributes)
|
16
17
|
set_instance_variables_from_hash attributes unless attributes.nil?
|
17
18
|
@payer_info = PaymentMethodNonceDetailsPayerInfo.new(attributes[:payer_info]) if attributes[:payer_info]
|
19
|
+
@sepa_direct_debit_account_nonce_details = ::Braintree::SepaDirectDebitAccountNonceDetails.new(attributes)
|
18
20
|
end
|
19
21
|
|
20
22
|
def inspect
|
@@ -26,6 +28,7 @@ module Braintree
|
|
26
28
|
:is_network_tokenized,
|
27
29
|
:last_two,
|
28
30
|
:payer_info,
|
31
|
+
:sepa_direct_debit_account_nonce_details,
|
29
32
|
]
|
30
33
|
|
31
34
|
formatted_attrs = attr_order.map do |attr|
|
@@ -18,6 +18,8 @@ module Braintree
|
|
18
18
|
VisaCheckoutCard._new(gateway, attributes[:visa_checkout_card])
|
19
19
|
elsif attributes[:samsung_pay_card]
|
20
20
|
SamsungPayCard._new(gateway, attributes[:samsung_pay_card])
|
21
|
+
elsif attributes[:sepa_debit_account]
|
22
|
+
SepaDirectDebitAccount._new(gateway, attributes[:sepa_debit_account])
|
21
23
|
else
|
22
24
|
UnknownPaymentMethod._new(gateway, attributes)
|
23
25
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccount
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :bank_reference_token
|
6
|
+
attr_reader :created_at
|
7
|
+
attr_reader :customer_id
|
8
|
+
attr_reader :customer_global_id
|
9
|
+
attr_reader :default
|
10
|
+
attr_reader :global_id
|
11
|
+
attr_reader :image_url
|
12
|
+
attr_reader :last_4
|
13
|
+
attr_reader :mandate_type
|
14
|
+
attr_reader :merchant_or_partner_customer_id
|
15
|
+
attr_reader :token
|
16
|
+
attr_reader :updated_at
|
17
|
+
attr_reader :view_mandate_url
|
18
|
+
|
19
|
+
def initialize(gateway, attributes) # :nodoc:
|
20
|
+
@gateway = gateway
|
21
|
+
set_instance_variables_from_hash(attributes)
|
22
|
+
end
|
23
|
+
|
24
|
+
def default?
|
25
|
+
@default
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
protected :new
|
30
|
+
end
|
31
|
+
|
32
|
+
def self._new(*args) # :nodoc:
|
33
|
+
self.new(*args)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.find(*args)
|
37
|
+
Configuration.gateway.sepa_direct_debit_account.find(*args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.delete(*args)
|
41
|
+
Configuration.gateway.sepa_direct_debit_account.delete(*args)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.sale(token, transaction_attributes)
|
45
|
+
options = transaction_attributes[:options] || {}
|
46
|
+
Configuration.gateway.transaction.sale(
|
47
|
+
transaction_attributes.merge(
|
48
|
+
:payment_method_token => token,
|
49
|
+
:options => options.merge(:submit_for_settlement => true),
|
50
|
+
),
|
51
|
+
)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.sale!(token, transaction_attributes)
|
55
|
+
return_object_or_raise(:transaction) { sale(token, transaction_attributes) }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccountGateway
|
3
|
+
def initialize(gateway)
|
4
|
+
@gateway = gateway
|
5
|
+
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
7
|
+
end
|
8
|
+
|
9
|
+
def find(token)
|
10
|
+
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
11
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/sepa_debit_account/#{token}")
|
12
|
+
SepaDirectDebitAccount._new(@gateway, response[:sepa_debit_account])
|
13
|
+
rescue NotFoundError
|
14
|
+
raise NotFoundError, "sepa direct debit account with token #{token.inspect} not found"
|
15
|
+
end
|
16
|
+
|
17
|
+
def delete(token)
|
18
|
+
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
19
|
+
@config.http.delete("#{@config.base_merchant_path}/payment_methods/sepa_debit_account/#{token}")
|
20
|
+
SuccessfulResult.new
|
21
|
+
rescue NotFoundError
|
22
|
+
raise NotFoundError, "sepa direct debit account with token #{token.inspect} not found"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Braintree
|
2
|
+
class SepaDirectDebitAccountNonceDetails# :nodoc:
|
3
|
+
include BaseModule
|
4
|
+
|
5
|
+
attr_reader :bank_reference_token
|
6
|
+
attr_reader :last_4
|
7
|
+
attr_reader :mandate_type
|
8
|
+
attr_reader :merchant_or_partner_customer_id
|
9
|
+
|
10
|
+
def initialize(attributes)
|
11
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def inspect
|
15
|
+
attr_order = [
|
16
|
+
:bank_reference_token,
|
17
|
+
:last_4,
|
18
|
+
:mandate_type,
|
19
|
+
:merchant_or_partner_customer_id,
|
20
|
+
]
|
21
|
+
|
22
|
+
formatted_attrs = attr_order.map do |attr|
|
23
|
+
"#{attr}: #{send(attr).inspect}"
|
24
|
+
end
|
25
|
+
"#<SepaDirectDebitAccountNonceDetails#{formatted_attrs.join(", ")}>"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/braintree/test/nonce.rb
CHANGED
@@ -4,6 +4,7 @@ module Braintree
|
|
4
4
|
Transactable = "fake-valid-nonce"
|
5
5
|
Consumed = "fake-consumed-nonce"
|
6
6
|
PayPalOneTimePayment = "fake-paypal-one-time-nonce"
|
7
|
+
#NEXT_MAJOR_VERSION - no longer supported in the Gateway, remove this constant
|
7
8
|
PayPalFuturePayment = "fake-paypal-future-nonce"
|
8
9
|
PayPalBillingAgreement = "fake-paypal-billing-agreement-nonce"
|
9
10
|
LocalPayment = "fake-local-payment-method-nonce"
|
@@ -68,6 +69,7 @@ module Braintree
|
|
68
69
|
SamsungPayDiscover = "tokensam_fake_discover"
|
69
70
|
SamsungPayMasterCard = "tokensam_fake_mastercard"
|
70
71
|
SamsungPayVisa = "tokensam_fake_visa"
|
72
|
+
SepaDirectDebit = "fake-sepa-direct-debit-nonce"
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Braintree
|
2
|
+
class Transaction
|
3
|
+
class SepaDirectDebitAccountDetails # :nodoc:
|
4
|
+
include BaseModule
|
5
|
+
|
6
|
+
attr_reader :bank_reference_token
|
7
|
+
attr_reader :capture_id
|
8
|
+
attr_reader :debug_id
|
9
|
+
attr_reader :global_id
|
10
|
+
attr_reader :last_4
|
11
|
+
attr_reader :mandate_type
|
12
|
+
attr_reader :merchant_or_partner_customer_id
|
13
|
+
attr_reader :paypal_v2_order_id
|
14
|
+
attr_reader :refund_from_transaction_fee_amount
|
15
|
+
attr_reader :refund_from_transaction_fee_currency_iso_code
|
16
|
+
attr_reader :refund_id
|
17
|
+
attr_reader :settlement_type
|
18
|
+
attr_reader :token
|
19
|
+
attr_reader :transaction_fee_amount
|
20
|
+
attr_reader :transaction_fee_currency_iso_code
|
21
|
+
|
22
|
+
def initialize(attributes)
|
23
|
+
set_instance_variables_from_hash attributes unless attributes.nil?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -24,6 +24,7 @@ module Braintree
|
|
24
24
|
AVSAndCVV = "avs_and_cvv"
|
25
25
|
CVV = "cvv"
|
26
26
|
Duplicate = "duplicate"
|
27
|
+
ExcessiveRetry = "excessive_retry"
|
27
28
|
Fraud = "fraud"
|
28
29
|
RiskThreshold = "risk_threshold"
|
29
30
|
ThreeDSecure = "three_d_secure"
|
@@ -153,6 +154,8 @@ module Braintree
|
|
153
154
|
attr_reader :samsung_pay_card_details
|
154
155
|
attr_reader :sca_exemption_requested
|
155
156
|
attr_reader :service_fee_amount
|
157
|
+
attr_reader :sepa_direct_debit_account_details
|
158
|
+
attr_reader :sepa_direct_debit_return_code
|
156
159
|
attr_reader :settlement_batch_id
|
157
160
|
attr_reader :shipping_amount
|
158
161
|
attr_reader :shipping_details
|
@@ -307,6 +310,7 @@ module Braintree
|
|
307
310
|
@paypal_here_details = PayPalHereDetails.new(@paypal_here)
|
308
311
|
@samsung_pay_card_details = SamsungPayCardDetails.new(attributes[:samsung_pay_card])
|
309
312
|
@sca_exemption_requested = attributes[:sca_exemption_requested]
|
313
|
+
@sepa_direct_debit_account_details = SepaDirectDebitAccountDetails.new(@sepa_debit_account_detail)
|
310
314
|
@service_fee_amount = Util.to_big_decimal(service_fee_amount)
|
311
315
|
@shipping_details = AddressDetails.new(@shipping)
|
312
316
|
@status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
|
data/lib/braintree/version.rb
CHANGED
@@ -42,6 +42,8 @@ module Braintree
|
|
42
42
|
_dispute_won_sample_xml(id)
|
43
43
|
when Braintree::WebhookNotification::Kind::DisputeAccepted
|
44
44
|
_dispute_accepted_sample_xml(id)
|
45
|
+
when Braintree::WebhookNotification::Kind::DisputeAutoAccepted
|
46
|
+
_dispute_auto_accepted_sample_xml(id)
|
45
47
|
when Braintree::WebhookNotification::Kind::DisputeDisputed
|
46
48
|
_dispute_disputed_sample_xml(id)
|
47
49
|
when Braintree::WebhookNotification::Kind::DisputeExpired
|
@@ -337,6 +339,14 @@ module Braintree
|
|
337
339
|
end
|
338
340
|
end
|
339
341
|
|
342
|
+
def _dispute_auto_accepted_sample_xml(id)
|
343
|
+
if id == "legacy_dispute_id"
|
344
|
+
_old_dispute_auto_accepted_sample_xml(id)
|
345
|
+
else
|
346
|
+
_new_dispute_auto_accepted_sample_xml(id)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
340
350
|
def _dispute_disputed_sample_xml(id)
|
341
351
|
if id == "legacy_dispute_id"
|
342
352
|
_old_dispute_disputed_sample_xml(id)
|
@@ -434,6 +444,26 @@ module Braintree
|
|
434
444
|
XML
|
435
445
|
end
|
436
446
|
|
447
|
+
def _old_dispute_auto_accepted_sample_xml(id)
|
448
|
+
<<-XML
|
449
|
+
<dispute>
|
450
|
+
<amount>100.00</amount>
|
451
|
+
<currency-iso-code>USD</currency-iso-code>
|
452
|
+
<received-date type="date">2014-03-01</received-date>
|
453
|
+
<reply-by-date type="date">2014-03-21</reply-by-date>
|
454
|
+
<kind>chargeback</kind>
|
455
|
+
<status>auto_accepted</status>
|
456
|
+
<reason>fraud</reason>
|
457
|
+
<id>#{id}</id>
|
458
|
+
<transaction>
|
459
|
+
<id>#{id}</id>
|
460
|
+
<amount>100.00</amount>
|
461
|
+
</transaction>
|
462
|
+
<date-opened type=\"date\">2014-03-21</date-opened>
|
463
|
+
</dispute>
|
464
|
+
XML
|
465
|
+
end
|
466
|
+
|
437
467
|
def _old_dispute_disputed_sample_xml(id)
|
438
468
|
<<-XML
|
439
469
|
<dispute>
|
@@ -685,6 +715,52 @@ module Braintree
|
|
685
715
|
XML
|
686
716
|
end
|
687
717
|
|
718
|
+
def _new_dispute_auto_accepted_sample_xml(id)
|
719
|
+
<<-XML
|
720
|
+
<dispute>
|
721
|
+
<id>#{id}</id>
|
722
|
+
<amount>100.00</amount>
|
723
|
+
<amount-disputed>100.00</amount-disputed>
|
724
|
+
<amount-won>95.00</amount-won>
|
725
|
+
<case-number>CASE-12345</case-number>
|
726
|
+
<created-at type="datetime">2017-06-16T20:44:41Z</created-at>
|
727
|
+
<currency-iso-code>USD</currency-iso-code>
|
728
|
+
<forwarded-comments nil="true"/>
|
729
|
+
<kind>chargeback</kind>
|
730
|
+
<merchant-account-id>ytnlulaloidoqwvzxjrdqputg</merchant-account-id>
|
731
|
+
<reason>fraud</reason>
|
732
|
+
<reason-code nil="true"/>
|
733
|
+
<reason-description nil="true"/>
|
734
|
+
<received-date type="date">2016-02-15</received-date>
|
735
|
+
<reference-number>REF-9876</reference-number>
|
736
|
+
<reply-by-date type="date">2016-02-22</reply-by-date>
|
737
|
+
<status>auto_accepted</status>
|
738
|
+
<updated-at type="datetime">2017-06-16T20:44:41Z</updated-at>
|
739
|
+
<original-dispute-id>9qde5qgp</original-dispute-id>
|
740
|
+
<status-history type="array">
|
741
|
+
<status-history>
|
742
|
+
<status>open</status>
|
743
|
+
<timestamp type="datetime">2017-06-16T20:44:41Z</timestamp>
|
744
|
+
</status-history>
|
745
|
+
<status-history>
|
746
|
+
<status>auto_accepted</status>
|
747
|
+
<timestamp type="datetime">2017-06-25T20:50:55Z</timestamp>
|
748
|
+
</status-history>
|
749
|
+
</status-history>
|
750
|
+
<evidence type="array"/>
|
751
|
+
<transaction>
|
752
|
+
<id>#{id}</id>
|
753
|
+
<amount>100.00</amount>
|
754
|
+
<created-at>2017-06-21T20:44:41Z</created-at>
|
755
|
+
<order-id nil="true"/>
|
756
|
+
<purchase-order-number nil="true"/>
|
757
|
+
<payment-instrument-subtype>Visa</payment-instrument-subtype>
|
758
|
+
</transaction>
|
759
|
+
<date-opened type=\"date\">2014-03-21</date-opened>
|
760
|
+
</dispute>
|
761
|
+
XML
|
762
|
+
end
|
763
|
+
|
688
764
|
def _new_dispute_disputed_sample_xml(id)
|
689
765
|
<<-XML
|
690
766
|
<dispute>
|
data/lib/braintree.rb
CHANGED
@@ -124,6 +124,9 @@ require "braintree/us_bank_account_verification_gateway"
|
|
124
124
|
require "braintree/us_bank_account_verification_search"
|
125
125
|
require "braintree/us_bank_account_gateway"
|
126
126
|
require "braintree/transaction/us_bank_account_details"
|
127
|
+
require "braintree/sepa_direct_debit_account"
|
128
|
+
require "braintree/sepa_direct_debit_account_gateway"
|
129
|
+
require "braintree/sepa_direct_debit_account_nonce_details"
|
127
130
|
require "braintree/sha256_digest"
|
128
131
|
require "braintree/signature_service"
|
129
132
|
require "braintree/subscription"
|
@@ -150,6 +153,7 @@ require "braintree/transaction/installment/adjustment"
|
|
150
153
|
require "braintree/transaction/paypal_details"
|
151
154
|
require "braintree/transaction/paypal_here_details"
|
152
155
|
require "braintree/transaction/samsung_pay_card_details"
|
156
|
+
require "braintree/transaction/sepa_direct_debit_account_details"
|
153
157
|
require "braintree/transaction/status_details"
|
154
158
|
require "braintree/transaction/subscription_details"
|
155
159
|
require "braintree/transaction/venmo_account_details"
|
@@ -1754,7 +1754,7 @@ describe Braintree::Customer do
|
|
1754
1754
|
context "future" do
|
1755
1755
|
it "creates a customer with a future paypal account" do
|
1756
1756
|
result = Braintree::Customer.create(
|
1757
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
1757
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
1758
1758
|
)
|
1759
1759
|
|
1760
1760
|
result.should be_success
|
@@ -98,13 +98,37 @@ describe Braintree::Dispute, "search" do
|
|
98
98
|
Braintree::Dispute::ChargebackProtectionLevel::Effortless
|
99
99
|
]
|
100
100
|
end
|
101
|
-
expect(collection.disputes.count).to
|
102
|
-
dispute = collection.disputes.first
|
101
|
+
expect(collection.disputes.count).to be > 0
|
103
102
|
|
104
103
|
# NEXT_MAJOR_VERSION Remove this assertion when chargeback_protection_level is removed from the SDK
|
105
|
-
|
106
|
-
|
107
|
-
|
104
|
+
collection.disputes.each do |dispute|
|
105
|
+
expect(dispute.chargeback_protection_level).to eq(Braintree::Dispute::ChargebackProtectionLevel::Effortless)
|
106
|
+
expect(dispute.protection_level).to eq(Braintree::Dispute::ProtectionLevel::EffortlessCBP)
|
107
|
+
expect(dispute.reason).to eq(Braintree::Dispute::Reason::Fraud)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "pre-dispute program" do
|
112
|
+
it "correctly returns disputes by pre-dispute program" do
|
113
|
+
collection = Braintree::Dispute.search do |search|
|
114
|
+
search.pre_dispute_program.in [
|
115
|
+
Braintree::Dispute::PreDisputeProgram::VisaRdr
|
116
|
+
]
|
117
|
+
end
|
118
|
+
|
119
|
+
expect(collection.disputes.count).to eq(1)
|
120
|
+
dispute = collection.disputes.first
|
121
|
+
expect(dispute.pre_dispute_program).to eq(Braintree::Dispute::PreDisputeProgram::VisaRdr)
|
122
|
+
end
|
123
|
+
|
124
|
+
it "correctly returns disputes with no pre-dispute program" do
|
125
|
+
collection = Braintree::Dispute.search do |search|
|
126
|
+
search.pre_dispute_program.is Braintree::Dispute::PreDisputeProgram::None
|
127
|
+
end
|
128
|
+
|
129
|
+
expect(collection.disputes.count).to be > 1
|
130
|
+
expect(collection.disputes.map(&:pre_dispute_program).uniq).to eq([Braintree::Dispute::PreDisputeProgram::None])
|
131
|
+
end
|
108
132
|
end
|
109
133
|
|
110
134
|
it "correctly returns disputes by effective_date range" do
|
@@ -267,7 +267,7 @@ describe Braintree::PayPalAccount do
|
|
267
267
|
context "self.sale" do
|
268
268
|
it "creates a transaction using a paypal account and returns a result object" do
|
269
269
|
customer = Braintree::Customer.create!(
|
270
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
270
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
271
271
|
)
|
272
272
|
|
273
273
|
result = Braintree::PayPalAccount.sale(customer.paypal_accounts[0].token, :amount => "100.00")
|
@@ -283,7 +283,7 @@ describe Braintree::PayPalAccount do
|
|
283
283
|
context "self.sale!" do
|
284
284
|
it "creates a transaction using a paypal account and returns a transaction" do
|
285
285
|
customer = Braintree::Customer.create!(
|
286
|
-
:payment_method_nonce => Braintree::Test::Nonce::
|
286
|
+
:payment_method_nonce => Braintree::Test::Nonce::PayPalBillingAgreement,
|
287
287
|
)
|
288
288
|
|
289
289
|
transaction = Braintree::PayPalAccount.sale!(customer.paypal_accounts[0].token, :amount => "100.00")
|