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