blob: 750f9987097db5ffeb7de0a6c9ec438cd5e77156 (
plain) (
tree)
|
|
from typing import List
from utils.read_file import entry
from utils.register import currencies, complete_prices
from utils.colored_output import *
class tree:
def __init__(self, name: str, value: currencies = None) -> None:
self.name = name
self.value = value
self.children = []
def compute_value(self):
if self.value is not None:
return
self.value = currencies()
for child in reversed(self.children):
child.compute_value()
for price in child.value:
self.value.add_money(price)
def add_child(self, name: str, value: currencies = None):
self.children.append(tree(name, value))
def add_value(self, price: str):
if self.value is None:
self.value = currencies()
self.value.add_money(price)
def get_child_with_name(self, name: str):
for child in self.children:
if name == child.name:
return child
return None
def __contains__(self, name: str) -> bool:
for child in self.children:
if name == child.name:
return True
return False
def __str__(self, level=0, ignore_level = False) -> str:
self.children.sort(key=lambda child: child.name)
result = ''
if not ignore_level:
for price in self.value:
result += price_f(f'{price:>20}') + '\n'
result = result.rstrip()
result += ' ' + ' '*(2 * level)
if len(self.children) == 1:
result += account_f(self.name + ':')
for child in self.children:
result += child.__str__(level + 1, ignore_level = True)
else:
result += account_f(self.name) + '\n'
for child in self.children:
result += child.__str__(level + 1)
return result
class accounts_tree:
def __init__(self) -> None:
self.my_accounts = tree(name='root')
def add_transaction(self, name_acc: str, price: str):
search = self.my_accounts
for name in name_acc.split(':'):
if name not in search:
search.add_child(name)
search = search.get_child_with_name(name)
search.add_value(price)
def __str__(self) -> str:
self.my_accounts.children.sort(key=lambda child: child.name)
self.my_accounts.compute_value()
result = ''
for child in self.my_accounts.children:
result += str(child)
result += '--------------------\n'
for price in self.my_accounts.value:
result += price_f(f'{price:>20}') + '\n'
return result.rstrip()
def print_balance(my_entries: List[entry]):
my_tree = accounts_tree()
for ent in my_entries:
complete_prices(ent)
for trans in ent.transactions:
my_tree.add_transaction(trans[0], str(trans[1]))
print(my_tree)
|