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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +14 -86
  4. data/app/controllers/admin/customers_controller.rb +5 -16
  5. data/app/controllers/admin/order_items_controller.rb +6 -9
  6. data/app/controllers/admin/orders_controller.rb +18 -82
  7. data/app/controllers/effective/carts_controller.rb +10 -6
  8. data/app/controllers/effective/customers_controller.rb +4 -2
  9. data/app/controllers/effective/orders_controller.rb +30 -26
  10. data/app/controllers/effective/providers/cheque.rb +3 -1
  11. data/app/controllers/effective/providers/free.rb +3 -1
  12. data/app/controllers/effective/providers/mark_as_paid.rb +4 -2
  13. data/app/controllers/effective/providers/moneris.rb +3 -1
  14. data/app/controllers/effective/providers/paypal.rb +3 -2
  15. data/app/controllers/effective/providers/phone.rb +3 -1
  16. data/app/controllers/effective/providers/pretend.rb +3 -1
  17. data/app/controllers/effective/providers/refund.rb +3 -1
  18. data/app/controllers/effective/providers/stripe.rb +3 -1
  19. data/app/controllers/effective/subscripter_controller.rb +4 -2
  20. data/app/controllers/effective/webhooks_controller.rb +12 -3
  21. data/app/datatables/admin/effective_customers_datatable.rb +7 -3
  22. data/app/datatables/admin/effective_orders_datatable.rb +2 -2
  23. data/app/datatables/effective_orders_datatable.rb +1 -1
  24. data/app/mailers/effective/orders_mailer.rb +131 -96
  25. data/app/models/concerns/acts_as_purchasable.rb +0 -11
  26. data/app/models/concerns/acts_as_subscribable.rb +0 -6
  27. data/app/models/effective/cart.rb +7 -5
  28. data/app/models/effective/cart_item.rb +7 -4
  29. data/app/models/effective/customer.rb +7 -6
  30. data/app/models/effective/order.rb +58 -38
  31. data/app/models/effective/order_item.rb +10 -8
  32. data/app/models/effective/product.rb +9 -6
  33. data/app/models/effective/subscription.rb +13 -12
  34. data/app/views/admin/orders/_form.html.haml +5 -9
  35. data/app/views/admin/orders/_order_item_fields.html.haml +8 -12
  36. data/app/views/effective/orders/_checkout_step2.html.haml +1 -2
  37. data/app/views/effective/orders/_order_actions.html.haml +1 -1
  38. data/config/effective_orders.rb +8 -32
  39. data/config/routes.rb +16 -17
  40. data/db/migrate/01_create_effective_orders.rb.erb +4 -0
  41. data/lib/effective_orders.rb +34 -76
  42. data/lib/effective_orders/engine.rb +0 -7
  43. data/lib/effective_orders/version.rb +1 -1
  44. data/lib/generators/templates/effective_orders_mailer_preview.rb +13 -13
  45. data/lib/tasks/effective_orders_tasks.rake +2 -2
  46. metadata +2 -3
  47. 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 :module => 'effective' do
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 if EffectiveOrders.free?
11
- post :mark_as_paid if EffectiveOrders.mark_as_paid?
12
- post :cheque if EffectiveOrders.cheque?
13
- post :phone if EffectiveOrders.phone?
14
- post :pretend if EffectiveOrders.pretend?
15
- post :refund if EffectiveOrders.refund?
16
- post :stripe if EffectiveOrders.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 if EffectiveOrders.moneris?
23
- post :paypal_postback if EffectiveOrders.paypal?
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
- if EffectiveOrders.subscriptions?
30
- match 'subscribe', to: 'subscripter#update', via: :post, as: :subscripter
31
-
32
- match 'customer/settings', to: 'customers#edit', as: :customer_settings, via: [:get]
33
- match 'customer/settings', to: 'customers#update', via: [:patch, :put, :post]
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
@@ -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
- PENDING = 'pending'.freeze # New orders are created in a pending state
7
- CONFIRMED = 'confirmed'.freeze # Once the order has passed checkout step 1
8
- DEFERRED = 'deferred'.freeze # Deferred providers. Cheque or Phone was selected.
9
- PURCHASED = 'purchased'.freeze # Purchased by provider
10
- DECLINED = 'declined'.freeze # Declined by provider
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'.freeze
16
- PAST_DUE = 'past_due'.freeze
17
- TRIALING = 'trialing'.freeze
18
- CANCELED = 'canceled'.freeze
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
- # The following are all valid config keys
23
- mattr_accessor :orders_table_name
24
- mattr_accessor :order_items_table_name
25
- mattr_accessor :carts_table_name
26
- mattr_accessor :cart_items_table_name
27
- mattr_accessor :customers_table_name
28
- mattr_accessor :subscriptions_table_name
29
- mattr_accessor :products_table_name
30
-
31
- mattr_accessor :authorization_method
32
-
33
- mattr_accessor :layout
34
- mattr_accessor :mailer
35
-
36
- mattr_accessor :orders_collection_scope
37
- mattr_accessor :order_tax_rate_method
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
- def self.authorize!(controller, action, resource)
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
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '4.6.0'.freeze
2
+ VERSION = '5.0.1'.freeze
3
3
  end
@@ -4,55 +4,55 @@
4
4
 
5
5
  class EffectiveOrdersMailerPreview < ActionMailer::Preview
6
6
  def order_receipt_to_admin
7
- Effective::OrdersMailer.order_receipt_to_admin(build_preview_order)
7
+ EffectiveOrders.mailer_klass.order_receipt_to_admin(build_preview_order)
8
8
  end
9
9
 
10
10
  def order_receipt_to_buyer
11
- Effective::OrdersMailer.order_receipt_to_buyer(build_preview_order)
11
+ EffectiveOrders.mailer_klass.order_receipt_to_buyer(build_preview_order)
12
12
  end
13
13
 
14
14
  def payment_request_to_buyer
15
- Effective::OrdersMailer.payment_request_to_buyer(build_preview_order)
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
- Effective::OrdersMailer.pending_order_invoice_to_buyer(build_preview_order)
19
+ EffectiveOrders.mailer_klass.pending_order_invoice_to_buyer(build_preview_order)
20
20
  end
21
21
 
22
22
  def subscription_payment_succeeded
23
- Effective::OrdersMailer.subscription_payment_succeeded(preview_customer)
23
+ EffectiveOrders.mailer_klass.subscription_payment_succeeded(preview_customer)
24
24
  end
25
25
 
26
26
  def subscription_payment_failed
27
- Effective::OrdersMailer.subscription_payment_failed(preview_customer)
27
+ EffectiveOrders.mailer_klass.subscription_payment_failed(preview_customer)
28
28
  end
29
29
 
30
30
  def subscription_created
31
- Effective::OrdersMailer.subscription_created(preview_customer)
31
+ EffectiveOrders.mailer_klass.subscription_created(preview_customer)
32
32
  end
33
33
 
34
34
  def subscription_updated
35
- Effective::OrdersMailer.subscription_updated(preview_customer)
35
+ EffectiveOrders.mailer_klass.subscription_updated(preview_customer)
36
36
  end
37
37
 
38
38
  def subscription_canceled
39
- Effective::OrdersMailer.subscription_canceled(preview_customer)
39
+ EffectiveOrders.mailer_klass.subscription_canceled(preview_customer)
40
40
  end
41
41
 
42
42
  def subscription_trialing
43
- Effective::OrdersMailer.subscription_trialing(preview_subscribable)
43
+ EffectiveOrders.mailer_klass.subscription_trialing(preview_subscribable)
44
44
  end
45
45
 
46
46
  def subscription_trial_expired
47
- Effective::OrdersMailer.subscription_trial_expired(preview_subscribable)
47
+ EffectiveOrders.mailer_klass.subscription_trial_expired(preview_subscribable)
48
48
  end
49
49
 
50
50
  def subscription_event_to_admin
51
- Effective::OrdersMailer.subscription_event_to_admin(:subscription_updated, preview_customer)
51
+ EffectiveOrders.mailer_klass.subscription_event_to_admin(:subscription_updated, preview_customer)
52
52
  end
53
53
 
54
54
  def order_error
55
- Effective::OrdersMailer.order_error(order: build_preview_order, error: 'Something did not work out')
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
- Effective::OrdersMailer.subscription_trial_expired(subscribable).deliver_now
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
- Effective::OrdersMailer.subscription_trialing(subscribable).deliver_now
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.6.0
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-02-24 00:00:00.000000000 Z
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