Class: Keepr::Account

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/keepr/account.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.merged_with_sums(options = {}) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/keepr/account.rb', line 50

def self.merged_with_sums(options={})
  accounts = with_sums(options).to_a

  # Sum up child accounts to parent
  position = 0
  while  = accounts[position] do
    if .parent_id && .sum_amount
      if  = accounts.find { |a| a.id == .parent_id }
        .sum_amount ||= 0
        .sum_amount += .sum_amount
        accounts.delete_at(position)
      else
        raise RuntimeError
      end
    else
      position += 1
    end
  end

  accounts
end

.with_sums(options = {}) ⇒ Object

Raises:

  • (ArgumentError)


22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/keepr/account.rb', line 22

def self.with_sums(options={})
  raise ArgumentError unless options.is_a?(Hash)

  subquery = Keepr::Posting.
               select('SUM(keepr_postings.amount)').
               joins(:keepr_journal).
               where('keepr_postings.keepr_account_id = keepr_accounts.id')

  date           = options[:date]
  permanent_only = options[:permanent_only]

  if date
    if date.is_a?(Date)
      subquery = subquery.where "keepr_journals.date <= '#{date.to_s(:db)}'"
    elsif date.is_a?(Range)
      subquery = subquery.where "keepr_journals.date BETWEEN '#{date.first.to_s(:db)}' AND '#{date.last.to_s(:db)}'"
    else
      raise ArgumentError
    end
  end

  if permanent_only
    subquery = subquery.where "keepr_journals.permanent = #{connection.quoted_true}"
  end

  select "keepr_accounts.*, (#{subquery.to_sql}) AS sum_amount"
end

Instance Method Details

#balance(date = nil) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/keepr/account.rb', line 82

def balance(date=nil)
  if date
    if date.is_a?(Date)
      keepr_postings.joins(:keepr_journal).where("keepr_journals.date <= '#{date.to_s(:db)}'").sum(:amount)
    elsif date.is_a?(Range)
      keepr_postings.joins(:keepr_journal).where("keepr_journals.date BETWEEN '#{date.first.to_s(:db)}' AND '#{date.last.to_s(:db)}'").sum(:amount)
    else
      raise ArgumentError
    end
  else
    keepr_postings.sum(:amount)
  end
end

#keepr_postingsObject



76
77
78
79
80
# File 'lib/keepr/account.rb', line 76

def keepr_postings
  Keepr::Posting.
    joins(:keepr_account).
    where(subtree_conditions)
end

#number_as_stringObject



96
97
98
99
100
101
102
# File 'lib/keepr/account.rb', line 96

def number_as_string
  if number < 1000
    "%04d" % number
  else
    number.to_s
  end
end

#profit_and_loss?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/keepr/account.rb', line 72

def profit_and_loss?
  revenue? || expense?
end

#to_sObject



104
105
106
# File 'lib/keepr/account.rb', line 104

def to_s
  "#{number_as_string} (#{name})"
end