effective_resources 1.9.14 → 1.9.18

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fa555e65ca74d65ab0bfbeef9b7dc8817e12951daf8ae8de6328512391a61aa
4
- data.tar.gz: 5a19481dee889d9b75d93523c2a8c8b3899c60eecb1496637cb7bf3c592f4421
3
+ metadata.gz: f5c9b933021449f0eb3d4ae100ff09fa9aa4af1efbff1e3ee29bdbbf7204a264
4
+ data.tar.gz: db60abded322951ceb47c9f75c8a19743ff6989a29b0441bc9c55915481a92ed
5
5
  SHA512:
6
- metadata.gz: 9c7d741ba719f1255fe53a1aecd195fcc78d70d29387c4a6f2cf8b989999b69effed19e5d18336521476dfc036362ca6c9ca9a829d3832c975f976ac89362208
7
- data.tar.gz: 2f363dd0624e8d7ab007e7e9e7446b557f1f8f311d348d4dcafeb8b99bd8cb14de50f24b0a508eae8a1c7f3b22d1c0d2aad25755caf85e649964a89a2f23fbe6
6
+ metadata.gz: 1d09592ecbb18c8b4310d374f19e2a30d63522c4d34ff27ef795eb3e0aef4e441305872012fa1cf6fa6519998e33a9dd86237abd5fe50ab878543292def7a390
7
+ data.tar.gz: 6f4e36f8181d3673739d72dc19750b68e3f239d5d911dcf9399c24be92a9f1716fb709c41345252506689eb1b220dfd91212b2213aa76cf8b05b976600c9a980
@@ -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,129 @@
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().reject { |fee| fee.marked_for_destruction? }
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.order_items.each do |order_item|
60
+ fee = fees.find { |fee| fee == order_item.purchasable }
61
+ order.remove(order_item) unless fee.present?
62
+ end
63
+
64
+ # From Billing Step
65
+ order.billing_address = owner.billing_address if owner.billing_address.present?
66
+
67
+ # Important to add/remove anything
68
+ order.save!
69
+
70
+ order
71
+ end
72
+
73
+ # Should be indempotent.
74
+ def build_submit_fees_and_order
75
+ return false if was_submitted?
76
+
77
+ fees = find_or_build_submit_fees()
78
+ raise('already has purchased submit fees') if fees.any?(&:purchased?)
79
+
80
+ order = find_or_build_submit_order()
81
+ raise('already has purchased submit order') if order.purchased?
82
+
83
+ true
84
+ end
85
+
86
+ # Owner clicks on the Billing step. Next step is Checkout
87
+ def billing!
88
+ ready! && save!
89
+ end
90
+
91
+ # Ready to check out
92
+ # This is called by the "ready_checkout" before_action in wizard_controller/before_actions.rb
93
+ def ready!
94
+ without_current_step do
95
+ build_submit_fees_and_order
96
+ save!
97
+ end
98
+ end
99
+
100
+ # Called automatically via after_purchase hook above
101
+ def submit_purchased!
102
+ return false if was_submitted?
103
+
104
+ wizard_steps[:checkout] = Time.zone.now
105
+ submit!
106
+ end
107
+
108
+ # A hook to extend
109
+ def before_submit_purchased!
110
+ end
111
+
112
+ def after_submit_purchased!
113
+ end
114
+
115
+ # Draft -> Submitted requirements
116
+ def submit!
117
+ raise('already submitted') if was_submitted?
118
+ raise('expected a purchased order') unless submit_order&.purchased?
119
+
120
+ wizard_steps[:checkout] ||= Time.zone.now
121
+ wizard_steps[:submitted] = Time.zone.now
122
+ submitted!
123
+ end
124
+
125
+ module ClassMethods
126
+ def acts_as_purchasable_wizard?; true; end
127
+ end
128
+
129
+ 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)
@@ -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.14'.freeze
2
+ VERSION = '1.9.18'.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.14
4
+ version: 1.9.18
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: 2022-01-05 00:00:00.000000000 Z
11
+ date: 2022-01-13 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