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



121
122
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 121

def after_submit_purchased!
end

#before_submit_purchased!Object

A hook to extend



118
119
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 118

def before_submit_purchased!
end

#billing!Object

Owner clicks on the Billing step. Next step is Checkout



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

def billing!
  ready! && save!
end

#build_submit_fees_and_orderObject

Should be indempotent.



83
84
85
86
87
88
89
90
91
92
93
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 83

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
75
76
77
78
79
80
# 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? }

  # Make sure all Fees are valid
  fees.each do |fee|
    raise('expected a valid fee') unless fee.valid?
  end

  # 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
  # This will update the prices, but the purchasables must be persisted
  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



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

def ready!
  without_current_step do
    build_submit_fees_and_order
    save!
  end
end

#submit!Object

Draft -> Submitted requirements



125
126
127
128
129
130
131
132
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 125

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



110
111
112
113
114
115
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 110

def submit_purchased!
  return false if 

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