112 lines
3.7 KiB
Ruby
112 lines
3.7 KiB
Ruby
module JamRuby
|
|
class ShoppingCart < ActiveRecord::Base
|
|
|
|
attr_accessible :quantity, :cart_type, :product_info
|
|
|
|
belongs_to :user, :inverse_of => :shopping_carts, :class_name => "JamRuby::User", :foreign_key => "user_id"
|
|
|
|
validates :cart_id, presence: true
|
|
validates :cart_type, presence: true
|
|
validates :cart_class_name, presence: true
|
|
validates :marked_for_redeem, numericality: {only_integer: true}
|
|
|
|
default_scope order('created_at DESC')
|
|
|
|
def product_info
|
|
product = self.cart_product
|
|
{name: product.name, price: product.price, product_id: cart_id, plan_code: product.plan_code, total_price: total_price(product), quantity: quantity, marked_for_redeem: marked_for_redeem} unless product.nil?
|
|
end
|
|
|
|
# multiply (quantity - redeemable) by price
|
|
def total_price(product)
|
|
(quantity - marked_for_redeem) * product.price
|
|
end
|
|
|
|
def cart_product
|
|
self.cart_class_name.classify.constantize.find_by_id(self.cart_id) unless self.cart_class_name.blank?
|
|
end
|
|
|
|
def redeem(mark_redeem)
|
|
self.marked_for_redeem = mark_redeem ? 1 : 0
|
|
end
|
|
|
|
def free?
|
|
marked_for_redeem == quantity
|
|
end
|
|
|
|
def self.create user, product, quantity = 1, mark_redeem = false
|
|
cart = ShoppingCart.new
|
|
if user.is_a?(User)
|
|
cart.user = user
|
|
else
|
|
cart.anonymous_user_id = user.id
|
|
end
|
|
|
|
cart.cart_type = product.class::PRODUCT_TYPE
|
|
cart.cart_class_name = product.class.name
|
|
cart.cart_id = product.id
|
|
cart.quantity = quantity
|
|
cart.redeem(mark_redeem)
|
|
cart.save
|
|
cart
|
|
end
|
|
|
|
# if the user has a redeemable jam_track still on their account, then also check if any shopping carts have already been marked.
|
|
# if no shpping carts have been marked, then mark it redeemable
|
|
# should be wrapped in a TRANSACTION
|
|
def self.user_has_redeemable_jam_track?(any_user)
|
|
mark_redeem = false
|
|
if APP_CONFIG.one_free_jamtrack_per_user && any_user.has_redeemable_jamtrack
|
|
mark_redeem = true # start out assuming we can redeem...
|
|
any_user.shopping_carts.each do |shopping_cart|
|
|
# but if we find any shopping cart item already marked for redeem, then back out of mark_redeem=true
|
|
if shopping_cart.cart_type == JamTrack::PRODUCT_TYPE && shopping_cart.marked_for_redeem > 0
|
|
mark_redeem = false
|
|
break
|
|
end
|
|
end
|
|
end
|
|
mark_redeem
|
|
end
|
|
|
|
# adds a jam_track to cart, checking for promotions
|
|
def self.add_jam_track_to_cart(any_user, jam_track)
|
|
cart = nil
|
|
ShoppingCart.transaction do
|
|
# does this user already have this JamTrack in their cart? If so, don't add it.
|
|
|
|
duplicate_found = false
|
|
any_user.shopping_carts.each do |shopping_cart|
|
|
if shopping_cart.cart_type == JamTrack::PRODUCT_TYPE && shopping_cart.cart_id == jam_track.id
|
|
duplicate_found = true
|
|
return
|
|
end
|
|
end
|
|
|
|
unless duplicate_found
|
|
mark_redeem = ShoppingCart.user_has_redeemable_jam_track?(any_user)
|
|
cart = ShoppingCart.create(any_user, jam_track, 1, mark_redeem)
|
|
end
|
|
end
|
|
cart
|
|
end
|
|
|
|
# deletes a jam track from the shopping cart, updating redeem flag as necessary
|
|
def self.remove_jam_track_from_cart(any_user, cart)
|
|
ShoppingCart.transaction do
|
|
cart.destroy
|
|
# check if we should move the redemption
|
|
mark_redeem = ShoppingCart.user_has_redeemable_jam_track?(any_user)
|
|
|
|
carts = any_user.shopping_carts
|
|
|
|
# if we find any carts on the account, mark one redeemable
|
|
if mark_redeem && carts.length > 0
|
|
carts[0].redeem(mark_redeem)
|
|
carts[0].save
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end |