flowcommerce_spree 0.0.2 → 0.0.7
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 +4 -4
- data/README.md +46 -13
- data/SPREE_FLOW.md +6 -28
- data/app/controllers/concerns/current_zone_loader_decorator.rb +33 -25
- data/app/controllers/flowcommerce_spree/inventory_controller.rb +23 -0
- data/app/controllers/flowcommerce_spree/orders_controller.rb +20 -0
- data/app/controllers/flowcommerce_spree/webhooks_controller.rb +23 -13
- data/app/controllers/users/sessions_controller_decorator.rb +28 -0
- data/app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb +4 -9
- data/app/models/spree/address_decorator.rb +19 -0
- data/app/models/spree/calculator/flow_io.rb +61 -0
- data/app/models/spree/calculator/shipping/flow_io.rb +40 -0
- data/app/models/spree/flow_io_credit_card_decorator.rb +21 -0
- data/app/models/spree/flow_io_order_decorator.rb +163 -0
- data/app/models/spree/flow_io_variant_decorator.rb +4 -2
- data/app/models/spree/gateway/flow_io.rb +153 -0
- data/app/models/spree/{credit_card_decorator.rb → payment_capture_event_decorator.rb} +1 -1
- data/app/models/spree/promotion_handler/coupon_decorator.rb +1 -1
- data/app/models/spree/zones/flow_io_product_zone_decorator.rb +8 -0
- data/app/models/tracking/setup_decorator.rb +40 -0
- data/app/overrides/spree/admin/order_sidebar_summary_flow_link.rb +13 -0
- data/app/overrides/spree/admin/products/order_price_flow_message.rb +9 -0
- data/app/serializers/api/v2/order_serializer_decorator.rb +20 -0
- data/app/services/flowcommerce_spree/import_experience_items.rb +1 -1
- data/app/services/flowcommerce_spree/order_sync.rb +81 -173
- data/app/services/flowcommerce_spree/order_updater.rb +78 -0
- data/app/services/flowcommerce_spree/webhooks/capture_upserted_v2.rb +76 -0
- data/app/services/flowcommerce_spree/webhooks/card_authorization_upserted_v2.rb +66 -0
- data/app/services/flowcommerce_spree/webhooks/experience_upserted_v2.rb +25 -0
- data/app/services/flowcommerce_spree/webhooks/fraud_status_changed.rb +35 -0
- data/app/services/flowcommerce_spree/webhooks/local_item_upserted.rb +40 -0
- data/app/views/spree/admin/payments/source_views/_flow_io_gateway.html.erb +21 -0
- data/config/rails_best_practices.yml +51 -0
- data/config/routes.rb +3 -1
- data/db/migrate/20201021755957_add_meta_to_spree_tables.rb +6 -4
- data/lib/flow/simple_gateway.rb +0 -36
- data/lib/flowcommerce_spree.rb +17 -3
- data/lib/flowcommerce_spree/engine.rb +33 -3
- data/lib/flowcommerce_spree/experience_service.rb +1 -27
- data/lib/flowcommerce_spree/logging_http_client.rb +33 -15
- data/lib/flowcommerce_spree/session.rb +17 -32
- data/lib/flowcommerce_spree/test_support.rb +7 -0
- data/lib/flowcommerce_spree/version.rb +1 -1
- data/lib/tasks/flowcommerce_spree.rake +4 -1
- metadata +88 -21
- data/app/mailers/spree/spree_order_mailer_decorator.rb +0 -24
- data/app/models/spree/gateway/spree_flow_gateway.rb +0 -116
- data/app/models/spree/line_item_decorator.rb +0 -15
- data/app/models/spree/order_decorator.rb +0 -179
- data/app/views/spree/order_mailer/confirm_email.html.erb +0 -86
- data/app/views/spree/order_mailer/confirm_email.text.erb +0 -38
- data/config/initializers/flowcommerce_spree.rb +0 -7
- data/lib/flow/error.rb +0 -73
- data/lib/flow/pay_pal.rb +0 -25
- data/lib/flowcommerce_spree/webhook_service.rb +0 -98
- data/lib/simple_csv_writer.rb +0 -44
@@ -14,30 +14,48 @@ module FlowcommerceSpree
|
|
14
14
|
# original_read = client.read_timeout
|
15
15
|
|
16
16
|
start_time = Time.now.utc.round(10)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# client.open_timeout = 60
|
24
|
-
# client.read_timeout = 60
|
25
|
-
end
|
17
|
+
|
18
|
+
# Contrived example to show how client settings can be adjusted
|
19
|
+
# if request.path.start_with?('/organizations')
|
20
|
+
# client.open_timeout = 60
|
21
|
+
# client.read_timeout = 60
|
22
|
+
# end
|
26
23
|
|
27
24
|
begin
|
28
25
|
response = super
|
29
26
|
rescue Io::Flow::V0::HttpClient::ServerError => e
|
30
|
-
@error = { error: e }
|
27
|
+
@error = { error: Oj.load(e.body), code: e.code, status: e.details }
|
28
|
+
raise exception_to_raise(e), @error.dig(:error, 'messages')
|
31
29
|
ensure
|
32
30
|
# client.open_timeout = original_open
|
33
31
|
# client.read_timeout = original_read
|
34
32
|
|
35
|
-
|
36
|
-
duration = ((end_time - start_time) * 1000).round(0)
|
37
|
-
@logger.info "complete #{request.method} #{request.path} #{duration} ms"
|
38
|
-
@logger.info "response: #{response}"
|
39
|
-
@logger.info "Error: #{e.inspect}" if e
|
33
|
+
log_request(request, response, start_time)
|
40
34
|
end
|
41
35
|
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def exception_to_raise(flow_io_exception)
|
40
|
+
resource = flow_io_exception.uri.split('/').last
|
41
|
+
exception = case resource
|
42
|
+
when 'reversals', 'refunds'
|
43
|
+
'Spree::Core::GatewayError'
|
44
|
+
else
|
45
|
+
'StandardError'
|
46
|
+
end
|
47
|
+
exception.constantize
|
48
|
+
end
|
49
|
+
|
50
|
+
def log_request(request, response, start_time)
|
51
|
+
duration = ((Time.now.utc.round(10) - start_time) * 1000).round(0)
|
52
|
+
|
53
|
+
@logger.info("Started #{request.method} #{request.path}\n"\
|
54
|
+
"headers: #{request.instance_variable_get(:@header)}\nbody: #{request.body}\n"\
|
55
|
+
"response: #{response&.force_encoding('utf-8')}\n"\
|
56
|
+
"Completed #{request.method} #{request.path} #{duration} ms\n")
|
57
|
+
|
58
|
+
@logger.info "Error: #{@error.inspect}" if @error
|
59
|
+
end
|
42
60
|
end
|
43
61
|
end
|
@@ -5,25 +5,32 @@ module FlowcommerceSpree
|
|
5
5
|
class Session
|
6
6
|
attr_accessor :session, :localized, :visitor
|
7
7
|
|
8
|
-
def
|
9
|
-
|
8
|
+
def self.create(country:, visitor:, experience: nil)
|
9
|
+
instance = new(country: country, visitor: visitor, experience: experience)
|
10
|
+
instance.create
|
11
|
+
instance
|
12
|
+
end
|
10
13
|
|
11
|
-
|
14
|
+
def initialize(country:, visitor:, experience: nil)
|
15
|
+
@country = country
|
12
16
|
@visitor = visitor
|
17
|
+
@experience = experience
|
13
18
|
end
|
14
19
|
|
15
|
-
# create session with
|
20
|
+
# create session without or with experience (the latter is useful for creating a new session with the order's
|
21
|
+
# experience on refreshing the checkout_token)
|
16
22
|
def create
|
17
|
-
data = {
|
23
|
+
data = { country: @country,
|
18
24
|
visit: { id: @visitor,
|
19
25
|
expires_at: (Time.now + 30.minutes).iso8601 } }
|
26
|
+
data[:experience] = @experience if @experience
|
20
27
|
|
21
28
|
session_model = ::Io::Flow::V0::Models::SessionForm.new data
|
22
29
|
@session = FlowCommerce.instance(http_handler: LoggingHttpHandler.new)
|
23
30
|
.sessions.post_organizations_by_organization(ORGANIZATION, session_model)
|
24
31
|
end
|
25
32
|
|
26
|
-
# if we want to
|
33
|
+
# if we want to manually switch to specific country or experience
|
27
34
|
def update(data)
|
28
35
|
@session = FlowCommerce.instance.sessions.put_by_session(@session.id,
|
29
36
|
::Io::Flow::V0::Models::SessionPutForm.new(data))
|
@@ -34,6 +41,10 @@ module FlowcommerceSpree
|
|
34
41
|
@session.local&.experience
|
35
42
|
end
|
36
43
|
|
44
|
+
def expires_at
|
45
|
+
@session.visit.expires_at
|
46
|
+
end
|
47
|
+
|
37
48
|
def local
|
38
49
|
@session.local
|
39
50
|
end
|
@@ -41,31 +52,5 @@ module FlowcommerceSpree
|
|
41
52
|
def id
|
42
53
|
@session.id
|
43
54
|
end
|
44
|
-
|
45
|
-
def localized?
|
46
|
-
# use flow if we are not in default country
|
47
|
-
return false unless local
|
48
|
-
return false if @localized.class == FalseClass
|
49
|
-
|
50
|
-
local.country.iso_3166_3 != ENV.fetch('FLOW_BASE_COUNTRY').upcase
|
51
|
-
end
|
52
|
-
|
53
|
-
# because we do not get full experience from session, we have to get from exp list
|
54
|
-
def delivered_duty_options
|
55
|
-
return nil unless experience
|
56
|
-
|
57
|
-
return unless (flow_experience = Flow::Experience.get(experience.key))
|
58
|
-
|
59
|
-
Hashie::Mash.new(flow_experience.settings.delivered_duty.to_hash)
|
60
|
-
end
|
61
|
-
|
62
|
-
# if we have more than one choice, we show choice popup
|
63
|
-
def offers_delivered_duty_choice?
|
64
|
-
if (options = delivered_duty_options)
|
65
|
-
options.available.length > 1
|
66
|
-
else
|
67
|
-
false
|
68
|
-
end
|
69
|
-
end
|
70
55
|
end
|
71
56
|
end
|
@@ -47,8 +47,11 @@ namespace :flowcommerce_spree do
|
|
47
47
|
|
48
48
|
while current_page == 0 || !variants.empty?
|
49
49
|
current_page += 1
|
50
|
-
variants = Spree::Variant.order('updated_at desc').page(current_page).per(100).all
|
51
50
|
|
51
|
+
products = Spree::Product.where.not(country_of_origin: nil)
|
52
|
+
.order('updated_at desc')
|
53
|
+
.page(current_page).per(50).includes(:variants_including_master)
|
54
|
+
variants = products.map(&:variants_including_master).flatten
|
52
55
|
variants.each do |variant|
|
53
56
|
total_sum += 1
|
54
57
|
result = variant.sync_product_to_flow
|
metadata
CHANGED
@@ -1,16 +1,44 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flowcommerce_spree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aurel Branzeanu
|
8
8
|
- Sebastian De Luca
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-04-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: active_model_serializers
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.10.2
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.10.2
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: activerecord-postgres-json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 0.2.3
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 0.2.3
|
14
42
|
- !ruby/object:Gem::Dependency
|
15
43
|
name: colorize
|
16
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -77,16 +105,16 @@ dependencies:
|
|
77
105
|
name: oj
|
78
106
|
requirement: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- -
|
108
|
+
- - '='
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
110
|
+
version: 3.7.12
|
83
111
|
type: :runtime
|
84
112
|
prerelease: false
|
85
113
|
version_requirements: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- -
|
115
|
+
- - '='
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
117
|
+
version: 3.7.12
|
90
118
|
- !ruby/object:Gem::Dependency
|
91
119
|
name: pg
|
92
120
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,6 +143,20 @@ dependencies:
|
|
115
143
|
- - "~>"
|
116
144
|
- !ruby/object:Gem::Version
|
117
145
|
version: 2.3.0
|
146
|
+
- !ruby/object:Gem::Dependency
|
147
|
+
name: factory_bot_rails
|
148
|
+
requirement: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '4.0'
|
153
|
+
type: :development
|
154
|
+
prerelease: false
|
155
|
+
version_requirements: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '4.0'
|
118
160
|
- !ruby/object:Gem::Dependency
|
119
161
|
name: github_changelog_generator
|
120
162
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,6 +171,20 @@ dependencies:
|
|
129
171
|
- - ">="
|
130
172
|
- !ruby/object:Gem::Version
|
131
173
|
version: '0'
|
174
|
+
- !ruby/object:Gem::Dependency
|
175
|
+
name: rspec-rails
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3.5'
|
181
|
+
type: :development
|
182
|
+
prerelease: false
|
183
|
+
version_requirements: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '3.5'
|
132
188
|
description: Integration of popular Rails/Spree store framework with e-commerce Flow
|
133
189
|
API
|
134
190
|
email:
|
@@ -145,42 +201,54 @@ files:
|
|
145
201
|
- app/assets/javascripts/flowcommerce_spree/application.js
|
146
202
|
- app/assets/stylesheets/flowcommerce_spree/application.css
|
147
203
|
- app/controllers/concerns/current_zone_loader_decorator.rb
|
204
|
+
- app/controllers/flowcommerce_spree/inventory_controller.rb
|
205
|
+
- app/controllers/flowcommerce_spree/orders_controller.rb
|
148
206
|
- app/controllers/flowcommerce_spree/webhooks_controller.rb
|
207
|
+
- app/controllers/users/sessions_controller_decorator.rb
|
149
208
|
- app/helpers/flowcommerce_spree/application_helper.rb
|
150
209
|
- app/helpers/spree/admin/orders_helper_decorator.rb
|
151
210
|
- app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb
|
152
|
-
- app/mailers/spree/spree_order_mailer_decorator.rb
|
153
211
|
- app/models/flowcommerce_spree/settings.rb
|
154
|
-
- app/models/spree/
|
212
|
+
- app/models/spree/address_decorator.rb
|
213
|
+
- app/models/spree/calculator/flow_io.rb
|
214
|
+
- app/models/spree/calculator/shipping/flow_io.rb
|
215
|
+
- app/models/spree/flow_io_credit_card_decorator.rb
|
216
|
+
- app/models/spree/flow_io_order_decorator.rb
|
155
217
|
- app/models/spree/flow_io_product_decorator.rb
|
156
218
|
- app/models/spree/flow_io_variant_decorator.rb
|
157
|
-
- app/models/spree/gateway/
|
158
|
-
- app/models/spree/
|
159
|
-
- app/models/spree/order_decorator.rb
|
219
|
+
- app/models/spree/gateway/flow_io.rb
|
220
|
+
- app/models/spree/payment_capture_event_decorator.rb
|
160
221
|
- app/models/spree/promotion_decorator.rb
|
161
222
|
- app/models/spree/promotion_handler/coupon_decorator.rb
|
162
223
|
- app/models/spree/spree_user_decorator.rb
|
163
224
|
- app/models/spree/taxon_decorator.rb
|
164
225
|
- app/models/spree/zone_decorator.rb
|
165
226
|
- app/models/spree/zones/flow_io_product_zone_decorator.rb
|
227
|
+
- app/models/tracking/setup_decorator.rb
|
228
|
+
- app/overrides/spree/admin/order_sidebar_summary_flow_link.rb
|
229
|
+
- app/overrides/spree/admin/products/order_price_flow_message.rb
|
230
|
+
- app/serializers/api/v2/order_serializer_decorator.rb
|
166
231
|
- app/services/flowcommerce_spree/import_experience_items.rb
|
167
232
|
- app/services/flowcommerce_spree/import_experiences.rb
|
168
233
|
- app/services/flowcommerce_spree/order_sync.rb
|
234
|
+
- app/services/flowcommerce_spree/order_updater.rb
|
235
|
+
- app/services/flowcommerce_spree/webhooks/capture_upserted_v2.rb
|
236
|
+
- app/services/flowcommerce_spree/webhooks/card_authorization_upserted_v2.rb
|
237
|
+
- app/services/flowcommerce_spree/webhooks/experience_upserted_v2.rb
|
238
|
+
- app/services/flowcommerce_spree/webhooks/fraud_status_changed.rb
|
239
|
+
- app/services/flowcommerce_spree/webhooks/local_item_upserted.rb
|
169
240
|
- app/views/layouts/flowcommerce_spree/application.html.erb
|
170
241
|
- app/views/spree/admin/payments/index.html.erb
|
242
|
+
- app/views/spree/admin/payments/source_views/_flow_io_gateway.html.erb
|
171
243
|
- app/views/spree/admin/promotions/edit.html.erb
|
172
244
|
- app/views/spree/admin/shared/_order_summary.html.erb
|
173
245
|
- app/views/spree/admin/shared/_order_summary_flow.html.erb
|
174
|
-
-
|
175
|
-
- app/views/spree/order_mailer/confirm_email.text.erb
|
176
|
-
- config/initializers/flowcommerce_spree.rb
|
246
|
+
- config/rails_best_practices.yml
|
177
247
|
- config/routes.rb
|
178
248
|
- db/migrate/20201021160159_add_type_and_meta_to_spree_zone.rb
|
179
249
|
- db/migrate/20201021755957_add_meta_to_spree_tables.rb
|
180
250
|
- db/migrate/20201022173210_add_zone_type_to_spree_zone_members.rb
|
181
251
|
- db/migrate/20201022174252_add_kind_to_zone.rb
|
182
|
-
- lib/flow/error.rb
|
183
|
-
- lib/flow/pay_pal.rb
|
184
252
|
- lib/flow/simple_gateway.rb
|
185
253
|
- lib/flowcommerce_spree.rb
|
186
254
|
- lib/flowcommerce_spree/api.rb
|
@@ -190,15 +258,14 @@ files:
|
|
190
258
|
- lib/flowcommerce_spree/logging_http_handler.rb
|
191
259
|
- lib/flowcommerce_spree/refresher.rb
|
192
260
|
- lib/flowcommerce_spree/session.rb
|
261
|
+
- lib/flowcommerce_spree/test_support.rb
|
193
262
|
- lib/flowcommerce_spree/version.rb
|
194
|
-
- lib/flowcommerce_spree/webhook_service.rb
|
195
|
-
- lib/simple_csv_writer.rb
|
196
263
|
- lib/tasks/flowcommerce_spree.rake
|
197
264
|
homepage: https://github.com/mejuri-inc/flowcommerce_spree
|
198
265
|
licenses:
|
199
266
|
- MIT
|
200
267
|
metadata: {}
|
201
|
-
post_install_message:
|
268
|
+
post_install_message:
|
202
269
|
rdoc_options: []
|
203
270
|
require_paths:
|
204
271
|
- lib
|
@@ -214,7 +281,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
281
|
version: '0'
|
215
282
|
requirements: []
|
216
283
|
rubygems_version: 3.0.8
|
217
|
-
signing_key:
|
284
|
+
signing_key:
|
218
285
|
specification_version: 4
|
219
286
|
summary: Integration of Spree with Flow API
|
220
287
|
test_files: []
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Spree
|
4
|
-
OrderMailer.class_eval do
|
5
|
-
# default from: ApplicationMailer::DEFAULT_FROM
|
6
|
-
|
7
|
-
def refund_complete_email(web_hook_event)
|
8
|
-
auth_id = web_hook_event.dig('refund', 'authorization', 'key')
|
9
|
-
|
10
|
-
raise Flow::Error, 'authorization key not found in WebHookEvent [refund_capture_upserted_v2]' unless auth_id
|
11
|
-
|
12
|
-
authorization = FlowcommerceSpree.client.authorizations.get_by_key FlowcommerceSpree::ORGANIZATION, auth_id
|
13
|
-
|
14
|
-
refund_requested = web_hook_event['refund']['requested']
|
15
|
-
@mail_to = authorization.customer.email
|
16
|
-
@full_name = "#{authorization.customer.name.first} #{authorization.customer.name.last}"
|
17
|
-
@amount = "#{refund_requested['amount']} #{refund_requested['currency']}"
|
18
|
-
@number = authorization.order.number
|
19
|
-
@order = Spree::Order.find_by number: @number
|
20
|
-
|
21
|
-
mail(to: @mail_to, subject: "We refunded your order for ammount #{@amount}")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,116 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Flow.io (2017)
|
4
|
-
# adapter for Spree that talks to activemerchant_flow
|
5
|
-
module Spree
|
6
|
-
class Gateway
|
7
|
-
class Flow < Gateway
|
8
|
-
def provider_class
|
9
|
-
self.class
|
10
|
-
end
|
11
|
-
|
12
|
-
def actions
|
13
|
-
%w[capture authorize purchase refund void]
|
14
|
-
end
|
15
|
-
|
16
|
-
# if user wants to force auto capture
|
17
|
-
def auto_capture?
|
18
|
-
false
|
19
|
-
end
|
20
|
-
|
21
|
-
def payment_profiles_supported?
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
def method_type
|
26
|
-
'gateway'
|
27
|
-
end
|
28
|
-
|
29
|
-
def preferences
|
30
|
-
{}
|
31
|
-
end
|
32
|
-
|
33
|
-
def supports?(source)
|
34
|
-
# flow supports credit cards
|
35
|
-
source.class == Spree::CreditCard
|
36
|
-
end
|
37
|
-
|
38
|
-
def authorize(_amount, _payment_method, options = {})
|
39
|
-
order = load_order options
|
40
|
-
order.cc_authorization
|
41
|
-
end
|
42
|
-
|
43
|
-
def capture(_amount, _payment_method, options = {})
|
44
|
-
order = load_order options
|
45
|
-
order.cc_capture
|
46
|
-
end
|
47
|
-
|
48
|
-
def purchase(_amount, _payment_method, options = {})
|
49
|
-
order = load_order options
|
50
|
-
flow_auth = order.cc_authorization
|
51
|
-
|
52
|
-
if flow_auth.success?
|
53
|
-
order.cc_capture
|
54
|
-
else
|
55
|
-
flow_auth
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def refund(_money, _authorization_key, options = {})
|
60
|
-
order = load_order options
|
61
|
-
order.cc_refund
|
62
|
-
end
|
63
|
-
|
64
|
-
def void(money, authorization_key, options = {})
|
65
|
-
# binding.pry
|
66
|
-
end
|
67
|
-
|
68
|
-
def create_profile(payment)
|
69
|
-
# binding.pry
|
70
|
-
|
71
|
-
# payment.order.state
|
72
|
-
@credit_card = payment.source
|
73
|
-
|
74
|
-
profile_ensure_payment_method_is_present!
|
75
|
-
create_flow_cc_profile!
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
# hard inject Flow as payment method unless defined
|
81
|
-
def profile_ensure_payment_method_is_present!
|
82
|
-
return if @credit_card.payment_method_id
|
83
|
-
|
84
|
-
flow_payment = Spree::PaymentMethod.where(active: true, type: 'Spree::Gateway::Flow').first
|
85
|
-
@credit_card.payment_method_id = flow_payment.id if flow_payment
|
86
|
-
end
|
87
|
-
|
88
|
-
# create payment profile with Flow and tokenize Credit Card
|
89
|
-
def create_flow_cc_profile!
|
90
|
-
return if @credit_card.gateway_customer_profile_id
|
91
|
-
return unless @credit_card.verification_value
|
92
|
-
|
93
|
-
# build credit card hash
|
94
|
-
data = {}
|
95
|
-
data[:number] = @credit_card.number
|
96
|
-
data[:name] = @credit_card.name
|
97
|
-
data[:cvv] = @credit_card.verification_value
|
98
|
-
data[:expiration_year] = @credit_card.year.to_i
|
99
|
-
data[:expiration_month] = @credit_card.month.to_i
|
100
|
-
|
101
|
-
# tokenize with Flow
|
102
|
-
# rescue Io::Flow::V0::HttpClient::ServerError
|
103
|
-
card_form = ::Io::Flow::V0::Models::CardForm.new(data)
|
104
|
-
result = FlowcommerceSpree.client.cards.post(::FlowcommerceSpree::ORGANIZATION, card_form)
|
105
|
-
|
106
|
-
@credit_card.update_column :gateway_customer_profile_id, result.token
|
107
|
-
end
|
108
|
-
|
109
|
-
def load_order(options)
|
110
|
-
order_number = options[:order_id].split('-').first
|
111
|
-
spree_order = Spree::Order.find_by number: order_number
|
112
|
-
::Flow::SimpleGateway.new spree_order
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|