flowcommerce_spree 0.0.2 → 0.0.3
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 +13 -9
- data/SPREE_FLOW.md +6 -28
- data/app/controllers/concerns/current_zone_loader_decorator.rb +37 -23
- data/app/controllers/flowcommerce_spree/webhooks_controller.rb +15 -3
- data/app/controllers/users/sessions_controller_decorator.rb +11 -0
- data/app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb +19 -8
- 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 +37 -0
- data/app/models/spree/flow_io_variant_decorator.rb +2 -2
- data/app/models/spree/gateway/{spree_flow_gateway.rb → flow_io.rb} +2 -2
- data/app/models/spree/order_decorator.rb +75 -10
- data/app/models/spree/promotion_handler/coupon_decorator.rb +1 -1
- data/app/models/spree/zones/flow_io_product_zone_decorator.rb +4 -0
- data/app/models/tracking/setup_decorator.rb +40 -0
- data/app/services/flowcommerce_spree/order_sync.rb +137 -57
- data/config/rails_best_practices.yml +51 -0
- data/lib/flowcommerce_spree.rb +12 -2
- data/lib/flowcommerce_spree/engine.rb +28 -3
- data/lib/flowcommerce_spree/logging_http_client.rb +11 -9
- data/lib/flowcommerce_spree/session.rb +16 -11
- data/lib/flowcommerce_spree/test_support.rb +7 -0
- data/lib/flowcommerce_spree/version.rb +1 -1
- data/lib/flowcommerce_spree/webhook_service.rb +126 -40
- metadata +24 -4
- data/config/initializers/flowcommerce_spree.rb +0 -7
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
Coupon.class_eval do
|
6
6
|
def apply
|
7
7
|
if order.coupon_code.present?
|
8
|
-
if promotion&.actions
|
8
|
+
if promotion&.actions&.exists?
|
9
9
|
experience_key = order.flow_order&.dig('experience', 'key')
|
10
10
|
forbiden_keys = promotion.flow_data&.dig('filter', 'experience') || []
|
11
11
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tracking
|
4
|
+
Setup.module_eval do
|
5
|
+
private
|
6
|
+
|
7
|
+
def setup_tracking
|
8
|
+
return if request.path.start_with?(ADMIN_PATH)
|
9
|
+
|
10
|
+
user_consents = UserConsent.new(cookies)
|
11
|
+
setup_visitor_cookie(user_consents)
|
12
|
+
store_order_flow_io_attributes(user_consents) if current_order&.zone&.flow_io_active_experience?
|
13
|
+
end
|
14
|
+
|
15
|
+
def store_order_flow_io_attributes(user_consents)
|
16
|
+
# Using `save!` and not `update_column` for callbacks to work and sync the order to flow.io
|
17
|
+
current_order.save!(validate: false) if order_user_consents_updated?(user_consents) || user_uuid_updated?
|
18
|
+
end
|
19
|
+
|
20
|
+
def order_user_consents_updated?(user_consents)
|
21
|
+
consents_changed = nil
|
22
|
+
user_consents.active_groups.each do |consent_group|
|
23
|
+
group_value = consent_group[1][:value]
|
24
|
+
gdpr_group_name = "gdpr_#{consent_group[1][:name]}"
|
25
|
+
next if current_order.flow_io_attributes[gdpr_group_name] == group_value
|
26
|
+
|
27
|
+
consents_changed ||= true
|
28
|
+
current_order.flow_io_attribute_add(gdpr_group_name, group_value)
|
29
|
+
end
|
30
|
+
|
31
|
+
consents_changed
|
32
|
+
end
|
33
|
+
|
34
|
+
def user_uuid_updated?
|
35
|
+
return if current_order.flow_io_attr_user_uuid.present?
|
36
|
+
|
37
|
+
current_order.add_user_uuid_to_flow_data
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -5,20 +5,23 @@ module FlowcommerceSpree
|
|
5
5
|
# for easy integration we are currently passing:
|
6
6
|
# - flow experience
|
7
7
|
# - spree order
|
8
|
-
# - current customer, present as @
|
8
|
+
# - current customer, if present as @order.user
|
9
9
|
#
|
10
10
|
# example:
|
11
11
|
# flow_order = FlowcommerceSpree::OrderSync.new # init flow-order object
|
12
12
|
# order: Spree::Order.last,
|
13
13
|
# experience: @flow_session.experience
|
14
|
-
# customer:
|
14
|
+
# customer: @order.user
|
15
15
|
# flow_order.build_flow_request # builds json body to be posted to flow.io api
|
16
16
|
# flow_order.synchronize! # sends order to flow
|
17
|
-
class OrderSync
|
17
|
+
class OrderSync # rubocop:disable Metrics/ClassLength
|
18
18
|
FLOW_CENTER = 'default'
|
19
|
+
SESSION_EXPIRATION_THRESHOLD = 10 # Refresh session if less than 10 seconds to session expiration remains
|
19
20
|
|
20
21
|
attr_reader :digest, :order, :response
|
21
22
|
|
23
|
+
delegate :url_helpers, to: 'Rails.application.routes'
|
24
|
+
|
22
25
|
class << self
|
23
26
|
def clear_cache(order)
|
24
27
|
return unless order.flow_data['order']
|
@@ -31,11 +34,9 @@ module FlowcommerceSpree
|
|
31
34
|
def initialize(order:)
|
32
35
|
raise(ArgumentError, 'Experience not defined or not active') unless order.zone&.flow_io_active_experience?
|
33
36
|
|
34
|
-
@client = FlowcommerceSpree.client(session_id: order.flow_data['session_id'])
|
35
37
|
@experience = order.flow_io_experience_key
|
36
|
-
@order
|
37
|
-
@
|
38
|
-
@items = []
|
38
|
+
@order = order
|
39
|
+
@client = FlowcommerceSpree.client(session_id: fetch_session_id)
|
39
40
|
end
|
40
41
|
|
41
42
|
# helper method to send complete order from Spree to flow.io
|
@@ -43,6 +44,12 @@ module FlowcommerceSpree
|
|
43
44
|
sync_body!
|
44
45
|
check_state!
|
45
46
|
write_response_in_cache
|
47
|
+
|
48
|
+
# This is for 1st order syncing, when no checkout_token has been fetched yet. In all the subsequent syncs,
|
49
|
+
# the checkout_token is fetched in the `fetch_session_id` method, calling the refresh_checkout_token method when
|
50
|
+
# necessary.
|
51
|
+
refresh_checkout_token if @order.flow_io_checkout_token.blank?
|
52
|
+
@order.update_column(:meta, @order.meta.to_json)
|
46
53
|
@response
|
47
54
|
end
|
48
55
|
|
@@ -64,13 +71,12 @@ module FlowcommerceSpree
|
|
64
71
|
|
65
72
|
# delivery methods are defined in flow console
|
66
73
|
def deliveries
|
67
|
-
# if we have
|
74
|
+
# if we have error with an order, but still using this method
|
68
75
|
return [] unless @order.flow_order
|
69
76
|
|
70
77
|
@order.flow_data ||= {}
|
71
78
|
|
72
|
-
delivery_list = @order.flow_order['deliveries'][0]['options']
|
73
|
-
delivery_list = delivery_list.map do |opts|
|
79
|
+
delivery_list = @order.flow_order['deliveries'][0]['options'].map do |opts|
|
74
80
|
name = opts['tier']['name']
|
75
81
|
|
76
82
|
# add original Flow ID
|
@@ -101,15 +107,10 @@ module FlowcommerceSpree
|
|
101
107
|
|
102
108
|
# builds object that can be sent to api.flow.io to sync order data
|
103
109
|
def build_flow_request
|
104
|
-
@
|
105
|
-
|
106
|
-
@opts = {}
|
107
|
-
@opts[:experience] = @experience
|
108
|
-
@opts[:expand] = ['experience']
|
110
|
+
@opts = { experience: @experience, expand: ['experience'] }
|
111
|
+
@body = { items: @order.line_items.map { |line_item| add_item(line_item) } }
|
109
112
|
|
110
|
-
|
111
|
-
|
112
|
-
add_customer if @customer
|
113
|
+
try_to_add_customer
|
113
114
|
|
114
115
|
if (flow_data = @order.flow_data['order'])
|
115
116
|
@body[:selections] = flow_data['selections'].presence
|
@@ -128,35 +129,118 @@ module FlowcommerceSpree
|
|
128
129
|
|
129
130
|
private
|
130
131
|
|
132
|
+
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
133
|
+
def fetch_session_id
|
134
|
+
session = RequestStore.store[:session]
|
135
|
+
current_session_id = session&.[]('_f60_session')
|
136
|
+
session_expire_at = session&.[]('_f60_expires_at')&.to_datetime
|
137
|
+
session_expired = flow_io_session_expired?(session_expire_at.to_i)
|
138
|
+
order_flow_session_id = @order.flow_data['session_id']
|
139
|
+
order_session_expire_at = @order.flow_io_session_expires_at
|
140
|
+
order_session_expired = flow_io_session_expired?(order_session_expire_at.to_i)
|
141
|
+
|
142
|
+
if order_flow_session_id == current_session_id && session_expire_at == order_session_expire_at &&
|
143
|
+
@order.flow_io_checkout_token.present? && session_expired == false
|
144
|
+
return current_session_id
|
145
|
+
elsif current_session_id && session_expire_at && session_expired == false
|
146
|
+
# If request flow_session is not expired, don't refresh the flow_session (i.e., don't mark the refresh_session
|
147
|
+
# lvar as true), just store the flow_session data into the order, if it is new, and refresh the checkout_token
|
148
|
+
refresh_session = nil
|
149
|
+
elsif order_flow_session_id && order_session_expire_at && order_session_expired == false && session_expired.nil?
|
150
|
+
refresh_checkout_token if @order.flow_io_order_id && @order.flow_io_checkout_token.blank?
|
151
|
+
return order_flow_session_id
|
152
|
+
else
|
153
|
+
refresh_session = true
|
154
|
+
end
|
155
|
+
|
156
|
+
if refresh_session
|
157
|
+
flow_io_session = Session.new(
|
158
|
+
ip: '127.0.0.1',
|
159
|
+
visitor: "session-#{Digest::SHA1.hexdigest(@order.guest_token)}",
|
160
|
+
experience: @experience
|
161
|
+
)
|
162
|
+
flow_io_session.create
|
163
|
+
current_session_id = flow_io_session.id
|
164
|
+
session_expire_at = flow_io_session.expires_at.to_s
|
165
|
+
end
|
166
|
+
|
167
|
+
@order.flow_data['session_id'] = current_session_id
|
168
|
+
@order.flow_data['session_expires_at'] = session_expire_at
|
169
|
+
|
170
|
+
if session.respond_to?(:[])
|
171
|
+
session['_f60_session'] = current_session_id
|
172
|
+
session['_f60_expires_at'] = session_expire_at
|
173
|
+
end
|
174
|
+
|
175
|
+
# On the 1st OrderSync at this moment the order is not yet created at flow.io, so we couldn't yet retrieve the
|
176
|
+
# checkout_token. This is done after the order will be synced, in the `synchronize!` method.
|
177
|
+
refresh_checkout_token if @order.flow_io_order_id
|
178
|
+
|
179
|
+
current_session_id
|
180
|
+
end
|
181
|
+
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
182
|
+
|
183
|
+
def flow_io_session_expired?(expiration_time)
|
184
|
+
return nil if expiration_time == 0
|
185
|
+
|
186
|
+
expiration_time - Time.zone.now.utc.to_i < SESSION_EXPIRATION_THRESHOLD
|
187
|
+
end
|
188
|
+
|
189
|
+
def refresh_checkout_token
|
190
|
+
root_url = url_helpers.root_url
|
191
|
+
order_number = @order.number
|
192
|
+
confirmation_url = "#{root_url}thankyou?order=#{order_number}&t=#{@order.guest_token}"
|
193
|
+
checkout_token = FlowcommerceSpree.client.checkout_tokens.post_checkout_and_tokens_by_organization(
|
194
|
+
FlowcommerceSpree::ORGANIZATION,
|
195
|
+
discriminator: 'checkout_token_reference_form',
|
196
|
+
order_number: order_number,
|
197
|
+
session_id: @order.flow_data['session_id'],
|
198
|
+
urls: { continue_shopping: root_url,
|
199
|
+
confirmation: confirmation_url,
|
200
|
+
invalid_checkout: root_url }
|
201
|
+
)
|
202
|
+
@order.add_flow_checkout_token(checkout_token.id)
|
203
|
+
|
204
|
+
@order.flow_io_attribute_add('flow_return_url', confirmation_url)
|
205
|
+
@order.flow_io_attribute_add('checkout_continue_shopping_url', root_url)
|
206
|
+
end
|
207
|
+
|
131
208
|
# if customer is defined, add customer info
|
132
209
|
# it is possible to have order in Spree without customer info (new guest session)
|
133
|
-
def
|
134
|
-
return unless @
|
135
|
-
|
136
|
-
address =
|
137
|
-
|
138
|
-
if
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
phone: address.phone }
|
144
|
-
|
145
|
-
streets = []
|
146
|
-
streets.push address.address1 unless address.address1.blank?
|
147
|
-
streets.push address.address2 unless address.address2.blank?
|
148
|
-
|
149
|
-
@body[:destination] = { streets: streets,
|
150
|
-
city: address.city,
|
151
|
-
province: address.state_name,
|
152
|
-
postal: address.zipcode,
|
153
|
-
country: (address.country.iso3 || 'USA'),
|
154
|
-
contact: @body[:customer] }
|
155
|
-
|
156
|
-
@body[:destination].delete_if { |_k, v| v.nil? }
|
210
|
+
def try_to_add_customer
|
211
|
+
return unless (customer = @order.user)
|
212
|
+
|
213
|
+
address = nil
|
214
|
+
customer_ship_address = customer.ship_address
|
215
|
+
address = customer_ship_address if customer_ship_address&.country&.iso3 == @order.zone.flow_io_experience_country
|
216
|
+
|
217
|
+
unless address
|
218
|
+
user_profile_address = customer.user_profile&.address
|
219
|
+
address = user_profile_address if user_profile_address&.country&.iso3 == @order.zone.flow_io_experience_country
|
157
220
|
end
|
158
221
|
|
159
|
-
@body
|
222
|
+
@body[:customer] = { name: { first: address&.firstname,
|
223
|
+
last: address&.lastname },
|
224
|
+
email: customer.email,
|
225
|
+
number: customer.flow_number,
|
226
|
+
phone: address&.phone }
|
227
|
+
|
228
|
+
add_customer_address(address) if address
|
229
|
+
end
|
230
|
+
|
231
|
+
def add_customer_address(address)
|
232
|
+
streets = []
|
233
|
+
streets.push address.address1 if address&.address1.present?
|
234
|
+
streets.push address.address2 if address&.address2.present?
|
235
|
+
|
236
|
+
@body[:destination] = { streets: streets,
|
237
|
+
city: address&.city,
|
238
|
+
province: address&.state_name,
|
239
|
+
postal: address&.zipcode,
|
240
|
+
country: (address&.country&.iso3 || ''),
|
241
|
+
contact: @body[:customer] }
|
242
|
+
|
243
|
+
@body[:destination].delete_if { |_k, v| v.nil? }
|
160
244
|
end
|
161
245
|
|
162
246
|
def sync_body!
|
@@ -165,7 +249,7 @@ module FlowcommerceSpree
|
|
165
249
|
@use_get = false
|
166
250
|
|
167
251
|
# use get if order is completed and closed
|
168
|
-
@use_get = true if @order.state == 'complete'
|
252
|
+
@use_get = true if @order.flow_data.dig('order', 'submitted_at').present? || @order.state == 'complete'
|
169
253
|
|
170
254
|
# use get if local digest hash check said there is no change
|
171
255
|
@use_get ||= true if @order.flow_data['digest'] == @digest
|
@@ -174,9 +258,9 @@ module FlowcommerceSpree
|
|
174
258
|
@use_get = false unless @order.flow_data['order']
|
175
259
|
|
176
260
|
if @use_get
|
177
|
-
@response ||=
|
261
|
+
@response ||= @client.orders.get_by_number(ORGANIZATION, @order.number).to_hash
|
178
262
|
else
|
179
|
-
@response = @client.orders.put_by_number(
|
263
|
+
@response = @client.orders.put_by_number(ORGANIZATION, @order.number,
|
180
264
|
Io::Flow::V0::Models::OrderPutForm.new(@body), @opts).to_hash
|
181
265
|
end
|
182
266
|
end
|
@@ -199,16 +283,14 @@ module FlowcommerceSpree
|
|
199
283
|
price_root = variant.flow_data&.dig('exp', @experience, 'prices')&.[](0) || {}
|
200
284
|
|
201
285
|
# create flow order line item
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
@items.push item
|
286
|
+
{ center: FLOW_CENTER,
|
287
|
+
number: variant.sku,
|
288
|
+
quantity: line_item.quantity,
|
289
|
+
price: { amount: price_root['amount'] || variant.cost_price,
|
290
|
+
currency: price_root['currency'] || variant.cost_currency } }
|
209
291
|
end
|
210
292
|
|
211
|
-
# set cache for total order
|
293
|
+
# set cache for total order amount
|
212
294
|
# written in flow_data field inside spree_orders table
|
213
295
|
def write_response_in_cache
|
214
296
|
if !@response || error?
|
@@ -222,10 +304,8 @@ module FlowcommerceSpree
|
|
222
304
|
return if @use_get && response_total == cache_total
|
223
305
|
|
224
306
|
# update local order
|
225
|
-
@order.flow_data.merge!('digest' => @digest, 'order' => @response
|
307
|
+
@order.flow_data.merge!('digest' => @digest, 'order' => @response)
|
226
308
|
end
|
227
|
-
|
228
|
-
@order.update_column(:meta, @order.meta.to_json)
|
229
309
|
end
|
230
310
|
end
|
231
311
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
AddModelVirtualAttributeCheck: { }
|
2
|
+
AlwaysAddDbIndexCheck: { }
|
3
|
+
#CheckSaveReturnValueCheck: { }
|
4
|
+
#CheckDestroyReturnValueCheck: { }
|
5
|
+
DefaultScopeIsEvilCheck: { }
|
6
|
+
DryBundlerInCapistranoCheck: { }
|
7
|
+
#HashSyntaxCheck: { }
|
8
|
+
IsolateSeedDataCheck: { }
|
9
|
+
KeepFindersOnTheirOwnModelCheck: { }
|
10
|
+
LawOfDemeterCheck: { }
|
11
|
+
#LongLineCheck: { max_line_length: 80 }
|
12
|
+
MoveCodeIntoControllerCheck: { }
|
13
|
+
MoveCodeIntoHelperCheck: { array_count: 3 }
|
14
|
+
MoveCodeIntoModelCheck: { use_count: 2 }
|
15
|
+
MoveFinderToNamedScopeCheck: { }
|
16
|
+
MoveModelLogicIntoModelCheck: { use_count: 4 }
|
17
|
+
NeedlessDeepNestingCheck: { nested_count: 2 }
|
18
|
+
NotRescueExceptionCheck: { }
|
19
|
+
NotUseDefaultRouteCheck: { }
|
20
|
+
NotUseTimeAgoInWordsCheck: { }
|
21
|
+
OveruseRouteCustomizationsCheck: { customize_count: 3 }
|
22
|
+
ProtectMassAssignmentCheck: { }
|
23
|
+
RemoveEmptyHelpersCheck: { }
|
24
|
+
#RemoveTabCheck: { }
|
25
|
+
RemoveTrailingWhitespaceCheck: { }
|
26
|
+
RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
|
27
|
+
RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
|
28
|
+
RemoveUnusedMethodsInModelsCheck: { except_methods:
|
29
|
+
[
|
30
|
+
'Spree::Calculator::FlowIo#compute_shipment', # Used by Spree::Calculator
|
31
|
+
'Spree::Calculator::FlowIo#compute_line_item', # Used by Spree::Calculator
|
32
|
+
'Spree::Calculator::FlowIo#description', # Used by Spree
|
33
|
+
'Spree::Shipping::FlowIo#compute_package', # Used by Spree
|
34
|
+
'Spree::Shipping::FlowIo#default_charge', # Used by Spree
|
35
|
+
'Spree::Shipping::FlowIo#threshold', # Used by Spree
|
36
|
+
'Spree::Shipping::FlowIo#description', # Used by Spree
|
37
|
+
] }
|
38
|
+
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
|
39
|
+
ReplaceInstanceVariableWithLocalVariableCheck: { }
|
40
|
+
RestrictAutoGeneratedRoutesCheck: { }
|
41
|
+
SimplifyRenderInControllersCheck: { }
|
42
|
+
SimplifyRenderInViewsCheck: { }
|
43
|
+
#UseBeforeFilterCheck: { customize_count: 2 }
|
44
|
+
UseModelAssociationCheck: { }
|
45
|
+
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
|
46
|
+
#UseParenthesesInMethodDefCheck: { }
|
47
|
+
UseObserverCheck: { }
|
48
|
+
UseQueryAttributeCheck: { }
|
49
|
+
UseSayWithTimeInMigrationsCheck: { }
|
50
|
+
UseScopeAccessCheck: { }
|
51
|
+
UseTurboSprocketsRails3Check: { }
|
data/lib/flowcommerce_spree.rb
CHANGED
@@ -9,6 +9,7 @@ require 'flowcommerce_spree/logging_http_handler'
|
|
9
9
|
require 'flowcommerce_spree/webhook_service'
|
10
10
|
require 'flowcommerce_spree/session'
|
11
11
|
require 'flow/simple_gateway'
|
12
|
+
require 'request_store'
|
12
13
|
|
13
14
|
module FlowcommerceSpree
|
14
15
|
def self.client(logger: FlowcommerceSpree.logger, **opts)
|
@@ -20,11 +21,20 @@ module FlowcommerceSpree
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def self.logger
|
23
|
-
logger = ActiveSupport::Logger.new(STDOUT
|
24
|
+
logger = ActiveSupport::Logger.new(STDOUT)
|
25
|
+
|
26
|
+
logger_formatter = proc do |severity, datetime, _progname, msg|
|
27
|
+
"\n#{datetime}, #{severity}: #{msg}\n"
|
28
|
+
end
|
29
|
+
|
30
|
+
logger.formatter = logger_formatter
|
24
31
|
|
25
32
|
# Broadcast the log into the file besides STDOUT, if `log` folder exists
|
26
33
|
if Dir.exist?('log')
|
27
|
-
|
34
|
+
file_logger = ActiveSupport::Logger.new('log/flowcommerce_spree.log', 3, 10_485_760)
|
35
|
+
file_logger.formatter = logger_formatter
|
36
|
+
|
37
|
+
logger.extend(ActiveSupport::Logger.broadcast(file_logger))
|
28
38
|
end
|
29
39
|
logger
|
30
40
|
end
|
@@ -6,14 +6,34 @@ module FlowcommerceSpree
|
|
6
6
|
isolate_namespace FlowcommerceSpree
|
7
7
|
|
8
8
|
config.before_initialize do
|
9
|
+
FlowcommerceSpree::ORGANIZATION = ENV.fetch('FLOW_ORGANIZATION', 'flow.io')
|
10
|
+
FlowcommerceSpree::BASE_COUNTRY = ENV.fetch('FLOW_BASE_COUNTRY', 'USA')
|
11
|
+
FlowcommerceSpree::API_KEY = ENV.fetch('FLOW_TOKEN', 'test_key')
|
12
|
+
|
9
13
|
FlowcommerceSpree::Config = FlowcommerceSpree::Settings.new
|
10
14
|
end
|
11
15
|
|
12
|
-
config.
|
16
|
+
config.flowcommerce_spree = ActiveSupport::OrderedOptions.new
|
17
|
+
|
18
|
+
initializer 'flowcommerce_spree.configuration' do |app|
|
19
|
+
# If some Rake tasks will fail in development environment, the cause could be the autoloading.
|
20
|
+
# Uncommenting the following 3 lines will enable eager-loading for the flowcommerce_spree Rake tasks.
|
21
|
+
# if Rails.env.development?
|
22
|
+
# app.config.eager_load = Rake.application.top_level_tasks.any? { |t| t.start_with?('flowcommerce_spree') }
|
23
|
+
# end
|
24
|
+
|
25
|
+
app.config.flowcommerce_spree[:mounted_path] = ENV.fetch('FLOW_MOUNT_PATH', '/flow')
|
26
|
+
|
27
|
+
app.routes.append do
|
28
|
+
mount FlowcommerceSpree::Engine => app.config.flowcommerce_spree[:mounted_path]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
config.after_initialize do |app|
|
13
33
|
# init Flow payments as an option
|
14
|
-
|
34
|
+
app.config.spree.payment_methods << Spree::Gateway::FlowIo
|
15
35
|
|
16
|
-
Flow::SimpleGateway.clear_zero_amount_payments = true
|
36
|
+
# Flow::SimpleGateway.clear_zero_amount_payments = true
|
17
37
|
end
|
18
38
|
|
19
39
|
def self.activate
|
@@ -23,5 +43,10 @@ module FlowcommerceSpree
|
|
23
43
|
end
|
24
44
|
|
25
45
|
config.to_prepare(&method(:activate).to_proc)
|
46
|
+
|
47
|
+
initializer 'spree.flowcommerce_spree.calculators', after: 'spree.register.calculators' do |_app|
|
48
|
+
Rails.application.config.spree.calculators.tax_rates << Spree::Calculator::FlowIo
|
49
|
+
Rails.application.config.spree.calculators.shipping_methods << Spree::Calculator::Shipping::FlowIo
|
50
|
+
end
|
26
51
|
end
|
27
52
|
end
|