braintree 4.17.0 → 4.18.0

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.
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