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

183 lines
4.7 KiB
Ruby

# 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'
CARD_TYPES =
[
JAM_TRACKS_5,
JAM_TRACKS_10,
JAM_CLASS_4
]
belongs_to :user, class_name: "JamRuby::User"
belongs_to :retailer, class_name: "JamRuby::Retailer"
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"
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
def is_lesson_posa_card?
card_type == JAM_CLASS_4
end
def credits
if card_type == JAM_TRACKS_5
5
elsif card_type == JAM_TRACKS_10
10
elsif card_type == JAM_CLASS_4
4
else
raise "unknown card type #{card_type}"
end
end
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
if user && claimed_at && claimed_at_was && claimed_at_changed?
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
if claimed_at && !activated_at
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
user.gifted_jamtracks += 5
elsif card_type == JAM_TRACKS_10
user.gifted_jamtracks += 10
elsif card_type == JAM_CLASS_4
user.jamclass_credits += 4
else
raise "unknown card type #{card_type}"
end
user.save!
end
end
def lesson_package_type
if card_type == JAM_TRACKS_5
raise 'not a lesson package: ' + card_type
elsif card_type == JAM_TRACKS_10
raise 'not a lesson package: ' + card_type
elsif card_type == JAM_CLASS_4
LessonPackageType.test_drive_4
else
raise "unknown card type #{card_type}"
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'
elsif card_type == JAM_CLASS_4
price = 49.99
plan_code = 'posa-jamclass-4'
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
self.save
end
def claim(user)
self.user = user
self.claimed_at = Time.now
if self.save
UserWhitelist.card_create(user, 'posa')
SaleLineItem.associate_user_for_posa(self, user)
# when you claim a POSA card, you are also making a LessonPackagePurchase
if is_lesson_posa_card?
purchase = LessonPackagePurchase.create(user, nil, lesson_package_type, nil, nil, self) if purchase.nil?
end
end
end
def short_display
if card_type == JAM_TRACKS_5
'JT-5'
elsif card_type == JAM_TRACKS_10
'JT-10'
elsif card_type == JAM_CLASS_4
'JC-4'
else
raise "unknown card type #{card_type}"
end
end
def to_s
"POSA #{short_display} #{code}"
end
end
end