effective_orders 6.12.2 → 6.12.3

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: e90f1a83b2e9268d377b28a05fbc423bef5618f2270231e018f04bb0f297ea02
4
- data.tar.gz: a4ed543e612da4fddbc2086b30de01ed5252cb53f033db9d538468a4cdd361df
3
+ metadata.gz: 4f5fbabf9c4012193962576f7ef67838e17e382740ad3860ab9c9f527ce86787
4
+ data.tar.gz: 71f6af17259b5b62ee66b2fd993bb085dc8411ad8040c21fa0a3bc639381c655
5
5
  SHA512:
6
- metadata.gz: 923d207995eb5f2861cd8425c57902357c9d5141d5169eec8911703051e9be4ecf9e90da6ee71aad88d777ec503d18bcc6478323620ade521a2b995c839a8d64
7
- data.tar.gz: 700ab00a86078101fd05a561b7b8c02098a8941f5a9d645e859bfdbafcc40dd363be9dadc3abfefda4b1a9c33673829451f71eefac07261715cec817641f6b2e
6
+ metadata.gz: 60eff8ba4e046b46575a23c98daf14b0ba07cf548041826590ac49c3bf193cde6632437baeae38bfe011f37a3cae0e7d3d5d444aeeb0340a0990d1c93a88ce2b
7
+ data.tar.gz: 9b91126b76b01d50fefc86b31d1a163dfe8164c523f69a2c3a523a827c632faaf0b0b5e13e0174b01450078dd32754a76157b5c4338b39b16b47a10ca1d25c59
@@ -19,7 +19,7 @@ module Admin
19
19
  scope :all
20
20
  scope :purchased
21
21
 
22
- scope :deferred if EffectiveOrders.deferred_providers.present?
22
+ scope :deferred if EffectiveOrders.deferred? || EffectiveOrders.delayed?
23
23
  scope :voided
24
24
 
25
25
  scope :pending_refunds if EffectiveOrders.refund && !EffectiveOrders.buyer_purchases_refund?
@@ -6,7 +6,7 @@ class EffectiveOrdersDatatable < Effective::Datatable
6
6
  scope :all
7
7
  scope :purchased
8
8
 
9
- scope :deferred if EffectiveOrders.deferred_providers.present?
9
+ scope :deferred if EffectiveOrders.deferred? || EffectiveOrders.delayed?
10
10
  scope :refunds if EffectiveOrders.refund
11
11
  scope :not_purchased
12
12
  end
@@ -23,15 +23,51 @@ module Effective
23
23
  self.currency = currency || EffectiveOrders.deluxe.fetch(:currency)
24
24
  end
25
25
 
26
- def payment
27
- raise('expected purchase response to be present') unless purchase_response.kind_of?(Hash)
28
- purchase_response
26
+ def health_check
27
+ get('/')
28
+ end
29
+
30
+ def healthy?
31
+ response = health_check()
32
+
33
+ return false unless response.kind_of?(Hash)
34
+ return false unless response['appName'].present?
35
+ return false unless response['environment'].present?
36
+
37
+ true
38
+ end
39
+
40
+ # Decode the base64 encoded JSON object into a Hash
41
+ def decode_payment_intent_payload(payload)
42
+ raise('expected a string') unless payload.kind_of?(String)
43
+
44
+ payment_intent = (JSON.parse(Base64.decode64(payload)) rescue nil)
45
+
46
+ raise('expected payment_intent to be a Hash') unless payment_intent.kind_of?(Hash)
47
+ raise('expected a token payment') unless payment_intent['type'] == 'Token'
48
+
49
+ payment_intent
50
+ end
51
+
52
+ # Takes a payment_intent and returns the card info we can store
53
+ def card_info(payment_intent)
54
+ token = extract_token(payment_intent)
55
+
56
+ # Return the authorization params merged with the card info
57
+ last4 = token['maskedPan'].to_s.last(4)
58
+ card = token['cardType'].to_s.downcase
59
+ date = token['expDate']
60
+ cvv = token['cvv']
61
+
62
+ active_card = "**** **** **** #{last4} #{card} #{date}" if last4.present?
63
+
64
+ { 'active_card' => active_card, 'card' => card, 'expDate' => date, 'cvv' => cvv }.compact
29
65
  end
30
66
 
67
+ # After we store a payment intent we can call purchase! immediately or wait till later.
31
68
  # This calls Authorize Payment and Complete Payment
32
- # Returns true if all good.
33
- # Returns false if there was an error.
34
- # Always sets the @purchase_response which is api.payment
69
+ # Returns true when purchased. Returns false when declined.
70
+ # The response is stored in api.payment() after this is run
35
71
  def purchase!(order, payment_intent)
36
72
  payment_intent = decode_payment_intent_payload(payment_intent) if payment_intent.kind_of?(String)
37
73
  raise('expected payment_intent to be a Hash') unless payment_intent.kind_of?(Hash)
@@ -58,21 +94,56 @@ module Effective
58
94
  true
59
95
  end
60
96
 
61
- # Health Check
62
- def health_check
63
- get('/')
97
+ def payment
98
+ raise('expected purchase response to be present') unless purchase_response.kind_of?(Hash)
99
+ purchase_response
64
100
  end
65
101
 
66
- def healthy?
67
- response = health_check()
102
+ def purchase_delayed_orders!(orders)
103
+ now = Time.zone.now
68
104
 
69
- return false unless response.kind_of?(Hash)
70
- return false unless response['timestamp'].to_s.start_with?(Time.zone.now.strftime('%Y-%m-%d'))
71
- return false unless response['environment'].present?
105
+ Array(orders).each do |order|
106
+ puts "Trying order #{order.id}"
107
+
108
+ begin
109
+ raise('expected a delayed order') unless order.delayed?
110
+ raise('expected a deferred order') unless order.deferred?
111
+ raise('expected delayed payment intent') unless order.delayed_payment_intent.present?
112
+
113
+ order.update_columns(delayed_payment_purchase_ran_at: now, delayed_payment_purchase_result: nil)
114
+
115
+ purchased = purchase!(order, order.delayed_payment_intent)
116
+ provider = order.payment_provider
117
+ payment = self.payment()
118
+ card = payment["card"]
119
+
120
+ if purchased
121
+ order.assign_attributes(delayed_payment_purchase_result: "success")
122
+ order.purchase!(payment: payment, provider: provider, card: card, email: true, skip_buyer_validations: true)
123
+
124
+ puts "Successfully purchased order #{order.id}"
125
+ else
126
+ order.assign_attributes(delayed_payment_purchase_result: "failed with message: #{Array(payment['responseMessage']).to_sentence.presence || 'none'}.")
127
+ order.decline!(payment: payment, provider: provider, card: card)
128
+
129
+ puts "Failed to purchase order #{order.id} #{order.delayed_payment_purchase_result}"
130
+ end
131
+
132
+ rescue => e
133
+ order.update_columns(delayed_payment_purchase_ran_at: now, delayed_payment_purchase_result: "error: #{e.message}")
134
+
135
+ EffectiveLogger.error(e.message, associated: order) if defined?(EffectiveLogger)
136
+ ExceptionNotifier.notify_exception(e, data: { order_id: order.id }) if defined?(ExceptionNotifier)
137
+
138
+ puts "Error purchasing #{order.id}: #{e.message}"
139
+ end
140
+ end
72
141
 
73
142
  true
74
143
  end
75
144
 
145
+ protected
146
+
76
147
  # Authorize Payment
77
148
  def authorize_payment(order, payment_intent)
78
149
  response = post('/payments/authorize', params: authorize_payment_params(order, payment_intent))
@@ -117,19 +188,6 @@ module Effective
117
188
  response.reverse_merge(authorization)
118
189
  end
119
190
 
120
- def complete_payment_params(order, payment_intent)
121
- raise('expected an Effective::Order') unless order.kind_of?(Effective::Order)
122
-
123
- payment_id = extract_payment_id(payment_intent)
124
- amount = { amount: order.total_to_f, currency: currency }
125
-
126
- # Params passed into Complete Payment
127
- {
128
- paymentId: payment_id,
129
- amount: amount
130
- }
131
- end
132
-
133
191
  def authorize_payment_params(order, payment_intent)
134
192
  raise('expected an Effective::Order') unless order.kind_of?(Effective::Order)
135
193
 
@@ -183,6 +241,19 @@ module Effective
183
241
  }.compact
184
242
  end
185
243
 
244
+ def complete_payment_params(order, payment_intent)
245
+ raise('expected an Effective::Order') unless order.kind_of?(Effective::Order)
246
+
247
+ payment_id = extract_payment_id(payment_intent)
248
+ amount = { amount: order.total_to_f, currency: currency }
249
+
250
+ # Params passed into Complete Payment
251
+ {
252
+ paymentId: payment_id,
253
+ amount: amount
254
+ }
255
+ end
256
+
186
257
  def get(endpoint, params: nil)
187
258
  query = ('?' + params.compact.map { |k, v| "$#{k}=#{v}" }.join('&')) if params.present?
188
259
 
@@ -223,33 +294,6 @@ module Effective
223
294
  JSON.parse(result.body)
224
295
  end
225
296
 
226
- # Takes a payment_intent and returns the card info we can store
227
- def card_info(payment_intent)
228
- token = extract_token(payment_intent)
229
-
230
- # Return the authorization params merged with the card info
231
- last4 = token['maskedPan'].to_s.last(4)
232
- card = token['cardType'].to_s.downcase
233
- date = token['expDate']
234
- cvv = token['cvv']
235
-
236
- active_card = "**** **** **** #{last4} #{card} #{date}" if last4.present?
237
-
238
- { 'active_card' => active_card, 'card' => card, 'expDate' => date, 'cvv' => cvv }.compact
239
- end
240
-
241
- # Decode the base64 encoded JSON object into a Hash
242
- def decode_payment_intent_payload(payload)
243
- raise('expected a string') unless payload.kind_of?(String)
244
-
245
- payment_intent = (JSON.parse(Base64.decode64(payload)) rescue nil)
246
-
247
- raise('expected payment_intent to be a Hash') unless payment_intent.kind_of?(Hash)
248
- raise('expected a token payment') unless payment_intent['type'] == 'Token'
249
-
250
- payment_intent
251
- end
252
-
253
297
  private
254
298
 
255
299
  def headers
@@ -241,7 +241,9 @@ module Effective
241
241
  validates :payment_provider, presence: true
242
242
 
243
243
  validate do
244
- errors.add(:payment_provider, "unknown deferred payment provider") unless EffectiveOrders.deferred_providers.include?(payment_provider)
244
+ unless EffectiveOrders.deferred_providers.include?(payment_provider) || EffectiveOrders.delayed_providers.include?(payment_provider)
245
+ errors.add(:payment_provider, "unknown deferred payment provider")
246
+ end
245
247
  end
246
248
  end
247
249
 
@@ -673,7 +675,9 @@ module Effective
673
675
 
674
676
  payment: payment_to_h(payment.presence || 'none'),
675
677
  payment_provider: (provider.presence || 'none'),
676
- payment_card: (card.presence || 'none')
678
+ payment_card: (card.presence || 'none'),
679
+
680
+ delayed_payment_intent: nil # Do not store the delayed payment intent any longer
677
681
  )
678
682
 
679
683
  if current_user&.email.present?
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '6.12.2'.freeze
2
+ VERSION = '6.12.3'.freeze
3
3
  end
@@ -185,8 +185,9 @@ module EffectiveOrders
185
185
  ].compact
186
186
  end
187
187
 
188
+ # Should not include delayed providers
188
189
  def self.deferred_providers
189
- [('cheque' if cheque?), ('deluxe_delayed' if deluxe_delayed?), ('etransfer' if etransfer?), ('phone' if phone?)].compact
190
+ [('cheque' if cheque?), ('etransfer' if etransfer?), ('phone' if phone?)].compact
190
191
  end
191
192
 
192
193
  def self.delayed_providers
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_orders
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.12.2
4
+ version: 6.12.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-30 00:00:00.000000000 Z
11
+ date: 2024-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails