ronzalo/spree_sales

View on GitHub
app/models/spree/variant_decorator.rb

Summary

Maintainability
A
35 mins
Test Coverage
Spree::Variant.class_eval do
  has_many :sale_prices, through: :prices

  delegate :sale_price, :original_price, :on_sale?, to: :default_price

  def put_on_sale value, params={}
    if !params[:currency] || (params[:currency] == "all_currencies") || (params[:currency] == :all_currencies)
      run_on_prices(true) {|p| p.put_on_sale value, params }
    elsif params[:currency]
      prices.find_by(currency: params[:currency]).put_on_sale(value, params) if prices.exists?(currency: params[:currency])
    end
  end
  alias_method :create_sale, :put_on_sale

  # TODO: make update_sale method

  def active_sale_in(currency)
    price_in(currency).active_sale
  end
  alias_method :current_sale_in, :active_sale_in

  def next_active_sale_in(currency)
    price_in(currency).next_active_sale
  end
  alias_method :next_current_sale_in, :next_active_sale_in

  def sale_price_in(currency)
    Spree::Price.new variant_id: id, currency: currency, amount: price_in(currency).sale_price
  end

  def discount_percent_in(currency)
    price_in(currency).discount_percent
  end

  def on_sale_in?(currency)
    price_in(currency).on_sale?
  end

  def original_price_in(currency)
    Spree::Price.new variant_id: id, currency: currency, amount: price_in(currency).original_price
  end

  def enable_sale(all_currencies=true)
    run_on_prices(all_currencies, &:enable_sale)
  end

  def disable_sale(all_currencies=true)
    run_on_prices(all_currencies, &:disable_sale)
  end

  def start_sale(end_time=nil, all_currencies=true)
    run_on_prices(all_currencies) {|p| p.start_sale end_time }
  end

  def stop_sale(all_currencies=true)
    run_on_prices(all_currencies, &:stop_sale)
  end

  private

  def run_on_prices(all_currencies)
    if all_currencies && prices.present?
      prices.each {|p| yield p }
    else
      yield default_price
    end
  end
end