flowcommerce-solidus 0.1.11 → 0.1.12
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/.version +1 -1
- data/static/app/flow/decorators/spree_product_decorator.rb +4 -3
- data/static/app/flow/flow.rb +8 -10
- data/static/app/flow/flow/experience.rb +1 -1
- data/static/app/flow/flow/simple_gateway.rb +3 -3
- data/static/app/flow/lib/spree_flow_gateway.rb +47 -20
- data/static/lib/tasks/flow.rake +7 -1
- metadata +2 -4
- data/static/app/flow/decorators/spree_credit_card_decorator.rb +0 -35
- data/static/app/flow/lib/spree_stripe_gateway.rb +0 -142
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dc5caf05326a4cca8e512be102b74b784f48145
|
4
|
+
data.tar.gz: 42063f71e4af7586d9989627a78eeeb2cbd5e9ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df425ba922fce210fcee1bad090af046bacb685be895a563d85fa67d98c5284c1669d97f41c257252c7a556989222095c78f866a7ab7ef84005ffb369105638c
|
7
|
+
data.tar.gz: 1e2efbe81e86efa045ae51db86d038b9a6abaf0b2388333e2fe70f463419736b00939329999077733052f9e15bbce587f005c06465c027a56fc17c99610f4a0d
|
data/.version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.12
|
@@ -3,12 +3,13 @@
|
|
3
3
|
Spree::Product.class_eval do
|
4
4
|
|
5
5
|
# returns price tied to local experience from master variant
|
6
|
-
def flow_local_price
|
7
|
-
variants.first.flow_local_price
|
6
|
+
def flow_local_price flow_exp
|
7
|
+
variants.first.flow_local_price flow_exp
|
8
8
|
end
|
9
9
|
|
10
|
-
def flow_included?
|
10
|
+
def flow_included? flow_exp
|
11
11
|
return true unless flow_exp
|
12
|
+
|
12
13
|
flow_data['%s.excluded' % flow_exp.key].to_i == 1 ? false : true
|
13
14
|
end
|
14
15
|
|
data/static/app/flow/flow.rb
CHANGED
@@ -2,13 +2,14 @@
|
|
2
2
|
# for now all in same class
|
3
3
|
|
4
4
|
require 'logger'
|
5
|
+
require 'awesome_print'
|
5
6
|
|
6
7
|
module Flow
|
7
|
-
|
8
|
+
mattr_accessor :organization
|
9
|
+
mattr_accessor :base_country
|
10
|
+
mattr_accessor :api_key
|
8
11
|
|
9
|
-
|
10
|
-
def base_country() ENV.fetch('FLOW_BASE_COUNTRY') end
|
11
|
-
def api_key() ENV.fetch('FLOW_API_KEY') end
|
12
|
+
extend self
|
12
13
|
|
13
14
|
# builds curl command and gets remote data
|
14
15
|
def api action, path, params={}, body=nil
|
@@ -40,12 +41,9 @@ module Flow
|
|
40
41
|
|
41
42
|
data = JSON.load `#{command}`
|
42
43
|
|
43
|
-
if data.kind_of?(Hash) && data['code'] == 'generic_error'
|
44
|
-
|
45
|
-
|
46
|
-
else
|
47
|
-
data
|
48
|
-
end
|
44
|
+
ap data if data.kind_of?(Hash) && data['code'] == 'generic_error'
|
45
|
+
|
46
|
+
data
|
49
47
|
end
|
50
48
|
|
51
49
|
def log_api_error
|
@@ -34,7 +34,7 @@ module Flow::Experience
|
|
34
34
|
def get_from_flow
|
35
35
|
return cached_experinces if cache_valid?
|
36
36
|
|
37
|
-
experiences = FlowCommerce.instance.experiences.get
|
37
|
+
experiences = FlowCommerce.instance.experiences.get Flow.organization
|
38
38
|
@cache = [experiences, Time.now]
|
39
39
|
experiences
|
40
40
|
end
|
@@ -102,10 +102,10 @@ class Flow::SimpleGateway
|
|
102
102
|
|
103
103
|
# gets credit card token
|
104
104
|
def cc_get_token
|
105
|
-
cards = @order.credit_cards.select{ |cc| cc
|
106
|
-
raise StandarError.new('Credit card not found') unless cards.first
|
105
|
+
cards = @order.credit_cards.select{ |cc| cc.gateway_customer_profile_id }
|
106
|
+
raise StandarError.new('Credit card with token not found') unless cards.first
|
107
107
|
|
108
|
-
cards.first.
|
108
|
+
cards.first.gateway_customer_profile_id
|
109
109
|
end
|
110
110
|
|
111
111
|
# we want to return errors in standardized format
|
@@ -1,8 +1,6 @@
|
|
1
1
|
# Flow.io (2017)
|
2
2
|
# adapter for Solidus/Spree that talks to activemerchant_flow
|
3
3
|
|
4
|
-
# load '/Users/dux/dev/org/flow.io/activemerchant_flow/lib/active_merchant/billing/gateways/flow.rb'
|
5
|
-
|
6
4
|
module Spree
|
7
5
|
class Gateway::Flow < Gateway
|
8
6
|
def provider_class
|
@@ -19,7 +17,7 @@ module Spree
|
|
19
17
|
end
|
20
18
|
|
21
19
|
def payment_profiles_supported?
|
22
|
-
|
20
|
+
true
|
23
21
|
end
|
24
22
|
|
25
23
|
def method_type
|
@@ -30,32 +28,22 @@ module Spree
|
|
30
28
|
{}
|
31
29
|
end
|
32
30
|
|
33
|
-
|
34
|
-
# # binding.pry
|
35
|
-
# # ActiveMerchant::Billing::FlowGateway.new(token: Flow.api_key, organization: Flow.organization)
|
36
|
-
|
37
|
-
# case payment.order.state
|
38
|
-
# when 'payment'
|
39
|
-
# when 'confirm'
|
40
|
-
# end
|
41
|
-
# end
|
42
|
-
|
43
|
-
def supports?(source)
|
31
|
+
def supports? source
|
44
32
|
# flow supports credit cards
|
45
33
|
source.class == Spree::CreditCard
|
46
34
|
end
|
47
35
|
|
48
|
-
def authorize
|
36
|
+
def authorize amount, payment_method, options={}
|
49
37
|
order = load_order options
|
50
38
|
order.cc_authorization
|
51
39
|
end
|
52
40
|
|
53
|
-
def capture
|
41
|
+
def capture amount, payment_method, options={}
|
54
42
|
order = load_order options
|
55
43
|
order.cc_capture
|
56
44
|
end
|
57
45
|
|
58
|
-
def purchase
|
46
|
+
def purchase amount, payment_method, options={}
|
59
47
|
order = load_order options
|
60
48
|
flow_auth = order.cc_authorization
|
61
49
|
|
@@ -66,18 +54,57 @@ module Spree
|
|
66
54
|
end
|
67
55
|
end
|
68
56
|
|
69
|
-
def refund
|
57
|
+
def refund money, authorization_key, options={}
|
70
58
|
order = load_order options
|
71
59
|
order.cc_refund
|
72
60
|
end
|
73
61
|
|
74
|
-
def void
|
62
|
+
def void money, authorization_key, options={}
|
63
|
+
# binding.pry
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_profile payment
|
75
67
|
# binding.pry
|
68
|
+
|
69
|
+
# payment.order.state
|
70
|
+
@credit_card = payment.source
|
71
|
+
|
72
|
+
profile_ensure_payment_method_is_present!
|
73
|
+
create_flow_cc_profile!
|
76
74
|
end
|
77
75
|
|
78
76
|
private
|
79
77
|
|
80
|
-
|
78
|
+
# hard inject Flow as payment method unless defined
|
79
|
+
def profile_ensure_payment_method_is_present!
|
80
|
+
return if @credit_card.payment_method_id
|
81
|
+
|
82
|
+
flow_payment = Spree::PaymentMethod.where(active: true, type:'Spree::Gateway::Flow').first
|
83
|
+
@credit_card.payment_method_id = flow_payment.id if flow_payment
|
84
|
+
end
|
85
|
+
|
86
|
+
# create payment profile with Flow and tokenize Credit Card
|
87
|
+
def create_flow_cc_profile!
|
88
|
+
return if @credit_card.gateway_customer_profile_id
|
89
|
+
return unless @credit_card.verification_value
|
90
|
+
|
91
|
+
# build credit card hash
|
92
|
+
data = {}
|
93
|
+
data[:number] = @credit_card.number
|
94
|
+
data[:name] = @credit_card.name
|
95
|
+
data[:cvv] = @credit_card.verification_value
|
96
|
+
data[:expiration_year] = @credit_card.year.to_i
|
97
|
+
data[:expiration_month] = @credit_card.month.to_i
|
98
|
+
|
99
|
+
# tokenize with Flow
|
100
|
+
# rescue Io::Flow::V0::HttpClient::ServerError
|
101
|
+
card_form = ::Io::Flow::V0::Models::CardForm.new(data)
|
102
|
+
result = FlowCommerce.instance.cards.post(::Flow.organization, card_form)
|
103
|
+
|
104
|
+
@credit_card.update_column :gateway_customer_profile_id, result.token
|
105
|
+
end
|
106
|
+
|
107
|
+
def load_order options
|
81
108
|
order_number = options[:order_id].split('-').first
|
82
109
|
spree_order = Spree::Order.find_by number: order_number
|
83
110
|
::Flow::SimpleGateway.new spree_order
|
data/static/lib/tasks/flow.rake
CHANGED
@@ -20,6 +20,7 @@ task :flow do |t|
|
|
20
20
|
puts ' -'
|
21
21
|
print 'Task number: '
|
22
22
|
task = $stdin.gets.to_i
|
23
|
+
exit if task == 0
|
23
24
|
task = tasks[task - 1].to_s.split(/\s+/)[1]
|
24
25
|
|
25
26
|
if task.present?
|
@@ -227,7 +228,6 @@ namespace :flow do
|
|
227
228
|
desc 'Ensure we have DB prepared for flow'
|
228
229
|
task :migrate => :environment do |t|
|
229
230
|
migrate = []
|
230
|
-
migrate.push [:spree_credit_cards, :flow_data, :jsonb, default: {}]
|
231
231
|
migrate.push [:spree_products, :flow_data, :jsonb, default: {}]
|
232
232
|
migrate.push [:spree_variants, :flow_data, :jsonb, default: {}]
|
233
233
|
migrate.push [:spree_orders, :flow_data, :jsonb, default: {}]
|
@@ -244,5 +244,11 @@ namespace :flow do
|
|
244
244
|
end
|
245
245
|
end
|
246
246
|
end
|
247
|
+
|
248
|
+
desc 'Pretty print flow_data of last updated product variant'
|
249
|
+
task :sync_check => :environment do |t|
|
250
|
+
data = Spree::Variant.order('updated_at desc').first.flow_data
|
251
|
+
puts JSON.pretty_generate(data).gsub(/"(\w+)":/) { '"%s":' % $1.yellow }
|
252
|
+
end
|
247
253
|
end
|
248
254
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flowcommerce-solidus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flow.io (Dino Reic)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -108,7 +108,6 @@ files:
|
|
108
108
|
- "./static/app/flow/SOLIDUS_FLOW.md"
|
109
109
|
- "./static/app/flow/decorators/admin_decorators.rb"
|
110
110
|
- "./static/app/flow/decorators/localized_coupon_code_decorator.rb"
|
111
|
-
- "./static/app/flow/decorators/spree_credit_card_decorator.rb"
|
112
111
|
- "./static/app/flow/decorators/spree_order_decorator.rb"
|
113
112
|
- "./static/app/flow/decorators/spree_product_decorator.rb"
|
114
113
|
- "./static/app/flow/decorators/spree_user_decorator.rb"
|
@@ -124,7 +123,6 @@ files:
|
|
124
123
|
- "./static/app/flow/flow/webhook.rb"
|
125
124
|
- "./static/app/flow/lib/flow_api_refresh.rb"
|
126
125
|
- "./static/app/flow/lib/spree_flow_gateway.rb"
|
127
|
-
- "./static/app/flow/lib/spree_stripe_gateway.rb"
|
128
126
|
- "./static/app/views/spree/admin/payments/index.html.erb"
|
129
127
|
- "./static/app/views/spree/admin/promotions/edit.html.erb"
|
130
128
|
- "./static/app/views/spree/admin/shared/_order_summary.html.erb"
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# added flow specific methods to Spree::CreditCard
|
2
|
-
|
3
|
-
Spree::CreditCard.class_eval do
|
4
|
-
|
5
|
-
validate :flow_fetch_cc_token
|
6
|
-
|
7
|
-
def flow_fetch_cc_token
|
8
|
-
return false unless respond_to?(:flow_data) # Flow not installed
|
9
|
-
return false if flow_data['cc_token']
|
10
|
-
return false unless number
|
11
|
-
return errors.add(:verification_value, 'CVV verification value is required') unless verification_value.present?
|
12
|
-
|
13
|
-
# build cc hash
|
14
|
-
data = {}
|
15
|
-
data[:number] = number
|
16
|
-
data[:name] = name
|
17
|
-
data[:cvv] = verification_value
|
18
|
-
data[:expiration_year] = year.to_i
|
19
|
-
data[:expiration_month] = month.to_i
|
20
|
-
|
21
|
-
card_form = ::Io::Flow::V0::Models::CardForm.new(data)
|
22
|
-
result = FlowCommerce.instance.cards.post(Flow.organization, card_form)
|
23
|
-
|
24
|
-
# cache the result
|
25
|
-
flow_data['cc_token'] = result.token
|
26
|
-
|
27
|
-
true
|
28
|
-
rescue Io::Flow::V0::HttpClient::ServerError
|
29
|
-
puts $!.message
|
30
|
-
flow_error = $!.message.split(':', 2).first
|
31
|
-
errors.add(:base, flow_error)
|
32
|
-
end
|
33
|
-
|
34
|
-
end
|
35
|
-
|
@@ -1,142 +0,0 @@
|
|
1
|
-
# require 'flowcommerce-activemerchant'
|
2
|
-
|
3
|
-
# module Spree
|
4
|
-
# class Gateway::StripeGateway < Gateway
|
5
|
-
# # https://dashboard.stripe.com/account/apikeys
|
6
|
-
|
7
|
-
# preference :secret_key, :string
|
8
|
-
# preference :publishable_key, :string
|
9
|
-
|
10
|
-
# CARD_TYPE_MAPPING = {
|
11
|
-
# 'American Express' => 'american_express',
|
12
|
-
# 'Diners Club' => 'diners_club',
|
13
|
-
# 'Visa' => 'visa'
|
14
|
-
# }
|
15
|
-
|
16
|
-
# def method_type
|
17
|
-
# 'gateway'
|
18
|
-
# end
|
19
|
-
|
20
|
-
# def provider_class
|
21
|
-
# ActiveMerchant::Billing::FlowGatewaya
|
22
|
-
# end
|
23
|
-
|
24
|
-
# def payment_profiles_supported?
|
25
|
-
# true
|
26
|
-
# end
|
27
|
-
|
28
|
-
# def purchase(money, creditcard, gateway_options)
|
29
|
-
# ap [:purchase, money, creditcard, gateway_options]
|
30
|
-
# binding.pry
|
31
|
-
# provider.purchase(*options_for_purchase_or_auth(money, creditcard, gateway_options))
|
32
|
-
# end
|
33
|
-
|
34
|
-
# def authorize(money, creditcard, gateway_options)
|
35
|
-
# ap [:authorize, money, creditcard, gateway_options]
|
36
|
-
# binding.pry
|
37
|
-
# provider.authorize(*options_for_purchase_or_auth(money, creditcard, gateway_options))
|
38
|
-
# end
|
39
|
-
|
40
|
-
# def capture(money, response_code, gateway_options)
|
41
|
-
# ap [:capture, money, response_code, gateway_options]
|
42
|
-
# binding.pry
|
43
|
-
# provider.capture(money, response_code, gateway_options)
|
44
|
-
# end
|
45
|
-
|
46
|
-
# def credit(money, creditcard, response_code, gateway_options)
|
47
|
-
# ap [:credit, money, creditcard, response_code, gateway_options]
|
48
|
-
# binding.pry
|
49
|
-
# provider.refund(money, response_code, {})
|
50
|
-
# end
|
51
|
-
|
52
|
-
# def void(response_code, creditcard, gateway_options)
|
53
|
-
# ap [:void, response_code, creditcard, gateway_options]
|
54
|
-
# binding.pry
|
55
|
-
# provider.void(response_code, {})
|
56
|
-
# end
|
57
|
-
|
58
|
-
# def cancel(response_code)
|
59
|
-
# ap [:cancel, response_code]
|
60
|
-
# provider.void(response_code, {})
|
61
|
-
# end
|
62
|
-
|
63
|
-
# def create_profile(payment)
|
64
|
-
# ap [:create_profile, payment]
|
65
|
-
# return unless payment.source.gateway_customer_profile_id.nil?
|
66
|
-
# options = {
|
67
|
-
# email: payment.order.email,
|
68
|
-
# login: preferred_secret_key,
|
69
|
-
# }.merge! address_for(payment)
|
70
|
-
|
71
|
-
# source = update_source!(payment.source)
|
72
|
-
# if source.number.blank? && source.gateway_payment_profile_id.present?
|
73
|
-
# creditcard = source.gateway_payment_profile_id
|
74
|
-
# else
|
75
|
-
# creditcard = source
|
76
|
-
# end
|
77
|
-
|
78
|
-
# response = provider.store(creditcard, options)
|
79
|
-
# if response.success?
|
80
|
-
# payment.source.update_attributes!({
|
81
|
-
# cc_type: payment.source.cc_type, # side-effect of update_source!
|
82
|
-
# gateway_customer_profile_id: response.params['id'],
|
83
|
-
# gateway_payment_profile_id: response.params['default_source'] || response.params['default_card']
|
84
|
-
# })
|
85
|
-
|
86
|
-
# else
|
87
|
-
# payment.send(:gateway_error, response.message)
|
88
|
-
# end
|
89
|
-
# end
|
90
|
-
|
91
|
-
# private
|
92
|
-
|
93
|
-
# # In this gateway, what we call 'secret_key' is the 'login'
|
94
|
-
# def options
|
95
|
-
# options = super
|
96
|
-
# options.merge(:login => preferred_secret_key)
|
97
|
-
# end
|
98
|
-
|
99
|
-
# def options_for_purchase_or_auth(money, creditcard, gateway_options)
|
100
|
-
# options = {}
|
101
|
-
# options[:description] = "Spree Order ID: #{gateway_options[:order_id]}"
|
102
|
-
# options[:currency] = gateway_options[:currency]
|
103
|
-
|
104
|
-
# if customer = creditcard.gateway_customer_profile_id
|
105
|
-
# options[:customer] = customer
|
106
|
-
# end
|
107
|
-
# if token_or_card_id = creditcard.gateway_payment_profile_id
|
108
|
-
# # The Stripe ActiveMerchant gateway supports passing the token directly as the creditcard parameter
|
109
|
-
# # The Stripe ActiveMerchant gateway supports passing the customer_id and credit_card id
|
110
|
-
# # https://github.com/Shopify/active_merchant/issues/770
|
111
|
-
# creditcard = token_or_card_id
|
112
|
-
# end
|
113
|
-
# return money, creditcard, options
|
114
|
-
# end
|
115
|
-
|
116
|
-
# def address_for(payment)
|
117
|
-
# {}.tap do |options|
|
118
|
-
# if address = payment.order.bill_address
|
119
|
-
# options.merge!(address: {
|
120
|
-
# address1: address.address1,
|
121
|
-
# address2: address.address2,
|
122
|
-
# city: address.city,
|
123
|
-
# zip: address.zipcode
|
124
|
-
# })
|
125
|
-
|
126
|
-
# if country = address.country
|
127
|
-
# options[:address].merge!(country: country.name)
|
128
|
-
# end
|
129
|
-
|
130
|
-
# if state = address.state
|
131
|
-
# options[:address].merge!(state: state.name)
|
132
|
-
# end
|
133
|
-
# end
|
134
|
-
# end
|
135
|
-
# end
|
136
|
-
|
137
|
-
# def update_source!(source)
|
138
|
-
# source.cc_type = CARD_TYPE_MAPPING[source.cc_type] if CARD_TYPE_MAPPING.include?(source.cc_type)
|
139
|
-
# source
|
140
|
-
# end
|
141
|
-
# end
|
142
|
-
# end
|