activemerchant 1.86.0 → 1.87.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +22 -0
  3. data/lib/active_merchant/billing/avs_result.rb +0 -1
  4. data/lib/active_merchant/billing/check.rb +1 -1
  5. data/lib/active_merchant/billing/compatibility.rb +3 -3
  6. data/lib/active_merchant/billing/credit_card.rb +1 -1
  7. data/lib/active_merchant/billing/credit_card_formatting.rb +3 -3
  8. data/lib/active_merchant/billing/credit_card_methods.rb +6 -4
  9. data/lib/active_merchant/billing/gateway.rb +9 -9
  10. data/lib/active_merchant/billing/gateways/adyen.rb +48 -7
  11. data/lib/active_merchant/billing/gateways/allied_wallet.rb +1 -1
  12. data/lib/active_merchant/billing/gateways/authorize_net.rb +8 -8
  13. data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +1 -1
  14. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +15 -15
  15. data/lib/active_merchant/billing/gateways/axcessms.rb +2 -2
  16. data/lib/active_merchant/billing/gateways/balanced.rb +11 -11
  17. data/lib/active_merchant/billing/gateways/bank_frick.rb +1 -1
  18. data/lib/active_merchant/billing/gateways/barclaycard_smartpay.rb +5 -5
  19. data/lib/active_merchant/billing/gateways/beanstream.rb +3 -2
  20. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +5 -5
  21. data/lib/active_merchant/billing/gateways/blue_pay.rb +5 -5
  22. data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
  23. data/lib/active_merchant/billing/gateways/bogus.rb +3 -3
  24. data/lib/active_merchant/billing/gateways/borgun.rb +5 -6
  25. data/lib/active_merchant/billing/gateways/braintree_blue.rb +18 -12
  26. data/lib/active_merchant/billing/gateways/bridge_pay.rb +1 -1
  27. data/lib/active_merchant/billing/gateways/cams.rb +12 -12
  28. data/lib/active_merchant/billing/gateways/card_stream.rb +9 -9
  29. data/lib/active_merchant/billing/gateways/cardknox.rb +4 -4
  30. data/lib/active_merchant/billing/gateways/cardprocess.rb +1 -1
  31. data/lib/active_merchant/billing/gateways/cashnet.rb +2 -2
  32. data/lib/active_merchant/billing/gateways/cc5.rb +2 -2
  33. data/lib/active_merchant/billing/gateways/cenpos.rb +2 -2
  34. data/lib/active_merchant/billing/gateways/checkout.rb +1 -1
  35. data/lib/active_merchant/billing/gateways/clearhaus.rb +12 -12
  36. data/lib/active_merchant/billing/gateways/commercegate.rb +3 -3
  37. data/lib/active_merchant/billing/gateways/creditcall.rb +2 -2
  38. data/lib/active_merchant/billing/gateways/credorax.rb +13 -3
  39. data/lib/active_merchant/billing/gateways/ct_payment.rb +6 -6
  40. data/lib/active_merchant/billing/gateways/culqi.rb +1 -1
  41. data/lib/active_merchant/billing/gateways/cyber_source.rb +8 -8
  42. data/lib/active_merchant/billing/gateways/data_cash.rb +2 -2
  43. data/lib/active_merchant/billing/gateways/dibs.rb +2 -2
  44. data/lib/active_merchant/billing/gateways/digitzs.rb +5 -5
  45. data/lib/active_merchant/billing/gateways/ebanx.rb +1 -1
  46. data/lib/active_merchant/billing/gateways/efsnet.rb +4 -4
  47. data/lib/active_merchant/billing/gateways/elavon.rb +3 -3
  48. data/lib/active_merchant/billing/gateways/element.rb +4 -4
  49. data/lib/active_merchant/billing/gateways/epay.rb +1 -1
  50. data/lib/active_merchant/billing/gateways/eway.rb +2 -2
  51. data/lib/active_merchant/billing/gateways/eway_managed.rb +5 -5
  52. data/lib/active_merchant/billing/gateways/eway_rapid.rb +1 -1
  53. data/lib/active_merchant/billing/gateways/exact.rb +1 -1
  54. data/lib/active_merchant/billing/gateways/federated_canada.rb +1 -1
  55. data/lib/active_merchant/billing/gateways/first_giving.rb +1 -1
  56. data/lib/active_merchant/billing/gateways/firstdata_e4.rb +7 -7
  57. data/lib/active_merchant/billing/gateways/flo2cash.rb +2 -2
  58. data/lib/active_merchant/billing/gateways/forte.rb +11 -7
  59. data/lib/active_merchant/billing/gateways/garanti.rb +5 -5
  60. data/lib/active_merchant/billing/gateways/global_collect.rb +2 -3
  61. data/lib/active_merchant/billing/gateways/hdfc.rb +2 -2
  62. data/lib/active_merchant/billing/gateways/hps.rb +3 -3
  63. data/lib/active_merchant/billing/gateways/inspire.rb +7 -7
  64. data/lib/active_merchant/billing/gateways/iridium.rb +14 -14
  65. data/lib/active_merchant/billing/gateways/itransact.rb +4 -4
  66. data/lib/active_merchant/billing/gateways/iveri.rb +3 -3
  67. data/lib/active_merchant/billing/gateways/jetpay.rb +2 -2
  68. data/lib/active_merchant/billing/gateways/jetpay_v2.rb +2 -2
  69. data/lib/active_merchant/billing/gateways/latitude19.rb +1 -1
  70. data/lib/active_merchant/billing/gateways/linkpoint.rb +3 -3
  71. data/lib/active_merchant/billing/gateways/litle.rb +2 -2
  72. data/lib/active_merchant/billing/gateways/maxipago.rb +1 -1
  73. data/lib/active_merchant/billing/gateways/mercado_pago.rb +7 -13
  74. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +3 -3
  75. data/lib/active_merchant/billing/gateways/merchant_one.rb +4 -4
  76. data/lib/active_merchant/billing/gateways/merchant_partners.rb +1 -1
  77. data/lib/active_merchant/billing/gateways/merchant_warrior.rb +3 -3
  78. data/lib/active_merchant/billing/gateways/mercury.rb +2 -2
  79. data/lib/active_merchant/billing/gateways/metrics_global.rb +2 -2
  80. data/lib/active_merchant/billing/gateways/micropayment.rb +1 -1
  81. data/lib/active_merchant/billing/gateways/migs.rb +4 -6
  82. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +2 -2
  83. data/lib/active_merchant/billing/gateways/moneris.rb +85 -56
  84. data/lib/active_merchant/billing/gateways/moneris_us.rb +9 -9
  85. data/lib/active_merchant/billing/gateways/money_movers.rb +1 -1
  86. data/lib/active_merchant/billing/gateways/mundipagg.rb +1 -1
  87. data/lib/active_merchant/billing/gateways/nab_transact.rb +1 -1
  88. data/lib/active_merchant/billing/gateways/net_registry.rb +2 -2
  89. data/lib/active_merchant/billing/gateways/netaxept.rb +6 -6
  90. data/lib/active_merchant/billing/gateways/netbanx.rb +36 -36
  91. data/lib/active_merchant/billing/gateways/netbilling.rb +2 -2
  92. data/lib/active_merchant/billing/gateways/netpay.rb +1 -1
  93. data/lib/active_merchant/billing/gateways/nmi.rb +2 -2
  94. data/lib/active_merchant/billing/gateways/ogone.rb +7 -7
  95. data/lib/active_merchant/billing/gateways/omise.rb +6 -6
  96. data/lib/active_merchant/billing/gateways/opp.rb +1 -1
  97. data/lib/active_merchant/billing/gateways/optimal_payment.rb +5 -0
  98. data/lib/active_merchant/billing/gateways/orbital.rb +9 -7
  99. data/lib/active_merchant/billing/gateways/pac_net_raven.rb +6 -6
  100. data/lib/active_merchant/billing/gateways/pagarme.rb +1 -1
  101. data/lib/active_merchant/billing/gateways/pay_conex.rb +1 -1
  102. data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +8 -5
  103. data/lib/active_merchant/billing/gateways/pay_hub.rb +2 -2
  104. data/lib/active_merchant/billing/gateways/pay_junction.rb +2 -2
  105. data/lib/active_merchant/billing/gateways/pay_junction_v2.rb +2 -2
  106. data/lib/active_merchant/billing/gateways/pay_secure.rb +3 -3
  107. data/lib/active_merchant/billing/gateways/paybox_direct.rb +8 -8
  108. data/lib/active_merchant/billing/gateways/payeezy.rb +1 -1
  109. data/lib/active_merchant/billing/gateways/payex.rb +8 -8
  110. data/lib/active_merchant/billing/gateways/payflow.rb +13 -13
  111. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +4 -4
  112. data/lib/active_merchant/billing/gateways/payflow_express.rb +1 -1
  113. data/lib/active_merchant/billing/gateways/payment_express.rb +10 -10
  114. data/lib/active_merchant/billing/gateways/paymentez.rb +3 -0
  115. data/lib/active_merchant/billing/gateways/paymill.rb +4 -4
  116. data/lib/active_merchant/billing/gateways/payscout.rb +1 -1
  117. data/lib/active_merchant/billing/gateways/paystation.rb +1 -1
  118. data/lib/active_merchant/billing/gateways/payu_in.rb +3 -3
  119. data/lib/active_merchant/billing/gateways/payu_latam.rb +1 -1
  120. data/lib/active_merchant/billing/gateways/payway.rb +2 -2
  121. data/lib/active_merchant/billing/gateways/plugnpay.rb +2 -2
  122. data/lib/active_merchant/billing/gateways/pro_pay.rb +2 -2
  123. data/lib/active_merchant/billing/gateways/psigate.rb +1 -1
  124. data/lib/active_merchant/billing/gateways/psl_card.rb +3 -3
  125. data/lib/active_merchant/billing/gateways/qbms.rb +1 -1
  126. data/lib/active_merchant/billing/gateways/quantum.rb +7 -7
  127. data/lib/active_merchant/billing/gateways/quickbooks.rb +6 -6
  128. data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +1 -1
  129. data/lib/active_merchant/billing/gateways/qvalent.rb +2 -2
  130. data/lib/active_merchant/billing/gateways/realex.rb +33 -13
  131. data/lib/active_merchant/billing/gateways/redsys.rb +2 -2
  132. data/lib/active_merchant/billing/gateways/safe_charge.rb +2 -2
  133. data/lib/active_merchant/billing/gateways/sage.rb +6 -6
  134. data/lib/active_merchant/billing/gateways/sage_pay.rb +7 -7
  135. data/lib/active_merchant/billing/gateways/secure_net.rb +1 -1
  136. data/lib/active_merchant/billing/gateways/secure_pay.rb +2 -2
  137. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +1 -1
  138. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +1 -1
  139. data/lib/active_merchant/billing/gateways/skip_jack.rb +5 -6
  140. data/lib/active_merchant/billing/gateways/smart_ps.rb +7 -7
  141. data/lib/active_merchant/billing/gateways/so_easy_pay.rb +1 -1
  142. data/lib/active_merchant/billing/gateways/stripe.rb +5 -5
  143. data/lib/active_merchant/billing/gateways/swipe_checkout.rb +2 -2
  144. data/lib/active_merchant/billing/gateways/telr.rb +1 -1
  145. data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +2 -2
  146. data/lib/active_merchant/billing/gateways/transact_pro.rb +5 -5
  147. data/lib/active_merchant/billing/gateways/transax.rb +1 -1
  148. data/lib/active_merchant/billing/gateways/trust_commerce.rb +7 -7
  149. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +17 -16
  150. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +2 -2
  151. data/lib/active_merchant/billing/gateways/vanco.rb +2 -2
  152. data/lib/active_merchant/billing/gateways/verifi.rb +1 -1
  153. data/lib/active_merchant/billing/gateways/viaklix.rb +4 -4
  154. data/lib/active_merchant/billing/gateways/visanet_peru.rb +4 -4
  155. data/lib/active_merchant/billing/gateways/wirecard.rb +2 -2
  156. data/lib/active_merchant/billing/gateways/worldpay.rb +24 -13
  157. data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +2 -2
  158. data/lib/active_merchant/billing/response.rb +7 -7
  159. data/lib/active_merchant/country.rb +4 -4
  160. data/lib/active_merchant/network_connection_retries.rb +7 -9
  161. data/lib/active_merchant/version.rb +1 -1
  162. data/lib/support/gateway_support.rb +3 -3
  163. data/lib/support/ssl_verify.rb +1 -1
  164. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8651e675cc5726ec8424c3023a81307c0d03f66b
4
- data.tar.gz: cc00a987adb4cbcd89ac106d07e8cd86d7046052
2
+ SHA256:
3
+ metadata.gz: 6c6735efd6b43a6792c15f372218c58388a7481e907f221b8ca401dcee3c9fc2
4
+ data.tar.gz: eaecbc6f7dfcae07746717eb79208ec5911f80bd15d73ed859fab38164f08d63
5
5
  SHA512:
6
- metadata.gz: 53533aee5d0cb713eb89cdf53ac2d7e71f5ffa0e0ff46a06a6d69effd36e54f76f7f4e18acda564b7392963c586388e55df8e8fdf8f65bb36d090917b3d32df5
7
- data.tar.gz: 815a578f9421bb5b5c316c9ee79bf8043dd20cea4fabf8e19885587bf07b9418d2944b218b121b32cbc6ac481a52635ae2c22e6e66a7399b77e1cef90789f117
6
+ metadata.gz: 5c37662376465c08da0eafa7ca7a801efb37316b254ac81c234b52c6e780b204763b2c0fdef035a38a6a28e6b5377e2d384e621770719a7497f8e27a008518ca
7
+ data.tar.gz: 4d8ff4e910d7b93c9f21476be94acdcf25123db575c39614303a5b10ee7c5bf50b050ea1b7c1cb4e6a158c909f76bd82b83327904b8fd7b73f1093ad138e6d19
data/CHANGELOG CHANGED
@@ -1,6 +1,28 @@
1
1
  = ActiveMerchant CHANGELOG
2
2
 
3
3
  == HEAD
4
+ * Barclaycard Smartpay: Improves Error Handling [deedeelavinder] #3026
5
+ * Braintree: Fix passing phone-only billing address [curiousepic] #3025
6
+ * Litle: Capitalize check account type [curiousepic] #3028
7
+ * Braintree: Account for nil billing address fields [curiousepic] #3029
8
+ * Realex: Add verify [kheang] #3030
9
+ * Braintree: Actually account for nil address fields [curiousepic] #3032
10
+ * Mercado Pago: do not infer card type [bpollack] #3038
11
+ * Credorax: allow sending submerchant ID (h3 parameter) [bpollack] #3040
12
+ * Worldpay: Pass stored credential option fields [curiousepic] #3041
13
+ * Make behavior of nil CC numbers more consistent [guaguasi] #3010
14
+ * Moneris: Adds Credential on File logic [deedeelavinder] #3042
15
+ * Adyen: Return AVS and CVC Result [nfarve] #3044
16
+ * Paymentez: Supports phone field, does not send if empty [molbrown] #3043
17
+ * Braintree: Account for nil address with existing customer [curiousepic] #3047
18
+ * Optimal Payment: Add verify capabilities #3052
19
+ * Moneris: Allows cof_enabled gateway to process non-cof transactions [deedeelavinder] #3051
20
+ * Cenpos: update supported countries [bpollack] #3055
21
+ * CyberSource: update supported countries [bpollack] #3055
22
+ * MiGS: update supported countries [bpollack] #3055
23
+ * Clearhaus: update submission data format [bpollack] #3053
24
+ * Forte: Allow void on capture #3059
25
+
4
26
  == Version 1.86.0 (October 26, 2018)
5
27
  * UsaEpayTransaction: Support UMcheckformat option for echecks [dtykocki] #3002
6
28
  * Global Collect: handle internal server errors [molbrown] #3005
@@ -1,4 +1,3 @@
1
- #!ruby19
2
1
  # encoding: utf-8
3
2
 
4
3
  module ActiveMerchant
@@ -59,7 +59,7 @@ module ActiveMerchant #:nodoc:
59
59
  # (3(d1 + d4 + d7) + 7(d2 + d5 + d8) + 1(d3 + d6 + d9))mod 10 = 0
60
60
  # See http://en.wikipedia.org/wiki/Routing_transit_number#Internal_checksums
61
61
  def valid_routing_number?
62
- digits = routing_number.to_s.split('').map(&:to_i).select{|d| (0..9).include?(d)}
62
+ digits = routing_number.to_s.split('').map(&:to_i).select { |d| (0..9).cover?(d) }
63
63
  case digits.size
64
64
  when 9
65
65
  checksum = ((3 * (digits[0] + digits[3] + digits[6])) +
@@ -61,7 +61,7 @@ module ActiveMerchant
61
61
 
62
62
  class Errors < Hash
63
63
  def initialize
64
- super(){|h, k| h[k] = []}
64
+ super() { |h, k| h[k] = [] }
65
65
  end
66
66
 
67
67
  alias count size
@@ -75,7 +75,7 @@ module ActiveMerchant
75
75
  end
76
76
 
77
77
  def empty?
78
- all?{|k, v| v&.empty?}
78
+ all? { |k, v| v&.empty? }
79
79
  end
80
80
 
81
81
  def on(field)
@@ -91,7 +91,7 @@ module ActiveMerchant
91
91
  end
92
92
 
93
93
  def each_full
94
- full_messages.each{|msg| yield msg}
94
+ full_messages.each { |msg| yield msg }
95
95
  end
96
96
 
97
97
  def full_messages
@@ -388,7 +388,7 @@ module ActiveMerchant #:nodoc:
388
388
  private
389
389
 
390
390
  def month_days
391
- mdays = [nil,31,28,31,30,31,30,31,31,30,31,30,31]
391
+ mdays = [nil, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
392
392
  mdays[2] = 29 if Date.leap?(year)
393
393
  mdays[month]
394
394
  end
@@ -13,9 +13,9 @@ module ActiveMerchant #:nodoc:
13
13
  return '' if number.blank?
14
14
 
15
15
  case option
16
- when :two_digits then sprintf('%.2i', number.to_i)[-2..-1]
17
- when :four_digits then sprintf('%.4i', number.to_i)[-4..-1]
18
- else number
16
+ when :two_digits then sprintf('%.2i', number.to_i)[-2..-1]
17
+ when :four_digits then sprintf('%.4i', number.to_i)[-4..-1]
18
+ else number
19
19
  end
20
20
  end
21
21
  end
@@ -10,7 +10,7 @@ module ActiveMerchant #:nodoc:
10
10
  'diners_club' => ->(num) { num =~ /^3(0[0-5]|[68]\d)\d{11}$/ },
11
11
  'jcb' => ->(num) { num =~ /^35(28|29|[3-8]\d)\d{12}$/ },
12
12
  'dankort' => ->(num) { num =~ /^5019\d{12}$/ },
13
- 'maestro' => ->(num) { (12..19).include?(num&.size) && in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) },
13
+ 'maestro' => ->(num) { (12..19).cover?(num&.size) && in_bin_range?(num.slice(0, 6), MAESTRO_RANGES) },
14
14
  'forbrugsforeningen' => ->(num) { num =~ /^600722\d{10}$/ },
15
15
  'sodexo' => ->(num) { num =~ /^(606071|603389|606070|606069|606068|600818)\d{8}$/ },
16
16
  'vr' => ->(num) { num =~ /^(627416|637036)\d{8}$/ },
@@ -86,7 +86,7 @@ module ActiveMerchant #:nodoc:
86
86
  end
87
87
 
88
88
  def valid_expiry_year?(year)
89
- (Time.now.year..Time.now.year + 20).include?(year.to_i)
89
+ (Time.now.year..Time.now.year + 20).cover?(year.to_i)
90
90
  end
91
91
 
92
92
  def valid_start_year?(year)
@@ -160,7 +160,7 @@ module ActiveMerchant #:nodoc:
160
160
  end
161
161
 
162
162
  def electron?(number)
163
- return false unless [16, 19].include?(number.length)
163
+ return false unless [16, 19].include?(number&.length)
164
164
 
165
165
  # don't recalculate for each range
166
166
  bank_identification_number = first_digits(number).to_i
@@ -176,7 +176,7 @@ module ActiveMerchant #:nodoc:
176
176
  end
177
177
 
178
178
  def first_digits(number)
179
- number.slice(0,6)
179
+ number&.slice(0, 6) || ''
180
180
  end
181
181
 
182
182
  def last_digits(number)
@@ -201,10 +201,12 @@ module ActiveMerchant #:nodoc:
201
201
  private
202
202
 
203
203
  def valid_card_number_length?(number) #:nodoc:
204
+ return false if number.nil?
204
205
  number.length >= 12
205
206
  end
206
207
 
207
208
  def valid_card_number_characters?(number) #:nodoc:
209
+ return false if number.nil?
208
210
  !number.match(/\D/)
209
211
  end
210
212
 
@@ -204,11 +204,11 @@ module ActiveMerchant #:nodoc:
204
204
 
205
205
  def normalize(field)
206
206
  case field
207
- when 'true' then true
208
- when 'false' then false
209
- when '' then nil
210
- when 'null' then nil
211
- else field
207
+ when 'true' then true
208
+ when 'false' then false
209
+ when '' then nil
210
+ when 'null' then nil
211
+ else field
212
212
  end
213
213
  end
214
214
 
@@ -241,10 +241,10 @@ module ActiveMerchant #:nodoc:
241
241
  def amount(money)
242
242
  return nil if money.nil?
243
243
  cents = if money.respond_to?(:cents)
244
- ActiveMerchant.deprecated 'Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents'
245
- money.cents
246
- else
247
- money
244
+ ActiveMerchant.deprecated 'Support for Money objects is deprecated and will be removed from a future release of ActiveMerchant. Please use an Integer value in cents'
245
+ money.cents
246
+ else
247
+ money
248
248
  end
249
249
 
250
250
  if money.is_a?(String)
@@ -7,7 +7,7 @@ module ActiveMerchant #:nodoc:
7
7
  self.test_url = 'https://pal-test.adyen.com/pal/servlet/Payment/v18'
8
8
  self.live_url = 'https://pal-live.adyen.com/pal/servlet/Payment/v18'
9
9
 
10
- self.supported_countries = ['AT','AU','BE','BG','BR','CH','CY','CZ','DE','DK','EE','ES','FI','FR','GB','GI','GR','HK','HU','IE','IS','IT','LI','LT','LU','LV','MC','MT','MX','NL','NO','PL','PT','RO','SE','SG','SK','SI','US']
10
+ self.supported_countries = ['AT', 'AU', 'BE', 'BG', 'BR', 'CH', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GI', 'GR', 'HK', 'HU', 'IE', 'IS', 'IT', 'LI', 'LT', 'LU', 'LV', 'MC', 'MT', 'MX', 'NL', 'NO', 'PL', 'PT', 'RO', 'SE', 'SG', 'SK', 'SI', 'US']
11
11
  self.default_currency = 'USD'
12
12
  self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :jcb, :dankort, :maestro, :discover]
13
13
 
@@ -34,8 +34,8 @@ module ActiveMerchant #:nodoc:
34
34
 
35
35
  def purchase(money, payment, options={})
36
36
  MultiResponse.run do |r|
37
- r.process{authorize(money, payment, options)}
38
- r.process{capture(money, r.authorization, options)}
37
+ r.process { authorize(money, payment, options) }
38
+ r.process { capture(money, r.authorization, options) }
39
39
  end
40
40
  end
41
41
 
@@ -103,6 +103,38 @@ module ActiveMerchant #:nodoc:
103
103
 
104
104
  private
105
105
 
106
+ AVS_MAPPING = {
107
+ '0' => 'R', # Unknown
108
+ '1' => 'A', # Address matches, postal code doesn't
109
+ '2' => 'N', # Neither postal code nor address match
110
+ '3' => 'R', # AVS unavailable
111
+ '4' => 'E', # AVS not supported for this card type
112
+ '5' => 'U', # No AVS data provided
113
+ '6' => 'Z', # Postal code matches, address doesn't match
114
+ '7' => 'D', # Both postal code and address match
115
+ '8' => 'U', # Address not checked, postal code unknown
116
+ '9' => 'B', # Address matches, postal code unknown
117
+ '10' => 'N', # Address doesn't match, postal code unknown
118
+ '11' => 'U', # Postal code not checked, address unknown
119
+ '12' => 'B', # Address matches, postal code not checked
120
+ '13' => 'U', # Address doesn't match, postal code not checked
121
+ '14' => 'P', # Postal code matches, address unknown
122
+ '15' => 'P', # Postal code matches, address not checked
123
+ '16' => 'N', # Postal code doesn't match, address unknown
124
+ '17' => 'U', # Postal code doesn't match, address not checked
125
+ '18' => 'I' # Neither postal code nor address were checked
126
+ }
127
+
128
+ CVC_MAPPING = {
129
+ '0' => 'P', # Unknown
130
+ '1' => 'M', # Matches
131
+ '2' => 'N', # Does not match
132
+ '3' => 'P', # Not checked
133
+ '4' => 'S', # No CVC/CVV provided, but was required
134
+ '5' => 'U', # Issuer not certifed by CVC/CVV
135
+ '6' => 'P' # No CVC/CVV provided
136
+ }
137
+
106
138
  NETWORK_TOKENIZATION_CARD_SOURCE = {
107
139
  'apple_pay' => 'applepay',
108
140
  'android_pay' => 'androidpay',
@@ -184,7 +216,7 @@ module ActiveMerchant #:nodoc:
184
216
  cvc: credit_card.verification_value
185
217
  }
186
218
 
187
- card.delete_if{|k,v| v.blank? }
219
+ card.delete_if { |k, v| v.blank? }
188
220
  card[:holderName] ||= 'Not Provided' if credit_card.is_a?(NetworkTokenizationCreditCard)
189
221
  requires!(card, :expiryMonth, :expiryYear, :holderName, :number)
190
222
  post[:card] = card
@@ -233,13 +265,12 @@ module ActiveMerchant #:nodoc:
233
265
 
234
266
  def commit(action, parameters)
235
267
  begin
236
- raw_response = ssl_post("#{url}/#{action.to_s}", post_data(action, parameters), request_headers)
268
+ raw_response = ssl_post("#{url}/#{action}", post_data(action, parameters), request_headers)
237
269
  response = parse(raw_response)
238
270
  rescue ResponseError => e
239
271
  raw_response = e.response.body
240
272
  response = parse(raw_response)
241
273
  end
242
-
243
274
  success = success_from(action, response)
244
275
  Response.new(
245
276
  success,
@@ -247,10 +278,20 @@ module ActiveMerchant #:nodoc:
247
278
  response,
248
279
  authorization: authorization_from(action, parameters, response),
249
280
  test: test?,
250
- error_code: success ? nil : error_code_from(response)
281
+ error_code: success ? nil : error_code_from(response),
282
+ avs_result: AVSResult.new(:code => avs_code_from(response)),
283
+ cvv_result: CVVResult.new(cvv_result_from(response))
251
284
  )
252
285
  end
253
286
 
287
+ def avs_code_from(response)
288
+ AVS_MAPPING[response['additionalData']['avsResult'][0..1].strip] if response.dig('additionalData', 'avsResult')
289
+ end
290
+
291
+ def cvv_result_from(response)
292
+ CVC_MAPPING[response['additionalData']['cvcResult'][0]] if response.dig('additionalData', 'cvcResult')
293
+ end
294
+
254
295
  def url
255
296
  if test?
256
297
  test_url
@@ -182,7 +182,7 @@ module ActiveMerchant #:nodoc:
182
182
 
183
183
  def parse_element(response, node)
184
184
  if node.has_elements?
185
- node.elements.each{|element| parse_element(response, element) }
185
+ node.elements.each { |element| parse_element(response, element) }
186
186
  else
187
187
  response[node.name.underscore.to_sym] = node.text
188
188
  end
@@ -133,9 +133,9 @@ module ActiveMerchant
133
133
 
134
134
  def refund(amount, authorization, options={})
135
135
  response = if auth_was_for_cim?(authorization)
136
- cim_refund(amount, authorization, options)
137
- else
138
- normal_refund(amount, authorization, options)
136
+ cim_refund(amount, authorization, options)
137
+ else
138
+ normal_refund(amount, authorization, options)
139
139
  end
140
140
 
141
141
  return response if response.success?
@@ -199,7 +199,7 @@ module ActiveMerchant
199
199
  end
200
200
 
201
201
  def verify_credentials
202
- response = commit(:verify_credentials) { }
202
+ response = commit(:verify_credentials) {}
203
203
  response.success?
204
204
  end
205
205
 
@@ -394,7 +394,7 @@ module ActiveMerchant
394
394
  end
395
395
 
396
396
  def camel_case_lower(key)
397
- String(key).split('_').inject([]){ |buffer,e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
397
+ String(key).split('_').inject([]) { |buffer, e| buffer.push(buffer.empty? ? e : e.capitalize) }.join
398
398
  end
399
399
 
400
400
  def add_settings(xml, source, options)
@@ -594,9 +594,9 @@ module ActiveMerchant
594
594
 
595
595
  xml.send(root_node) do
596
596
  first_name, last_name = if address[:name]
597
- split_names(address[:name])
598
- else
599
- [address[:first_name], address[:last_name]]
597
+ split_names(address[:name])
598
+ else
599
+ [address[:first_name], address[:last_name]]
600
600
  end
601
601
  full_address = "#{address[:address1]} #{address[:address2]}".strip
602
602
 
@@ -407,7 +407,7 @@ module ActiveMerchant #:nodoc:
407
407
 
408
408
  def recurring_parse_element(response, node)
409
409
  if node.has_elements?
410
- node.elements.each{|e| recurring_parse_element(response, e) }
410
+ node.elements.each { |e| recurring_parse_element(response, e) }
411
411
  else
412
412
  response[node.name.underscore.to_sym] = node.text
413
413
  end
@@ -379,18 +379,18 @@ module ActiveMerchant #:nodoc:
379
379
  requires!(options, :transaction)
380
380
  requires!(options[:transaction], :type)
381
381
  case options[:transaction][:type]
382
- when :void
382
+ when :void
383
383
  requires!(options[:transaction], :trans_id)
384
- when :refund
384
+ when :refund
385
385
  requires!(options[:transaction], :trans_id) &&
386
386
  (
387
387
  (options[:transaction][:customer_profile_id] && options[:transaction][:customer_payment_profile_id]) ||
388
388
  options[:transaction][:credit_card_number_masked] ||
389
389
  (options[:transaction][:bank_routing_number_masked] && options[:transaction][:bank_account_number_masked])
390
390
  )
391
- when :prior_auth_capture
391
+ when :prior_auth_capture
392
392
  requires!(options[:transaction], :amount, :trans_id)
393
- else
393
+ else
394
394
  requires!(options[:transaction], :amount, :customer_profile_id, :customer_payment_profile_id)
395
395
  end
396
396
  request = build_request(:create_customer_profile_transaction, options)
@@ -614,7 +614,7 @@ module ActiveMerchant #:nodoc:
614
614
 
615
615
  def build_create_customer_profile_transaction_request(xml, options)
616
616
  options[:extra_options] ||= {}
617
- options[:extra_options].merge!('x_delim_char' => @options[:delimiter]) if @options[:delimiter]
617
+ options[:extra_options]['x_delim_char'] = @options[:delimiter] if @options[:delimiter]
618
618
 
619
619
  add_transaction(xml, options[:transaction])
620
620
  xml.tag!('extraOptions') do
@@ -665,12 +665,12 @@ module ActiveMerchant #:nodoc:
665
665
  xml.tag!(CIM_TRANSACTION_TYPES[transaction[:type]]) do
666
666
  # The amount to be billed to the customer
667
667
  case transaction[:type]
668
- when :void
669
- tag_unless_blank(xml,'customerProfileId', transaction[:customer_profile_id])
670
- tag_unless_blank(xml,'customerPaymentProfileId', transaction[:customer_payment_profile_id])
671
- tag_unless_blank(xml,'customerShippingAddressId', transaction[:customer_shipping_address_id])
668
+ when :void
669
+ tag_unless_blank(xml, 'customerProfileId', transaction[:customer_profile_id])
670
+ tag_unless_blank(xml, 'customerPaymentProfileId', transaction[:customer_payment_profile_id])
671
+ tag_unless_blank(xml, 'customerShippingAddressId', transaction[:customer_shipping_address_id])
672
672
  xml.tag!('transId', transaction[:trans_id])
673
- when :refund
673
+ when :refund
674
674
  xml.tag!('amount', transaction[:amount])
675
675
  tag_unless_blank(xml, 'customerProfileId', transaction[:customer_profile_id])
676
676
  tag_unless_blank(xml, 'customerPaymentProfileId', transaction[:customer_payment_profile_id])
@@ -683,11 +683,11 @@ module ActiveMerchant #:nodoc:
683
683
  add_tax(xml, transaction[:tax]) if transaction[:tax]
684
684
  add_duty(xml, transaction[:duty]) if transaction[:duty]
685
685
  add_shipping(xml, transaction[:shipping]) if transaction[:shipping]
686
- when :prior_auth_capture
686
+ when :prior_auth_capture
687
687
  xml.tag!('amount', transaction[:amount])
688
688
  add_order(xml, transaction[:order]) if transaction[:order].present?
689
689
  xml.tag!('transId', transaction[:trans_id])
690
- else
690
+ else
691
691
  xml.tag!('amount', transaction[:amount])
692
692
  xml.tag!('customerProfileId', transaction[:customer_profile_id])
693
693
  xml.tag!('customerPaymentProfileId', transaction[:customer_payment_profile_id])
@@ -698,7 +698,7 @@ module ActiveMerchant #:nodoc:
698
698
  if [:auth_capture, :auth_only, :capture_only].include?(transaction[:type])
699
699
  xml.tag!('recurringBilling', transaction[:recurring_billing]) if transaction.has_key?(:recurring_billing)
700
700
  end
701
- unless [:void,:refund,:prior_auth_capture].include?(transaction[:type])
701
+ unless [:void, :refund, :prior_auth_capture].include?(transaction[:type])
702
702
  tag_unless_blank(xml, 'cardCode', transaction[:card_code])
703
703
  end
704
704
  end
@@ -878,7 +878,7 @@ module ActiveMerchant #:nodoc:
878
878
  end
879
879
 
880
880
  def format_extra_options(options)
881
- options&.map{ |k, v| "#{k}=#{v}" }&.join('&')
881
+ options&.map { |k, v| "#{k}=#{v}" }&.join('&')
882
882
  end
883
883
 
884
884
  def parse_direct_response(params)
@@ -952,7 +952,7 @@ module ActiveMerchant #:nodoc:
952
952
  def parse_element(node)
953
953
  if node.has_elements?
954
954
  response = {}
955
- node.elements.each{ |e|
955
+ node.elements.each { |e|
956
956
  key = e.name.underscore
957
957
  value = parse_element(e)
958
958
  if response.has_key?(key)
@@ -94,11 +94,11 @@ module ActiveMerchant #:nodoc:
94
94
 
95
95
  def parse_element(response, node)
96
96
  if node.has_attributes?
97
- node.attributes.each{|name, value| response["#{node.name}_#{name}".underscore.to_sym] = value }
97
+ node.attributes.each { |name, value| response["#{node.name}_#{name}".underscore.to_sym] = value }
98
98
  end
99
99
 
100
100
  if node.has_elements?
101
- node.elements.each{|element| parse_element(response, element) }
101
+ node.elements.each { |element| parse_element(response, element) }
102
102
  else
103
103
  response[node.name.underscore.to_sym] = node.text
104
104
  end