effective_resources 1.9.16 → 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: e2aae5d9ac90fa652dad2f7a60995282a9347dbfbbfdb0b497d1c46db42d7fe4
4
- data.tar.gz: 9d19f8cc152193da25ab30c7a4bc43187f9e52fb4eb309c0751df134f2a76dbc
3
+ metadata.gz: 9b69f74d07daa22a1733f0c9a9834056c614e025f70382f5c5bbae286d3bf066
4
+ data.tar.gz: 18517fd35b619d93f979a2536e0feed6d007306e47028beb70b21f6afcb3dfaf
5
5
  SHA512:
6
- metadata.gz: 2f33925a5ae6b5eda2076f6a27607af422e02412db62b55d0b6175a77cff200c18450611c314680b54c7843b59bdc498b508b760c03221e47da2a6e62f59efb1
7
- data.tar.gz: 71e9ab7dd0e61db615b043455459dad0de6b4e199f14ed39a0eb88ac16558d8b33d55bb9e0b95a2412dd4fa630ef277b198636078825ddb66d5c6db68c6b9fd3
6
+ metadata.gz: 8ef58e8d1d3f02d64c1a0e9f5979b22db50dc47314b945906cbc89edae6147d733d77305353ab25798f512d0f182460525fae2cfe6c4c93f919717d743670f32
7
+ data.tar.gz: 42b9e8c8ac3878d56d1f71f429c40cae535e23bbb43fe76b0b70deb3917779bb60c52a9122bbd5c0d057fc70778f4983c47d7ac5c3cd0024cdb0fbace2fe640f
@@ -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
@@ -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.16'.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.16
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: 2022-01-11 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