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



125
126
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 125

def after_submit_purchased!
end

#before_submit_purchased!Object

A hook to extend



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

def before_submit_purchased!
end

#billing!Object

Owner clicks on the Billing step. Next step is Checkout



100
101
102
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 100

def billing!
  ready! && save!
end

#build_submit_fees_and_orderObject

Should be indempotent.



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 85

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('expected an Effective::Order') unless order.kind_of?(Effective::Order)
  raise('already has purchased submit order') if order.purchased?
  raise('unable to proceed with a voided submit order') if order.try(:voided?)

  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
81
82
# 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 but #{fee.id} had errors #{fee.errors.inspect}") 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?

  # This will update all order items to match the prices from their
  order.try(:update_purchasable_attributes)

  # 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



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

def ready!
  without_current_step do
    build_submit_fees_and_order
    save!
  end
end

#submit!Object

Draft -> Submitted requirements



129
130
131
132
133
134
135
136
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 129

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



114
115
116
117
118
119
# File 'app/models/concerns/acts_as_purchasable_wizard.rb', line 114

def submit_purchased!
  return false if 

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