flowcommerce_spree 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +91 -0
- data/Rakefile +33 -0
- data/SPREE_FLOW.md +134 -0
- data/app/assets/javascripts/flowcommerce_spree/application.js +13 -0
- data/app/assets/stylesheets/flowcommerce_spree/application.css +15 -0
- data/app/controllers/concerns/current_zone_loader_decorator.rb +49 -0
- data/app/controllers/flowcommerce_spree/webhooks_controller.rb +25 -0
- data/app/helpers/flowcommerce_spree/application_helper.rb +6 -0
- data/app/helpers/spree/admin/orders_helper_decorator.rb +17 -0
- data/app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb +53 -0
- data/app/mailers/spree/spree_order_mailer_decorator.rb +24 -0
- data/app/models/flowcommerce_spree/settings.rb +8 -0
- data/app/models/spree/credit_card_decorator.rb +9 -0
- data/app/models/spree/flow_io_product_decorator.rb +91 -0
- data/app/models/spree/flow_io_variant_decorator.rb +205 -0
- data/app/models/spree/gateway/spree_flow_gateway.rb +116 -0
- data/app/models/spree/line_item_decorator.rb +15 -0
- data/app/models/spree/order_decorator.rb +179 -0
- data/app/models/spree/promotion_decorator.rb +10 -0
- data/app/models/spree/promotion_handler/coupon_decorator.rb +30 -0
- data/app/models/spree/spree_user_decorator.rb +15 -0
- data/app/models/spree/taxon_decorator.rb +37 -0
- data/app/models/spree/zone_decorator.rb +7 -0
- data/app/models/spree/zones/flow_io_product_zone_decorator.rb +55 -0
- data/app/services/flowcommerce_spree/import_experience_items.rb +76 -0
- data/app/services/flowcommerce_spree/import_experiences.rb +37 -0
- data/app/services/flowcommerce_spree/order_sync.rb +231 -0
- data/app/views/layouts/flowcommerce_spree/application.html.erb +14 -0
- data/app/views/spree/admin/payments/index.html.erb +28 -0
- data/app/views/spree/admin/promotions/edit.html.erb +57 -0
- data/app/views/spree/admin/shared/_order_summary.html.erb +44 -0
- data/app/views/spree/admin/shared/_order_summary_flow.html.erb +13 -0
- data/app/views/spree/order_mailer/confirm_email.html.erb +86 -0
- data/app/views/spree/order_mailer/confirm_email.text.erb +38 -0
- data/config/initializers/flowcommerce_spree.rb +7 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20201021160159_add_type_and_meta_to_spree_zone.rb +23 -0
- data/db/migrate/20201021755957_add_meta_to_spree_tables.rb +17 -0
- data/db/migrate/20201022173210_add_zone_type_to_spree_zone_members.rb +24 -0
- data/db/migrate/20201022174252_add_kind_to_zone.rb +22 -0
- data/lib/flow/error.rb +73 -0
- data/lib/flow/pay_pal.rb +25 -0
- data/lib/flow/simple_gateway.rb +115 -0
- data/lib/flowcommerce_spree.rb +31 -0
- data/lib/flowcommerce_spree/api.rb +48 -0
- data/lib/flowcommerce_spree/engine.rb +27 -0
- data/lib/flowcommerce_spree/experience_service.rb +65 -0
- data/lib/flowcommerce_spree/logging_http_client.rb +43 -0
- data/lib/flowcommerce_spree/logging_http_handler.rb +15 -0
- data/lib/flowcommerce_spree/refresher.rb +81 -0
- data/lib/flowcommerce_spree/session.rb +71 -0
- data/lib/flowcommerce_spree/version.rb +5 -0
- data/lib/flowcommerce_spree/webhook_service.rb +98 -0
- data/lib/simple_csv_writer.rb +44 -0
- data/lib/tasks/flowcommerce_spree.rake +289 -0
- metadata +220 -0
@@ -0,0 +1,289 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'flowcommerce'
|
4
|
+
require 'digest/sha1'
|
5
|
+
require 'colorize'
|
6
|
+
|
7
|
+
namespace :flowcommerce_spree do
|
8
|
+
logger = FlowcommerceSpree.logger
|
9
|
+
client = FlowcommerceSpree.client(logger: logger)
|
10
|
+
refresher = FlowcommerceSpree::Refresher.new(logger: logger)
|
11
|
+
|
12
|
+
desc 'Listing and possible invocation of all the Flow tasks'
|
13
|
+
task :list_tasks do |t|
|
14
|
+
task_list = `rake -T | grep flowcommerce_spree`.split($RS)
|
15
|
+
@exit = false
|
16
|
+
logger.info "Running task: #{t}"
|
17
|
+
|
18
|
+
loop do
|
19
|
+
puts 'Flowcommerce tasks:'
|
20
|
+
task_list.each_with_index do |task, index|
|
21
|
+
puts format(" %3d. #{task}", (index + 1))
|
22
|
+
end
|
23
|
+
|
24
|
+
print "\nType the task number to be invoked: "
|
25
|
+
task_number = $stdin.gets.to_i
|
26
|
+
|
27
|
+
if (1..task_list.size).cover?(task_number)
|
28
|
+
selected_task_name = task_list[task_number - 1].to_s.split(/\s+/)[1]
|
29
|
+
logger.info "\nRunning: #{selected_task_name}"
|
30
|
+
Rake::Task[selected_task_name].invoke
|
31
|
+
puts
|
32
|
+
else
|
33
|
+
puts "Unknown task number: #{task_number}".red, ''
|
34
|
+
end
|
35
|
+
|
36
|
+
break if @exit
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# uploads catalog to Flow API using local Spree database
|
41
|
+
desc 'Upload catalog'
|
42
|
+
task upload_catalog: :environment do |t|
|
43
|
+
update_sum = 0
|
44
|
+
total_sum = 0
|
45
|
+
current_page = 0
|
46
|
+
variants = []
|
47
|
+
|
48
|
+
while current_page == 0 || !variants.empty?
|
49
|
+
current_page += 1
|
50
|
+
variants = Spree::Variant.order('updated_at desc').page(current_page).per(100).all
|
51
|
+
|
52
|
+
variants.each do |variant|
|
53
|
+
total_sum += 1
|
54
|
+
result = variant.sync_product_to_flow
|
55
|
+
|
56
|
+
# skip if sync not needed
|
57
|
+
next $stdout.print "\nVariant #{variant.sku} is synced, no need to update".green unless result
|
58
|
+
|
59
|
+
if result.is_a?(Hash) && result[:error]
|
60
|
+
$stdout.print "\nError uploading #{variant.sku}. Reason: #{result[:error]}".red
|
61
|
+
else
|
62
|
+
update_sum += 1
|
63
|
+
$stdout.print "\n#{variant.sku}: #{variant.product.name} (#{variant.price} #{variant.cost_currency})"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
needed_update = (update_sum == 0 ? 'none' : update_sum).to_s.green
|
69
|
+
puts "\nFor total of #{total_sum.to_s.blue} products, #{needed_update} needed update"
|
70
|
+
t.reenable
|
71
|
+
end
|
72
|
+
|
73
|
+
desc 'Check if ENV vars, center and tier per experience is set'
|
74
|
+
task check: :environment do |t|
|
75
|
+
logger.info 'Environment check'
|
76
|
+
required_env_vars = %w[FLOW_TOKEN FLOW_ORGANIZATION FLOW_BASE_COUNTRY]
|
77
|
+
required_env_vars.each { |el| logger.info " ENV: #{el} - #{ENV[el].present? ? 'present'.green : 'MISSING'.red} " }
|
78
|
+
organization = FlowcommerceSpree::ORGANIZATION
|
79
|
+
|
80
|
+
logger.info 'Experiences:'
|
81
|
+
logger.info " Getting experiences for flow org: #{organization}"
|
82
|
+
experiences = client.experiences.get(organization)
|
83
|
+
logger.info " Got %d experiences - #{experiences.map(&:country).join(', ')}".green % experiences.length
|
84
|
+
|
85
|
+
# create default experience unless one exists
|
86
|
+
logger.info 'Centers:'
|
87
|
+
center_name = 'default'
|
88
|
+
current_centers = client.centers.get(organization).map(&:key)
|
89
|
+
if current_centers.include?(center_name)
|
90
|
+
logger.info " Default center: #{'present'.green}"
|
91
|
+
else
|
92
|
+
FlowcommerceSpree::Api.run(
|
93
|
+
:put, "/:organization/centers/#{center_name}", {},
|
94
|
+
'key': center_name,
|
95
|
+
'address': { 'contact': { 'name': { 'first': 'Kinto',
|
96
|
+
'last': 'Doe' },
|
97
|
+
'company': organization,
|
98
|
+
'email': 'dcone@test.flow.io',
|
99
|
+
'phone': '1-555-444-0001' },
|
100
|
+
'location': { 'streets': ['88 East Broad Street'],
|
101
|
+
'city': 'Columbus',
|
102
|
+
'province': 'OH',
|
103
|
+
'postal': '43215',
|
104
|
+
'country': FlowcommerceSpree::BASE_COUNTRY } },
|
105
|
+
'packaging': [{ 'dimensions': { 'packaging': { 'depth': { 'value': '9', 'units': 'inch' },
|
106
|
+
'length': { 'value': '13', 'units': 'inch' },
|
107
|
+
'weight': { 'value': '1', 'units': 'pound' },
|
108
|
+
'width': { 'value': '3', 'units': 'inch' } } },
|
109
|
+
'name': 'Big Box',
|
110
|
+
'number': 'box1' }],
|
111
|
+
'name': 'Spree Test',
|
112
|
+
'services': [{ 'service': 'dhl-express-worldwide' },
|
113
|
+
{ 'service': 'landmark-global' }],
|
114
|
+
'schedule': { 'holiday': 'us_bank_holidays',
|
115
|
+
'exception': [{ 'type': 'closed',
|
116
|
+
'datetime_range': { 'from': '2016-05-05T18:30:00.000Z',
|
117
|
+
'to': '2016-05-06T18:30:00.000Z' } }],
|
118
|
+
'calendar': 'weekdays',
|
119
|
+
'cutoff': '16:30' },
|
120
|
+
'timezone': 'US/Eastern'
|
121
|
+
)
|
122
|
+
logger.info " Default center: #{'created'.blue} (run again)"
|
123
|
+
end
|
124
|
+
|
125
|
+
logger.info 'Tiers:'
|
126
|
+
experiences.each do |exp|
|
127
|
+
exp_tiers = client.tiers.get(FlowcommerceSpree::ORGANIZATION, experience: exp.key)
|
128
|
+
count = exp_tiers.length
|
129
|
+
count_desc = count == 0 ? '0 (error!)'.red : count.to_s.green
|
130
|
+
exp_services = exp_tiers.inject([]) { |total, tier| total.push(*tier.services.map(&:id)) }
|
131
|
+
services_str = if exp_services.empty?
|
132
|
+
'and no delivery services defined!'.red
|
133
|
+
else
|
134
|
+
"with #{exp_services.length.to_s.green} delivery services defined (#{exp_services.join(', ')})"
|
135
|
+
end
|
136
|
+
logger.info " Experience #{exp.key.yellow} has #{count_desc} delivery tiers defined, #{services_str}"
|
137
|
+
end
|
138
|
+
|
139
|
+
logger.info 'Database fields (flow_data):'
|
140
|
+
[Spree::CreditCard, Spree::Product, Spree::Variant, Spree::Order, Spree::Promotion].each do |klass|
|
141
|
+
state = klass.new.respond_to?(:flow_data) ? 'exists'.green : 'not present (run DB migrations)'.red
|
142
|
+
logger.info " #{klass.to_s.ljust(18)} - #{state}"
|
143
|
+
end
|
144
|
+
|
145
|
+
logger.info 'Default store URL:'
|
146
|
+
url = Spree::Store.find_by(default: true).url
|
147
|
+
logger.info " Spree::Store.find_by(default:true).url == \"#{url.blue}\" (ensure this is valid and right URL)"
|
148
|
+
|
149
|
+
# rate cards check
|
150
|
+
ratecard_estimates_path = '/:organization/ratecard_estimates/summaries'
|
151
|
+
origins = []
|
152
|
+
errors = []
|
153
|
+
client.ratecards.get(FlowcommerceSpree::ORGANIZATION).each do |rc|
|
154
|
+
rc.origination_zones.each do |oz|
|
155
|
+
data = FlowcommerceSpree::Api.run(
|
156
|
+
:post, ratecard_estimates_path, {}, origin: oz.country, destination: origins.last || 'USA'
|
157
|
+
)
|
158
|
+
|
159
|
+
if data.is_a?(Hash) && data['code'] == 'generic_error'
|
160
|
+
errors << { origin: oz.country, messages: data['messages'] }
|
161
|
+
next
|
162
|
+
elsif data.is_a?(Array) && !data.empty?
|
163
|
+
origins << oz.country
|
164
|
+
else
|
165
|
+
errors << { origin: oz.country, messages: ['Unknown error'] }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
unless origins.empty?
|
171
|
+
logger.info "\nRate cards set, OK:".green
|
172
|
+
origins.each_with_index do |origin, index|
|
173
|
+
logger.info format(" %3d. #{origin}", (index + 1))
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
unless errors.empty?
|
178
|
+
logger.info "\nRate cards errors:".red
|
179
|
+
errors.each_with_index do |err, index|
|
180
|
+
logger.info format(" %3d. Origin = #{err[:origin]}, errors:", (index + 1))
|
181
|
+
err[:messages].each do |m|
|
182
|
+
logger.info " #{m}".red
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
t.reenable
|
187
|
+
end
|
188
|
+
|
189
|
+
desc 'Sync experiences and localized product catalog items from Flow.io'
|
190
|
+
task sync_localized_items: :environment do |t|
|
191
|
+
next t.reenable unless refresher.needs_refresh?
|
192
|
+
|
193
|
+
logger.info 'Sync needed, running ...'.yellow
|
194
|
+
|
195
|
+
FlowcommerceSpree::ImportExperiences.run(with_items: true, client: client, refresher: refresher)
|
196
|
+
|
197
|
+
t.reenable
|
198
|
+
end
|
199
|
+
|
200
|
+
desc 'Force sync (no timeout) experiences and localized product catalog items from Flow.io'
|
201
|
+
task sync_localized_items_forced: :environment do |t|
|
202
|
+
next t.reenable if refresher.in_progress?
|
203
|
+
|
204
|
+
FlowcommerceSpree::ImportExperiences.run(with_items: true, client: client, refresher: refresher)
|
205
|
+
|
206
|
+
t.reenable
|
207
|
+
end
|
208
|
+
|
209
|
+
# checks existence of every item in local product catalog - remove product from flow unless exists locally
|
210
|
+
desc 'Remove unused items from flow catalog'
|
211
|
+
task clean_flow_catalog: :environment do |t|
|
212
|
+
page_size = 100
|
213
|
+
offset = 0
|
214
|
+
items = []
|
215
|
+
promises = []
|
216
|
+
thread_pool = Concurrent::FixedThreadPool.new(5)
|
217
|
+
|
218
|
+
while offset == 0 || items.length == 100
|
219
|
+
items = FlowcommerceSpree::Api.run :get, '/:organization/catalog/items', limit: page_size, offset: offset
|
220
|
+
offset += page_size
|
221
|
+
|
222
|
+
items.each do |item|
|
223
|
+
sku = item['number']
|
224
|
+
|
225
|
+
next if Spree::Variant.exists?(sku: sku)
|
226
|
+
|
227
|
+
promises << Concurrent::Promises.future_on(thread_pool, sku) do |number|
|
228
|
+
FlowcommerceSpree::Api.run :delete, "/:organization/catalog/items/#{number}"
|
229
|
+
$stdout.puts "Removed item: #{number.red}"
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
Concurrent::Promises.zip(*promises).value!
|
235
|
+
thread_pool.shutdown
|
236
|
+
thread_pool.wait_for_termination
|
237
|
+
t.reenable
|
238
|
+
end
|
239
|
+
|
240
|
+
# remove all the products from flow.io
|
241
|
+
desc 'Purge Product Catalog on flow.io'
|
242
|
+
task purge_catalog: :environment do |t|
|
243
|
+
page_size = 100
|
244
|
+
offset = 0
|
245
|
+
items = []
|
246
|
+
promises = []
|
247
|
+
thread_pool = Concurrent::FixedThreadPool.new(5)
|
248
|
+
|
249
|
+
while offset == 0 || items.length == 100
|
250
|
+
items = FlowcommerceSpree::Api.run :get, '/:organization/catalog/items', limit: page_size, offset: offset
|
251
|
+
offset += page_size
|
252
|
+
|
253
|
+
items.each do |item|
|
254
|
+
variant_sku = item['number']
|
255
|
+
promises << Concurrent::Promises.future_on(thread_pool, variant_sku) do |sku|
|
256
|
+
FlowcommerceSpree::Api.run :delete, "/:organization/catalog/items/#{sku}"
|
257
|
+
$stdout.puts "Removed item: #{sku.red}"
|
258
|
+
end
|
259
|
+
v = Spree::Variant.find_by(sku: variant_sku)
|
260
|
+
v.flow_data.delete('last_sync_sh1')
|
261
|
+
v.update_column(:meta, v.meta.to_json)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
265
|
+
Concurrent::Promises.zip(*promises).value!
|
266
|
+
thread_pool.shutdown
|
267
|
+
thread_pool.wait_for_termination
|
268
|
+
t.reenable
|
269
|
+
end
|
270
|
+
|
271
|
+
desc 'Purge flow_data from all the Variants in the DB'
|
272
|
+
task purge_flow_data: :environment do |t|
|
273
|
+
record_counter = 0
|
274
|
+
Spree::Variant.where("meta->>'flow_data' IS NOT NULL").each do |v|
|
275
|
+
v.truncate_flow_data
|
276
|
+
record_counter += 1
|
277
|
+
print '.'
|
278
|
+
$stdout.flush
|
279
|
+
end
|
280
|
+
logger.info "\nTruncated flow_data on #{record_counter} records"
|
281
|
+
|
282
|
+
t.reenable
|
283
|
+
end
|
284
|
+
|
285
|
+
desc 'Exit list_tasks'
|
286
|
+
task exit: :environment do
|
287
|
+
@exit = true
|
288
|
+
end
|
289
|
+
end
|
metadata
ADDED
@@ -0,0 +1,220 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flowcommerce_spree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Aurel Branzeanu
|
8
|
+
- Sebastian De Luca
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-02-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: colorize
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: concurrent-ruby
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.0'
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.1.7
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - "~>"
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '1.0'
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.1.7
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: flowcommerce
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: flowcommerce-reference
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :runtime
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: oj
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: pg
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.21'
|
97
|
+
type: :runtime
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.21'
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: spree_backend
|
106
|
+
requirement: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 2.3.0
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.3.0
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: github_changelog_generator
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
description: Integration of popular Rails/Spree store framework with e-commerce Flow
|
133
|
+
API
|
134
|
+
email:
|
135
|
+
- a.branzeanu@datarockets.com
|
136
|
+
- sebastian.deluca@mejuri.com
|
137
|
+
executables: []
|
138
|
+
extensions: []
|
139
|
+
extra_rdoc_files: []
|
140
|
+
files:
|
141
|
+
- MIT-LICENSE
|
142
|
+
- README.md
|
143
|
+
- Rakefile
|
144
|
+
- SPREE_FLOW.md
|
145
|
+
- app/assets/javascripts/flowcommerce_spree/application.js
|
146
|
+
- app/assets/stylesheets/flowcommerce_spree/application.css
|
147
|
+
- app/controllers/concerns/current_zone_loader_decorator.rb
|
148
|
+
- app/controllers/flowcommerce_spree/webhooks_controller.rb
|
149
|
+
- app/helpers/flowcommerce_spree/application_helper.rb
|
150
|
+
- app/helpers/spree/admin/orders_helper_decorator.rb
|
151
|
+
- app/helpers/spree/core/controller_helpers/flow_io_order_helper_decorator.rb
|
152
|
+
- app/mailers/spree/spree_order_mailer_decorator.rb
|
153
|
+
- app/models/flowcommerce_spree/settings.rb
|
154
|
+
- app/models/spree/credit_card_decorator.rb
|
155
|
+
- app/models/spree/flow_io_product_decorator.rb
|
156
|
+
- 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
|
160
|
+
- app/models/spree/promotion_decorator.rb
|
161
|
+
- app/models/spree/promotion_handler/coupon_decorator.rb
|
162
|
+
- app/models/spree/spree_user_decorator.rb
|
163
|
+
- app/models/spree/taxon_decorator.rb
|
164
|
+
- app/models/spree/zone_decorator.rb
|
165
|
+
- app/models/spree/zones/flow_io_product_zone_decorator.rb
|
166
|
+
- app/services/flowcommerce_spree/import_experience_items.rb
|
167
|
+
- app/services/flowcommerce_spree/import_experiences.rb
|
168
|
+
- app/services/flowcommerce_spree/order_sync.rb
|
169
|
+
- app/views/layouts/flowcommerce_spree/application.html.erb
|
170
|
+
- app/views/spree/admin/payments/index.html.erb
|
171
|
+
- app/views/spree/admin/promotions/edit.html.erb
|
172
|
+
- app/views/spree/admin/shared/_order_summary.html.erb
|
173
|
+
- 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
|
177
|
+
- config/routes.rb
|
178
|
+
- db/migrate/20201021160159_add_type_and_meta_to_spree_zone.rb
|
179
|
+
- db/migrate/20201021755957_add_meta_to_spree_tables.rb
|
180
|
+
- db/migrate/20201022173210_add_zone_type_to_spree_zone_members.rb
|
181
|
+
- db/migrate/20201022174252_add_kind_to_zone.rb
|
182
|
+
- lib/flow/error.rb
|
183
|
+
- lib/flow/pay_pal.rb
|
184
|
+
- lib/flow/simple_gateway.rb
|
185
|
+
- lib/flowcommerce_spree.rb
|
186
|
+
- lib/flowcommerce_spree/api.rb
|
187
|
+
- lib/flowcommerce_spree/engine.rb
|
188
|
+
- lib/flowcommerce_spree/experience_service.rb
|
189
|
+
- lib/flowcommerce_spree/logging_http_client.rb
|
190
|
+
- lib/flowcommerce_spree/logging_http_handler.rb
|
191
|
+
- lib/flowcommerce_spree/refresher.rb
|
192
|
+
- lib/flowcommerce_spree/session.rb
|
193
|
+
- lib/flowcommerce_spree/version.rb
|
194
|
+
- lib/flowcommerce_spree/webhook_service.rb
|
195
|
+
- lib/simple_csv_writer.rb
|
196
|
+
- lib/tasks/flowcommerce_spree.rake
|
197
|
+
homepage: https://github.com/mejuri-inc/flowcommerce_spree
|
198
|
+
licenses:
|
199
|
+
- MIT
|
200
|
+
metadata: {}
|
201
|
+
post_install_message:
|
202
|
+
rdoc_options: []
|
203
|
+
require_paths:
|
204
|
+
- lib
|
205
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - "~>"
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: 2.3.0
|
210
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
211
|
+
requirements:
|
212
|
+
- - ">="
|
213
|
+
- !ruby/object:Gem::Version
|
214
|
+
version: '0'
|
215
|
+
requirements: []
|
216
|
+
rubygems_version: 3.0.8
|
217
|
+
signing_key:
|
218
|
+
specification_version: 4
|
219
|
+
summary: Integration of Spree with Flow API
|
220
|
+
test_files: []
|