jam-cloud/ruby/lib/jam_ruby/models/posa_card.rb

206 lines
5.5 KiB
Ruby
Raw Permalink Normal View History

2016-08-31 09:19:16 +00:00
# represents the gift card you hold in your hand
module JamRuby
class PosaCard < ActiveRecord::Base
@@log = Logging.logger[PosaCard]
JAM_TRACKS_5 = 'jam_tracks_5'
JAM_TRACKS_10 = 'jam_tracks_10'
JAM_CLASS_4 = 'jam_class_4'
2017-07-10 02:21:29 +00:00
JAM_CLASS_2 = 'jam_class_2'
2016-08-31 09:19:16 +00:00
CARD_TYPES =
[
JAM_TRACKS_5,
JAM_TRACKS_10,
2017-07-10 02:21:29 +00:00
JAM_CLASS_4,
JAM_CLASS_2
2016-08-31 09:19:16 +00:00
]
belongs_to :user, class_name: "JamRuby::User"
belongs_to :retailer, class_name: "JamRuby::Retailer"
2017-07-10 02:21:29 +00:00
belongs_to :lesson_package_type, class_name: "JamRuby::LessonPackageType"
2016-08-31 09:19:16 +00:00
has_many :posa_card_purchases, class_name: 'JamRuby::PosaCardPurchase'
has_one :lesson_package_purchase, class_name: 'JamRuby::LessonPackagePurchase'
has_one :jam_track_right, class_name: "JamRuby::JamTrackRight"
2016-08-31 09:19:16 +00:00
2017-07-10 02:21:29 +00:00
2016-08-31 09:19:16 +00:00
validates :card_type, presence: true, inclusion: {in: CARD_TYPES}
validates :code, presence: true, uniqueness: true
after_save :check_attributed
validate :already_activated
validate :retailer_set
validate :already_claimed
validate :user_set
validate :must_be_activated
validate :within_one_year
2017-10-15 22:07:35 +00:00
def is_amazon_posa_card?
lesson_package_type.is_amazon?
end
def is_lesson_posa_card?
2017-07-10 02:21:29 +00:00
self.is_lesson
end
2017-10-15 21:42:45 +00:00
def self.find_by_amazon_code(code)
PosaCard.where('code ilike ?', code).where('lesson_package_type_id in (?)', LessonPackageType::AMAZON_PACKAGES).first
end
2016-09-27 02:56:12 +00:00
2016-08-31 09:19:16 +00:00
def already_activated
if activated_at && activated_at_was && activated_at_changed?
if retailer && retailer_id == retailer_id_was
self.errors.add(:activated_at, 'already activated. Please give card to customer. Thank you!')
else
self.errors.add(:activated_at, 'already activated by someone else. Please contact support@jamkaazm.com')
end
end
end
def within_one_year
2017-07-10 02:21:29 +00:00
if user && claimed_at && !claimed_at_was && claimed_at_changed?
2016-08-31 09:19:16 +00:00
if !user.can_claim_posa_card
self.errors.add(:claimed_at, 'was within 1 year')
end
end
end
def already_claimed
if claimed_at && claimed_at_was && claimed_at_changed?
self.errors.add(:claimed_at, 'already claimed')
end
end
def retailer_set
if activated_at && !retailer
self.errors.add(:retailer, 'must be specified')
end
end
def user_set
if claimed_at && !user
self.errors.add(:user, 'must be specified')
end
end
def must_be_activated
2017-07-10 02:21:29 +00:00
if claimed_at && !preactivate && !activated_at
2016-08-31 09:19:16 +00:00
self.errors.add(:activated_at, 'must already be set')
end
end
def check_attributed
if user && user_id_changed?
if card_type == JAM_TRACKS_5
2017-07-10 02:21:29 +00:00
user.gifted_jamtracks += credits
2016-08-31 09:19:16 +00:00
elsif card_type == JAM_TRACKS_10
2017-07-10 02:21:29 +00:00
user.gifted_jamtracks += credits
elsif is_lesson_posa_card?
user.jamclass_credits += credits
2016-08-31 09:19:16 +00:00
else
raise "unknown card type #{card_type}"
end
user.save!
end
end
def product_info
price = nil
plan_code = nil
if card_type == JAM_TRACKS_5
price = 9.99
plan_code = 'posa-jamtracks-5'
elsif card_type == JAM_TRACKS_10
price = 19.99
plan_code = 'posa-jatracks-10'
2017-07-10 02:21:29 +00:00
elsif is_lesson_posa_card?
price = lesson_package_type.price
plan_code = "posa-jamclass-#{credits}"
2016-08-31 09:19:16 +00:00
else
raise "unknown card type #{card_type}"
end
{price: price, quantity: 1, marked_for_redeem: false, plan_code: plan_code}
end
def self.activate(posa_card, retailer)
Sale.posa_activate(posa_card, retailer)
end
def activate(retailer)
self.activated_at = Time.now
self.retailer = retailer
2016-08-31 09:19:16 +00:00
self.save
end
2017-07-10 02:21:29 +00:00
def has_been_purchased(create_purchase)
if !purchased
#release flag on user account indicating they need to buy this card
user.lesson_package_needs_purchase = nil
user.save
# indicate this has been purchased
self.purchased = true
self.save
if is_lesson_posa_card? && create_purchase
LessonPackagePurchase.create(user, nil, lesson_package_type, nil, nil, self)
end
end
end
2016-08-31 09:19:16 +00:00
def claim(user)
self.user = user
self.claimed_at = Time.now
if self.save
2017-07-10 02:21:29 +00:00
if user.errors.any?
# happens on signup if bad email etc
return
end
2016-10-07 16:56:48 +00:00
UserWhitelist.card_create(user, 'posa')
2017-07-10 02:21:29 +00:00
if !preactivate
SaleLineItem.associate_user_for_posa(self, user)
end
if requires_purchase
# this is a flag on the account that makes it so the user can't buy any TD's on the payment page until they clear this up, because we've given them credits
user.lesson_package_needs_purchase = self.lesson_package_type
user.save
end
# when you claim a POSA card, you are also making a LessonPackagePurchase
if is_lesson_posa_card?
GuitarCenter.post_posa_claim(self)
2017-07-10 02:21:29 +00:00
if purchased
LessonPackagePurchase.create(user, nil, lesson_package_type, nil, nil, self)
end
end
end
2016-08-31 09:19:16 +00:00
end
2016-10-07 13:28:17 +00:00
def short_display
if card_type == JAM_TRACKS_5
'JT-5'
elsif card_type == JAM_TRACKS_10
'JT-10'
2017-07-10 02:21:29 +00:00
elsif is_lesson_posa_card?
"JC-#{credits}"
2016-10-07 13:28:17 +00:00
else
raise "unknown card type #{card_type}"
end
end
def to_s
"POSA #{short_display} #{code}"
end
2016-08-31 09:19:16 +00:00
end
end