/
expenseTracker.py
138 lines (113 loc) · 3.4 KB
/
expenseTracker.py
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
try:
import _pickle as pickle
except:
import pickle
import pprint
import datetime
import re
from decimal import *
from prettytable import PrettyTable
getcontext().prec = 7
moneyPattern = re.compile('[\d]+(\.[\d]{1,2})?')
def newExpenditure(args):
expenDate = acquireDate()
expenLocale = input('Where did you spend the money? ')
expenAmount = input('Now type the amount spent: ')
while moneyPattern.match(expenAmount) == None:
expenAmount = input('Try again: ')
itemList = [];
if yesAnswer(input('Do you want to make an itemized list? ')):
print('Type "done" when finished')
runningTotal = Decimal(0)
while True:
itemName = input('Enter a name for the item: ')
if itemName == 'done':
break
itemCost = input('Now the cost: ')
while moneyPattern.match(itemCost) == None or itemCost == 'done':
itemCost = input('Try again: ')
if itemCost == 'done':
break
itemList.append({'name': itemName, 'cost': itemCost})
runningTotal += Decimal(itemCost)
if Decimal(runningTotal) >= Decimal(expenAmount):
break
saveExpenditure(expenDate, expenLocale, expenAmount, itemList)
def saveExpenditure(date, place, amount, list):
saveData = loadPickle()
# TODO: replace with method
try:
saveData[date]
except KeyError:
saveData[date] = []
saveData[date].append({'place': place, 'amount': amount, 'items': list})
savePickle(saveData)
def acquireDate():
loop = False
while loop != True:
expenDate = datetime.date.today()
if yesAnswer(input('Was this today? ')):
pass
elif yesAnswer(input('Was it this month? ')):
expenDate = expenDate.replace(day = int(input('Which day was it? ')))
elif yesAnswer(input('Was it this year, at least?! ')):
expenDate = expenDate.replace(
month = int(input('Okay, whew. Which number month? ')),
day = int(input('And which day was it? '))
)
else:
expenDate = datetime.date(
int(input('Alright then, which year was it? (It had better not be in the future; you\'ll break my program!) ')),
int(input('Number month? ')),
int(input('And which day was it? '))
)
loop = yesAnswer(input('So the date was %s? ' % expenDate.ctime()))
return expenDate
def yesAnswer(answer):
if answer == 'y' or answer == 'yes' or answer == 'mm':
return True
elif answer == 'quit':
quit()
else:
return False
def savePickle(data):
#open file for editing
pickl = open('data.pkl', 'wb');
#write object to file
pickle.dump(data, pickl)
# close at the end
pickl.close()
def loadPickle():
#open file for editing
pickl = open('data.pkl', 'rb');
#load object from file
unpickledObj = pickle.load(pickl)
# close at the end
pickl.close()
return unpickledObj
def loadData(args):
data = loadPickle()
table = PrettyTable()
table.add_column('name', (), align='l')
table.add_column('cost', (), align='r')
table.add_column('date', (), align='r')
table.add_column('place', (), align='l')
total = 0
itemCosts = 0
for date in data:
for x in data[date]:
total += Decimal(x['amount'])
if (len(x['items']) > 0):
for item in x['items']:
table.add_row((item['name'], item['cost'], date, x['place']))
itemCosts += Decimal(item['cost'])
else:
table.add_row(('Unspecified', Decimal(x['amount']), date, x['place']))
print(table)
print('Total expenditures entered:', total, 'EUR')
print('Non-itemized: ', total - itemCosts, 'EUR')
commands = {
'quit': quit,
'new': newExpenditure,
'load': loadData
}