catarse_pagarme 2.13.0 → 2.14.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
  SHA1:
3
- metadata.gz: 157074433bd6e3fbc68743fe19bf447709501985
4
- data.tar.gz: 68e83c91dc7923e61edabbc74f3d44572858a58d
3
+ metadata.gz: 759be41182016de2403b4d8dda77eb30691dbd1f
4
+ data.tar.gz: f161dd3654541d5ced3e5c0a7dd07dfb08fb82d0
5
5
  SHA512:
6
- metadata.gz: c37db8be1bf72f45cce1136464856d16812c510d59874c47f19e91334f3927cde2e8f89f701c56459df589e2e852550be79861cce4f14ae920555e3cb4c22f81
7
- data.tar.gz: a3dd9f06b8e595883199a50a4ec47cd478171780482c37a786733015f262c4eee8076e7293b8e8442edd5ade489f98ab52817c617de69d1c4f580651efa0ef39
6
+ metadata.gz: a0c95c06bde334b295b76b41c5f739b9ddcd4e5c67a0267160e2ba52f0f68f88ccb046c1e7c52cc5f9604585d5bed4c4b79281428d0eb3839cb3dc0dd8735435
7
+ data.tar.gz: a30bcc3414beebaf09ee900ffb777fbd7b16094bcd0188cac420b65b756b1dcbee22201e341d3ea45e787381f1b84d7369b3c378bba9032e2952b59453bdcf84
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ catarse_pagarme
data/Gemfile.lock CHANGED
@@ -1,7 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- catarse_pagarme (2.13.0)
4
+ catarse_pagarme (2.14.0)
5
+ countries (= 3.0.0)
6
+ konduto-ruby (= 2.1.0)
5
7
  pagarme (= 2.1.4)
6
8
  rails (~> 4.0)
7
9
  sentry-raven
@@ -50,10 +52,14 @@ GEM
50
52
  coderay (1.1.2)
51
53
  concurrent-ruby (1.0.5)
52
54
  connection_pool (2.2.2)
55
+ countries (3.0.0)
56
+ i18n_data (~> 0.8.0)
57
+ sixarm_ruby_unaccent (~> 1.1)
58
+ unicode_utils (~> 1.4)
53
59
  crass (1.0.4)
54
60
  database_cleaner (1.7.0)
55
61
  diff-lcs (1.3)
56
- domain_name (0.5.20180417)
62
+ domain_name (0.5.20190701)
57
63
  unf (>= 0.0.5, < 1.0.0)
58
64
  erubis (2.7.0)
59
65
  factory_girl (4.9.0)
@@ -61,40 +67,43 @@ GEM
61
67
  factory_girl_rails (4.9.0)
62
68
  factory_girl (~> 4.9.0)
63
69
  railties (>= 3.0.0)
64
- faraday (0.15.4)
70
+ faraday (0.17.0)
65
71
  multipart-post (>= 1.2, < 3)
66
72
  globalid (0.4.2)
67
73
  activesupport (>= 4.2.0)
74
+ http-accept (1.7.0)
68
75
  http-cookie (1.0.3)
69
76
  domain_name (~> 0.5)
70
77
  i18n (0.9.5)
71
78
  concurrent-ruby (~> 1.0)
79
+ i18n_data (0.8.0)
80
+ konduto-ruby (2.1.0)
72
81
  loofah (2.2.2)
73
82
  crass (~> 1.0.2)
74
83
  nokogiri (>= 1.5.9)
75
84
  mail (2.7.1)
76
85
  mini_mime (>= 0.1.1)
77
86
  method_source (0.9.0)
78
- mime-types (3.2.2)
87
+ mime-types (3.3)
79
88
  mime-types-data (~> 3.2015)
80
- mime-types-data (3.2018.0812)
81
- mini_mime (1.0.1)
89
+ mime-types-data (3.2019.1009)
90
+ mini_mime (1.0.2)
82
91
  mini_portile2 (2.3.0)
83
92
  minitest (5.11.3)
84
- multi_json (1.13.1)
85
- multipart-post (2.0.0)
93
+ multi_json (1.14.1)
94
+ multipart-post (2.1.1)
86
95
  netrc (0.11.0)
87
96
  nokogiri (1.8.4)
88
97
  mini_portile2 (~> 2.3.0)
89
98
  pagarme (2.1.4)
90
99
  multi_json
91
100
  rest-client
92
- pg (1.1.3)
101
+ pg (0.15.0)
93
102
  pry (0.11.3)
94
103
  coderay (~> 1.1.0)
95
104
  method_source (~> 0.9.0)
96
105
  rack (1.6.10)
97
- rack-protection (2.0.5)
106
+ rack-protection (2.0.7)
98
107
  rack
99
108
  rack-test (0.6.3)
100
109
  rack (>= 1.0)
@@ -123,8 +132,9 @@ GEM
123
132
  rake (>= 0.8.7)
124
133
  thor (>= 0.18.1, < 2.0)
125
134
  rake (12.3.1)
126
- redis (4.1.0)
127
- rest-client (2.0.2)
135
+ redis (4.1.3)
136
+ rest-client (2.1.0)
137
+ http-accept (>= 1.7.0, < 2.0)
128
138
  http-cookie (>= 1.0.2, < 2.0)
129
139
  mime-types (>= 1.16, < 4.0)
130
140
  netrc (~> 0.8)
@@ -145,13 +155,14 @@ GEM
145
155
  rspec-mocks (~> 3.8.0)
146
156
  rspec-support (~> 3.8.0)
147
157
  rspec-support (3.8.0)
148
- sentry-raven (2.9.0)
158
+ sentry-raven (2.12.3)
149
159
  faraday (>= 0.7.6, < 1.0)
150
- sidekiq (5.2.5)
160
+ sidekiq (5.2.7)
151
161
  connection_pool (~> 2.2, >= 2.2.2)
152
162
  rack (>= 1.5.0)
153
163
  rack-protection (>= 1.5.0)
154
164
  redis (>= 3.3.5, < 5)
165
+ sixarm_ruby_unaccent (1.2.0)
155
166
  sprockets (3.7.2)
156
167
  concurrent-ruby (~> 1.0)
157
168
  rack (> 1, < 3)
@@ -165,7 +176,8 @@ GEM
165
176
  thread_safe (~> 0.1)
166
177
  unf (0.1.4)
167
178
  unf_ext
168
- unf_ext (0.0.7.5)
179
+ unf_ext (0.0.7.6)
180
+ unicode_utils (1.4.0)
169
181
  weekdays (1.0.2)
170
182
 
171
183
  PLATFORMS
@@ -180,4 +192,4 @@ DEPENDENCIES
180
192
  rspec-rails (~> 3.3)
181
193
 
182
194
  BUNDLED WITH
183
- 1.16.5
195
+ 1.17.3
@@ -4,7 +4,7 @@ module CatarsePagarme
4
4
  MAX_SOFT_DESCRIPTOR_LENGTH = 13
5
5
 
6
6
  def create
7
- transaction = CreditCardTransaction.new(credit_card_attributes, payment).charge!
7
+ transaction = CreditCardTransaction.new(credit_card_attributes, payment).process!
8
8
 
9
9
  render json: { payment_status: transaction.status }
10
10
  rescue PagarMe::PagarMeError, PagarMe::ValidationError => e
@@ -142,7 +142,6 @@ module CatarsePagarme
142
142
  end
143
143
 
144
144
  def af_metadata
145
- return {} unless CatarsePagarme.configuration.use_simility
146
145
  project = contribution.project
147
146
  user = contribution.user
148
147
 
@@ -235,7 +234,7 @@ module CatarsePagarme
235
234
  id: contribution.project_id.to_s,
236
235
  name: contribution.project.name,
237
236
  type: contribution.project.mode == 'flex' ? 'flex' : 'full',
238
- date: contribution.project.expires_at.to_s,
237
+ date: contribution.project.created_at.to_s,
239
238
  venue_name: project.user.name,
240
239
  address: {
241
240
  country: "Brasil",
@@ -0,0 +1,148 @@
1
+ module CatarsePagarme
2
+ class AntifraudOrderWrapper
3
+ attr_accessor :attributes, :transaction
4
+
5
+ def initialize(attributes, transaction)
6
+ self.attributes = attributes
7
+ self.transaction = transaction
8
+ end
9
+
10
+ def send(analyze:)
11
+ order = build_order(analyze: analyze)
12
+ client.analyze(order)
13
+ end
14
+
15
+ private
16
+
17
+ def client
18
+ konduto_api_key = CatarsePagarme.configuration.konduto_api_key
19
+ @client ||= KondutoRuby.new(konduto_api_key)
20
+ end
21
+
22
+ def build_order(analyze:)
23
+ KondutoOrder.new(
24
+ order_attributes.merge({
25
+ analyze: analyze,
26
+ customer: build_customer,
27
+ payment: build_payment,
28
+ billing: build_billing_address,
29
+ shipping: build_shipping_address,
30
+ shopping_cart: build_shopping_cart,
31
+ seller: build_seller
32
+ })
33
+ )
34
+ end
35
+
36
+ def build_customer
37
+ KondutoCustomer.new(customer_attributes)
38
+ end
39
+
40
+ def build_payment
41
+ [KondutoPayment.new(payment_attributes)]
42
+ end
43
+
44
+ def build_billing_address
45
+ KondutoAddress.new(billing_address_attributes)
46
+ end
47
+
48
+ def build_shipping_address
49
+ KondutoAddress.new(shipping_address_attributes)
50
+ end
51
+
52
+ def build_shopping_cart
53
+ [KondutoItem.new(item_attributes)]
54
+ end
55
+
56
+ def build_seller
57
+ KondutoSeller.new(seller_attributes)
58
+ end
59
+
60
+ def order_attributes
61
+ {
62
+ id: self.transaction.id.to_s,
63
+ total_amount: self.attributes[:amount] / 100.0,
64
+ visitor: self.attributes.dig(:metadata, :contribution_id).to_s,
65
+ currency: 'BRL',
66
+ installments: self.attributes[:installments],
67
+ purchased_at: self.transaction.date_created,
68
+ ip: self.attributes.dig(:antifraud_metadata, :ip)
69
+ }
70
+ end
71
+
72
+ def customer_attributes
73
+ customer = self.attributes.dig(:customer)
74
+ {
75
+ id: customer[:document_number],
76
+ name: customer[:name],
77
+ email: customer[:email],
78
+ phone1: customer[:phone].to_h.values.join,
79
+ created_at: self.attributes.dig(:antifraud_metadata, :register, :registered_at)
80
+ }
81
+ end
82
+
83
+ def payment_attributes
84
+ {
85
+ type: 'credit',
86
+ status: self.transaction.status == 'authorized' ? 'approved' : 'declined',
87
+ bin: self.transaction.card.first_digits,
88
+ last4: self.transaction.card.last_digits,
89
+ expiration_date: card_expiration_date
90
+ }
91
+ end
92
+
93
+ def billing_address_attributes
94
+ billing_data = self.attributes.dig(:antifraud_metadata, :billing)
95
+ {
96
+ name: self.attributes.dig(:customer, :name),
97
+ address1: billing_data.dig(:address, :street),
98
+ city: billing_data.dig(:address, :city),
99
+ state: billing_data.dig(:address, :state),
100
+ zip: billing_data.dig(:address, :zipcode),
101
+ country: card_country_code
102
+ }
103
+ end
104
+
105
+ def shipping_address_attributes
106
+ shipping_data = self.attributes.dig(:antifraud_metadata, :shipping)
107
+ {
108
+ name: shipping_data.dig(:customer, :name),
109
+ address1: shipping_data.dig(:address, :street),
110
+ city: shipping_data.dig(:address, :city),
111
+ state: shipping_data.dig(:address, :state),
112
+ zip: shipping_data.dig(:address, :zipcode)
113
+ }
114
+ end
115
+
116
+ def item_attributes
117
+ shopping_cart_data = self.attributes.dig(:antifraud_metadata, :shopping_cart).first
118
+ {
119
+ sku: self.attributes.dig(:metadata, :contribution_id).to_s,
120
+ product_code: self.attributes.dig(:metadata, :contribution_id).to_s,
121
+ category: 9999,
122
+ name: shopping_cart_data[:name],
123
+ unit_cost: self.attributes[:amount] / 100.0,
124
+ quantity: 1,
125
+ created_at: self.attributes.dig(:metadata, :project_online).to_s[0..9]
126
+ }
127
+ end
128
+
129
+ def seller_attributes
130
+ event_data = self.attributes.dig(:antifraud_metadata, :events).first
131
+ {
132
+ id: event_data[:id],
133
+ name: event_data[:venue_name],
134
+ created_at: event_data[:date]
135
+ }
136
+ end
137
+
138
+ def card_expiration_date
139
+ expiration_date = self.transaction.card.expiration_date
140
+ "#{expiration_date[0..1]}20#{expiration_date[2..3]}"
141
+ end
142
+
143
+ def card_country_code
144
+ country = ::ISO3166::Country.find_country_by_name(self.transaction.card.country)
145
+ country.alpha2
146
+ end
147
+ end
148
+ end
@@ -17,7 +17,11 @@ module CatarsePagarme
17
17
 
18
18
  transfer = PagarMe::Transfer.new({
19
19
  bank_account_id: bank_account.id,
20
- amount: value_for_transaction
20
+ amount: value_for_transaction,
21
+ metadata: {
22
+ balance_transfer_id: balance_transfer.id,
23
+ seed: SecureRandom.hex(4)
24
+ }
21
25
  })
22
26
  transfer.create
23
27
  raise "unable to create a transfer" unless transfer.id.present?
@@ -1,31 +1,68 @@
1
1
  module CatarsePagarme
2
2
  class CreditCardTransaction < TransactionBase
3
+ def process!
4
+ authorize!
5
+ if self.transaction.status == 'authorized'
6
+ if was_credit_card_used_before?
7
+ self.transaction.capture
8
+ else
9
+ antifraud_outcome = process_antifraud
3
10
 
4
- def charge!
5
- save_card = self.attributes.delete(:save_card)
11
+ if antifraud_outcome.recommendation == :APPROVE
12
+ self.transaction.capture
13
+ elsif antifraud_outcome.recommendation == :DECLINE
14
+ self.transaction.refund
15
+ end
16
+ end
17
+ end
6
18
 
7
- self.transaction = PagarMe::Transaction.new(self.attributes)
19
+ change_payment_state
8
20
 
9
- unless payment.update_attributes({
10
- gateway: 'Pagarme',
11
- payment_method: payment_method })
21
+ self.transaction
22
+ end
12
23
 
13
- raise ::PagarMe::PagarMeError.new(
14
- payment.errors.messages.values.flatten.to_sentence)
24
+ def authorize!
25
+ save_card = self.attributes.delete(:save_card)
26
+
27
+ self.transaction = PagarMe::Transaction.new(
28
+ amount: self.attributes[:amount],
29
+ card_hash: self.attributes[:card_hash],
30
+ capture: false,
31
+ async: false,
32
+ postback_url: self.attributes[:postback_url]
33
+ )
34
+
35
+ unless payment.update_attributes(gateway: 'Pagarme', payment_method: payment_method)
36
+ raise ::PagarMe::PagarMeError.new(payment.errors.messages.values.flatten.to_sentence)
15
37
  end
16
38
 
17
39
  self.transaction.charge
18
40
 
19
- #VerifyPagarmeWorker.perform_in(5.minutes, payment.key)
20
-
21
41
  change_payment_state
22
42
 
23
43
  if self.transaction.status == 'refused'
44
+ antifraud_wrapper.send(analyze: false)
24
45
  raise ::PagarMe::PagarMeError.new(I18n.t('projects.contributions.edit.transaction_error'))
25
46
  end
26
47
 
27
48
  save_user_credit_card if save_card
28
- self.transaction
49
+ end
50
+
51
+ def was_credit_card_used_before?
52
+ PaymentEngines.was_credit_card_used_before?(self.transaction.card.id)
53
+ end
54
+
55
+ def process_antifraud
56
+ begin
57
+ antifraud_wrapper.send(analyze: true)
58
+ rescue RuntimeError => e
59
+ ::Raven.capture_exception(e)
60
+ OpenStruct.new(recommendation: :DECLINE)
61
+ end
62
+ end
63
+
64
+ def antifraud_wrapper
65
+ @antifraud_wrapper ||= AntifraudOrderWrapper.new(self.attributes, self.transaction)
29
66
  end
30
67
 
31
68
  def save_user_credit_card
@@ -8,16 +8,20 @@ module CatarsePagarme
8
8
  self.payment = payment
9
9
  end
10
10
 
11
- def change_status_by_transaction(transaction_status)
11
+ def change_status_by_transaction(transaction_status)
12
12
  case transaction_status
13
13
  when 'pending_review' then
14
14
  self.payment.try(:notify_about_pending_review)
15
- when 'paid', 'authorized' then
15
+ when 'paid' then
16
16
  self.payment.pay unless self.payment.paid?
17
17
  when 'pending_refund' then
18
18
  self.payment.request_refund unless self.payment.pending_refund?
19
19
  when 'refunded' then
20
- self.payment.refund unless self.payment.refunded?
20
+ if self.payment.pending?
21
+ self.payment.refuse
22
+ else
23
+ self.payment.refund unless self.payment.refunded?
24
+ end
21
25
  when 'refused' then
22
26
  self.payment.refuse unless self.payment.refused?
23
27
  when 'chargedback' then
@@ -17,9 +17,10 @@ Gem::Specification.new do |s|
17
17
  s.files = `git ls-files`.split($\)
18
18
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
19
19
 
20
+ s.add_dependency "countries", "3.0.0"
20
21
  s.add_dependency "rails", "~> 4.0"
21
22
  s.add_dependency "pagarme", "2.1.4"
22
- #s.add_dependency "pagarme", "1.10.0"
23
+ s.add_dependency "konduto-ruby", "2.1.0"
23
24
  s.add_dependency "weekdays", ">= 1.0.2"
24
25
  s.add_dependency "sidekiq"
25
26
  s.add_dependency "sentry-raven"
@@ -1,10 +1,11 @@
1
1
  require "pagarme"
2
+ require "konduto-ruby"
3
+ require "countries"
2
4
  require "catarse_pagarme/engine"
3
5
  require "catarse_pagarme/configuration"
4
6
  require "catarse_pagarme/payment_engine"
5
7
  require "sidekiq"
6
8
 
7
-
8
9
  module CatarsePagarme
9
10
  class << self
10
11
  attr_writer :configuration