effective_resources 1.9.13 → 1.9.17

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed166aa8aeaf93b66de29429230623cad83d1b55f61b550f0b6e028d619c7362
4
- data.tar.gz: 2843fd945c1c9dde784387b7db0d8b38187542f54aeaadee71876a1933c2c46f
3
+ metadata.gz: 9b69f74d07daa22a1733f0c9a9834056c614e025f70382f5c5bbae286d3bf066
4
+ data.tar.gz: 18517fd35b619d93f979a2536e0feed6d007306e47028beb70b21f6afcb3dfaf
5
5
  SHA512:
6
- metadata.gz: 144e3041a712292e4a7becf6ff9e71c4092c50bff7ebbb06d13fc8f14f92c3ff9a1dcf3aaf20f4c5e5b06a1b6d52745930ab3fe877c88ca5f4c8c9d6a8ee16e3
7
- data.tar.gz: e69d047183677c0176e6ffd941983a73bedf40040e49d413f1ea738766193eb686b52bfdb0063c7ca2f1bd637b753264708a99d41d254479689d2c52cc042fcf
6
+ metadata.gz: 8ef58e8d1d3f02d64c1a0e9f5979b22db50dc47314b945906cbc89edae6147d733d77305353ab25798f512d0f182460525fae2cfe6c4c93f919717d743670f32
7
+ data.tar.gz: 42b9e8c8ac3878d56d1f71f429c40cae535e23bbb43fe76b0b70deb3917779bb60c52a9122bbd5c0d057fc70778f4983c47d7ac5c3cd0024cdb0fbace2fe640f
@@ -17,6 +17,7 @@ module Effective
17
17
  def show
18
18
  Rails.logger.info 'Processed by Effective::WizardController#show'
19
19
 
20
+ run_callbacks(:resource_render)
20
21
  render_wizard
21
22
  end
22
23
 
@@ -69,6 +69,13 @@ module Effective
69
69
  @page_title ||= resource_wizard_step_title(resource, step)
70
70
  end
71
71
 
72
+ def ready_checkout
73
+ return unless step == :checkout
74
+ return unless resource.class.try(:acts_as_purchasable_wizard?)
75
+
76
+ resource.ready!
77
+ end
78
+
72
79
  end
73
80
  end
74
81
  end
@@ -25,6 +25,8 @@ module Effective
25
25
 
26
26
  before_action :assign_current_step
27
27
  before_action :assign_page_title
28
+
29
+ before_action :ready_checkout
28
30
  end
29
31
 
30
32
  helper_method :resource
@@ -0,0 +1,128 @@
1
+ # ActsAsPurchasableWizard
2
+ #
3
+
4
+ module ActsAsPurchasableWizard
5
+ extend ActiveSupport::Concern
6
+
7
+ module Base
8
+ def acts_as_purchasable_wizard
9
+ raise('please declare acts_as_wizard first') unless respond_to?(:acts_as_wizard?)
10
+ raise('please declare acts_as_purchasable_parent first') unless respond_to?(:acts_as_purchasable_parent?)
11
+
12
+ unless (const_get(:WIZARD_STEPS).keys & [:billing, :checkout, :submitted]).length == 3
13
+ raise('please include a :billing, :checkout and :submitted step')
14
+ end
15
+
16
+ include ::ActsAsPurchasableWizard
17
+ end
18
+ end
19
+
20
+ included do
21
+ validates :owner, presence: true
22
+
23
+ # Billing Step
24
+ validate(if: -> { current_step == :billing && owner.present? }) do
25
+ self.errors.add(:base, "must have a billing address") unless owner.billing_address.present?
26
+ self.errors.add(:base, "must have an email") unless owner.email.present?
27
+ end
28
+
29
+ after_purchase do |_|
30
+ raise('expected submit_order to be purchased') unless submit_order&.purchased?
31
+ before_submit_purchased!
32
+ submit_purchased!
33
+ after_submit_purchased!
34
+ end
35
+ end
36
+
37
+ # All Fees and Orders
38
+ def submit_fees
39
+ raise('to be implemented by caller')
40
+ end
41
+
42
+ def submit_order
43
+ orders.first
44
+ end
45
+
46
+ def find_or_build_submit_fees
47
+ submit_fees
48
+ end
49
+
50
+ def find_or_build_submit_order
51
+ order = submit_order || orders.build(user: owner)
52
+ fees = submit_fees()
53
+
54
+ # Adds fees, but does not overwrite any existing price.
55
+ fees.each do |fee|
56
+ order.add(fee) unless order.purchasables.include?(fee)
57
+ end
58
+
59
+ order.purchasables.each do |purchasable|
60
+ order.remove(purchasable) unless fees.include?(purchasable)
61
+ end
62
+
63
+ # From Billing Step
64
+ order.billing_address = owner.billing_address if owner.billing_address.present?
65
+
66
+ # Important to add/remove anything
67
+ order.save!
68
+
69
+ order
70
+ end
71
+
72
+ # Should be indempotent.
73
+ def build_submit_fees_and_order
74
+ return false if was_submitted?
75
+
76
+ fees = find_or_build_submit_fees()
77
+ raise('already has purchased submit fees') if fees.any?(&:purchased?)
78
+
79
+ order = find_or_build_submit_order()
80
+ raise('already has purchased submit order') if order.purchased?
81
+
82
+ true
83
+ end
84
+
85
+ # Owner clicks on the Billing step. Next step is Checkout
86
+ def billing!
87
+ ready! && save!
88
+ end
89
+
90
+ # Ready to check out
91
+ # This is called by the "ready_checkout" before_action in wizard_controller/before_actions.rb
92
+ def ready!
93
+ without_current_step do
94
+ build_submit_fees_and_order
95
+ save!
96
+ end
97
+ end
98
+
99
+ # Called automatically via after_purchase hook above
100
+ def submit_purchased!
101
+ return false if was_submitted?
102
+
103
+ wizard_steps[:checkout] = Time.zone.now
104
+ submit!
105
+ end
106
+
107
+ # A hook to extend
108
+ def before_submit_purchased!
109
+ end
110
+
111
+ def after_submit_purchased!
112
+ end
113
+
114
+ # Draft -> Submitted requirements
115
+ def submit!
116
+ raise('already submitted') if was_submitted?
117
+ raise('expected a purchased order') unless submit_order&.purchased?
118
+
119
+ wizard_steps[:checkout] ||= Time.zone.now
120
+ wizard_steps[:submitted] = Time.zone.now
121
+ submitted!
122
+ end
123
+
124
+ module ClassMethods
125
+ def acts_as_purchasable_wizard?; true; end
126
+ end
127
+
128
+ end
@@ -40,6 +40,7 @@ module ActsAsTokened
40
40
  end
41
41
 
42
42
  def to_global_id(**params)
43
+ params[:tenant] = Tenant.current if defined?(Tenant)
43
44
  GlobalID.new(URI::GID.build(app: Rails.application.config.global_id.app, model_name: model_name, model_id: to_param, params: params))
44
45
  end
45
46
 
@@ -50,9 +50,13 @@ module ActsAsWizard
50
50
  can_revisit_completed_steps(step)
51
51
  end
52
52
 
53
+ def wizard_step_keys
54
+ self.class.const_get(:WIZARD_STEPS).keys
55
+ end
56
+
53
57
  def required_steps
54
58
  return self.class.test_required_steps if Rails.env.test? && self.class.test_required_steps.present?
55
- self.class.const_get(:WIZARD_STEPS).keys
59
+ wizard_step_keys()
56
60
  end
57
61
 
58
62
  def wizard_step_title(step)
@@ -104,6 +108,16 @@ module ActsAsWizard
104
108
  has_completed_step?(required_steps.last)
105
109
  end
106
110
 
111
+ def without_current_step(&block)
112
+ existing = current_step
113
+
114
+ begin
115
+ self.current_step = nil; yield
116
+ ensure
117
+ self.current_step = existing
118
+ end
119
+ end
120
+
107
121
  private
108
122
 
109
123
  def can_revisit_completed_steps(step)
@@ -100,7 +100,9 @@ module Effective
100
100
  else # Maybe from a string field
101
101
  collection = relation.none
102
102
 
103
- relation.distinct("#{name}_type").pluck("#{name}_type").each do |klass_name|
103
+ relation.unscoped.distinct("#{name}_type").pluck("#{name}_type").each do |klass_name|
104
+ next if klass_name.nil?
105
+
104
106
  resource = Effective::Resource.new(klass_name)
105
107
  next unless resource.klass.present?
106
108
 
@@ -28,6 +28,7 @@ module EffectiveResources
28
28
  ActiveRecord::Base.extend(ActsAsSlugged::Base)
29
29
  ActiveRecord::Base.extend(ActsAsStatused::Base)
30
30
  ActiveRecord::Base.extend(ActsAsWizard::Base)
31
+ ActiveRecord::Base.extend(ActsAsPurchasableWizard::Base)
31
32
  ActiveRecord::Base.extend(HasManyRichTexts::Base)
32
33
 
33
34
  ActiveRecord::Base.extend(EffectiveDeviseUser::Base)
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '1.9.13'.freeze
2
+ VERSION = '1.9.17'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.13
4
+ version: 1.9.17
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-12-28 00:00:00.000000000 Z
11
+ date: 2022-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -153,6 +153,7 @@ files:
153
153
  - app/helpers/effective_resources_wizard_helper.rb
154
154
  - app/models/concerns/acts_as_archived.rb
155
155
  - app/models/concerns/acts_as_email_form.rb
156
+ - app/models/concerns/acts_as_purchasable_wizard.rb
156
157
  - app/models/concerns/acts_as_slugged.rb
157
158
  - app/models/concerns/acts_as_statused.rb
158
159
  - app/models/concerns/acts_as_tokened.rb