effective_resources 1.9.15 → 1.9.19

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: 7dd0112208ea9815fab0543b91b2ab24fd607d561a49b05d1f19ddffa4e6894b
4
- data.tar.gz: b9fc2f5ac59dc2cb164b4397995b81c8b1c855e045c6934fb2081f4ac9381db0
3
+ metadata.gz: db61d9867c96af5ca8c727700ab2c453bfc05a61394640a0c625ea656fd8b2a2
4
+ data.tar.gz: da861639cb20385b43db877442e77a17766b24ef416b127d211089cbe47e6879
5
5
  SHA512:
6
- metadata.gz: 41562bcb2c1f07e868fcea21088c9b676da9d43b193ad594affde4bc247d47713873f9fb56c63a58ca50b147d0a60905ae476544888e64ce709f22e5cd4dd859
7
- data.tar.gz: c0e9b28781244c3638f63ca6a6ce89ea811afe31774acb3911f6cc774ad57d61e4b803dde8423c81c39cb620a64be22a75b9a47e613c6da124a0699222763596
6
+ metadata.gz: 9b8d7940d66b6982338170336ae87595e7943f43ea6df15b32b12acbbe6e02904e921cfbb1ac5bcca09587955a1cdf2c3d12667121ed105aba30e3f95245ca13
7
+ data.tar.gz: 13446ebdf1422b9762442ea98a0f0902a4c8ed5fb82d784ee90a5e7b46f779782ef016bdbf5902cce13bc48f2358cc38651dc594ab9b044ff06226f426ddd0e0
@@ -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
@@ -14,8 +14,8 @@ module EffectiveResourcesWizardHelper
14
14
  return sidebar unless block_given?
15
15
 
16
16
  content_tag(:div, class: 'row') do
17
- content_tag(:div, class: 'col-3') { sidebar } +
18
- content_tag(:div, class: 'col-9') { yield }
17
+ content_tag(:div, class: 'col-lg-3') { sidebar } +
18
+ content_tag(:div, class: 'col-lg-9') { yield }
19
19
  end
20
20
  end
21
21
 
@@ -28,10 +28,10 @@ module EffectiveResourcesWizardHelper
28
28
  disabled = !resource.can_visit_step?(nav_step)
29
29
 
30
30
  label = [index, title].compact.join('. ')
31
- klass = ['list-group-item', ('active' if current), ('disabled' if disabled && !current)].compact.join(' ')
31
+ klass = ['list-group-item', 'list-group-item-action', ('active' if current), ('disabled' if disabled && !current)].compact.join(' ')
32
32
 
33
33
  if (current || disabled)
34
- content_tag(:li, label, class: klass)
34
+ content_tag(:a, label, class: klass)
35
35
  else
36
36
  link_to(label, wizard_path(nav_step), class: klass)
37
37
  end
@@ -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
@@ -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.15'.freeze
2
+ VERSION = '1.9.19'.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.15
4
+ version: 1.9.19
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-07 00:00:00.000000000 Z
11
+ date: 2022-01-18 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