old utilities and reporting scripts useful with ledger (http://joyful.com/projects.html#ledgertools)

root / recurring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
49
50
51
52
53
54
55
56
#!/usr/bin/env python
"""
recurring [01..31|all [01..12]] 
Simon Michael 2008

With no arguments, prints any recurring ledger entries due today, ready
for adding to a ledger file. The idea is to call this once a day to add
predictable transactions to your ledger, keeping it more current and
reducing effort at reconcile time.

With a day number or all, print entries for that day, or all entries.
With a month number, print entries dated for that month. These are
useful for manual catch-up.

Here is an example crontab line: "0 0 * * * user recurring >>LEDGERFILE".
On a mac, add "recurring >>LEDGERFILE" to /etc/daily.local instead.
(laptop users: this will get called just once on waking from a multi-day
sleep and not at all for powered-off days, so you might need to catch up.)

Recurring entries are configured below, grouped by day of the month.
Each is a list of arguments to the ledger entry command. It uses the
most recent similar entry as a template, so usually the payee is enough,
but you might also want to set the amount.  I use .99 as a memo for
"approximate, adjust me later".
"""

ENTRIES = {
    1:[['savings deposit'],
       ['blue cross'],
       ],
    6:[['slicehost'],
       ],
    15:[['edison',15.99],
        ['gas',12.99],
        ],
    }

import sys, os, optparse
from datetime import date

parser = optparse.OptionParser()
opts,args = parser.parse_args()
today = date.today()
year  = today.year
month = len(args)>1 and int(args[1]) or today.month
day   = len(args)>0 and args[0] or today.day
if day != 'all': day = int(day)

def print_entry(y,m,d,*args):
    os.system('ledger entry %s/%s/%s %s' % (y,m,d,' '.join(['"%s"'%a for a in args])))

if day == 'all':
    for d,ts in sorted(ENTRIES.items()):
        for t in ts: print_entry(year,month,d,*t)
else:
    for t in ENTRIES.get(day,[]): print_entry(year,month,day,*t)