Module: ActsAsPurchasable

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

Defined Under Namespace

Modules: ActiveRecord, ClassMethods

Instance Method Summary collapse

Instance Method Details

#declined!(order = nil, order_item = nil) ⇒ Object



134
135
136
137
# File 'app/models/concerns/acts_as_purchasable.rb', line 134

def declined!(order = nil, order_item = nil)
  after_decline(order, order_item) if self.respond_to?(:after_decline)
  save!
end

#is_effectively_purchasable?Boolean

Regular instance methods

Returns:

  • (Boolean)


47
48
49
# File 'app/models/concerns/acts_as_purchasable.rb', line 47

def is_effectively_purchasable?
  true
end

#priceObject



51
52
53
# File 'app/models/concerns/acts_as_purchasable.rb', line 51

def price
  self[:price] || 0
end

#price=(value) ⇒ Object

If I have a column type of Integer, and I’m passed a non-Integer, convert it here



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/models/concerns/acts_as_purchasable.rb', line 56

def price=(value)
  integer_column = ((column_for_attribute('price').try(:type) rescue nil) == :integer) # Rails built in method to lookup datatype

  if integer_column == false
    super
  elsif value.kind_of?(Integer)
    super
  elsif value.kind_of?(String) && !value.include?('.') # Looks like an integer
    super
  else # Could be Float, BigDecimal, or String like 9.99
    super((value.to_f * 100.0).to_i)
  end
end

#purchased!(order = nil, order_item = nil) ⇒ Object



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

def purchased!(order = nil, order_item = nil)
  # begin
  #   self.quantity_purchased = (self.quantity_purchased + 1)
  # rescue
  # end

  after_purchase(order, order_item) if self.respond_to?(:after_purchase)
  save!
end

#purchased?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'app/models/concerns/acts_as_purchasable.rb', line 92

def purchased?
  @is_purchased ||= orders.any? { |order| order.purchased? }
end

#purchased_atObject



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

def purchased_at
  @purchased_at ||= orders.map { |order| order.purchased_at if order.purchased? }.compact.sort.first
end

#purchased_by?(user) ⇒ Boolean

Returns:

  • (Boolean)


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

def purchased_by?(user)
  orders.any? { |order| order.purchased? && order.user_id == user.id }
end

#purchased_download_urlObject

Override me if this is a digital purchase.



140
141
142
# File 'app/models/concerns/acts_as_purchasable.rb', line 140

def purchased_download_url
  false
end

#purchased_orderObject



108
109
110
# File 'app/models/concerns/acts_as_purchasable.rb', line 108

def purchased_order
  purchased_orders.first
end

#purchased_ordersObject



104
105
106
# File 'app/models/concerns/acts_as_purchasable.rb', line 104

def purchased_orders
  orders.select { |order| order.purchased? }
end

#quantity_enabled?Boolean

Returns:

  • (Boolean)


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

def quantity_enabled?
  self.respond_to?(:quantity_enabled) ? quantity_enabled == true : false
end

#quantity_remainingObject



116
117
118
# File 'app/models/concerns/acts_as_purchasable.rb', line 116

def quantity_remaining
  (quantity_max - quantity_purchased) rescue 0
end

#sellerObject



86
87
88
89
90
# File 'app/models/concerns/acts_as_purchasable.rb', line 86

def seller
  if EffectiveOrders.stripe_connect_enabled
    raise 'acts_as_purchasable object requires the seller be defined to return the User selling this item.  This is only a requirement when using StripeConnect.'
  end
end

#sold_out?Boolean

Returns:

  • (Boolean)


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

def sold_out?
  quantity_enabled? ? (quantity_remaining == 0) : false
end

#tax_exemptObject



74
75
76
# File 'app/models/concerns/acts_as_purchasable.rb', line 74

def tax_exempt
  self[:tax_exempt] || false
end

#tax_rateObject



78
79
80
81
82
83
84
# File 'app/models/concerns/acts_as_purchasable.rb', line 78

def tax_rate
  @tax_rate ||= (
    self.instance_exec(self, &EffectiveOrders.tax_rate_method).to_f.tap do |rate|
      raise ArgumentError.new("expected EffectiveOrders.tax_rate_method to return a value between 0 and 1. Received #{rate}. Please return 0.05 for 5% tax.") if (rate > 1.0 || rate < 0.0)
    end
  )
end

#titleObject



70
71
72
# File 'app/models/concerns/acts_as_purchasable.rb', line 70

def title
  self[:title] || to_s
end