effective_orders 2.2.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/MIT-LICENSE +1 -1
- data/README.md +124 -84
- data/app/assets/javascripts/effective_orders/customers.js.coffee +39 -0
- data/app/assets/javascripts/effective_orders/providers/{stripe_charges.js.coffee → stripe.js.coffee} +15 -13
- data/app/assets/javascripts/effective_orders/subscriptions.js.coffee +73 -0
- data/app/assets/stylesheets/effective_orders.scss +2 -1
- data/app/assets/stylesheets/effective_orders/_order.scss +16 -8
- data/app/assets/stylesheets/effective_orders/_subscriptions.scss +14 -0
- data/app/controllers/admin/customers_controller.rb +11 -8
- data/app/controllers/admin/order_items_controller.rb +4 -8
- data/app/controllers/admin/orders_controller.rb +133 -87
- data/app/controllers/effective/carts_controller.rb +18 -8
- data/app/controllers/effective/concerns/purchase.rb +39 -0
- data/app/controllers/effective/customers_controller.rb +43 -0
- data/app/controllers/effective/orders_controller.rb +73 -119
- data/app/controllers/effective/providers/app_checkout.rb +3 -1
- data/app/controllers/effective/providers/ccbill.rb +4 -6
- data/app/controllers/effective/providers/cheque.rb +20 -11
- data/app/controllers/effective/providers/free.rb +33 -0
- data/app/controllers/effective/providers/mark_as_paid.rb +33 -0
- data/app/controllers/effective/providers/moneris.rb +9 -17
- data/app/controllers/effective/providers/paypal.rb +4 -6
- data/app/controllers/effective/providers/pretend.rb +4 -4
- data/app/controllers/effective/providers/refund.rb +39 -0
- data/app/controllers/effective/providers/stripe.rb +19 -40
- data/app/controllers/effective/providers/stripe_connect.rb +2 -6
- data/app/controllers/effective/webhooks_controller.rb +44 -95
- data/app/datatables/effective_customers_datatable.rb +21 -29
- data/app/datatables/effective_order_items_datatable.rb +77 -79
- data/app/datatables/effective_orders_datatable.rb +67 -57
- data/app/helpers/effective_carts_helper.rb +17 -14
- data/app/helpers/effective_orders_helper.rb +40 -56
- data/app/helpers/effective_paypal_helper.rb +3 -3
- data/app/helpers/effective_stripe_helper.rb +47 -18
- data/app/helpers/effective_subscriptions_helper.rb +79 -0
- data/app/mailers/effective/orders_mailer.rb +125 -2
- data/app/models/concerns/acts_as_purchasable.rb +23 -33
- data/app/models/concerns/acts_as_subscribable.rb +68 -0
- data/app/models/concerns/acts_as_subscribable_buyer.rb +22 -0
- data/app/models/effective/cart.rb +53 -24
- data/app/models/effective/cart_item.rb +6 -12
- data/app/models/effective/customer.rb +51 -54
- data/app/models/effective/order.rb +160 -147
- data/app/models/effective/order_item.rb +18 -21
- data/app/models/effective/product.rb +7 -7
- data/app/models/effective/providers/ccbill_postback.rb +1 -1
- data/app/models/effective/providers/stripe_charge.rb +8 -19
- data/app/models/effective/subscripter.rb +230 -0
- data/app/models/effective/subscription.rb +27 -76
- data/app/models/effective/tax_rate_calculator.rb +10 -7
- data/app/views/admin/customers/_actions.html.haml +1 -2
- data/app/views/admin/customers/index.html.haml +1 -1
- data/app/views/admin/customers/show.html.haml +6 -0
- data/app/views/admin/orders/_actions.html.haml +9 -7
- data/app/views/admin/orders/_form.html.haml +11 -7
- data/app/views/admin/orders/_order_actions.html.haml +2 -1
- data/app/views/admin/orders/_order_item_fields.html.haml +1 -1
- data/app/views/admin/orders/edit.html.haml +4 -0
- data/app/views/admin/orders/index.html.haml +1 -4
- data/app/views/admin/orders/new.html.haml +1 -1
- data/app/views/admin/orders/show.html.haml +5 -6
- data/app/views/effective/carts/_cart.html.haml +2 -2
- data/app/views/effective/carts/show.html.haml +2 -2
- data/app/views/effective/customers/_customer.html.haml +152 -0
- data/app/views/effective/customers/_fields.html.haml +12 -0
- data/app/views/effective/customers/_form.html.haml +13 -0
- data/app/views/effective/customers/edit.html.haml +3 -0
- data/app/views/effective/orders/_checkout_step1.html.haml +8 -15
- data/app/views/effective/orders/_checkout_step2.html.haml +34 -21
- data/app/views/effective/orders/_order.html.haml +8 -9
- data/app/views/effective/orders/_order_actions.html.haml +7 -8
- data/app/views/effective/orders/_order_header.html.haml +1 -1
- data/app/views/effective/orders/_order_items.html.haml +11 -5
- data/app/views/effective/orders/_order_note.html.haml +4 -7
- data/app/views/effective/orders/_orders_table.html.haml +26 -26
- data/app/views/effective/orders/app_checkout/_form.html.haml +2 -2
- data/app/views/effective/orders/ccbill/_form.html.haml +1 -1
- data/app/views/effective/orders/cheque/_form.html.haml +3 -1
- data/app/views/effective/orders/declined.html.haml +1 -1
- data/app/views/effective/orders/{checkout_step1.html.haml → edit.html.haml} +0 -0
- data/app/views/effective/orders/free/_form.html.haml +4 -0
- data/app/views/effective/orders/index.html.haml +2 -4
- data/app/views/effective/orders/mark_as_paid/_form.html.haml +32 -0
- data/app/views/effective/orders/moneris/_form.html.haml +6 -6
- data/app/views/effective/orders/{checkout_step2.html.haml → new.html.haml} +1 -1
- data/app/views/effective/orders/paypal/_form.html.haml +2 -2
- data/app/views/effective/orders/pretend/_form.html.haml +2 -2
- data/app/views/effective/orders/purchased.html.haml +3 -0
- data/app/views/effective/orders/refund/_form.html.haml +32 -0
- data/app/views/effective/orders/show.html.haml +4 -1
- data/app/views/effective/orders/stripe/_form.html.haml +5 -5
- data/app/views/effective/orders_mailer/subscription_canceled.html.haml +9 -0
- data/app/views/effective/orders_mailer/subscription_payment_failed.html.haml +9 -0
- data/app/views/effective/orders_mailer/subscription_payment_succeeded.html.haml +9 -0
- data/app/views/effective/orders_mailer/subscription_trial_expired.html.haml +5 -0
- data/app/views/effective/orders_mailer/subscription_trial_expiring.html.haml +7 -0
- data/app/views/effective/subscriptions/_fields.html.haml +16 -0
- data/app/views/effective/subscriptions/_plan.html.haml +21 -0
- data/app/views/layouts/effective_orders_mailer_layout.html.haml +6 -8
- data/config/effective_orders.rb +41 -20
- data/config/routes.rb +48 -48
- data/db/migrate/01_create_effective_orders.rb.erb +19 -5
- data/lib/effective_orders.rb +78 -42
- data/lib/effective_orders/engine.rb +36 -82
- data/lib/effective_orders/version.rb +1 -1
- data/lib/generators/effective_orders/install_generator.rb +2 -2
- data/lib/generators/templates/effective_orders_mailer_preview.rb +39 -4
- data/lib/tasks/effective_orders_tasks.rake +42 -0
- data/spec/controllers/carts_controller_spec.rb +1 -1
- data/spec/controllers/moneris_orders_controller_spec.rb +4 -4
- data/spec/controllers/orders_controller_spec.rb +4 -4
- data/spec/controllers/stripe_orders_controller_spec.rb +2 -2
- data/spec/controllers/webhooks_controller_spec.rb +1 -1
- data/spec/dummy/config/initializers/effective_orders.rb +1 -7
- data/spec/dummy/db/schema.rb +1 -0
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +3 -0
- data/spec/models/acts_as_purchasable_spec.rb +0 -56
- data/spec/models/customer_spec.rb +3 -3
- data/spec/models/order_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -1
- data/spec/support/factories.rb +2 -1
- metadata +37 -49
- data/active_admin/effective_carts.rb +0 -14
- data/active_admin/effective_orders.rb +0 -112
- data/app/assets/javascripts/effective_orders/providers/stripe_subscriptions.js.coffee +0 -28
- data/app/controllers/concerns/acts_as_active_admin_controller.rb +0 -69
- data/app/controllers/effective/subscriptions_controller.rb +0 -126
- data/app/models/effective/datatables/customers.rb +0 -40
- data/app/models/effective/datatables/order_items.rb +0 -101
- data/app/models/effective/datatables/orders.rb +0 -91
- data/app/models/inputs/price_field.rb +0 -63
- data/app/models/inputs/price_form_input.rb +0 -7
- data/app/models/inputs/price_formtastic_input.rb +0 -9
- data/app/models/inputs/price_input.rb +0 -19
- data/app/models/inputs/price_simple_form_input.rb +0 -8
- data/app/views/admin/orders/_form_mark_as_paid.html.haml +0 -33
- data/app/views/admin/orders/_order_payment_details.html.haml +0 -5
- data/app/views/admin/orders/mark_as_paid.html.haml +0 -7
- data/app/views/effective/orders/stripe/_subscription_fields.html.haml +0 -7
- data/app/views/effective/subscriptions/index.html.haml +0 -22
- data/app/views/effective/subscriptions/new.html.haml +0 -9
- data/app/views/effective/subscriptions/show.html.haml +0 -49
- data/db/upgrade/02_upgrade_effective_orders_from03x.rb.erb +0 -29
- data/db/upgrade/03_upgrade_effective_orders_from1x.rb.erb +0 -98
- data/db/upgrade/upgrade_price_column_on_table.rb.erb +0 -17
- data/lib/generators/effective_orders/upgrade_from03x_generator.rb +0 -31
- data/lib/generators/effective_orders/upgrade_from1x_generator.rb +0 -27
- data/lib/generators/effective_orders/upgrade_price_column_generator.rb +0 -30
@@ -4,27 +4,12 @@ module EffectiveOrders
|
|
4
4
|
|
5
5
|
config.autoload_paths += Dir["#{config.root}/app/models/**/"]
|
6
6
|
|
7
|
-
# Include Helpers to base application
|
8
|
-
initializer 'effective_orders.action_controller' do |app|
|
9
|
-
ActiveSupport.on_load :action_controller do
|
10
|
-
helper EffectiveOrdersHelper
|
11
|
-
helper EffectiveCartsHelper
|
12
|
-
helper EffectivePaypalHelper if EffectiveOrders.paypal_enabled
|
13
|
-
helper EffectiveStripeHelper if EffectiveOrders.stripe_enabled
|
14
|
-
helper EffectiveCcbillHelper if EffectiveOrders.ccbill_enabled
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
7
|
# Include acts_as_addressable concern and allow any ActiveRecord object to call it
|
19
8
|
initializer 'effective_orders.active_record' do |app|
|
20
9
|
ActiveSupport.on_load :active_record do
|
21
10
|
ActiveRecord::Base.extend(ActsAsPurchasable::ActiveRecord)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
initializer 'effective_orders.action_view' do |app|
|
26
|
-
ActiveSupport.on_load :action_view do
|
27
|
-
ActionView::Helpers::FormBuilder.send(:include, Inputs::PriceFormInput)
|
11
|
+
ActiveRecord::Base.extend(ActsAsSubscribable::ActiveRecord)
|
12
|
+
ActiveRecord::Base.extend(ActsAsSubscribableBuyer::ActiveRecord)
|
28
13
|
end
|
29
14
|
end
|
30
15
|
|
@@ -34,97 +19,88 @@ module EffectiveOrders
|
|
34
19
|
end
|
35
20
|
|
36
21
|
# Set up mail delivering config option
|
37
|
-
initializer
|
22
|
+
initializer 'effective_orders.mailer', after: :load_config_initializers do |app|
|
38
23
|
deliver_method = Rails.gem_version >= Gem::Version.new('4.2') ? :deliver_now : :deliver
|
39
24
|
EffectiveOrders.mailer[:deliver_method] ||= deliver_method
|
40
25
|
end
|
41
26
|
|
42
|
-
# Set up our Stripe API Key
|
43
|
-
initializer "effective_orders.stripe_api_key", after: :load_config_initializers do |app|
|
44
|
-
if EffectiveOrders.stripe_enabled
|
45
|
-
begin
|
46
|
-
require 'stripe'
|
47
|
-
rescue Exception
|
48
|
-
raise "unable to load stripe. Plese add gem 'stripe' to your Gemfile and then 'bundle install'"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
27
|
initializer 'effective_orders.moneris_config_validation', after: :load_config_initializers do
|
54
28
|
if EffectiveOrders.moneris_enabled
|
55
|
-
unless EffectiveOrders.moneris.is_a?(Hash)
|
56
|
-
raise ArgumentError, "expected EffectiveOrders.moneris to be a Hash but it is a #{EffectiveOrders.moneris.class}"
|
57
|
-
end
|
58
|
-
missing = EffectiveOrders.moneris.select {|_config, value| value.blank? }
|
29
|
+
raise 'expected EffectiveOrders.moneris to be a Hash' unless EffectiveOrders.moneris.is_a?(Hash)
|
59
30
|
|
60
|
-
|
31
|
+
missing = EffectiveOrders.moneris.select { |_, value| value.blank? }
|
32
|
+
raise "Missing EffectiveOrders.moneris config values: #{missing.keys.join(', ')}" if missing.present?
|
61
33
|
end
|
62
34
|
end
|
63
35
|
|
64
36
|
initializer 'effective_orders.paypal_config_validation', after: :load_config_initializers do
|
65
37
|
if EffectiveOrders.paypal_enabled
|
66
|
-
unless EffectiveOrders.paypal.is_a?(Hash)
|
67
|
-
raise ArgumentError, "expected EffectiveOrders.paypal to be a Hash but it is a #{EffectiveOrders.paypal.class}"
|
68
|
-
end
|
69
|
-
missing = EffectiveOrders.paypal.select {|_config, value| value.blank? }
|
38
|
+
raise 'expected EffectiveOrders.paypal to be a Hash' unless EffectiveOrders.paypal.is_a?(Hash)
|
70
39
|
|
71
|
-
|
40
|
+
missing = EffectiveOrders.paypal.select { |_, value| value.blank? }
|
41
|
+
raise "Missing EffectiveOrders.paypal config values: #{missing.keys.join(', ')}" if missing.present?
|
72
42
|
end
|
73
43
|
end
|
74
44
|
|
75
45
|
initializer 'effective_orders.stripe_config_validation', after: :load_config_initializers do
|
76
46
|
if EffectiveOrders.stripe_enabled
|
77
|
-
|
78
|
-
|
47
|
+
begin
|
48
|
+
require 'stripe'
|
49
|
+
rescue Exception
|
50
|
+
raise "unable to load stripe. Plese add gem 'stripe' to your Gemfile and then 'bundle install'"
|
79
51
|
end
|
80
|
-
|
52
|
+
|
53
|
+
raise 'expected EffectiveOrders.stripe to be a Hash' unless EffectiveOrders.stripe.is_a?(Hash)
|
54
|
+
|
55
|
+
missing = EffectiveOrders.stripe.select { |_, value| value.blank? }
|
81
56
|
required = [:secret_key, :publishable_key, :currency, :site_title]
|
82
|
-
|
83
|
-
required += stripe_connect_required if EffectiveOrders.stripe_connect_enabled
|
57
|
+
required += [:connect_client_id] if EffectiveOrders.stripe_connect_enabled
|
84
58
|
|
85
59
|
# perform an intersection operation between missing and required configs
|
86
60
|
missing_required = missing.keys & required
|
87
|
-
raise "Missing
|
61
|
+
raise "Missing EffectiveOrders.stripe config values: #{missing_required.join(', ')}" if missing_required.present?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
initializer 'effective_orders.stripe_api_key', after: :load_config_initializers do |app|
|
66
|
+
if EffectiveOrders.stripe_enabled
|
67
|
+
::Stripe.api_key = EffectiveOrders.stripe[:secret_key]
|
88
68
|
end
|
89
69
|
end
|
90
70
|
|
91
71
|
initializer 'effective_orders.ccbill_config_validation', after: :load_config_initializers do
|
92
72
|
if EffectiveOrders.ccbill_enabled
|
93
|
-
unless EffectiveOrders.ccbill.is_a?(Hash)
|
94
|
-
|
95
|
-
end
|
73
|
+
raise 'expected EffectiveOrders.ccbill to be a Hash' unless EffectiveOrders.ccbill.is_a?(Hash)
|
74
|
+
|
96
75
|
EffectiveOrders.ccbill[:form_period] ||= 365
|
97
76
|
|
98
|
-
missing = EffectiveOrders.stripe.select {|
|
77
|
+
missing = EffectiveOrders.stripe.select { |_, value| value.blank? }
|
99
78
|
required = [:client_accnum, :client_subacc, :form_name, :currency_code, :dynamic_pricing_salt]
|
100
79
|
|
101
80
|
# perform an intersection operation between missing and required configs
|
102
81
|
missing_required = missing.keys & required
|
103
|
-
raise "Missing
|
82
|
+
raise "Missing EffectiveOrders.ccbill config values: #{missing_required.join(', ')}" if missing_required.present?
|
104
83
|
end
|
105
84
|
end
|
106
85
|
|
107
86
|
initializer 'effective_orders.app_checkout_config_validation', after: :load_config_initializers do
|
108
87
|
if EffectiveOrders.app_checkout_enabled
|
109
|
-
unless EffectiveOrders.app_checkout.is_a?(Hash)
|
110
|
-
|
111
|
-
|
112
|
-
missing = EffectiveOrders.app_checkout.select {|_config, value| value.blank? }
|
88
|
+
raise 'expected EffectiveOrders.app_checkout to be a Hash' unless EffectiveOrders.app_checkout.is_a?(Hash)
|
89
|
+
|
90
|
+
missing = EffectiveOrders.app_checkout.select { |_, value| value.blank? }
|
113
91
|
missing = missing | [:service] unless EffectiveOrders.app_checkout.has_key?(:service)
|
114
92
|
|
115
93
|
raise "Missing effective_orders App Checkout configuration values: #{missing.keys.join(', ')}" if missing.present?
|
94
|
+
|
116
95
|
unless EffectiveOrders.app_checkout[:service].respond_to?(:call)
|
117
|
-
|
118
|
-
raise ArgumentError, msg
|
96
|
+
raise 'EffectiveOrders.app_checkout[:service] is not a compatible service object. Inherit from EffectiveOrders::AppCheckoutService or implement a similar API'
|
119
97
|
end
|
120
98
|
end
|
121
99
|
end
|
122
100
|
|
123
101
|
initializer 'effective_orders.cheque_config_validation', after: :load_config_initializers do
|
124
102
|
if EffectiveOrders.cheque_enabled
|
125
|
-
unless EffectiveOrders.cheque.is_a?(Hash)
|
126
|
-
raise ArgumentError, "expected EffectiveOrders.cheque to be a Hash but it is a #{EffectiveOrders.cheque.class}"
|
127
|
-
end
|
103
|
+
raise 'expected EffectiveOrders.cheque to be a Hash' unless EffectiveOrders.cheque.is_a?(Hash)
|
128
104
|
end
|
129
105
|
end
|
130
106
|
|
@@ -133,32 +109,10 @@ module EffectiveOrders
|
|
133
109
|
begin
|
134
110
|
require 'effective_obfuscation'
|
135
111
|
rescue Exception
|
136
|
-
raise "unable to load effective_obfuscation.
|
112
|
+
raise "unable to load effective_obfuscation. Please add gem 'effective_obfuscation' to your Gemfile and then 'bundle install'"
|
137
113
|
end
|
138
114
|
end
|
139
115
|
end
|
140
116
|
|
141
|
-
# Use ActiveAdmin (optional)
|
142
|
-
initializer 'effective_orders.active_admin' do
|
143
|
-
if EffectiveOrders.use_active_admin?
|
144
|
-
begin
|
145
|
-
require 'activeadmin'
|
146
|
-
rescue Exception
|
147
|
-
raise "unable to load activeadmin. Plese add gem 'activeadmin' to your Gemfile and then 'bundle install'"
|
148
|
-
end
|
149
|
-
|
150
|
-
ActiveAdmin.application.load_paths.unshift *Dir["#{config.root}/active_admin"]
|
151
|
-
|
152
|
-
Rails.application.config.to_prepare do
|
153
|
-
ActiveSupport.on_load :action_controller do
|
154
|
-
ApplicationController.extend(ActsAsActiveAdminController::ActionController)
|
155
|
-
Effective::OrdersController.send(:acts_as_active_admin_controller, 'orders')
|
156
|
-
Effective::CartsController.send(:acts_as_active_admin_controller, 'carts')
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
117
|
end
|
164
118
|
end
|
@@ -8,7 +8,7 @@ module EffectiveOrders
|
|
8
8
|
source_root File.expand_path('../../templates', __FILE__)
|
9
9
|
|
10
10
|
def self.next_migration_number(dirname)
|
11
|
-
|
11
|
+
unless ActiveRecord::Base.timestamped_migrations
|
12
12
|
Time.new.utc.strftime("%Y%m%d%H%M%S")
|
13
13
|
else
|
14
14
|
"%.3d" % (current_migration_number(dirname) + 1)
|
@@ -29,7 +29,7 @@ module EffectiveOrders
|
|
29
29
|
if mailer_preview_path.present?
|
30
30
|
template 'effective_orders_mailer_preview.rb', File.join(mailer_preview_path, 'effective_orders_mailer_preview.rb')
|
31
31
|
else
|
32
|
-
puts "couldn't find action_mailer.preview_path.
|
32
|
+
puts "couldn't find action_mailer.preview_path. Skipping effective_orders_mailer_preview."
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -11,7 +11,6 @@ class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
|
11
11
|
Effective::OrdersMailer.order_receipt_to_buyer(build_preview_order)
|
12
12
|
end
|
13
13
|
|
14
|
-
# This email is only sent to sellers having sold items via StripeConnect
|
15
14
|
def order_receipt_to_seller
|
16
15
|
order = build_preview_order
|
17
16
|
Effective::OrdersMailer.order_receipt_to_seller(order, preview_customer, order.order_items)
|
@@ -25,8 +24,28 @@ class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
|
25
24
|
Effective::OrdersMailer.pending_order_invoice_to_buyer(build_preview_order)
|
26
25
|
end
|
27
26
|
|
27
|
+
def subscription_payment_succeeded
|
28
|
+
Effective::OrdersMailer.subscription_payment_succeeded(preview_customer)
|
29
|
+
end
|
30
|
+
|
31
|
+
def subscription_payment_failed
|
32
|
+
Effective::OrdersMailer.subscription_payment_failed(preview_customer)
|
33
|
+
end
|
34
|
+
|
35
|
+
def subscription_canceled
|
36
|
+
Effective::OrdersMailer.subscription_canceled(preview_customer)
|
37
|
+
end
|
38
|
+
|
39
|
+
def subscription_trial_expiring
|
40
|
+
Effective::OrdersMailer.subscription_trial_expiring(preview_subscribable)
|
41
|
+
end
|
42
|
+
|
43
|
+
def subscription_trial_expired
|
44
|
+
Effective::OrdersMailer.subscription_trial_expired(preview_subscribable)
|
45
|
+
end
|
46
|
+
|
28
47
|
def order_error
|
29
|
-
Effective::OrdersMailer.order_error(order: build_preview_order, error:
|
48
|
+
Effective::OrdersMailer.order_error(order: build_preview_order, error: 'Something did not work out')
|
30
49
|
end
|
31
50
|
|
32
51
|
protected
|
@@ -57,7 +76,7 @@ class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
|
57
76
|
end
|
58
77
|
|
59
78
|
def preview_user
|
60
|
-
User.new(email: 'buyer@
|
79
|
+
User.new(email: 'buyer@website.com').tap do |user|
|
61
80
|
user.name = 'Valued Customer' if user.respond_to?(:name=)
|
62
81
|
user.full_name = 'Valued Customer' if user.respond_to?(:full_name=)
|
63
82
|
|
@@ -71,6 +90,22 @@ class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
|
71
90
|
end
|
72
91
|
|
73
92
|
def preview_customer
|
74
|
-
Effective::Customer.new(user: preview_user)
|
93
|
+
Effective::Customer.new(user: preview_user, active_card: '**** **** **** 1234 Visa 04/20')
|
94
|
+
end
|
95
|
+
|
96
|
+
def preview_subscribable
|
97
|
+
Class.new do
|
98
|
+
include ActiveModel::Model
|
99
|
+
attr_accessor :buyer
|
100
|
+
|
101
|
+
def to_s
|
102
|
+
'My cool service'
|
103
|
+
end
|
104
|
+
|
105
|
+
def trial_expires_at
|
106
|
+
Time.zone.now + 1.day
|
107
|
+
end
|
108
|
+
end.new(buyer: preview_user)
|
75
109
|
end
|
110
|
+
|
76
111
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# rake effective_orders:overwrite_order_item_titles
|
2
|
+
|
1
3
|
namespace :effective_orders do
|
2
4
|
desc 'Overwrite all order item titles with current acts_as_purchasable object title'
|
3
5
|
task overwrite_order_item_titles: :environment do
|
@@ -25,4 +27,44 @@ namespace :effective_orders do
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
30
|
+
|
31
|
+
desc 'Sends trial expiring and expired emails to each subscribable. Schedule me to run once per day.'
|
32
|
+
task send_trial_expiring_emails: :environment do
|
33
|
+
trial_remind_at = Array(EffectiveOrders.subscription[:trial_remind_at]).compact
|
34
|
+
exit unless trial_remind_at.present? && trial_remind_at.all? { |x| x.present? }
|
35
|
+
|
36
|
+
Rails.application.eager_load!
|
37
|
+
|
38
|
+
today = Time.zone.now.beginning_of_day
|
39
|
+
reminders = trial_remind_at.select { |remind_at| remind_at.kind_of?(ActiveSupport::Duration) }
|
40
|
+
|
41
|
+
begin
|
42
|
+
ActsAsSubscribable.descendants.each do |klass|
|
43
|
+
klass.trialing.find_each do |subscribable|
|
44
|
+
if subscribable.trial_expires_at == today
|
45
|
+
puts "sending trial expired to #{subscribable}"
|
46
|
+
Effective::OrdersMailer.subscription_trial_expired(subscribable).deliver_now
|
47
|
+
end
|
48
|
+
|
49
|
+
next if subscribable.trial_expired? # We already notified them
|
50
|
+
|
51
|
+
reminders.each do |remind_at|
|
52
|
+
next unless subscribable.trial_expires_at == (today + remind_at)
|
53
|
+
|
54
|
+
puts "sending trial expiring to #{subscribable}. expires in #{(subscribable.trial_expires_at - today) / 1.day.to_i} days."
|
55
|
+
Effective::OrdersMailer.subscription_trial_expiring(subscribable).deliver_now
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
puts 'send_trial_expiring_emails completed'
|
61
|
+
EffectiveLogger.success('scheduled task send_trial_expiring_emails completed') if defined?(EffectiveLogger)
|
62
|
+
rescue => e
|
63
|
+
ExceptionNotifier.notify_exception(e) if defined?(ExceptionNotifier)
|
64
|
+
raise e
|
65
|
+
end
|
66
|
+
|
67
|
+
true
|
68
|
+
end
|
69
|
+
|
28
70
|
end
|
@@ -105,7 +105,7 @@ describe Effective::CartsController, type: :controller do
|
|
105
105
|
|
106
106
|
get :show
|
107
107
|
assigns(:cart).user.should eq cart.user
|
108
|
-
assigns(:cart).
|
108
|
+
assigns(:cart).cart_items.length.should eq 4 # the 3 from my factory, and 1 more we just created
|
109
109
|
assigns(:cart).find(product).present?.should eq true
|
110
110
|
|
111
111
|
Effective::Cart.where(:id => session_cart).should eq []
|
@@ -116,15 +116,15 @@ describe Effective::OrdersController, type: :controller do
|
|
116
116
|
end
|
117
117
|
|
118
118
|
describe 'redirect urls' do
|
119
|
-
it 'redirects to the
|
119
|
+
it 'redirects to the purchased_url on purchase' do
|
120
120
|
allow(subject).to receive(:parse_moneris_response).and_return({response_code: 1}) # success
|
121
|
-
post :moneris_postback, moneris_params.tap { |x| x[:
|
121
|
+
post :moneris_postback, moneris_params.tap { |x| x[:rvar_purchased_url] = '/something' }
|
122
122
|
response.should redirect_to '/something'
|
123
123
|
end
|
124
124
|
|
125
|
-
it 'redirects to the
|
125
|
+
it 'redirects to the declined_url on decline' do
|
126
126
|
allow(subject).to receive(:parse_moneris_response).and_return({response_code: 'null'}) # failure
|
127
|
-
post :moneris_postback, moneris_params.tap { |x| x[:
|
127
|
+
post :moneris_postback, moneris_params.tap { |x| x[:rvar_declined_url] = '/something' }
|
128
128
|
response.should redirect_to '/something'
|
129
129
|
end
|
130
130
|
end
|
@@ -37,7 +37,7 @@ describe Effective::OrdersController, type: :controller do
|
|
37
37
|
assigns(:order).user.should eq cart.user
|
38
38
|
|
39
39
|
assigns(:order).order_items.size.should eq cart.cart_items.size
|
40
|
-
assigns(:order).total.should eq cart.
|
40
|
+
assigns(:order).total.should eq cart.subtotal
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'redirects if there is an empty order' do
|
@@ -81,11 +81,11 @@ describe Effective::OrdersController, type: :controller do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'should assign an @order based off the user cart' do
|
84
|
-
post :create
|
84
|
+
post :create, effective_order: {}
|
85
85
|
|
86
86
|
assigns(:order).user.should eq cart.user
|
87
87
|
assigns(:order).order_items.size.should eq cart.cart_items.size
|
88
|
-
assigns(:order).total.should eq cart.
|
88
|
+
assigns(:order).total.should eq cart.subtotal
|
89
89
|
assigns(:order).purchased?.should eq false
|
90
90
|
end
|
91
91
|
|
@@ -330,7 +330,7 @@ describe Effective::OrdersController, type: :controller do
|
|
330
330
|
describe '#order_purchased (with a free order)' do
|
331
331
|
before(:each) do
|
332
332
|
sign_in cart.user
|
333
|
-
cart.cart_items.each { |cart_item| cart_item.purchasable.update_attributes(price: 0
|
333
|
+
cart.cart_items.each { |cart_item| cart_item.purchasable.update_attributes(price: 0) }
|
334
334
|
end
|
335
335
|
|
336
336
|
it 'creates a purchased order' do
|
@@ -10,7 +10,7 @@ describe Effective::OrdersController, type: :controller do
|
|
10
10
|
|
11
11
|
let(:stripe_helper) { StripeMock.create_test_helper }
|
12
12
|
let(:order) { FactoryGirl.create(:order) }
|
13
|
-
let(:buyer) { Effective::Customer.
|
13
|
+
let(:buyer) { Effective::Customer.for_buyer(order.user) }
|
14
14
|
let(:token) { stripe_helper.generate_card_token }
|
15
15
|
let(:stripe_charge_params) do
|
16
16
|
{:effective_providers_stripe_charge => {'effective_order_id' => order.to_param, 'token' => token}}
|
@@ -91,7 +91,7 @@ describe Effective::OrdersController, type: :controller do
|
|
91
91
|
|
92
92
|
describe '#stripe_charge with a subscription' do
|
93
93
|
let(:order) { FactoryGirl.create(:order_with_subscription) }
|
94
|
-
let(:buyer) { Effective::Customer.
|
94
|
+
let(:buyer) { Effective::Customer.for_buyer(order.user) }
|
95
95
|
let(:subscription) { order.order_items[1].purchasable }
|
96
96
|
let(:token) { stripe_helper.generate_card_token }
|
97
97
|
let(:stripe_charge_params) do
|
@@ -7,7 +7,7 @@ describe Effective::WebhooksController, type: :controller do
|
|
7
7
|
after { StripeMock.stop }
|
8
8
|
|
9
9
|
let(:order) { FactoryGirl.create(:order) }
|
10
|
-
let(:buyer) { Effective::Customer.
|
10
|
+
let(:buyer) { Effective::Customer.for_buyer(order.user) }
|
11
11
|
|
12
12
|
let(:event_hash) { event.to_hash }
|
13
13
|
|
@@ -31,15 +31,9 @@ EffectiveOrders.setup do |config|
|
|
31
31
|
# config.authorization_method = false
|
32
32
|
config.authorization_method = Proc.new { |controller, action, resource| true }
|
33
33
|
|
34
|
-
# Register Effective::Order with ActiveAdmin if ActiveAdmin is present
|
35
|
-
config.use_active_admin = true
|
36
|
-
|
37
34
|
# Use effective_obfuscation gem to change order.id into a seemingly random 10-digit number
|
38
35
|
config.obfuscate_order_ids = true
|
39
36
|
|
40
|
-
# Silence the price deprecation warnings
|
41
|
-
config.silence_deprecation_warnings = true
|
42
|
-
|
43
37
|
# Require these addresses when creating a new Order. Works with effective_addresses gem
|
44
38
|
config.require_billing_address = true
|
45
39
|
config.require_shipping_address = true
|
@@ -211,7 +205,7 @@ EffectiveOrders.setup do |config|
|
|
211
205
|
|
212
206
|
# Stripe configuration
|
213
207
|
config.stripe_enabled = true
|
214
|
-
config.
|
208
|
+
config.subscriptions_enabled = true # https://stripe.com/docs/subscriptions
|
215
209
|
config.stripe_connect_enabled = false # https://stripe.com/docs/connect
|
216
210
|
config.stripe_connect_application_fee_method = Proc.new { |order_item| order_item.total * 0.10 } # 10 percent
|
217
211
|
|