Managing my expenses using Clojure
For someone who studied accounting, I've never really paid a huge amount of attention to where my money goes when I stop looking. Generally speaking, as long as I've got somewhere to live and a steady supply of cheese and wine I'm not too worried.
So it's funny that I suddenly decided that it would be a good idea to
track my expenses, but there you have it. I thought I'd write a little
Clojure program that would let me enter my recurring and one-off
expenses (in a format reminiscent of Emacs's ~/.diary file) and have
it tell me where all my money got to each week.
You can see my source code or download the self-contained jar file to try for yourself.
To use it, I create a file called ~/.expenses that looks roughly like
this:
## Recurring stuff...
#
# Amounts we receive are entered as negative numbers...
fortnightly -10000 Fortnightly pay (I wish)
weekly 345.5 Rent (also optimistic)
monthly 123 Internet+phone
# Recurring items can have ranges attached to let you reflect changes
# in amounts over time, etc.
[--1/3/2009] monthly 123 Health cover
[1/3/2009--] monthly 234 Health cover (the bastards!)
fortnightly 50 Petrol
yearly 2345 Gas & Electricity
yearly 700 Car registration
# etc...
# One-off expenditures
#
25/02/2009 11.00 Coffee
25/02/2009 9.50 Lunch
25/02/2009 25.00 Wine
26/02/2009 25.00 Wine
27/02/2009 25.00 Wine
# ... more wine...
Then I point the expenses program at this file to see the report over time:
$ java -jar expenses.jar ~/.expenses
======================================================
Week starting: Sun Feb 22 00:00:00 EST 2009
======================================================
Recurring items:
22/02/2009 Fortnightly pay (I wish) 5000.00
22/02/2009 Rent (also optimistic) ( 345.50)
22/02/2009 Internet+phone ( 30.75)
22/02/2009 Health cover ( 30.75)
22/02/2009 Petrol ( 25.00)
22/02/2009 Gas & Electricity ( 45.10)
22/02/2009 Car registration ( 13.46)
Subtotal: 4509.44
Line items:
25/02/2009 Coffee ( 11.00)
25/02/2009 Lunch ( 9.50)
25/02/2009 Wine ( 25.00)
26/02/2009 Wine ( 25.00)
27/02/2009 Wine ( 25.00)
Subtotal: ( 95.50)
=========================
Total saved: 4413.94
=========================
Hooray! I'm fictitiously rich!
And that's basically all it does: it apportions recurring expenses over each week so you can get a more realistic idea of what they cost you week-to-week, and makes it easy to record one-off items too. For recording those one-offs I use a snippet of Emacs lisp which I bind to a key:
(defun spend ()
(interactive)
(let ((now (time-stamp-dd/mm/yyyy))
(amount (read-number "Amount: "))
(description (read-string "Description?: ")))
(with-current-buffer (find-file-noselect "~/.expenses")
(goto-char (point-max))
(insert (format "%s\t%.2f\t%s\n"
now
amount
description))
(save-buffer)
(kill-buffer))))