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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +46 -13
  3. data/SPREE_FLOW.md +6 -28
  4. data/app/controllers/concerns/current_zone_loader_decorator.rb +33 -25
  5. data/app/controllers/flowcommerce_spree/inventory_controller.rb +23 -0
  6. data/app/controllers/flowcommerce_spree/orders_controller.rb +20 -0
  7. data/app/controllers/flowcommerce_spree/webhooks_controller.rb +23 -13
  8. data/app/controllers/users/sessions_controller_decorator.rb +28 -0
  9. data/app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb +4 -9
  10. data/app/models/spree/address_decorator.rb +19 -0
  11. data/app/models/spree/calculator/flow_io.rb +61 -0
  12. data/app/models/spree/calculator/shipping/flow_io.rb +40 -0
  13. data/app/models/spree/flow_io_credit_card_decorator.rb +21 -0
  14. data/app/models/spree/flow_io_order_decorator.rb +163 -0
  15. data/app/models/spree/flow_io_variant_decorator.rb +4 -2
  16. data/app/models/spree/gateway/flow_io.rb +153 -0
  17. data/app/models/spree/{credit_card_decorator.rb → payment_capture_event_decorator.rb} +1 -1
  18. data/app/models/spree/promotion_handler/coupon_decorator.rb +1 -1
  19. data/app/models/spree/zones/flow_io_product_zone_decorator.rb +8 -0
  20. data/app/models/tracking/setup_decorator.rb +40 -0
  21. data/app/overrides/spree/admin/order_sidebar_summary_flow_link.rb +13 -0
  22. data/app/overrides/spree/admin/products/order_price_flow_message.rb +9 -0
  23. data/app/serializers/api/v2/order_serializer_decorator.rb +20 -0
  24. data/app/services/flowcommerce_spree/import_experience_items.rb +1 -1
  25. data/app/services/flowcommerce_spree/order_sync.rb +81 -173
  26. data/app/services/flowcommerce_spree/order_updater.rb +78 -0
  27. data/app/services/flowcommerce_spree/webhooks/capture_upserted_v2.rb +76 -0
  28. data/app/services/flowcommerce_spree/webhooks/card_authorization_upserted_v2.rb +66 -0
  29. data/app/services/flowcommerce_spree/webhooks/experience_upserted_v2.rb +25 -0
  30. data/app/services/flowcommerce_spree/webhooks/fraud_status_changed.rb +35 -0
  31. data/app/services/flowcommerce_spree/webhooks/local_item_upserted.rb +40 -0
  32. data/app/views/spree/admin/payments/source_views/_flow_io_gateway.html.erb +21 -0
  33. data/config/rails_best_practices.yml +51 -0
  34. data/config/routes.rb +3 -1
  35. data/db/migrate/20201021755957_add_meta_to_spree_tables.rb +6 -4
  36. data/lib/flow/simple_gateway.rb +0 -36
  37. data/lib/flowcommerce_spree.rb +17 -3
  38. data/lib/flowcommerce_spree/engine.rb +33 -3
  39. data/lib/flowcommerce_spree/experience_service.rb +1 -27
  40. data/lib/flowcommerce_spree/logging_http_client.rb +33 -15
  41. data/lib/flowcommerce_spree/session.rb +17 -32
  42. data/lib/flowcommerce_spree/test_support.rb +7 -0
  43. data/lib/flowcommerce_spree/version.rb +1 -1
  44. data/lib/tasks/flowcommerce_spree.rake +4 -1
  45. metadata +88 -21
  46. data/app/mailers/spree/spree_order_mailer_decorator.rb +0 -24
  47. data/app/models/spree/gateway/spree_flow_gateway.rb +0 -116
  48. data/app/models/spree/line_item_decorator.rb +0 -15
  49. data/app/models/spree/order_decorator.rb +0 -179
  50. data/app/views/spree/order_mailer/confirm_email.html.erb +0 -86
  51. data/app/views/spree/order_mailer/confirm_email.text.erb +0 -38
  52. data/config/initializers/flowcommerce_spree.rb +0 -7
  53. data/lib/flow/error.rb +0 -73
  54. data/lib/flow/pay_pal.rb +0 -25
  55. data/lib/flowcommerce_spree/webhook_service.rb +0 -98
  56. 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
- @logger.info "start #{request.method} #{request.path}"
18
- @logger.info "body: #{request.instance_variable_get(:@header)}"
19
- @logger.info "body: #{request.body}"
20
-
21
- if request.path.start_with?('/organizations')
22
- # Contrived example to show how client settings can be adjusted
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 }.to_json
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
- end_time = Time.now.utc.round(10)
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 initialize(ip:, visitor:)
9
- ip = '127.0.0.1' if ip == '::1'
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
- @ip = ip
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 blank data
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 = { ip: @ip,
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 manualy switch to specific country or experience
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
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FlowcommerceSpree
4
+ module TestSupport
5
+ FACTORY_PATH = File.expand_path('../../spec/factories/flow_io', __dir__)
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FlowcommerceSpree
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.7'
5
5
  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.2
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-02-18 00:00:00.000000000 Z
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: '0'
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: '0'
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/credit_card_decorator.rb
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/spree_flow_gateway.rb
158
- - app/models/spree/line_item_decorator.rb
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
- - app/views/spree/order_mailer/confirm_email.html.erb
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