rodger 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f37dadd46ae840fa1bac37ffaed7a232daa5d8f3
4
+ data.tar.gz: 42c957b10e2230165a5425170e93fc498887e893
5
+ SHA512:
6
+ metadata.gz: 87aea5981751d8be2518e80fec5ee9884c1a1d7e52617039aba6429dfaafdddaa85d842d3bee7652857dff3bd825ec2ae6356ef9f6a9d46586fd80bb0feb84ca
7
+ data.tar.gz: 9d8659b282ac9f650954b8a4a55ff727098cb7c1a9e184087a8c002e14994e80441ddbf5def350aa763742b1d94dc0e2648e463a2d6d59c2d16f8043c8586071
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .rvmrc
19
+ *~
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --format nested
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rodger.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 svs
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # Rodger
2
+
3
+ Rodger is a Ruby interface to [John Wiegley's ledger-cli program](http://www.ledger-cli.org/)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rodger'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rodger
18
+
19
+ ### It is important to have the ledger-cli binary on your system.
20
+
21
+ ## Usage
22
+
23
+ ```ruby
24
+
25
+ @r = Rodger.new("accounts.cli")
26
+ @r.accounts # A hash with the accounts in it
27
+ @r.balance["Liabilities:Credit-Card:VISA"] # => The balance of a particular account
28
+ ```
29
+
30
+ Check the specs for more usage examples
31
+
32
+ ## Contributing
33
+
34
+ 1. Fork it
35
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
36
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
37
+ 4. Push to the branch (`git push origin my-new-feature`)
38
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/rodger.rb ADDED
@@ -0,0 +1,123 @@
1
+ require 'hashie'
2
+ require "rodger/version"
3
+
4
+ class AccountTree < Hash
5
+ # AccountTree is just a hash, but we make a separate class of it
6
+ # _ to not pollute the Hash class with our Hashie extensions
7
+ # - incase we want to funk it up later
8
+ # - to give us some type information
9
+
10
+ include Hashie::Extensions::MergeInitializer
11
+
12
+
13
+ # deep merge merges two AccountTrees such that their sub-account-trees are merged as well
14
+ # frankly, I can not now work out why this code works but the specs pass and so....
15
+ def deep_merge (h)
16
+ self.merge(h) do |k, old, new|
17
+ begin
18
+ AccountTree.new(old).deep_merge(AccountTree.new(new))
19
+ rescue
20
+ new
21
+ end
22
+ end
23
+ end
24
+
25
+ # returns true if an account has no sub accounts
26
+ def leaf?
27
+ (keys - [:name, :balance]).empty?
28
+ end
29
+
30
+ end
31
+
32
+ class Rodger
33
+
34
+ # This class provides a Ruby API to ledger
35
+
36
+ # WARNING - Currently only supports single currency
37
+
38
+ [:filename, :report_type, :current, :begin, :end, :period, :period_sort, :cleared, :dc, :uncleared,
39
+ :real, :actual, :related, :budget, :add_budget, :unbudgeted, :forecast, :limit, :amount, :total, :ledger].each do |a|
40
+ attr_accessor a
41
+ end
42
+
43
+ # Initialize with the name of the filename and an optional path to the ledger binary
44
+ #
45
+ # options is a hash like
46
+ # :file => path to the ledger file
47
+ # :bin => path to the ledger binary. Defaults to 'ledger' so not required if ledger is in your path
48
+ def initialize(options = {})
49
+ @filename = options[:file]
50
+ @ledger = options[:bin] || 'ledger'
51
+ end
52
+
53
+ # Public: Builds a AccountTree of the accounts as reported by ledger. It populates each account with the canonical name and balance of the account
54
+ # returns a Hash like {"Assets" => {:name => "Assets", :balance => <balance>, "Fixed Assets" => {:name => "Assets:FixedAssets", :bal...}}}
55
+ def accounts
56
+ ahash = (cmd "accounts | sort").split("\n")
57
+ ahash.reduce(AccountTree.new) do |s, h|
58
+ a = recurse_accounts(h.split(":")) # recursion is awsm!
59
+ s.deep_merge(a)
60
+ end
61
+ end
62
+
63
+ # Public: Returns a hash of all the account names and their balances. Is the "flat" version of the accounts tree above
64
+ # however, it does not include any accounts which do not have any journal entries in them.
65
+ def balances
66
+ return @balances_hash if @balances_hash
67
+ ledger_balances = cmd 'bal --balance-format "%A | %(display_total)\n"'
68
+ @balances_hash = Hash[*(ledger_balances.split("\n")).map{|line| parse_account_line(line)}.flatten]
69
+ end
70
+
71
+ # Public: Returns the account balance for a given account on a given date
72
+ # Need to give the full name of the account, not a regexp to match against
73
+ def balance(account)
74
+ return balances[account] || infer_balance(account) # need to infer the balance if the account is not in ledger's output
75
+ end
76
+
77
+ private
78
+
79
+ # Builds the command using the provided switches and any extra arguments used here
80
+ def cmd(extra_args)
81
+ `#{@ledger} -f #{@filename} #{extra_args}`
82
+ end
83
+
84
+ # given an array like [Assets][FixedAssets][Furniture], returns a Hash like
85
+ # {"Assets" => {:name => "Assets", :balance => <balance>, "FixedAssets" => {...}...}...}
86
+ # by querying the given ledger for balances, etc.
87
+ def recurse_accounts(accounts_array, prenom = "")
88
+ result = AccountTree.new
89
+ prenom = prenom.empty? ? accounts_array[0] : "#{prenom}:#{accounts_array[0]}"
90
+ if accounts_array.class == Array
91
+ if accounts_array.size == 1
92
+ result[accounts_array[0]] = AccountTree.new(:name => prenom, :balance => balance(prenom))
93
+ else
94
+ r = recurse_accounts(accounts_array[1..-1], prenom)
95
+ result[accounts_array[0]] = r.merge(:name => prenom, :balance => balance(prenom))
96
+ end
97
+ end
98
+ result
99
+ end
100
+
101
+
102
+ #Private: takes a line from ledger balance output and returns the account, amount and currency
103
+ def parse_account_line(line)
104
+ account = line.split("|")[0].strip rescue nil
105
+ amount = line.scan(/\-{0,1}\d+[\.\d+]*/)[0].to_f rescue nil
106
+ currency = line.scan(/[A-Z]{3,7}/)[-1] rescue nil
107
+ [account,{:amount => amount, :currency => currency}]
108
+ end
109
+
110
+ # If the given account is not found in the balance report, we have to infer the balance from the subaccounts
111
+ # Please refer to the specs for more information
112
+ #
113
+ # account is an account name
114
+ def infer_balance(account)
115
+ sub_accounts = balances.keys.compact.map{|k| k.match(/#{account}:[^:]*/)}.compact
116
+ relevant_accounts = sub_accounts.map(&:to_s).uniq
117
+ relevant_account_balances = relevant_accounts.map{|a| balance(a)}
118
+ balance = relevant_account_balances.reduce({:amount => 0, :currency => nil}){|s,h| {:amount => s[:amount] + h[:amount], :currency => h[:currency]}}
119
+ end
120
+
121
+
122
+
123
+ end
@@ -0,0 +1,3 @@
1
+ class Rodger
2
+ VERSION = "0.0.1"
3
+ end
data/rodger.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rodger/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rodger"
8
+ spec.version = Rodger::VERSION
9
+ spec.authors = ["svs"]
10
+ spec.email = ["svs@svs.io"]
11
+ spec.description = %q{Read ledger-cli files with ease in Ruby}
12
+ spec.summary = %q{Rodger is a ruby API for getting info out of files that can be parsed by ledger-cli}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "hashie"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+
27
+ end
@@ -0,0 +1,579 @@
1
+ ;;; -*- mode: ledger; coding: utf-8; -*-
2
+ ;;;
3
+ ;;; This is an example/demo file, with some example accounts and
4
+ ;;; some example transactions. A real-life Ledger file has a lot
5
+ ;;; more transactions in it, and possibly a very different set
6
+ ;;; of accounts; feel free to define your own and to change
7
+ ;;; everything in here if you use this as a template. You can be
8
+ ;;; creative, because all the account categories and commodities
9
+ ;;; are entirely generic. (More comments are sprinkled below.)
10
+ ;;;
11
+ ;;; The order in which the transactions are declared does not
12
+ ;;; matter at all... personally I like to organize transactions
13
+ ;;; in chronological order, within sections that are
14
+ ;;; more-or-less by account. I normally pretty much keep them in
15
+ ;;; the order that the converted OFX file presents them. Here
16
+ ;;; however, I've ordered the transactions for better clarity of
17
+ ;;; presentation, since this is a file with sample transactions.
18
+
19
+
20
+ ;;;;; Initialization
21
+
22
+
23
+ ;;; Declaration of Accounts.
24
+
25
+ ;;; Here you can declare a list of valid accounts, and
26
+ ;;; optionally, a constraint on which kind of commodity they are
27
+ ;;; allowed to hold (helps you track down mistakes).
28
+ ;;;
29
+ ;;; Note that
30
+ ;;;
31
+ ;;; - the system supports any currencies, and works with
32
+ ;;; multiple commodities in the same Ledger.
33
+ ;;;
34
+ ;;; - No distinction is made between currency commodities (e.g.
35
+ ;;; USD, EUR, USD) and investment commodities (e.g. GOOG,
36
+ ;;; AAPL, MSFT).
37
+ ;;;
38
+ ;;; - The Assets, Liabilities, Equity, Income, Expenses
39
+ ;;; categories are not special; they are simply a convention;
40
+ ;;; be creative if you like. There are really only two kinds
41
+ ;;; of accounts: debit accounts and credit accounts, and the
42
+ ;;; type is only used for reporting (maybe).
43
+
44
+ @defaccount De Assets:Current:Cash
45
+ @defaccount De Assets:Current:BestBank:Checking USD
46
+ @defaccount De Assets:Current:BestBank:Savings USD
47
+ ;@defaccount De Assets:Fixed:Home USD
48
+ @defaccount De Assets:Investments:UTrade:Account USD
49
+ @defaccount De Assets:Investments:UTrade:Account:AAPL AAPL
50
+ @defaccount De Assets:Investments:UTrade:Account:EWJ EWJ
51
+ ;@defaccount De Assets:Loans
52
+ @defaccount De Assets:AccountsReceivable
53
+
54
+ ;@defaccount Cr Liabilities:AccountsPayable
55
+ @defaccount Cr Liabilities:BestBank:Mortgage:Loan USD
56
+ @defaccount Cr Liabilities:Credit-Card:VISA USD
57
+ @defaccount Cr Liabilities:Condo-Management USD
58
+
59
+ @defaccount Cr Equity:Opening-Balances
60
+
61
+ @defaccount Cr Income:Investments:Interest:Checking
62
+ @defaccount Cr Income:Investments:Interest:Savings
63
+ @defaccount Cr Income:Investments:Dividends
64
+ @defaccount Cr Income:Investments:Capital-Gains
65
+ @defaccount Cr Income:Salary:AcmeCo
66
+
67
+ @defaccount De Expenses:Financial:Fees
68
+ @defaccount De Expenses:Financial:Commissions
69
+ @defaccount De Expenses:Insurance:Life
70
+ @defaccount De Expenses:Food:Restaurant
71
+ @defaccount De Expenses:Food:Grocery
72
+ @defaccount De Expenses:Food:Alcool
73
+ @defaccount De Expenses:Communications:Phone
74
+ @defaccount De Expenses:Communications:Mail
75
+ ;@defaccount De Expenses:Transportation:Parking
76
+ @defaccount De Expenses:Transportation:Taxi
77
+ ;@defaccount De Expenses:Transportation:Trains
78
+ ;@defaccount De Expenses:Transportation:PublicTrans
79
+ ;@defaccount De Expenses:Taxes:US-State-California USD
80
+ @defaccount De Expenses:Taxes:US-Federal USD
81
+ @defaccount De Expenses:Govt-Services USD
82
+ @defaccount De Expenses:Clothes
83
+ @defaccount De Expenses:Car:Gas
84
+ @defaccount De Expenses:Sports
85
+ @defaccount De Expenses:Sports:Gear
86
+ @defaccount De Expenses:Fun:Movie
87
+ ;@defaccount De Expenses:Fun:Museum
88
+ @defaccount De Expenses:Books
89
+ ;@defaccount De Expenses:Travel:Flights
90
+ ;@defaccount De Expenses:Travel:Accomodation
91
+ ;@defaccount De Expenses:Toys:Photography
92
+ ;@defaccount De Expenses:Toys:Computer
93
+ ;@defaccount De Expenses:Office-Supplies
94
+ @defaccount De Expenses:Medical
95
+ @defaccount De Expenses:Charity
96
+ ;@defaccount De Expenses:Misc
97
+ ;@defaccount De Expenses:Home:Repair
98
+ ;@defaccount De Expenses:Home:Maintenance
99
+ ;@defaccount De Expenses:Home:Taxes:Municipal
100
+ ;@defaccount De Expenses:Home:Taxes:School
101
+ ;@defaccount De Expenses:Home:Insurance
102
+ ;@defaccount De Expenses:Home:Monthly
103
+ ;@defaccount De Expenses:Home:Monthly:Internet
104
+ @defaccount De Expenses:Home:Monthly:Condo-Fees
105
+ ;@defaccount De Expenses:Home:Monthly:Electricity
106
+ @defaccount De Expenses:Home:Monthly:Loan-Interest
107
+ ;@defaccount De Expenses:Home:Monthly:Water
108
+ ;@defaccount De Expenses:Home:Acquisition:Furniture
109
+ ;@defaccount De Expenses:Home:Acquisition:Renovations
110
+ ;@defaccount De Expenses:Home:Acquisition:Legal
111
+ ;@defaccount De Expenses:Home:Acquisition:Inspection
112
+
113
+
114
+
115
+ ;;; You can provide mappings from the account numbers ("account
116
+ ;;; ids") that are normally found in OFX files that the
117
+ ;;; banks/brokers provide, mapping to account names in this
118
+ ;;; Ledger file. This way, a script that converts the OFX into
119
+ ;;; Ledger-compatible syntax is able to automatically figure out
120
+ ;;; the right account names.
121
+
122
+ ;;; Account number mappings.
123
+ @var ofx accid 123456789012 Assets:Current:BestBank:Checking
124
+ @var ofx accid 123456789012 Assets:Current:BestBank:Savings
125
+ @var ofx accid 1234567890 Liabilities:BestBank:Mortgage:Loan
126
+ @var ofx accid 1234567890123456 Liabilities:Credit-Card:VISA
127
+ @var ofx accid 1234567890 Assets:Investments:UTrade:Account
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+ ;;;;; Assets:Current:BestBank:Checking
137
+
138
+ ;; This entry tells the software to automatically insert an
139
+ ;; entry at this date, of the amount required to fulfill the
140
+ ;; next @check directive (chronologically) in the account (for
141
+ ;; all commodities present). If the required amount is 0, no
142
+ ;; entry is added.
143
+ @pad 2007-12-31 Assets:Current:BestBank:Checking Equity:Opening-Balances
144
+
145
+
146
+
147
+ ;; A check deposit, e.g. depositing a government check.
148
+ 2008-01-05 * GST CANADA | Deposit from govt for consumer tax rebate
149
+ Assets:Current:BestBank:Checking 77.76 USD
150
+ Expenses:Taxes:US-Federal
151
+
152
+
153
+
154
+ ;; This is how salary direct deposit entries might show up
155
+ ;; within the checking account section. Note how the salaries
156
+ ;; are negative amounts... that's because Income is a credit
157
+ ;; account category, and the numbers there are negative (you can
158
+ ;; interpret this as the "amount of work-dollars that you took
159
+ ;; from society and placed into your account").
160
+
161
+ 2008-01-10 * ACME | Salary paid from employer
162
+ Assets:Current:BestBank:Checking 2000.00 USD
163
+ Income:Salary:AcmeCo -2000 USD
164
+
165
+ 2008-01-25 * ACME | Salary paid from employer
166
+ Assets:Current:BestBank:Checking 2000.00 USD
167
+ Income:Salary:AcmeCo
168
+
169
+ 2008-02-10 * ACME | Salary paid from employer
170
+ Assets:Current:BestBank:Checking 2000.00 USD
171
+ Income:Salary:AcmeCo
172
+
173
+ 2008-02-25 * ACME | Salary paid from employer
174
+ Assets:Current:BestBank:Checking 2000.00 USD
175
+ Income:Salary:AcmeCo
176
+
177
+
178
+
179
+ ;; Withdrawal from another bank's ATM machine (with fees).
180
+ 2008-01-12 * ATM withdrawal - 00044242
181
+ Assets:Current:BestBank:Checking -301.50 USD
182
+ Expenses:Financial:Fees 1.50 USD
183
+ Assets:Current:Cash
184
+
185
+ ;; ATM withdrawal (without fees).
186
+ 2008-01-30 * ATM withdrawal
187
+ Assets:Current:BestBank:Checking -800.00 USD
188
+ Assets:Current:Cash
189
+
190
+ 2008-02-10 * ATM withdrawal
191
+ Assets:Current:BestBank:Checking -500.00 USD
192
+ Assets:Current:Cash
193
+
194
+ 2008-02-24 * ATM withdrawal
195
+ Assets:Current:BestBank:Checking -500.00 USD
196
+ Assets:Current:Cash
197
+
198
+
199
+ ;; Automated withdrawal for Life insurance payments.
200
+ 2008-01-02 * LIFE INSURANCE -- LONDON LIFE
201
+ Assets:Current:BestBank:Checking -42.69 USD
202
+ Expenses:Insurance:Life
203
+
204
+ 2008-02-02 * LIFE INSURANCE -- LONDON LIFE
205
+ Assets:Current:BestBank:Checking -42.69 USD
206
+ Expenses:Insurance:Life
207
+
208
+
209
+ ;; A purchase from a store using the bank's debit card.
210
+ 2008-01-17 * Interac Purchase - 1341 - ACCES SPORTS S
211
+ Assets:Current:BestBank:Checking -89.00 USD
212
+ Expenses:Sports:Gear
213
+
214
+
215
+ ;; A monthly fee that the bank takes for its deposit banking services.
216
+ 2008-01-10 * MONTHLY FEE
217
+ Assets:Current:BestBank:Checking -4.00 USD
218
+ Expenses:Financial:Fees
219
+
220
+ ;; A typical bank's return on checking accounts.
221
+ 2008-01-12 * Deposit interest
222
+ Assets:Current:BestBank:Checking 0.02 USD
223
+ Income:Investments:Interest:Checking
224
+
225
+
226
+
227
+ ;; An example of using the A/R account: I bought an electronic
228
+ ;; toy for a friend, and I wanted to track the amount that he
229
+ ;; should pay back to me. Instead of placing it in expenses, I
230
+ ;; made it a receivable, which was cancelled later on where he
231
+ ;; paid me back.
232
+
233
+ 2008-03-26 * Bought an iPhone to Gilbert (had to use ATM)
234
+ Assets:AccountsReceivable 431.92 USD
235
+ Expenses:Financial:Fees 3.00 USD
236
+ Assets:Current:Cash -434.92 USD
237
+
238
+ ;; Notice that the amount pay back was for an approximate
239
+ ;; amount, so the overflow I placed in the cash account.
240
+ 2008-04-02 * Gilbert paid back for iPhone
241
+ Assets:Current:Cash 440.00 CAD
242
+ Assets:AccountsReceivable -431.92 USD
243
+ Assets:Current:Cash
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+ ;;;;; Assets:Current:BestBank:Savings
253
+
254
+ @pad 2007-12-31 Assets:Current:BestBank:Savings Equity:Opening-Balances
255
+
256
+
257
+ ;; Interest paid on balance in savings account.
258
+ 2008-01-03 * DEPOSIT INTEREST
259
+ Assets:Current:BestBank:Savings 95.69 USD
260
+ Income:Investments:Interest:Savings
261
+
262
+
263
+ ;; An entry that indicates a bank transfer from a checking account to a savings account.
264
+ ;; There is a choice to locate this entry with the savings or with the checking, it's up to you.
265
+ 2008-01-29 * Transfer from checking to savings account
266
+ Assets:Current:BestBank:Savings 2000.00 USD
267
+ Assets:Current:BestBank:Checking
268
+
269
+ 2008-02-03 * DEPOSIT INTEREST
270
+ Assets:Current:BestBank:Savings 102.34 USD
271
+ Income:Investments:Interest:Savings
272
+
273
+ 2008-02-03 * Transferring money to brokerage account for better investment.
274
+ Assets:Current:BestBank:Savings -10000.00 USD
275
+ Assets:Investments:UTrade:Account
276
+
277
+
278
+
279
+
280
+
281
+ ;; Automated mortgage payments from the savings account.
282
+ 2008-01-12 * MORTGAGE PAYMENT
283
+ Assets:Current:BestBank:Savings -464.46 USD
284
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
285
+ Expenses:Home:Monthly:Loan-Interest
286
+
287
+ 2008-01-27 * MORTGAGE PAYMENT
288
+ Assets:Current:BestBank:Savings -464.46 USD
289
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
290
+ Expenses:Home:Monthly:Loan-Interest
291
+
292
+ 2008-02-12 * MORTGAGE PAYMENT
293
+ Assets:Current:BestBank:Savings -464.46 USD
294
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
295
+ Expenses:Home:Monthly:Loan-Interest
296
+
297
+ 2008-02-27 * MORTGAGE PAYMENT
298
+ Assets:Current:BestBank:Savings -464.46 USD
299
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
300
+ Expenses:Home:Monthly:Loan-Interest
301
+
302
+ 2008-03-12 * MORTGAGE PAYMENT
303
+ Assets:Current:BestBank:Savings -464.46 USD
304
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
305
+ Expenses:Home:Monthly:Loan-Interest
306
+
307
+ 2008-03-27 * MORTGAGE PAYMENT
308
+ Assets:Current:BestBank:Savings -464.46 USD
309
+ Liabilities:BestBank:Mortgage:Loan 171.01 USD
310
+ Expenses:Home:Monthly:Loan-Interest
311
+
312
+
313
+
314
+ ;;;;; Liabilities:Credit-Card:VISA
315
+
316
+ @pad 2008-01-01 Liabilities:Credit-Card:VISA Equity:Opening-Balances
317
+
318
+ ;; Paying back my credit card.
319
+ 2008-01-22 * Online Banking payment - 5051 - VISA
320
+ Assets:Current:BestBank:Checking -791.34 USD
321
+ Liabilities:Credit-Card:VISA
322
+
323
+
324
+ ;; Expenses at restaurants on credit card.
325
+ 2008-01-15 * Cafe Imagination |
326
+ Liabilities:Credit-Card:VISA
327
+ Expenses:Food:Restaurant 47.00 USD
328
+
329
+ 2008-01-19 * Soupe Bol |
330
+ Liabilities:Credit-Card:VISA -21.00 USD
331
+ Expenses:Food:Restaurant
332
+
333
+ 2008-01-27 * Scola Pasta |
334
+ Liabilities:Credit-Card:VISA
335
+ Expenses:Food:Restaurant 51.17 USD
336
+
337
+
338
+ ;; Cell phone bill via credit crad.
339
+ 2008-01-19 * FIDO |
340
+ Liabilities:Credit-Card:VISA
341
+ Expenses:Communications:Phone 121.96 USD
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+ ;;;;; Assets:Investments:UTrade:Account
350
+
351
+ @pad 2007-12-31 Assets:Investments:UTrade:Account Equity:Opening-Balances
352
+
353
+
354
+ ;; Some example trades.
355
+ ;;
356
+ ;; - Notice how I like to create a special account to contain
357
+ ;; each kind of commodity. This choice is an arbitrary one: I
358
+ ;; could keep all the stocks in the one investing account
359
+ ;; (which would then contain many different kinds of
360
+ ;; commodities) but doing it this way I can more easily track
361
+ ;; the book value of the remaining shares that I have. I think
362
+ ;; there may be a better way to do this.
363
+ ;;
364
+ ;; - Usually I enter the final amounts from the trade
365
+ ;; confirmation slips that get emailed to me, because the
366
+ ;; information there is more precise and detailed than what I
367
+ ;; seem to get from the online brokerage interface. YMMV.
368
+ ;;
369
+ ;; - I still don't have a good generic way to deal with the
370
+ ;; capital gains automatically, so I enter them by hand for
371
+ ;; now. The challenge is to find a generic way to account
372
+ ;; for capital gains while accounting for commissions and
373
+ ;; trade fees the correct way (they should get removed from the
374
+ ;; capital gains at both ends of a trade).
375
+
376
+ 2008-01-08 * Buy some Apple Computer
377
+ Assets:Investments:UTrade:Account:AAPL 185.40 USD
378
+ Assets:Investments:UTrade:Account
379
+ Expenses:Financial:Commissions 9.95 USD
380
+
381
+ ;; A divident payment.
382
+ 2008-02-02 * DIVIDEND from AAPL position
383
+ Assets:Investments:UTrade:Account 0.68 USD
384
+ Income:Investments:Dividends
385
+
386
+
387
+ ;; This position is kept long, so it gets reflected below in the check.
388
+ 2008-02-10 * Buy some japanese ETF from iShares
389
+ Assets:Investments:UTrade:Account:EWJ 13.34 USD
390
+ Assets:Investments:UTrade:Account
391
+ Expenses:Financial:Commissions 9.95 USD
392
+
393
+
394
+ ;; Run checks against statement summary of positions that gets
395
+ ;; mailed periodically.
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+ ;;;;; Expenses:Insurance:Life
404
+
405
+ ;; Estimate of value of life insurance policy, to account for
406
+ ;; total net worth.
407
+ 2008-01-01 * Life insurance policy resale value
408
+ Expenses:Insurance:Life 4407.06 USD
409
+ Equity:Opening-Balances
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+ ;;;;; Assets:Fixed:Home
418
+
419
+ ;; You could use this account in order to reevaluate your home.
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+ ;;;;; Expenses:Home:Monthly:Condo-Fees
428
+
429
+ @pad 2008-01-01 Liabilities:Condo-Management Equity:Opening-Balances
430
+
431
+ 2008-01-01 * Propri-Manage |
432
+ Expenses:Home:Monthly:Condo-Fees 212.61 USD
433
+ Liabilities:Condo-Management
434
+
435
+ 2008-01-14 * (998) Propri-Manage | cheque sent by snail mail
436
+ Liabilities:Condo-Management 800.00 USD
437
+ Assets:Current:BestBank:Checking
438
+
439
+ 2008-02-01 * Propri-Manage |
440
+ Expenses:Home:Monthly:Condo-Fees 212.61 USD
441
+ Liabilities:Condo-Management
442
+
443
+ 2008-03-01 * Propri-Manage |
444
+ Expenses:Home:Monthly:Condo-Fees 212.61 USD
445
+ Liabilities:Condo-Management
446
+
447
+ 2008-03-10 * Propri-Manage | special billing, spring works
448
+ Expenses:Home:Monthly:Condo-Fees 61.25 USD
449
+ Liabilities:Condo-Management
450
+
451
+
452
+
453
+
454
+
455
+
456
+
457
+
458
+ ;;;;; Assets:Current:Cash
459
+ ;;;;; Expenses:*
460
+
461
+ @pad 2007-12-31 Assets:Current:Cash Equity:Opening-Balances
462
+
463
+
464
+ ;; Because I don't track individual cash expenses very tightly,
465
+ ;; I still need to distribute the cash that disappeared into
466
+ ;; appropriate expense categories. What I like to do is
467
+ ;; guesstimate that about 80% of it goes into restaurants, and
468
+ ;; 20% into wine bars. What frequency and categories you choose
469
+ ;; to use is highly dependent on your lifestyle...
470
+
471
+ 2008-01-02 * Distribution of cash expenses
472
+ Expenses:Food:Restaurant 300.00 USD
473
+ Expenses:Food:Alcool 100.00 USD
474
+ Assets:Current:Cash
475
+
476
+ 2008-01-16 * Distribution of cash expenses
477
+ Expenses:Food:Restaurant 300.00 USD
478
+ Expenses:Food:Alcool 100.00 USD
479
+ Assets:Current:Cash
480
+
481
+ 2008-02-02 * Distribution of cash expenses
482
+ Expenses:Food:Restaurant 300.00 USD
483
+ Expenses:Food:Alcool 100.00 USD
484
+ Assets:Current:Cash
485
+
486
+ 2008-02-16 * Distribution of cash expenses
487
+ Expenses:Food:Restaurant 300.00 USD
488
+ Expenses:Food:Alcool 100.00 USD
489
+ Assets:Current:Cash
490
+
491
+ 2008-03-02 * Distribution of cash expenses
492
+ Expenses:Food:Restaurant 300.00 USD
493
+ Expenses:Food:Alcool 100.00 USD
494
+ Assets:Current:Cash
495
+
496
+ 2008-03-16 * Distribution of cash expenses
497
+ Expenses:Food:Restaurant 300.00 USD
498
+ Expenses:Food:Alcool 100.00 USD
499
+ Assets:Current:Cash
500
+
501
+
502
+
503
+ ;;
504
+ ;; Some common cash expenses.
505
+ ;;
506
+
507
+ 2008-02-18 * DMV | Renewal of driver's license.
508
+ Expenses:Govt-Services 110.00 USD
509
+ Assets:Current:Cash
510
+
511
+ 2008-01-21 * WHOLE FOODS |
512
+ Expenses:Food:Grocery 54.03 USD
513
+ Assets:Current:Cash
514
+
515
+ 2008-01-21 * USPS | sent package to mom
516
+ Expenses:Communications:Mail 4.43 USD
517
+ Assets:Current:Cash
518
+
519
+ 2008-02-04 * taxi home from meeting
520
+ Expenses:Transportation:Taxi 12.00 USD
521
+ Assets:Current:Cash
522
+
523
+
524
+
525
+ ;; Short weekend trip to Skii Mountain.
526
+ ;;
527
+ ;; You can use the @begintag and @endtag directives to mark all
528
+ ;; transactions between them with a specific tag. Later on you
529
+ ;; can filter the postings to a tag by using a cmdline. This
530
+ ;; allows you to find out what expenses were incurred during a
531
+ ;; specific trip.
532
+
533
+ @begintag ski-trip
534
+
535
+ 2008-01-27 * SUNONO | fill'er up
536
+ Expenses:Car:Gas 40 USD
537
+ Assets:Current:Cash
538
+
539
+ 2008-01-27 * SKII | Lift tickets
540
+ Expenses:Sports 120 USD
541
+ Assets:Current:Cash
542
+
543
+ 2008-01-27 * Dinner at chalet
544
+ Expenses:Food:Restaurant 35.33 USD
545
+ Assets:Current:Cash
546
+
547
+ 2008-01-28 * breakfast
548
+ Expenses:Food:Restaurant 17.23 USD
549
+ Assets:Current:Cash
550
+
551
+ 2008-01-28 * a new hat, it was cold
552
+ Expenses:Clothes 40.02 USD
553
+ Assets:Current:Cash
554
+
555
+ @endtag ski-trip
556
+
557
+
558
+
559
+
560
+ 2008-03-03 * ALDO | new shoes
561
+ Expenses:Clothes 121.20 USD
562
+ Assets:Current:Cash
563
+
564
+ 2008-02-24 * AMC | movies with girlfriend
565
+ Expenses:Fun:Movie 24 USD
566
+ Assets:Current:Cash
567
+
568
+ 2008-03-06 * Barnes & Noble | books on accounting
569
+ Expenses:Books 74.43 USD
570
+ Assets:Current:Cash -74.43 USD
571
+
572
+ 2008-02-03 * ITHURTS MEDICAL CENT | x-ray for broken bones
573
+ Expenses:Medical 312.00 USD
574
+ Assets:Current:Cash
575
+
576
+ 2008-03-02 * ZEN CENTER | Donation to Zen center
577
+ Expenses:Charity 50 USD
578
+ Assets:Current:Cash
579
+