Sha256: de88a87ccc88f182dd241b0e224b298c2345a55d631258800f5ab376c63b677c

Contents?: true

Size: 1.83 KB

Versions: 1

Compression:

Stored size: 1.83 KB

Contents

module Freemium
  module CouponRedemption

    def self.included(base)
      base.class_eval do
        belongs_to :subscription, :class_name => "Subscription"
        belongs_to :coupon, :class_name => "Coupon"

        before_validation :upgrade_plan_automatically
        before_create :set_redeemed_on

        validates_presence_of :coupon
        validates_presence_of :subscription
        validates_uniqueness_of :coupon_id, :scope => :subscription_id, :message => "has already been applied"
        validate :custom_validation, :on => :create
      end
    end

    def expire!(date = Date.today)
      self.update_attribute :expired_on, date
    end

    def active?(date = Date.today)
      expires_on ? date <= self.expires_on : true
    end

    def expires_on
      return nil unless self.coupon.duration_in_months
      self.redeemed_on + self.coupon.duration_in_months.months
    end

    def redeemed_on
      self['redeemed_on'] || Date.today
    end

    protected

    def set_redeemed_on
      self.redeemed_on = Date.today
    end

    def upgrade_plan_automatically
      if self.coupon &&
         self.coupon.discount_percentage == 100 &&
         self.coupon.subscription_plans.count == 1 &&
         self.coupon.subscription_plans.first.rate > self.subscription.subscription_plan.rate

        self.subscription.subscription_plan = self.coupon.subscription_plans.first
      end
    end

    def custom_validation
      errors.add :subscription,  "must be paid"             if self.subscription && !self.subscription.subscription_plan.paid?
      errors.add :coupon,  "has expired"                    if self.coupon && (self.coupon.expired? || self.coupon.expired?)
      errors.add :coupon,  "is not valid for selected plan" if self.coupon && self.subscription && !self.coupon.applies_to_plan?(self.subscription.subscription_plan)
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
freemium-ajb-0.0.4 lib/freemium/coupon_redemption.rb