module MultiCurrency::ClassMethods

Public Instance Methods

multi_currency_columns() click to toggle source
# File lib/multi_currency.rb, line 11
def multi_currency_columns
  @@multi_currency_columns ||= []
end
multi_currency_columns=(columns) click to toggle source
# File lib/multi_currency.rb, line 15
def multi_currency_columns=(columns)
  if columns.is_a? Array
    @@multi_currency_columns = columns
  else
    raise "Multi currency columns should be an array"
  end
end
multi_currency_for(columns) click to toggle source
# File lib/multi_currency.rb, line 23
def multi_currency_for(columns)
  multi_currency_columns = columns
  multi_currency_columns.each do |column|
    define_singleton_method "sum_#{column}" do |currency, date = nil|
      formatted_date = date.nil? ? "#{column}_rate_date" : "'#{date.strftime("%Y-%m-%d")}'"
      self.where(
          "#{column}_currency IS NOT NULL AND #{column} IS NOT NULL").
        sum("
          CASE #{column}_currency
            WHEN '#{currency.downcase}' THEN #{column}
            ELSE #{column} * (SELECT exchange_rates.rate FROM exchange_rates WHERE (exchange_rates.from_code = #{column}_currency AND to_code = '#{currency.downcase}' AND date = #{formatted_date}) )
          END").to_f
    end

    define_method "#{column}_in" do |currency_code, date = nil|
      if self.send("#{column}_source_amount").present? && self.send("#{column}_source_currency").present?
        date = self.send("#{column}_rate_date") if date.nil?
        default_currency = self.send("#{column}_currency") rescue MultiCurrency.configuration.default_currency
        rate = MultiCurrency.configuration.default_converter.get_rate_and_cache(default_currency, currency_code, date)
        return self.send(column) * rate
      else
        return nil
      end
    end
  end

  define_method "do_currency_exchange" do
    multi_currency_columns.each do |column|
      if self.send("#{column}_source_amount").present? && self.send("#{column}_source_currency").present?
        eval("self.#{column}_currency = '#{MultiCurrency.configuration.default_currency.downcase}'")
        date = self.send("#{column}_rate_date") || Date.today
        eval("self.#{column}_rate_date = date")
        rate = MultiCurrency.configuration.default_converter.
          get_rate_and_cache(self.send("#{column}_source_currency"), self.send("#{column}_currency"), date)
        eval("self.#{column} = self.#{column}_source_amount * rate")
      else
        eval("self.#{column}_source_amount = nil")
        eval("self.#{column}_source_currency = nil")
        eval("self.#{column}_rate_date = nil")
        eval("self.#{column}_currency = nil")
        eval("self.#{column} = nil")
      end
    end
  end

end