Sha256: de47446cb7e5cfec4eba03fd9582a9d84a29b6714b909b7b2f7c88779be074c4

Contents?: true

Size: 1.92 KB

Versions: 21

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

require "money"

Money.rounding_mode = BigDecimal::ROUND_HALF_UP

# Creates accessors for money values
module Sequel::Plugins::MoneyAccessors
  MoneyClassRequired = Class.new(StandardError)

  module ClassMethods
    # Setup money accessor
    #
    # @param amount_column [Symbol] amount column
    # @param currency_column [Symbol] currency column
    # @example
    #   class Order < Sequel::Model
    #     money_accessor :amount, :currency
    #   end
    #
    #   order = Order.create(amount: 200, currency: "EUR")
    #   order.amount # => #<Money fractional:20000.0 currency:RUB>
    #   order.currency # => "EUR"
    def money_accessor(amount_column, currency_column)
      money_getter(amount_column, currency_column)
      money_setter(amount_column, currency_column)
    end

    def money_getter(amount_column, currency_column)
      include_accessors_module!
      @_money_accessors_module.module_eval do
        define_method(amount_column) do
          amount, currency = super(), send(currency_column)
          return unless amount && currency
          Money.from_amount(amount.to_d, currency)
        end
      end
    end

    def money_setter(amount_column, currency_column)
      include_accessors_module!
      @_money_accessors_module.module_eval do
        define_method("#{amount_column}=") do |value|
          case value
          when Money
            amount = value.to_d
            currency = value.currency.to_s
          when nil
            amount = currency = nil
          else
            raise MoneyClassRequired, "#{amount_column} value must be either Money instance or nil"
          end

          super(amount)
          send("#{currency_column}=", currency)
        end
      end
    end

    private

    def include_accessors_module!
      return if defined?(@_money_accessors_module)
      @_money_accessors_module = Module.new
      prepend @_money_accessors_module
    end
  end
end

Version data entries

21 entries across 21 versions & 1 rubygems

Version Path
umbrellio-sequel-plugins-0.9.0.79 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.9.0.76 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.8.0.73 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.7.0.52 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.6.0.46 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.6.0 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.6.0.36 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1.27 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1.26 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1.25 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1.18 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1.17 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.1 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.5.0 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.164 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.152 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.145 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.134 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.121 lib/sequel/plugins/money_accessors.rb
umbrellio-sequel-plugins-0.4.0.114 lib/sequel/plugins/money_accessors.rb