Adds Transactions derived from list

New `Transactions` class derived from `list` to add auxilliary methods to a
transaction list.
New get_transactions_by_(year,month,category) methods return dict sorted
by (year,month,category).
Also adds sort_by_bank inplace.
This commit is contained in:
Luís Murta 2020-08-07 20:55:49 +01:00
parent 2eecd2191a
commit 7a587213c9
Signed by: satprog
GPG Key ID: DDF2EFC6179009DC
2 changed files with 71 additions and 12 deletions

22
main.py
View File

@ -4,7 +4,7 @@ import pickle
import sys
from categories import Categories
from transaction import Transaction as Tr, TransactionError
from transaction import Transaction as Tr, TransactionError, Transactions
from parsers import Parser
@ -90,7 +90,7 @@ def initialize(raw_dir, data_dir, restart=False):
def manual_categorization(trs):
trs = Tr.sort_by_bank(trs)
trs.sort_by_bank()
for i, transaction in enumerate(trs):
if not transaction.category:
category = input(f"{transaction} category: ")
@ -108,7 +108,7 @@ if __name__ == "__main__":
datafiles = initialize(".raw", "data", restart=False)
transactions = list()
transactions = Transactions()
for file in datafiles.values():
transactions.extend(file)
transactions.sort()
@ -119,12 +119,12 @@ if __name__ == "__main__":
# if transaction.category in reprocess:
# transaction.category = ''
Categories.categorize(transactions)
manual_categorization(transactions)
for f, file in datafiles.items():
file_transactions = [t for t in transactions if t in file]
Tr.write_transactions(Path("data") / f, file_transactions)
# Categories.categorize(transactions)
#
# manual_categorization(transactions)
#
# for f, file in datafiles.items():
# file_transactions = [t for t in transactions if t in file]
# Tr.write_transactions(Path("data") / f, file_transactions)
#
Tr.write_transactions("transactions.csv", transactions)

View File

@ -1,3 +1,4 @@
from categories import Categories
from csv import reader, writer
from datetime import date
from decimal import Decimal, InvalidOperation
@ -89,4 +90,62 @@ class Transaction:
return self.date >= other.date
def __repr__(self):
return f"{self.date} {self.description} {self.value}€ from {self.bank} ({self.category})"
return "{} {} {}€ ({})".format(
self.date.strftime("%d/%m/%y"), self.category, self.value, self.bank
)
class Transactions(list):
def sort_by_bank(self):
self.sort(key=lambda k: k.bank)
def get_transactions_by_year(self, start=None, end=None):
if not start:
start = self[0].date
if not end:
end = self[-1].date
years = dict()
for year in range(start.year, end.year + 1):
years[year] = Transactions(
t for t in self if start <= t.date <= end and t.date.year == year
)
return years
def get_transactions_by_month(self, start=None, end=None):
if not start:
start = self[0].date
if not end:
end = self[-1].date
months = dict()
for year, year_transactions in self.get_transactions_by_year(
start, end
).items():
for month in range(1, 13):
key = "_".join([str(year), str(month)])
months[key] = Transactions(
t for t in year_transactions if t.date.month == month
)
# trims last unused months
trim = 1
for transactions in reversed(months.values()):
if transactions:
break
else:
trim += 1
while trim := trim - 1:
months.popitem()
return months
def get_transactions_by_category(self):
categories = {cat: [] for cat in Categories.get_categories_names()}
for transaction in self:
try:
categories[transaction.category].append(transaction)
except AttributeError:
categories[transaction.category] = [transaction]
return categories