Skip to content

Instantly share code, notes, and snippets.

@oskarth
Last active February 6, 2017 08:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save oskarth/917c96be08768eef72a59fd2b75e3a99 to your computer and use it in GitHub Desktop.
Save oskarth/917c96be08768eef72a59fd2b75e3a99 to your computer and use it in GitHub Desktop.
Script to generate Ledger entries that distribute a cost over several days
#!/usr/bin/env python
#
# Generate Ledger entries that distribute a cost over several days.
# http://www.ledger-cli.org/
#
# Example usage:
# ./bin/distribute-cost Expenses:Food:Groceries 500 TWD 2017/02/05 7
#
# -- oskarth
import sys
from datetime import datetime, timedelta
if len(sys.argv) != 6:
print "Wrong number of arguments"
print "Example usage:"
print "./distribute-cost Expenses:Misc:Buffer 150 USD 2017/02/05 7"
sys.exit(1)
category = sys.argv[1]
total = float(sys.argv[2])
currency = sys.argv[3]
date = datetime.strptime(sys.argv[4], "%Y/%m/%d")
days = int(sys.argv[5])
part = (total*100 // days) / 100
rest = (total*100 % days) / 100
d1 = datetime.strftime(date, "%Y/%m/%d")
part_str = "{:.2f}".format(part)
rest_str ="{:.2f}".format(rest)
if not (abs(float(part * days + rest) - total) <= 0.01):
print "ERROR: Part and rest don't add up"
print float(part * days + rest), "vs", total
sys.exit(1)
print "".join([" ", category, " ", rest_str,
" ", currency, " ; [=", d1, "]"])
for n in range(days):
dn = datetime.strftime(date + timedelta(days=n), "%Y/%m/%d")
print "".join([" ", category, " ", part_str,
" ", currency, " ; [=", dn, "]"])
➜ finance git:(master) ✗ ./bin/distribute-cost Expenses:Misc:Buffer 150 USD 2017/02/01 28
Expenses:Misc:Buffer 0.20 USD ; [=2017/02/01]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/01]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/02]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/03]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/04]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/05]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/06]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/07]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/08]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/09]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/10]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/11]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/12]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/13]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/14]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/15]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/16]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/17]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/18]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/19]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/20]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/21]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/22]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/23]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/24]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/25]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/26]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/27]
Expenses:Misc:Buffer 5.35 USD ; [=2017/02/28]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment