mirror of
https://github.com/Growstuff/growstuff.git
synced 2026-02-01 05:01:04 -05:00
86 lines
2.4 KiB
Ruby
86 lines
2.4 KiB
Ruby
class Order < ActiveRecord::Base
|
|
belongs_to :member, with_deleted: true
|
|
|
|
has_many :order_items, dependent: :destroy
|
|
|
|
default_scope { order('created_at DESC') }
|
|
|
|
validates :referral_code, format: {
|
|
with: /\A[a-zA-Z0-9 ]*\z/,
|
|
message: "may only include letters and numbers"
|
|
}
|
|
|
|
before_save :standardize_referral_code
|
|
|
|
scope :by_member, ->(member) { where(member: member) }
|
|
|
|
# total price of an order
|
|
def total
|
|
sum = 0
|
|
order_items.each do |i|
|
|
subtotal = i.price * i.quantity
|
|
sum += subtotal
|
|
end
|
|
sum
|
|
end
|
|
|
|
# return items in the format ActiveMerchant/PayPal want them
|
|
def activemerchant_items
|
|
items = []
|
|
order_items.each do |i|
|
|
items.push(name: i.product.name,
|
|
quantity: i.quantity,
|
|
amount: i.price)
|
|
end
|
|
items
|
|
end
|
|
|
|
# record the paypal details for reference
|
|
def record_paypal_details(token)
|
|
self.paypal_express_token = token
|
|
details = EXPRESS_GATEWAY.details_for(token)
|
|
self.paypal_express_payer_id = details.payer_id
|
|
save
|
|
end
|
|
|
|
# when an order is completed, we update the member's account to mark
|
|
# them as paid, or whatever, based on what products they ordered
|
|
def update_account
|
|
order_items.each do |i|
|
|
member.update_account_after_purchase(i.product)
|
|
end
|
|
end
|
|
|
|
# removes whitespace and forces to uppercase (we're somewhat liberal
|
|
# in what we accept, but we clean it up anyway.)
|
|
def standardize_referral_code
|
|
self.referral_code = referral_code.upcase.gsub(/\s/, '') if referral_code
|
|
end
|
|
|
|
# search orders (used by admin/orders)
|
|
# usage: Order.search({ :by => 'member', :for => 'Skud' })
|
|
# can search by: member, order_id, paypal_token, paypal_payer_id,
|
|
def self.search(args = {})
|
|
if args[:for]
|
|
case args[:by]
|
|
when "member"
|
|
member = Member.with_deleted.find_by(login_name: args[:for])
|
|
return member.orders if member
|
|
when "order_id"
|
|
order = Order.find_by(id: args[:for])
|
|
return [order] if order
|
|
when "paypal_token"
|
|
order = Order.find_by(paypal_express_token: args[:for])
|
|
return [order] if order
|
|
when "paypal_payer_id"
|
|
order = Order.find_by(paypal_express_payer_id: args[:for])
|
|
return [order] if order
|
|
when "referral_code"
|
|
# coerce to uppercase
|
|
return Order.where(referral_code: args[:for].upcase)
|
|
end
|
|
end
|
|
[]
|
|
end
|
|
end
|