effective_orders 4.6.0 → 5.0.1
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/MIT-LICENSE +1 -1
- data/README.md +14 -86
- data/app/controllers/admin/customers_controller.rb +5 -16
- data/app/controllers/admin/order_items_controller.rb +6 -9
- data/app/controllers/admin/orders_controller.rb +18 -82
- data/app/controllers/effective/carts_controller.rb +10 -6
- data/app/controllers/effective/customers_controller.rb +4 -2
- data/app/controllers/effective/orders_controller.rb +30 -26
- data/app/controllers/effective/providers/cheque.rb +3 -1
- data/app/controllers/effective/providers/free.rb +3 -1
- data/app/controllers/effective/providers/mark_as_paid.rb +4 -2
- data/app/controllers/effective/providers/moneris.rb +3 -1
- data/app/controllers/effective/providers/paypal.rb +3 -2
- data/app/controllers/effective/providers/phone.rb +3 -1
- data/app/controllers/effective/providers/pretend.rb +3 -1
- data/app/controllers/effective/providers/refund.rb +3 -1
- data/app/controllers/effective/providers/stripe.rb +3 -1
- data/app/controllers/effective/subscripter_controller.rb +4 -2
- data/app/controllers/effective/webhooks_controller.rb +12 -3
- data/app/datatables/admin/effective_customers_datatable.rb +7 -3
- data/app/datatables/admin/effective_orders_datatable.rb +2 -2
- data/app/datatables/effective_orders_datatable.rb +1 -1
- data/app/mailers/effective/orders_mailer.rb +131 -96
- data/app/models/concerns/acts_as_purchasable.rb +0 -11
- data/app/models/concerns/acts_as_subscribable.rb +0 -6
- data/app/models/effective/cart.rb +7 -5
- data/app/models/effective/cart_item.rb +7 -4
- data/app/models/effective/customer.rb +7 -6
- data/app/models/effective/order.rb +58 -38
- data/app/models/effective/order_item.rb +10 -8
- data/app/models/effective/product.rb +9 -6
- data/app/models/effective/subscription.rb +13 -12
- data/app/views/admin/orders/_form.html.haml +5 -9
- data/app/views/admin/orders/_order_item_fields.html.haml +8 -12
- data/app/views/effective/orders/_checkout_step2.html.haml +1 -2
- data/app/views/effective/orders/_order_actions.html.haml +1 -1
- data/config/effective_orders.rb +8 -32
- data/config/routes.rb +16 -17
- data/db/migrate/01_create_effective_orders.rb.erb +4 -0
- data/lib/effective_orders.rb +34 -76
- data/lib/effective_orders/engine.rb +0 -7
- data/lib/effective_orders/version.rb +1 -1
- data/lib/generators/templates/effective_orders_mailer_preview.rb +13 -13
- data/lib/tasks/effective_orders_tasks.rake +2 -2
- metadata +2 -3
- data/app/models/effective/access_denied.rb +0 -17
data/config/routes.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
EffectiveOrders::Engine.routes.draw do
|
2
|
-
scope :
|
2
|
+
scope module: 'effective' do
|
3
3
|
resources :orders, except: [:destroy] do
|
4
4
|
member do
|
5
5
|
get :purchased
|
@@ -7,33 +7,32 @@ EffectiveOrders::Engine.routes.draw do
|
|
7
7
|
get :declined
|
8
8
|
get :send_buyer_receipt
|
9
9
|
|
10
|
-
post :free
|
11
|
-
post :mark_as_paid
|
12
|
-
post :cheque
|
13
|
-
post :phone
|
14
|
-
post :pretend
|
15
|
-
post :refund
|
16
|
-
post :stripe
|
10
|
+
post :free
|
11
|
+
post :mark_as_paid
|
12
|
+
post :cheque
|
13
|
+
post :phone
|
14
|
+
post :pretend
|
15
|
+
post :refund
|
16
|
+
post :stripe
|
17
17
|
end
|
18
18
|
|
19
19
|
collection do
|
20
20
|
post :bulk_send_buyer_receipt
|
21
21
|
|
22
|
-
post :moneris_postback
|
23
|
-
post :paypal_postback
|
22
|
+
post :moneris_postback
|
23
|
+
post :paypal_postback
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
post 'orders/:id', to: 'orders#update'
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
match 'webhooks/stripe', to: 'webhooks#stripe', via: [:get, :post, :put]
|
35
|
-
end
|
29
|
+
# Subscriptions
|
30
|
+
match 'subscribe', to: 'subscripter#update', via: :post, as: :subscripter
|
31
|
+
match 'customer/settings', to: 'customers#edit', as: :customer_settings, via: [:get]
|
32
|
+
match 'customer/settings', to: 'customers#update', via: [:patch, :put, :post]
|
33
|
+
match 'webhooks/stripe', to: 'webhooks#stripe', via: [:get, :post, :put]
|
36
34
|
|
35
|
+
# Carts
|
37
36
|
match 'cart', to: 'carts#show', as: 'cart', via: :get
|
38
37
|
match 'cart', to: 'carts#destroy', via: :delete
|
39
38
|
|
@@ -2,6 +2,7 @@ class CreateEffectiveOrders < ActiveRecord::Migration[4.2]
|
|
2
2
|
def self.up
|
3
3
|
create_table <%= @orders_table_name %> do |t|
|
4
4
|
t.integer :user_id
|
5
|
+
t.string :user_type
|
5
6
|
|
6
7
|
t.integer :parent_id
|
7
8
|
t.string :parent_type
|
@@ -53,6 +54,8 @@ class CreateEffectiveOrders < ActiveRecord::Migration[4.2]
|
|
53
54
|
|
54
55
|
create_table <%= @carts_table_name %> do |t|
|
55
56
|
t.integer :user_id
|
57
|
+
t.string :user_type
|
58
|
+
|
56
59
|
t.integer :cart_items_count, :default => 0
|
57
60
|
t.timestamps
|
58
61
|
end
|
@@ -76,6 +79,7 @@ class CreateEffectiveOrders < ActiveRecord::Migration[4.2]
|
|
76
79
|
|
77
80
|
create_table <%= @customers_table_name %> do |t|
|
78
81
|
t.integer :user_id
|
82
|
+
t.string :user_type
|
79
83
|
|
80
84
|
t.string :stripe_customer_id
|
81
85
|
t.string :payment_method_id
|
data/lib/effective_orders.rb
CHANGED
@@ -1,94 +1,47 @@
|
|
1
1
|
require 'effective_addresses'
|
2
|
+
require 'effective_resources'
|
2
3
|
require 'effective_orders/engine'
|
3
4
|
require 'effective_orders/version'
|
4
5
|
|
5
6
|
module EffectiveOrders
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
# Order states
|
8
|
+
PENDING = 'pending' # New orders are created in a pending state
|
9
|
+
CONFIRMED = 'confirmed' # Once the order has passed checkout step 1
|
10
|
+
DEFERRED = 'deferred' # Deferred providers. Cheque or Phone was selected.
|
11
|
+
PURCHASED = 'purchased' # Purchased by provider
|
12
|
+
DECLINED = 'declined' # Declined by provider
|
12
13
|
STATES = { PENDING => PENDING, CONFIRMED => CONFIRMED, DEFERRED => DEFERRED, PURCHASED => PURCHASED, DECLINED => DECLINED }
|
13
14
|
|
14
15
|
# Subscription statuses (as per stripe)
|
15
|
-
ACTIVE = 'active'
|
16
|
-
PAST_DUE = 'past_due'
|
17
|
-
TRIALING = 'trialing'
|
18
|
-
CANCELED = 'canceled'
|
16
|
+
ACTIVE = 'active'
|
17
|
+
PAST_DUE = 'past_due'
|
18
|
+
TRIALING = 'trialing'
|
19
|
+
CANCELED = 'canceled'
|
19
20
|
|
20
21
|
STATUSES = { ACTIVE => ACTIVE, PAST_DUE => PAST_DUE, CANCELED => CANCELED, TRIALING => TRIALING }
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
mattr_accessor :obfuscate_order_ids
|
40
|
-
mattr_accessor :billing_address
|
41
|
-
mattr_accessor :shipping_address
|
42
|
-
mattr_accessor :use_address_full_name
|
43
|
-
|
44
|
-
mattr_accessor :collect_note
|
45
|
-
mattr_accessor :collect_note_required
|
46
|
-
mattr_accessor :collect_note_message
|
47
|
-
|
48
|
-
mattr_accessor :terms_and_conditions
|
49
|
-
mattr_accessor :terms_and_conditions_label
|
50
|
-
|
51
|
-
mattr_accessor :minimum_charge
|
52
|
-
|
53
|
-
# Features
|
54
|
-
mattr_accessor :free_enabled
|
55
|
-
mattr_accessor :mark_as_paid_enabled
|
56
|
-
mattr_accessor :pretend_enabled
|
57
|
-
mattr_accessor :pretend_message
|
58
|
-
|
59
|
-
# Payment processors. false or Hash
|
60
|
-
mattr_accessor :cheque
|
61
|
-
mattr_accessor :moneris
|
62
|
-
mattr_accessor :paypal
|
63
|
-
mattr_accessor :phone
|
64
|
-
mattr_accessor :refund
|
65
|
-
mattr_accessor :stripe
|
66
|
-
mattr_accessor :subscriptions # Stripe subscriptions
|
67
|
-
mattr_accessor :trial # Trial mode
|
68
|
-
|
69
|
-
def self.setup
|
70
|
-
yield self
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.authorized?(controller, action, resource)
|
74
|
-
@_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
|
75
|
-
|
76
|
-
return !!authorization_method unless authorization_method.respond_to?(:call)
|
77
|
-
controller = controller.controller if controller.respond_to?(:controller)
|
78
|
-
|
79
|
-
begin
|
80
|
-
!!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
|
81
|
-
rescue *@_exceptions
|
82
|
-
false
|
83
|
-
end
|
23
|
+
def self.config_keys
|
24
|
+
[
|
25
|
+
:orders_table_name, :order_items_table_name, :carts_table_name, :cart_items_table_name,
|
26
|
+
:customers_table_name, :subscriptions_table_name, :products_table_name,
|
27
|
+
:layout, :mailer_class_name, :mailer,
|
28
|
+
:orders_collection_scope, :order_tax_rate_method,
|
29
|
+
:obfuscate_order_ids, :use_effective_qb_sync,
|
30
|
+
:billing_address, :shipping_address, :use_address_full_name,
|
31
|
+
:collect_note, :collect_note_required, :collect_note_message,
|
32
|
+
:terms_and_conditions, :terms_and_conditions_label, :minimum_charge,
|
33
|
+
|
34
|
+
# Features
|
35
|
+
:free_enabled, :mark_as_paid_enabled, :pretend_enabled, :pretend_message,
|
36
|
+
# Payment processors. false or Hash
|
37
|
+
:cheque, :moneris, :paypal, :phone, :refund, :stripe, :subscriptions, :trial
|
38
|
+
]
|
84
39
|
end
|
85
40
|
|
86
|
-
|
87
|
-
raise Effective::AccessDenied.new('Access Denied', action, resource) unless authorized?(controller, action, resource)
|
88
|
-
end
|
41
|
+
include EffectiveGem
|
89
42
|
|
90
43
|
def self.permitted_params
|
91
|
-
[
|
44
|
+
@permitted_params ||= [
|
92
45
|
:cc, :note, :terms_and_conditions, :confirmed_checkout,
|
93
46
|
billing_address: EffectiveAddresses.permitted_params,
|
94
47
|
shipping_address: EffectiveAddresses.permitted_params,
|
@@ -169,6 +122,11 @@ module EffectiveOrders
|
|
169
122
|
[('cheque' if cheque?), ('phone' if phone?)].compact
|
170
123
|
end
|
171
124
|
|
125
|
+
def self.mailer_klass
|
126
|
+
name = mailer_class_name.presence || 'Effective::OrdersMailer'
|
127
|
+
name.safe_constantize || raise("unable to constantize mailer class. check config.mailer_class_name")
|
128
|
+
end
|
129
|
+
|
172
130
|
def self.can_skip_checkout_step1?
|
173
131
|
return false if require_billing_address
|
174
132
|
return false if require_shipping_address
|
@@ -16,13 +16,6 @@ module EffectiveOrders
|
|
16
16
|
eval File.read("#{config.root}/config/effective_orders.rb")
|
17
17
|
end
|
18
18
|
|
19
|
-
# Set up mail delivering config option
|
20
|
-
initializer 'effective_orders.mailer', after: :load_config_initializers do |app|
|
21
|
-
EffectiveOrders.mailer[:deliver_method] ||= (
|
22
|
-
(Rails.application.config.respond_to?(:active_job) && Rails.application.config.active_job.queue_adapter) ? :deliver_later : :deliver_now
|
23
|
-
)
|
24
|
-
end
|
25
|
-
|
26
19
|
initializer "effective_orders.append_precompiled_assets" do |app|
|
27
20
|
Rails.application.config.assets.precompile += ['effective_orders/*']
|
28
21
|
end
|
@@ -4,55 +4,55 @@
|
|
4
4
|
|
5
5
|
class EffectiveOrdersMailerPreview < ActionMailer::Preview
|
6
6
|
def order_receipt_to_admin
|
7
|
-
|
7
|
+
EffectiveOrders.mailer_klass.order_receipt_to_admin(build_preview_order)
|
8
8
|
end
|
9
9
|
|
10
10
|
def order_receipt_to_buyer
|
11
|
-
|
11
|
+
EffectiveOrders.mailer_klass.order_receipt_to_buyer(build_preview_order)
|
12
12
|
end
|
13
13
|
|
14
14
|
def payment_request_to_buyer
|
15
|
-
|
15
|
+
EffectiveOrders.mailer_klass.payment_request_to_buyer(build_preview_order)
|
16
16
|
end
|
17
17
|
|
18
18
|
def pending_order_invoice_to_buyer
|
19
|
-
|
19
|
+
EffectiveOrders.mailer_klass.pending_order_invoice_to_buyer(build_preview_order)
|
20
20
|
end
|
21
21
|
|
22
22
|
def subscription_payment_succeeded
|
23
|
-
|
23
|
+
EffectiveOrders.mailer_klass.subscription_payment_succeeded(preview_customer)
|
24
24
|
end
|
25
25
|
|
26
26
|
def subscription_payment_failed
|
27
|
-
|
27
|
+
EffectiveOrders.mailer_klass.subscription_payment_failed(preview_customer)
|
28
28
|
end
|
29
29
|
|
30
30
|
def subscription_created
|
31
|
-
|
31
|
+
EffectiveOrders.mailer_klass.subscription_created(preview_customer)
|
32
32
|
end
|
33
33
|
|
34
34
|
def subscription_updated
|
35
|
-
|
35
|
+
EffectiveOrders.mailer_klass.subscription_updated(preview_customer)
|
36
36
|
end
|
37
37
|
|
38
38
|
def subscription_canceled
|
39
|
-
|
39
|
+
EffectiveOrders.mailer_klass.subscription_canceled(preview_customer)
|
40
40
|
end
|
41
41
|
|
42
42
|
def subscription_trialing
|
43
|
-
|
43
|
+
EffectiveOrders.mailer_klass.subscription_trialing(preview_subscribable)
|
44
44
|
end
|
45
45
|
|
46
46
|
def subscription_trial_expired
|
47
|
-
|
47
|
+
EffectiveOrders.mailer_klass.subscription_trial_expired(preview_subscribable)
|
48
48
|
end
|
49
49
|
|
50
50
|
def subscription_event_to_admin
|
51
|
-
|
51
|
+
EffectiveOrders.mailer_klass.subscription_event_to_admin(:subscription_updated, preview_customer)
|
52
52
|
end
|
53
53
|
|
54
54
|
def order_error
|
55
|
-
|
55
|
+
EffectiveOrders.mailer_klass.order_error(order: build_preview_order, error: 'Something did not work out')
|
56
56
|
end
|
57
57
|
|
58
58
|
protected
|
@@ -44,7 +44,7 @@ namespace :effective_orders do
|
|
44
44
|
klass.trialing.find_each do |subscribable|
|
45
45
|
if subscribable.trialing_until == today
|
46
46
|
puts "sending trial expired to #{subscribable}"
|
47
|
-
|
47
|
+
EffectiveOrders.mailer_klass.subscription_trial_expired(subscribable).deliver_now
|
48
48
|
end
|
49
49
|
|
50
50
|
next if subscribable.trial_past_due? # We already notified them
|
@@ -53,7 +53,7 @@ namespace :effective_orders do
|
|
53
53
|
|
54
54
|
reminders.each do |remind_at|
|
55
55
|
next unless today == (date + remind_at)
|
56
|
-
|
56
|
+
EffectiveOrders.mailer_klass.subscription_trialing(subscribable).deliver_now
|
57
57
|
end
|
58
58
|
end
|
59
59
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_orders
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -156,7 +156,6 @@ files:
|
|
156
156
|
- app/models/concerns/acts_as_purchasable.rb
|
157
157
|
- app/models/concerns/acts_as_subscribable.rb
|
158
158
|
- app/models/concerns/acts_as_subscribable_buyer.rb
|
159
|
-
- app/models/effective/access_denied.rb
|
160
159
|
- app/models/effective/cart.rb
|
161
160
|
- app/models/effective/cart_item.rb
|
162
161
|
- app/models/effective/customer.rb
|
@@ -1,17 +0,0 @@
|
|
1
|
-
unless defined?(Effective::AccessDenied)
|
2
|
-
module Effective
|
3
|
-
class AccessDenied < StandardError
|
4
|
-
attr_reader :action, :subject
|
5
|
-
|
6
|
-
def initialize(message = nil, action = nil, subject = nil)
|
7
|
-
@message = message
|
8
|
-
@action = action
|
9
|
-
@subject = subject
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
@message || I18n.t(:'unauthorized.default', :default => 'Access Denied')
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|