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 +4 -4
- data/app/controllers/concerns/effective/wizard_controller/actions.rb +1 -0
- data/app/controllers/concerns/effective/wizard_controller/before_actions.rb +7 -0
- data/app/controllers/concerns/effective/wizard_controller.rb +2 -0
- data/app/models/concerns/acts_as_purchasable_wizard.rb +129 -0
- data/app/models/concerns/acts_as_tokened.rb +1 -0
- data/app/models/concerns/acts_as_wizard.rb +15 -1
- data/lib/effective_resources/engine.rb +1 -0
- data/lib/effective_resources/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5c9b933021449f0eb3d4ae100ff09fa9aa4af1efbff1e3ee29bdbbf7204a264
|
4
|
+
data.tar.gz: db60abded322951ceb47c9f75c8a19743ff6989a29b0441bc9c55915481a92ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d09592ecbb18c8b4310d374f19e2a30d63522c4d34ff27ef795eb3e0aef4e441305872012fa1cf6fa6519998e33a9dd86237abd5fe50ab878543292def7a390
|
7
|
+
data.tar.gz: 6f4e36f8181d3673739d72dc19750b68e3f239d5d911dcf9399c24be92a9f1716fb709c41345252506689eb1b220dfd91212b2213aa76cf8b05b976600c9a980
|
@@ -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
|
@@ -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
|
-
|
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)
|
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.
|
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-
|
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
|