add gnucash-process-report
This commit is contained in:
parent
1158a9397d
commit
9f6decb001
110
gnucash-process-report
Executable file
110
gnucash-process-report
Executable file
@ -0,0 +1,110 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
|
||||||
|
# Josh Holtrop
|
||||||
|
# 2011-05-07
|
||||||
|
# This script processes an HTML report output by gnucash and consolidates
|
||||||
|
# the in/out amounts into net amounts and writes a new HTML report file
|
||||||
|
# to the standard output.
|
||||||
|
# Usage:
|
||||||
|
# gnucash-process-report generated.html > new.html
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
if len(argv) < 2:
|
||||||
|
sys.stderr.write('Usage: %s <report-file>\n' % argv[0])
|
||||||
|
return 2
|
||||||
|
title = ''
|
||||||
|
accounts = {}
|
||||||
|
inout = ''
|
||||||
|
category = ''
|
||||||
|
f = open(argv[1], 'r')
|
||||||
|
lines = f.read().split('\n')
|
||||||
|
f.close()
|
||||||
|
for line in lines:
|
||||||
|
m = re.search(r'<h3>(.*)</h3>', line)
|
||||||
|
if m is not None:
|
||||||
|
title = m.group(1)
|
||||||
|
continue
|
||||||
|
m = re.search(r'Money into', line)
|
||||||
|
if m is not None:
|
||||||
|
inout = 'in'
|
||||||
|
continue
|
||||||
|
m = re.search(r'Money out of', line)
|
||||||
|
if m is not None:
|
||||||
|
inout = 'out'
|
||||||
|
continue
|
||||||
|
m = re.search(r'<a\s*href="gnc-register.*>(.*)</a>', line)
|
||||||
|
if m is not None:
|
||||||
|
category = m.group(1)
|
||||||
|
continue
|
||||||
|
m = re.search(r'</tr>', line)
|
||||||
|
if m is not None:
|
||||||
|
category = ''
|
||||||
|
continue
|
||||||
|
m = re.search(r'number-cel.*>(.*)</td>', line)
|
||||||
|
if m is not None:
|
||||||
|
amt = float(re.sub(r'[$,]', '', m.group(1).strip()))
|
||||||
|
if category != '':
|
||||||
|
if inout == 'in':
|
||||||
|
amt = -amt
|
||||||
|
elif inout != 'out':
|
||||||
|
continue
|
||||||
|
if category in accounts:
|
||||||
|
accounts[category] += amt
|
||||||
|
else:
|
||||||
|
accounts[category] = amt
|
||||||
|
categories = accounts.keys()
|
||||||
|
categories.sort()
|
||||||
|
def fmt_amt(a):
|
||||||
|
f = '%.2f' % a
|
||||||
|
m = re.match(r'(.+)(...\...)', f)
|
||||||
|
if m is not None:
|
||||||
|
f = '%s,%s' % (m.group(1, 2))
|
||||||
|
return '$%s' % f
|
||||||
|
sys.stdout.write('''
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>%s</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h3>%s</h3>
|
||||||
|
<h5>Money Into Accounts</h5>
|
||||||
|
<table>
|
||||||
|
''' % (title, title))
|
||||||
|
total_in = 0.0
|
||||||
|
for c in categories:
|
||||||
|
if accounts[c] < 0:
|
||||||
|
amt = -accounts[c]
|
||||||
|
total_in += amt
|
||||||
|
sys.stdout.write('<tr><td>%s</td><td>%s</td></tr>\n' %
|
||||||
|
(c, fmt_amt(amt)))
|
||||||
|
sys.stdout.write('<tr style="font-weight: bold;"><td>Total:</td>'
|
||||||
|
'<td>%s</td></tr>\n' % fmt_amt(total_in))
|
||||||
|
sys.stdout.write('''
|
||||||
|
</table>
|
||||||
|
<h5>Money Out Of Accounts</h5>
|
||||||
|
<table>''')
|
||||||
|
total_out = 0.0
|
||||||
|
for c in categories:
|
||||||
|
if accounts[c] >= 0:
|
||||||
|
amt = accounts[c]
|
||||||
|
total_out += amt
|
||||||
|
sys.stdout.write('<tr><td>%s</td><td>%s</td></tr>\n' %
|
||||||
|
(c, fmt_amt(amt)))
|
||||||
|
sys.stdout.write('<tr style="font-weight: bold;"><td>Total:</td>'
|
||||||
|
'<td>%s</td></tr>\n' % fmt_amt(total_out))
|
||||||
|
total_diff = total_in - total_out
|
||||||
|
sys.stdout.write('<tr><td> </td><td> </td></tr>\n')
|
||||||
|
sys.stdout.write('<tr style="font-weight: bold;"><td>Net In:</td>'
|
||||||
|
'<td>%s</td></tr>\n' % fmt_amt(total_diff))
|
||||||
|
sys.stdout.write('''
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
''')
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv)
|
Loading…
x
Reference in New Issue
Block a user