I added the features for users to use promotion code and for promoters to create on their events. May be rewrite to discount code?
43 lines
1.0 KiB
Ruby
43 lines
1.0 KiB
Ruby
class PromotionCode < ApplicationRecord
|
|
# Validations
|
|
validates :code, presence: true, uniqueness: true
|
|
validates :discount_amount_cents, numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
# Scopes
|
|
scope :active, -> { where(active: true) }
|
|
scope :expired, -> { where("expires_at < ? OR active = ?", Time.current, false) }
|
|
scope :valid, -> { active.where("expires_at > ? OR expires_at IS NULL", Time.current) }
|
|
|
|
# Callbacks
|
|
before_create :increment_uses_count
|
|
|
|
# Associations
|
|
belongs_to :user
|
|
belongs_to :event
|
|
has_many :order_promotion_codes
|
|
has_many :orders, through: :order_promotion_codes
|
|
|
|
# Instance methods
|
|
def discount_amount_euros
|
|
discount_amount_cents / 100.0
|
|
end
|
|
|
|
def active?
|
|
active && (expires_at.nil? || expires_at > Time.current)
|
|
end
|
|
|
|
def expired?
|
|
expires_at.present? && expires_at < Time.current
|
|
end
|
|
|
|
def can_be_used?
|
|
active? && (usage_limit.nil? || uses_count < usage_limit)
|
|
end
|
|
|
|
private
|
|
|
|
def increment_uses_count
|
|
self.uses_count ||= 0
|
|
end
|
|
end
|