class MudratProjector::Transaction

Attributes

credits[RW]

Public Class Methods

new(params = {}) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 7
def initialize params = {}
  @date        = params.fetch :date
  self.credits = extract_entry_params :credit, params
  self.debits  = extract_entry_params :debit,  params
end

Public Instance Methods

balanced?() click to toggle source
# File lib/mudrat_projector/transaction.rb, line 13
def balanced?
  sum_credits = build_set_for_balance credits
  sum_debits  = build_set_for_balance debits
  (sum_credits ^ sum_debits).empty?
end
credits=(credits) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 19
def credits= credits
  @credits = build_entries :credit, credits
end
debits=(debits) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 23
def debits= debits
  @debits = build_entries :debit, debits
end
each(&block) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 27
def each &block
  credits.each &block
  debits.each &block
end
slice(slice_date) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 32
def slice slice_date
  if date > slice_date
    [[], self]
  else
    [[self], nil]
  end
end

Private Instance Methods

build_entries(credit_or_debit, entries) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 52
def build_entries credit_or_debit, entries
  entries.map do |entry_params|
    if entry_params.is_a? TransactionEntry
      entry_params
    else
      TransactionEntry.public_send "new_#{credit_or_debit}", entry_params
    end
  end
end
build_set_for_balance(entries) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 62
def build_set_for_balance entries
  hash = Hash.new { |h,k| h[k] = 0 }
  entries.each do |entry|
    balance_key = entry.class == TransactionEntry ? :fixed : entry.other_account_id
    hash[balance_key] += entry.scalar
  end
  hash.reduce Set.new do |set, (_, value)| set << value; end
end
extract_entry_params(credit_or_debit, params) click to toggle source
# File lib/mudrat_projector/transaction.rb, line 42
def extract_entry_params credit_or_debit, params
  entries = Array params["#{credit_or_debit}s".to_sym]
  return entries unless params.has_key? credit_or_debit
  unless entries.empty?
    raise ArgumentError, "You cannot supply both #{credit_or_debit} and "\
      "#{credit_or_debit}s"
  end
  [params.fetch(credit_or_debit)]
end