braintree 4.17.0 → 4.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02bb65b55ac949e73761f1a9ded2f1cf844bc81b7bbfc48d39e080387166e4d2
4
- data.tar.gz: b3975e3c6a0d415544cc643aaa2471f3efe532537a0ad1a8175dcf42767b2684
3
+ metadata.gz: b8d5039746bfcbc33e3899cb43cf5a014084278543b5c83ea0b09146a0c0b63b
4
+ data.tar.gz: 688a569cbff984a1d6a0571095a7f990efda7ce717ee9393c93263f8b9007f80
5
5
  SHA512:
6
- metadata.gz: 6eb74dc8f70c828d8112b177bd9c424816626064fbfba2615d7246f9bae54513c5637b43be0c70a36e4dff5ac0b00aefbf208f66549829e64d37e30a37f0920a
7
- data.tar.gz: d6af576d6a66816007de302db284e2bb456c1a37347eadac4df3ba483d5ab728e2a04dc26f2d98be91082c1a4b30790417e2d102bfd8b054b524c4b6d40174d5
6
+ metadata.gz: df005acb10a67bdcf42ab131f49b93f595ad9431004922502b255c54d4222960e54a344a018abd0175c3b340d8474215a1f49b0a210b590fbe78fe020bf7daf1
7
+ data.tar.gz: 783676045da0d1240f5b9cd808149f04fd9a7005c99015ff5ec07ff0a0ffcf4093e1e0ab896334f2e7e0f953829a62b8532130a3057bef5c344d506c58064d67
@@ -561,6 +561,10 @@ module Braintree
561
561
  UnitTaxAmountCannotBeNegative = "95826"
562
562
  UnitTaxAmountFormatIsInvalid = "95824"
563
563
  UnitTaxAmountIsTooLarge = "95825"
564
+ UPCCodeIsMissing = "95830"
565
+ UPCCodeIsTooLong = "95831"
566
+ UPCTypeIsMissing = "95832"
567
+ UPCTypeIsInvalid = "95833"
564
568
  end
565
569
 
566
570
  module Merchant
@@ -0,0 +1,16 @@
1
+ module Braintree
2
+ class Transaction
3
+ class PackageDetails
4
+ include BaseModule
5
+
6
+ attr_reader :carrier
7
+ attr_reader :id
8
+ attr_reader :paypal_tracking_id
9
+ attr_reader :tracking_number
10
+
11
+ def initialize(attributes)
12
+ set_instance_variables_from_hash attributes unless attributes.nil?
13
+ end
14
+ end
15
+ end
16
+ end
@@ -138,6 +138,7 @@ module Braintree
138
138
  attr_reader :network_token_details
139
139
  attr_reader :network_transaction_id
140
140
  attr_reader :order_id
141
+ attr_reader :packages
141
142
  attr_reader :partial_settlement_transaction_ids
142
143
  attr_reader :payment_instrument_type
143
144
  attr_reader :payment_receipt
@@ -284,6 +285,14 @@ module Braintree
284
285
  return_object_or_raise(:transaction) { update_details(*args) }
285
286
  end
286
287
 
288
+ def self.package_tracking(*args)
289
+ Configuration.gateway.transaction.package_tracking(*args)
290
+ end
291
+
292
+ def self.package_tracking!(*args)
293
+ Configuration.gateway.transaction.package_tracking!(*args)
294
+ end
295
+
287
296
  def self.submit_for_partial_settlement(*args)
288
297
  Configuration.gateway.transaction.submit_for_partial_settlement(*args)
289
298
  end
@@ -325,6 +334,7 @@ module Braintree
325
334
  @sca_exemption_requested = attributes[:sca_exemption_requested]
326
335
  @sepa_direct_debit_account_details = SepaDirectDebitAccountDetails.new(@sepa_debit_account_detail)
327
336
  @service_fee_amount = Util.to_big_decimal(service_fee_amount)
337
+ @packages = attributes[:shipments] ? attributes[:shipments].map { |pd| PackageDetails.new(pd) } : []
328
338
  @shipping_details = AddressDetails.new(@shipping)
329
339
  @status_history = attributes[:status_history] ? attributes[:status_history].map { |s| StatusDetails.new(s) } : []
330
340
  @subscription_details = SubscriptionDetails.new(@subscription)
@@ -112,6 +112,16 @@ module Braintree
112
112
  return_object_or_raise(:transaction) { sale(*args) }
113
113
  end
114
114
 
115
+ def package_tracking(transaction_id, package_tracking_request)
116
+ raise ArgumentError, "transaction_id is invalid" unless transaction_id =~ /\A[0-9a-z]+\z/
117
+ Util.verify_keys(TransactionGateway._package_tracking_request_signature, package_tracking_request)
118
+ _do_create "/transactions/#{transaction_id}/shipments", :shipment => package_tracking_request
119
+ end
120
+
121
+ def package_tracking!(*args)
122
+ return_object_or_raise(:transaction) { package_tracking(*args) }
123
+ end
124
+
115
125
  def search(&block)
116
126
  search = TransactionSearch.new
117
127
  block.call(search) if block
@@ -187,6 +197,14 @@ module Braintree
187
197
  return_object_or_raise(:transaction) { void(*args) }
188
198
  end
189
199
 
200
+ def self._package_tracking_request_signature
201
+ [
202
+ :carrier,
203
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
204
+ :notify_payer, :tracking_number,
205
+ ]
206
+ end
207
+
190
208
  def self._clone_signature
191
209
  [:amount, :channel, {:options => [:submit_for_settlement]}]
192
210
  end
@@ -204,7 +222,7 @@ module Braintree
204
222
  :ships_from_postal_code, :tax_amount, :tax_exempt, :three_d_secure_authentication_id,:three_d_secure_token, #Deprecated
205
223
  :transaction_source, :type, :venmo_sdk_payment_method_code, # Deprecated
206
224
  :sca_exemption, :currency_iso_code, :exchange_rate_quote_id,
207
- {:line_items => [:quantity, :name, :description, :kind, :unit_amount, :unit_tax_amount, :total_amount, :discount_amount, :tax_amount, :unit_of_measure, :product_code, :commodity_code, :url]},
225
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
208
226
  {:risk_data => [:customer_browser, :customer_device_id, :customer_ip, :customer_location_zip, :customer_tenure]},
209
227
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}, {:network_tokenization_attributes => [:cryptogram, :ecommerce_indicator, :token_requestor_id]}]},
210
228
  {:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
@@ -244,7 +262,7 @@ module Braintree
244
262
  {:three_d_secure => [:required]},
245
263
  {:amex_rewards => [:request_id, :points, :currency_amount, :currency_iso_code]},
246
264
  {:venmo => [:profile_id]},
247
- {:credit_card => [:account_type]},
265
+ {:credit_card => [:account_type, :process_debit_as_credit]},
248
266
  ]
249
267
  },
250
268
  {:external_vault => [
@@ -300,7 +318,7 @@ module Braintree
300
318
  :discount_amount,
301
319
  :shipping_amount,
302
320
  :ships_from_postal_code,
303
- :line_items => [:commodity_code, :description, :discount_amount, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :url, :tax_amount],
321
+ :line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url],
304
322
  ]
305
323
  end
306
324
 
@@ -1,18 +1,21 @@
1
1
  module Braintree
2
2
  class TransactionLineItem
3
3
  include BaseModule
4
- attr_reader :quantity
5
- attr_reader :name
4
+ attr_reader :commodity_code
6
5
  attr_reader :description
7
- attr_reader :kind
8
- attr_reader :unit_amount
9
- attr_reader :unit_tax_amount
10
- attr_reader :unit_of_measure
11
6
  attr_reader :discount_amount
7
+ attr_reader :image_url
8
+ attr_reader :kind
9
+ attr_reader :name
10
+ attr_reader :product_code
11
+ attr_reader :quantity
12
12
  attr_reader :tax_amount
13
13
  attr_reader :total_amount
14
- attr_reader :product_code
15
- attr_reader :commodity_code
14
+ attr_reader :unit_amount
15
+ attr_reader :unit_of_measure
16
+ attr_reader :unit_tax_amount
17
+ attr_reader :upc_code
18
+ attr_reader :upc_type
16
19
  attr_reader :url
17
20
 
18
21
  def initialize(gateway, attributes)
@@ -1,7 +1,7 @@
1
1
  module Braintree
2
2
  module Version
3
3
  Major = 4
4
- Minor = 17
4
+ Minor = 18
5
5
  Tiny = 0
6
6
 
7
7
  String = "#{Major}.#{Minor}.#{Tiny}"
data/lib/braintree.rb CHANGED
@@ -156,6 +156,7 @@ require "braintree/transaction/payment_receipt/card_present_data.rb"
156
156
  require "braintree/transaction/payment_receipt/merchant_address.rb"
157
157
  require "braintree/transaction/meta_checkout_card_details"
158
158
  require "braintree/transaction/meta_checkout_token_details"
159
+ require "braintree/transaction/package_details"
159
160
  require "braintree/transaction/paypal_details"
160
161
  require "braintree/transaction/paypal_here_details"
161
162
  require "braintree/transaction/samsung_pay_card_details"
@@ -276,7 +276,7 @@ describe Braintree::CreditCard do
276
276
  :customer_id => customer.id,
277
277
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
278
278
  :three_d_secure_pass_thru => {
279
- :eci_flag => "02",
279
+ :eci_flag => "05",
280
280
  :cavv => "some_cavv",
281
281
  :xid => "some_xid",
282
282
  :authentication_response => "Y",
@@ -298,7 +298,7 @@ describe Braintree::CreditCard do
298
298
  :customer_id => customer.id,
299
299
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
300
300
  :three_d_secure_pass_thru => {
301
- :eci_flag => "02",
301
+ :eci_flag => "05",
302
302
  :cavv => "some_cavv",
303
303
  :xid => "some_xid",
304
304
  :three_d_secure_version => "1.0.2",
@@ -310,7 +310,6 @@ describe Braintree::CreditCard do
310
310
  :options => {:verify_card => true},
311
311
  )
312
312
  expect(result.success?).to eq(true)
313
-
314
313
  end
315
314
 
316
315
  it "returns 3DS info on cc verification" do
@@ -793,7 +792,7 @@ describe Braintree::CreditCard do
793
792
  result = Braintree::CreditCard.update(credit_card.token,
794
793
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
795
794
  :three_d_secure_pass_thru => {
796
- :eci_flag => "02",
795
+ :eci_flag => "05",
797
796
  :cavv => "some_cavv",
798
797
  :xid => "some_xid",
799
798
  :authentication_response => "Y",
@@ -821,7 +820,7 @@ describe Braintree::CreditCard do
821
820
  result = Braintree::CreditCard.update(credit_card.token,
822
821
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
823
822
  :three_d_secure_pass_thru => {
824
- :eci_flag => "02",
823
+ :eci_flag => "05",
825
824
  :cavv => "some_cavv",
826
825
  :three_d_secure_version=> "2.1.0",
827
826
  :xid => "some_xid",
@@ -405,7 +405,7 @@ describe Braintree::CreditCardVerification, "search" do
405
405
  :amount => "10.00",
406
406
  },
407
407
  :three_d_secure_pass_thru => {
408
- :eci_flag => "02",
408
+ :eci_flag => "05",
409
409
  :cavv => "some_cavv",
410
410
  :xid => "some_xid",
411
411
  :three_d_secure_version => "1.0.2",
@@ -1132,7 +1132,7 @@ describe Braintree::Customer do
1132
1132
  :number => 4111111111111111,
1133
1133
  :expiration_date => "05/2060",
1134
1134
  :three_d_secure_pass_thru => {
1135
- :eci_flag => "02",
1135
+ :eci_flag => "05",
1136
1136
  :cavv => "some_cavv",
1137
1137
  :xid => "some_xid",
1138
1138
  :three_d_secure_version => "1.0.2",
@@ -1167,7 +1167,7 @@ describe Braintree::Customer do
1167
1167
  :number => 4111111111111111,
1168
1168
  :expiration_date => "05/2060",
1169
1169
  :three_d_secure_pass_thru => {
1170
- :eci_flag => "02",
1170
+ :eci_flag => "05",
1171
1171
  :cavv => "some_cavv",
1172
1172
  :xid => "some_xid",
1173
1173
  :authentication_response => "Y",
@@ -1451,7 +1451,7 @@ describe Braintree::Customer do
1451
1451
  :payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
1452
1452
  :credit_card => {
1453
1453
  :three_d_secure_pass_thru => {
1454
- :eci_flag => "02",
1454
+ :eci_flag => "05",
1455
1455
  :cavv => "some_cavv",
1456
1456
  :xid => "some_xid",
1457
1457
  :three_d_secure_version => "xx",
@@ -1475,7 +1475,7 @@ describe Braintree::Customer do
1475
1475
  :payment_method_nonce => Braintree::Test::Nonce::ThreeDSecureVisaFullAuthentication,
1476
1476
  :credit_card => {
1477
1477
  :three_d_secure_pass_thru => {
1478
- :eci_flag => "02",
1478
+ :eci_flag => "05",
1479
1479
  :cavv => "some_cavv",
1480
1480
  :xid => "some_xid",
1481
1481
  :three_d_secure_version => "2.2.1",
@@ -0,0 +1,111 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe Braintree::Transaction do
4
+ describe "self.package_tracking" do
5
+ it "returns validation error message from gateway api" do
6
+ # Create Transaction
7
+ result = Braintree::Transaction.sale(
8
+ :amount => "100",
9
+ :options => {
10
+ :submit_for_settlement => true
11
+ },
12
+ :paypal_account => {
13
+ :payer_id => "fake-payer-id",
14
+ :payment_id => "fake-payment-id",
15
+ },
16
+ )
17
+
18
+ expect(result.success?).to eq(true)
19
+
20
+ # Carrier name is required
21
+ invalidResult = Braintree::Transaction.package_tracking(result.transaction.id, {tracking_number: "tracking_number_1"})
22
+ expect(invalidResult.message).to eq("Carrier name is required.")
23
+
24
+ # Tracking number is required
25
+ invalidResult = Braintree::Transaction.package_tracking(result.transaction.id, {carrier: "UPS"})
26
+ expect(invalidResult.message).to eq("Tracking number is required.")
27
+ end
28
+
29
+ it "successfully calls gateway API and adds package tracking information" do
30
+
31
+ # Create Transaction
32
+ result = Braintree::Transaction.sale(
33
+ :amount => "100",
34
+ :options => {
35
+ :submit_for_settlement => true
36
+ },
37
+ :paypal_account => {
38
+ :payer_id => "fake-payer-id",
39
+ :payment_id => "fake-payment-id",
40
+ },
41
+ )
42
+
43
+ expect(result.success?).to eq(true)
44
+
45
+ # Create First Package with 2 products
46
+ firstPackageResult = Braintree::Transaction.package_tracking(
47
+ result.transaction.id,
48
+ {
49
+ carrier: "UPS",
50
+ notify_payer: true,
51
+ tracking_number: "tracking_number_1",
52
+ line_items: [
53
+ {
54
+ product_code: "ABC 01",
55
+ name: "Best Product Ever",
56
+ quantity: "1",
57
+ description: "Best Description Ever",
58
+ upc_code: "51234567890",
59
+ upc_type: "UPC-A",
60
+ image_url: "https://example.com/image.png",
61
+ },
62
+ {
63
+ product_code: "ABC 02",
64
+ name: "Best Product Ever",
65
+ quantity: "1",
66
+ description: "Best Description Ever",
67
+ upc_code: "51234567891",
68
+ upc_type: "UPC-A",
69
+ image_url: "https://example.com/image.png",
70
+ },
71
+ ],
72
+ },
73
+ )
74
+
75
+ # First package is shipped by the merchant
76
+ expect(firstPackageResult.success?).to eq(true)
77
+ expect(firstPackageResult.transaction.packages[0].id).not_to be_nil
78
+ expect(firstPackageResult.transaction.packages[0].carrier).to eq("UPS")
79
+ expect(firstPackageResult.transaction.packages[0].tracking_number).to eq("tracking_number_1")
80
+
81
+
82
+ # Create second package with 1 product
83
+ secondPackageResult = Braintree::Transaction.package_tracking(
84
+ result.transaction.id,
85
+ {
86
+ carrier: "FEDEX",
87
+ notify_payer: true,
88
+ tracking_number: "tracking_number_2",
89
+ line_items: [
90
+ {
91
+ product_code: "ABC 03",
92
+ name: "Best Product Ever",
93
+ quantity: "1",
94
+ description: "Best Description Ever",
95
+ },
96
+ ]
97
+ },
98
+ )
99
+
100
+ # Second package is shipped by the merchant
101
+ expect(secondPackageResult.success?).to eq(true)
102
+ expect(secondPackageResult.transaction.packages[1].id).not_to be_nil
103
+ expect(secondPackageResult.transaction.packages[1].carrier).to eq("FEDEX")
104
+ expect(secondPackageResult.transaction.packages[1].tracking_number).to eq("tracking_number_2")
105
+
106
+ # Find transaction gives both packages
107
+ findTransaction = Braintree::Transaction.find(result.transaction.id)
108
+ expect(findTransaction.packages.length).to eq(2)
109
+ end
110
+ end
111
+ end
@@ -97,7 +97,7 @@ describe Braintree::PaymentMethodNonce do
97
97
  nonce.details.bin.should == "401288"
98
98
  nonce.details.last_two.should == "81"
99
99
  nonce.details.card_type.should == "Visa"
100
- nonce.details.expiration_year.should == "2024"
100
+ nonce.details.expiration_year.should == Date.today().next_year().year.to_s
101
101
  nonce.details.expiration_month.should == "12"
102
102
  end
103
103
 
@@ -107,7 +107,7 @@ describe Braintree::PaymentMethodNonce do
107
107
  nonce.details.bin.should == "401288"
108
108
  nonce.details.last_two.should == "81"
109
109
  nonce.details.card_type.should == "Visa"
110
- nonce.details.expiration_year.should == "2024"
110
+ nonce.details.expiration_year.should == Date.today().next_year().year.to_s
111
111
  nonce.details.expiration_month.should == "12"
112
112
  end
113
113
 
@@ -342,7 +342,7 @@ describe Braintree::PaymentMethod do
342
342
  :customer_id => customer.id,
343
343
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
344
344
  :three_d_secure_pass_thru => {
345
- :eci_flag => "02",
345
+ :eci_flag => "05",
346
346
  :cavv => "some_cavv",
347
347
  :xid => "some_xid",
348
348
  :three_d_secure_version => "xx",
@@ -365,7 +365,7 @@ describe Braintree::PaymentMethod do
365
365
  :customer_id => customer.id,
366
366
  :payment_method_nonce => Braintree::Test::Nonce::Transactable,
367
367
  :three_d_secure_pass_thru => {
368
- :eci_flag => "02",
368
+ :eci_flag => "05",
369
369
  :cavv => "some_cavv",
370
370
  :xid => "some_xid",
371
371
  :three_d_secure_version => "1.0.2",
@@ -18,6 +18,9 @@ describe Braintree::TransactionLineItem do
18
18
  :kind => "debit",
19
19
  :unit_amount => "45.1232",
20
20
  :total_amount => "45.15",
21
+ :upc_code => "11223344556677889",
22
+ :upc_type => "UPC-A",
23
+ :image_url => "https://google.com/image.png",
21
24
  },
22
25
  ],
23
26
  )
@@ -32,6 +35,9 @@ describe Braintree::TransactionLineItem do
32
35
  expect(line_item.kind).to eq("debit")
33
36
  expect(line_item.unit_amount).to eq(BigDecimal("45.1232"))
34
37
  expect(line_item.total_amount).to eq(BigDecimal("45.15"))
38
+ expect(line_item.upc_type).to eq("UPC-A")
39
+ expect(line_item.upc_code).to eq("11223344556677889")
40
+ expect(line_item.image_url).to eq("https://google.com/image.png")
35
41
  end
36
42
  end
37
43
  end
@@ -2132,8 +2132,9 @@ describe Braintree::Transaction do
2132
2132
  meta_checkout_card_details.cardholder_name.should == "Meta Checkout Card Cardholder"
2133
2133
  meta_checkout_card_details.container_id.should == "container123"
2134
2134
  meta_checkout_card_details.customer_location.should == "US"
2135
- meta_checkout_card_details.expiration_date.should == "12/2024"
2136
- meta_checkout_card_details.expiration_year.should == "2024"
2135
+ next_year = Date.today().next_year().year.to_s
2136
+ meta_checkout_card_details.expiration_date.should == "12/".concat(next_year)
2137
+ meta_checkout_card_details.expiration_year.should == next_year
2137
2138
  meta_checkout_card_details.expiration_month.should == "12"
2138
2139
  meta_checkout_card_details.image_url.should == "https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=development"
2139
2140
  meta_checkout_card_details.is_network_tokenized.should == false
@@ -2161,8 +2162,9 @@ describe Braintree::Transaction do
2161
2162
  meta_checkout_token_details.cryptogram.should == "AlhlvxmN2ZKuAAESNFZ4GoABFA=="
2162
2163
  meta_checkout_token_details.customer_location.should == "US"
2163
2164
  meta_checkout_token_details.ecommerce_indicator.should == "07"
2164
- meta_checkout_token_details.expiration_date.should == "12/2024"
2165
- meta_checkout_token_details.expiration_year.should == "2024"
2165
+ next_year = Date.today().next_year().year.to_s
2166
+ meta_checkout_token_details.expiration_date.should == "12/".concat(next_year)
2167
+ meta_checkout_token_details.expiration_year.should == next_year
2166
2168
  meta_checkout_token_details.expiration_month.should == "12"
2167
2169
  meta_checkout_token_details.image_url.should == "https://assets.braintreegateway.com/payment_method_logo/visa.png?environment=development"
2168
2170
  meta_checkout_token_details.is_network_tokenized.should == true
@@ -2748,7 +2750,7 @@ describe Braintree::Transaction do
2748
2750
  },
2749
2751
  :three_d_secure_authentication_id => three_d_secure_authentication_id,
2750
2752
  :three_d_secure_pass_thru => {
2751
- :eci_flag => "02",
2753
+ :eci_flag => "05",
2752
2754
  :cavv => "some_cavv",
2753
2755
  :xid => "some_xid",
2754
2756
  :three_d_secure_version => "1.0.2",
@@ -2835,7 +2837,7 @@ describe Braintree::Transaction do
2835
2837
  :expiration_date => "12/12",
2836
2838
  },
2837
2839
  :three_d_secure_pass_thru => {
2838
- :eci_flag => "02",
2840
+ :eci_flag => "05",
2839
2841
  :cavv => "some_cavv",
2840
2842
  :xid => "some_xid",
2841
2843
  :three_d_secure_version => "1.0.2",
@@ -2860,7 +2862,7 @@ describe Braintree::Transaction do
2860
2862
  :expiration_date => "12/12",
2861
2863
  },
2862
2864
  :three_d_secure_pass_thru => {
2863
- :eci_flag => "02",
2865
+ :eci_flag => "05",
2864
2866
  :cavv => "some_cavv",
2865
2867
  :xid => "some_xid",
2866
2868
  :three_d_secure_version => "1.0.2",
@@ -2947,7 +2949,7 @@ describe Braintree::Transaction do
2947
2949
  :expiration_date => "12/12",
2948
2950
  },
2949
2951
  :three_d_secure_pass_thru => {
2950
- :eci_flag => "02",
2952
+ :eci_flag => "05",
2951
2953
  :cavv => "some_cavv",
2952
2954
  :xid => "some_xid",
2953
2955
  :three_d_secure_version => "invalid",
@@ -2971,7 +2973,7 @@ describe Braintree::Transaction do
2971
2973
  :expiration_date => "12/12",
2972
2974
  },
2973
2975
  :three_d_secure_pass_thru => {
2974
- :eci_flag => "02",
2976
+ :eci_flag => "05",
2975
2977
  :cavv => "some_cavv",
2976
2978
  :xid => "some_xid",
2977
2979
  :three_d_secure_version => "1.0.2",
@@ -2995,7 +2997,7 @@ describe Braintree::Transaction do
2995
2997
  :expiration_date => "12/12",
2996
2998
  },
2997
2999
  :three_d_secure_pass_thru => {
2998
- :eci_flag => "02",
3000
+ :eci_flag => "05",
2999
3001
  :cavv => "some_cavv",
3000
3002
  :xid => "some_xid",
3001
3003
  :three_d_secure_version => "1.0.2",
@@ -3019,7 +3021,7 @@ describe Braintree::Transaction do
3019
3021
  :expiration_date => "12/12",
3020
3022
  },
3021
3023
  :three_d_secure_pass_thru => {
3022
- :eci_flag => "02",
3024
+ :eci_flag => "05",
3023
3025
  :cavv => "some_cavv",
3024
3026
  :xid => "some_xid",
3025
3027
  :three_d_secure_version => "1.0.2",
@@ -4605,6 +4607,84 @@ describe Braintree::Transaction do
4605
4607
  expect(result.success?).to eq(false)
4606
4608
  expect(result.errors.for(:transaction).on(:line_items)[0].code).to eq(Braintree::ErrorCodes::Transaction::TooManyLineItems)
4607
4609
  end
4610
+
4611
+ context "UPC code and type" do
4612
+ let(:line_item) do
4613
+ {
4614
+ :quantity => "1",
4615
+ :name => "Name #1",
4616
+ :description => "Description #1",
4617
+ :kind => "debit",
4618
+ :unit_amount => "45.12",
4619
+ :unit_tax_amount => "1.23",
4620
+ :unit_of_measure => "gallon",
4621
+ :discount_amount => "1.02",
4622
+ :tax_amount => "4.50",
4623
+ :total_amount => "45.15",
4624
+ :product_code => "23434",
4625
+ :commodity_code => "9SAASSD8724",
4626
+ :url => "https://example.com/products/23434",
4627
+ :upc_code => "042100005264",
4628
+ :upc_type => "UPC-A",
4629
+ :image_url => "https://google.com/image.png",
4630
+ }
4631
+ end
4632
+
4633
+ it "accepts valid values" do
4634
+ result = Braintree::Transaction.create(
4635
+ :type => "sale",
4636
+ :amount => "45.15",
4637
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4638
+ :line_items => [line_item],
4639
+ )
4640
+ expect(result.success?).to eq(true)
4641
+ expect(result.transaction.line_items.length).to eq(1)
4642
+ line_item = result.transaction.line_items[0]
4643
+ expect(line_item.upc_code).to eq("042100005264")
4644
+ expect(line_item.upc_type).to eq("UPC-A")
4645
+ end
4646
+
4647
+ it "returns validation errors for invalid UPC code and type too long" do
4648
+ line_item[:upc_code] = "THISCODELONGERTHAN17CHARS"
4649
+ line_item[:upc_type] = "USB-C"
4650
+ result = Braintree::Transaction.create(
4651
+ :type => "sale",
4652
+ :amount => "45.15",
4653
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4654
+ :line_items => [line_item],
4655
+ )
4656
+
4657
+ expect(result.success?).to eq(false)
4658
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_code)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCCodeIsTooLong)
4659
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_type)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCTypeIsInvalid)
4660
+ end
4661
+
4662
+ it "returns UPC code missing error when code is not present" do
4663
+ line_item.delete(:upc_code)
4664
+ result = Braintree::Transaction.create(
4665
+ :type => "sale",
4666
+ :amount => "45.15",
4667
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4668
+ :line_items => [line_item],
4669
+ )
4670
+
4671
+ expect(result.success?).to eq(false)
4672
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_code)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCCodeIsMissing)
4673
+ end
4674
+
4675
+ it "returns UPC type missing error when type is not present" do
4676
+ line_item.delete(:upc_type)
4677
+ result = Braintree::Transaction.create(
4678
+ :type => "sale",
4679
+ :amount => "45.15",
4680
+ :payment_method_nonce => Braintree::Test::Nonce::Transactable,
4681
+ :line_items => [line_item],
4682
+ )
4683
+
4684
+ expect(result.success?).to eq(false)
4685
+ expect(result.errors.for(:transaction).for(:line_items).for(:index_0).on(:upc_type)[0].code).to eq(Braintree::ErrorCodes::TransactionLineItem::UPCTypeIsMissing)
4686
+ end
4687
+ end
4608
4688
  end
4609
4689
 
4610
4690
  context "level 3 summary data" do
@@ -5820,7 +5900,7 @@ describe Braintree::Transaction do
5820
5900
  end
5821
5901
 
5822
5902
  context "Pinless debit transaction" do
5823
- xit "succesfully submits for settlement" do
5903
+ it "succesfully submits for settlement" do
5824
5904
  result = Braintree::Transaction.sale(
5825
5905
  :amount => Braintree::Test::TransactionAmounts::Authorize,
5826
5906
  :merchant_account_id => SpecHelper::PinlessDebitMerchantAccountId,
@@ -5831,10 +5911,28 @@ describe Braintree::Transaction do
5831
5911
  },
5832
5912
  )
5833
5913
  expect(result.success?).to be_truthy
5834
- expect(result.transaction.status).to eq(Braintree::Transaction::Status::SubmittedForSettlement)
5835
5914
  expect(result.transaction.debit_network).not_to be_nil
5836
5915
  end
5837
5916
  end
5917
+
5918
+ context "Process debit as credit" do
5919
+ it "succesfully completed pinless eligible transaction in signature" do
5920
+ result = Braintree::Transaction.sale(
5921
+ :amount => Braintree::Test::TransactionAmounts::Authorize,
5922
+ :merchant_account_id => SpecHelper::PinlessDebitMerchantAccountId,
5923
+ :currency_iso_code => "USD",
5924
+ :payment_method_nonce => Braintree::Test::Nonce::TransactablePinlessDebitVisa,
5925
+ :options => {
5926
+ :submit_for_settlement => true,
5927
+ :credit_card => {
5928
+ :process_debit_as_credit => true
5929
+ }
5930
+ },
5931
+ )
5932
+ expect(result.success?).to be_truthy
5933
+ expect(result.transaction.debit_network).to be_nil
5934
+ end
5935
+ end
5838
5936
  end
5839
5937
 
5840
5938
  describe "self.sale!" do
@@ -7739,20 +7837,6 @@ describe Braintree::Transaction do
7739
7837
  expect(adjustment_transaction.errors.for(:authorization_adjustment).on(:base).first.code).to eq(Braintree::ErrorCodes::Transaction::NoNetAmountToPerformAuthAdjustment)
7740
7838
  end
7741
7839
 
7742
- it "returns failure, when transaction status is not authorized" do
7743
- additional_params = {:options => {:submit_for_settlement => true}}
7744
- initial_transaction = Braintree::Transaction.sale(first_data_master_transaction_params.merge(additional_params))
7745
- expect(initial_transaction.success?).to eq(true)
7746
-
7747
- adjustment_transaction = Braintree::Transaction.adjust_authorization(
7748
- initial_transaction.transaction.id, "85.50"
7749
- )
7750
-
7751
- expect(adjustment_transaction.success?).to eq(false)
7752
- expect(adjustment_transaction.transaction.amount).to eq(BigDecimal("75.50"))
7753
- expect(adjustment_transaction.errors.for(:transaction).on(:base).first.code).to eq(Braintree::ErrorCodes::Transaction::TransactionMustBeInStateAuthorized)
7754
- end
7755
-
7756
7840
  it "returns failure, when transaction authorization type final or undefined" do
7757
7841
  additional_params = {:transaction_source => "recurring"}
7758
7842
  initial_transaction = Braintree::Transaction.sale(first_data_master_transaction_params.merge(additional_params))
@@ -0,0 +1,74 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
2
+
3
+ describe "Package Tracking Unit Tests" do
4
+ describe "creates and validates requests" do
5
+ let(:gateway) do
6
+ config = Braintree::Configuration.new(
7
+ :merchant_id => "merchant_id",
8
+ :public_key => "public_key",
9
+ :private_key => "private_key",
10
+ )
11
+ Braintree::Gateway.new(config)
12
+ end
13
+
14
+ it "creates transaction gateway package tracking request signature" do
15
+ expect(Braintree::TransactionGateway._package_tracking_request_signature).to match(
16
+ [
17
+ :carrier,
18
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
19
+ :notify_payer, :tracking_number,
20
+ ],
21
+ )
22
+ end
23
+
24
+ it "raises an ArgumentError if transaction_id is an invalid format" do
25
+ expect do
26
+ Braintree::Transaction.package_tracking("invalid-transaction-id", {})
27
+ end.to raise_error(ArgumentError, "transaction_id is invalid")
28
+ end
29
+
30
+ it "raises an exception if attributes contain an invalid key" do
31
+ expect do
32
+ Braintree::Transaction.package_tracking("txn123", {:invalid_key => "random", :carrier => "UPS", :tracking_number => "123123"})
33
+ end.to raise_error(ArgumentError, "invalid keys: invalid_key")
34
+ end
35
+ end
36
+
37
+ describe "handles response" do
38
+ it "parses the packages response correctly" do
39
+ transaction = Braintree::Transaction._new(
40
+ :gateway,
41
+ :shipments => [
42
+ {:id => "id1", :carrier => "UPS", :tracking_number => "tracking_number_1", :paypal_tracking_id => "pp_tracking_number_1"},
43
+ {:id => "id2", :carrier => "FEDEX", :tracking_number => "tracking_number_2", :paypal_tracking_id => "pp_tracking_number_2"}
44
+ ],
45
+ )
46
+ expect(transaction.packages.size).to eq(2)
47
+ expect(transaction.packages[0].id).to eq("id1")
48
+ expect(transaction.packages[0].carrier).to eq("UPS")
49
+ expect(transaction.packages[0].tracking_number).to eq("tracking_number_1")
50
+ expect(transaction.packages[0].paypal_tracking_id).to eq("pp_tracking_number_1")
51
+
52
+ expect(transaction.packages[1].id).to eq("id2")
53
+ expect(transaction.packages[1].carrier).to eq("FEDEX")
54
+ expect(transaction.packages[1].tracking_number).to eq("tracking_number_2")
55
+ expect(transaction.packages[1].paypal_tracking_id).to eq("pp_tracking_number_2")
56
+ end
57
+
58
+ it "doesn't blow up if no shipments are present in the transaction response" do
59
+ transaction = Braintree::Transaction._new(
60
+ :gateway,
61
+ :shipments => [],
62
+ )
63
+ expect(transaction.packages.size).to eq(0)
64
+ end
65
+
66
+ it "doesn't blow up if shipments tag is not present in the transaction response" do
67
+ transaction = Braintree::Transaction._new(
68
+ :gateway,
69
+ {},
70
+ )
71
+ expect(transaction.packages.size).to eq(0)
72
+ end
73
+ end
74
+ end
@@ -41,7 +41,7 @@ describe Braintree::TransactionGateway do
41
41
  :ships_from_postal_code, :tax_amount, :tax_exempt, :three_d_secure_authentication_id,:three_d_secure_token, #Deprecated
42
42
  :transaction_source, :type, :venmo_sdk_payment_method_code, #Deprecated
43
43
  :sca_exemption, :currency_iso_code, :exchange_rate_quote_id,
44
- {:line_items => [:quantity, :name, :description, :kind, :unit_amount, :unit_tax_amount, :total_amount, :discount_amount, :tax_amount, :unit_of_measure, :product_code, :commodity_code, :url]},
44
+ {:line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url]},
45
45
  {:risk_data => [:customer_browser, :customer_device_id, :customer_ip, :customer_location_zip, :customer_tenure]},
46
46
  {:credit_card => [:token, :cardholder_name, :cvv, :expiration_date, :expiration_month, :expiration_year, :number, {:payment_reader_card_details => [:encrypted_card_data, :key_serial_number]}, {:network_tokenization_attributes => [:cryptogram, :ecommerce_indicator, :token_requestor_id]}]},
47
47
  {:customer => [:id, :company, :email, :fax, :first_name, :last_name, :phone, :website]},
@@ -81,7 +81,7 @@ describe Braintree::TransactionGateway do
81
81
  {:three_d_secure => [:required]},
82
82
  {:amex_rewards => [:request_id, :points, :currency_amount, :currency_iso_code]},
83
83
  {:venmo => [:profile_id]},
84
- {:credit_card => [:account_type]},
84
+ {:credit_card => [:account_type, :process_debit_as_credit]},
85
85
  ]
86
86
  },
87
87
  {:external_vault => [
@@ -137,7 +137,7 @@ describe Braintree::TransactionGateway do
137
137
  :discount_amount,
138
138
  :shipping_amount,
139
139
  :ships_from_postal_code,
140
- :line_items => [:commodity_code, :description, :discount_amount, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :url, :tax_amount],
140
+ :line_items => [:commodity_code, :description, :discount_amount, :image_url, :kind, :name, :product_code, :quantity, :tax_amount, :total_amount, :unit_amount, :unit_of_measure, :unit_tax_amount, :upc_code, :upc_type, :url],
141
141
  ])
142
142
  end
143
143
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: braintree
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.17.0
4
+ version: 4.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Braintree
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-19 00:00:00.000000000 Z
11
+ date: 2024-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: builder
@@ -181,6 +181,7 @@ files:
181
181
  - lib/braintree/transaction/local_payment_details.rb
182
182
  - lib/braintree/transaction/meta_checkout_card_details.rb
183
183
  - lib/braintree/transaction/meta_checkout_token_details.rb
184
+ - lib/braintree/transaction/package_details.rb
184
185
  - lib/braintree/transaction/payment_receipt.rb
185
186
  - lib/braintree/transaction/payment_receipt/card_present_data.rb
186
187
  - lib/braintree/transaction/payment_receipt/merchant_address.rb
@@ -250,6 +251,7 @@ files:
250
251
  - spec/integration/braintree/merchant_account_spec.rb
251
252
  - spec/integration/braintree/merchant_spec.rb
252
253
  - spec/integration/braintree/oauth_spec.rb
254
+ - spec/integration/braintree/package_tracking_spec.rb
253
255
  - spec/integration/braintree/payment_method_nonce_spec.rb
254
256
  - spec/integration/braintree/payment_method_spec.rb
255
257
  - spec/integration/braintree/payment_method_us_bank_account_spec.rb
@@ -311,6 +313,7 @@ files:
311
313
  - spec/unit/braintree/meta_checkout_token_details_spec.rb
312
314
  - spec/unit/braintree/meta_checkout_token_spec.rb
313
315
  - spec/unit/braintree/modification_spec.rb
316
+ - spec/unit/braintree/package_tracking_spec.rb
314
317
  - spec/unit/braintree/payment_method_customer_data_updated_metadata_spec.rb
315
318
  - spec/unit/braintree/payment_method_nonce_details_payer_info_spec.rb
316
319
  - spec/unit/braintree/payment_method_nonce_details_spec.rb