Module: ActsAsPurchasableWizard

Extended by:
ActiveSupport::Concern
Defined in:
app/models/concerns/acts_as_purchasable_wizard.rb

Overview

ActsAsPurchasableWizard

Defined Under Namespace

Modules: Base, ClassMethods

Instance Method Summary collapse

Instance Method Details

#after_submit_purchased!Object



115
116
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 115

def after_submit_purchased!
end

#before_submit_purchased!Object

A hook to extend



112
113
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 112

def before_submit_purchased!
end

#billing!Object

Owner clicks on the Billing step. Next step is Checkout



90
91
92
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 90

def billing!
  ready! && save!
end

#build_submit_fees_and_orderObject

Should be indempotent.



77
78
79
80
81
82
83
84
85
86
87
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 77

def build_submit_fees_and_order
  return false if 

  fees = find_or_build_submit_fees()
  raise('already has purchased submit fees') if fees.any?(&:purchased?)

  order = find_or_build_submit_order()
  raise('already has purchased submit order') if order.purchased?

  true
end

#find_or_build_submit_feesObject



46
47
48
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 46

def find_or_build_submit_fees
  submit_fees
end

#find_or_build_submit_orderObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 50

def find_or_build_submit_order
  order = submit_order || orders.build(user: owner) # This is polymorphic user, might be an organization
  fees = submit_fees().reject { |fee| fee.marked_for_destruction? }

  # A membership could go from individual to organization
  order.user = owner

  # Adds fees, but does not overwrite any existing price.
  fees.each do |fee|
    order.add(fee) unless order.purchasables.include?(fee)
  end

  order.order_items.each do |order_item|
    fee = fees.find { |fee| fee == order_item.purchasable }
    order.remove(order_item) unless fee.present?
  end

  # From Billing Step
  order.billing_address = owner.billing_address if owner.try(:billing_address).present?

  # Important to add/remove anything
  order.save!

  order
end

#ready!Object

Ready to check out This is called by the “ready_checkout” before_action in wizard_controller/before_actions.rb



96
97
98
99
100
101
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 96

def ready!
  without_current_step do
    build_submit_fees_and_order
    save!
  end
end

#submit!Object

Draft -> Submitted requirements



119
120
121
122
123
124
125
126
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 119

def submit!
  raise('already submitted') if 
  raise('expected a purchased order') unless submit_order&.purchased?

  wizard_steps[:checkout] ||= Time.zone.now
  wizard_steps[:submitted] = Time.zone.now
  
end

#submit_feesObject

All Fees and Orders



38
39
40
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 38

def submit_fees
  raise('to be implemented by caller')
end

#submit_orderObject



42
43
44
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 42

def submit_order
  orders.first
end

#submit_purchased!Object

Called automatically via after_purchase hook above



104
105
106
107
108
109
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 104

def submit_purchased!
  return false if 

  wizard_steps[:checkout] = Time.zone.now
  submit!
end