Ancilliary methods to retrieve categories by type

Get methods added for income, fixed expenses, variable expenses and
discretionary expenses.
Search has regex check to detect placeholder category. Removes the need
for an additional search.
This commit is contained in:
Luís Murta 2020-08-07 20:47:17 +01:00
parent ca12d1846c
commit 2eecd2191a
Signed by: satprog
GPG Key ID: DDF2EFC6179009DC

View File

@ -10,6 +10,9 @@ class Categories:
range = () range = ()
def search(self, t): def search(self, t):
if not self.regex:
return False
if self.banks: if self.banks:
return any( return any(
pattern.search(t.description.lower()) pattern.search(t.description.lower())
@ -33,20 +36,13 @@ class Categories:
@classmethod @classmethod
def categorize(cls, transactions): def categorize(cls, transactions):
income_categories = [
Income1().name,
Income2().name,
Income3().name,
]
null_matches = Null().search_all(transactions) null_matches = Null().search_all(transactions)
travel_matches = Travel().search_all( travel_matches = Travel().search_all(
transactions, date(2019, 12, 23), date(2020, 1, 2) transactions, date(2019, 12, 23), date(2020, 1, 2)
) )
for i, transaction in enumerate(transactions): for i, transaction in enumerate(transactions):
for category in cls.get_categories(): for category in [cat() for cat in cls.get_categories()]:
if category.search(transaction): if category.search(transaction):
if not transaction.category: if not transaction.category:
transaction.category = category.name transaction.category = category.name
@ -71,7 +67,7 @@ class Categories:
new_category = input("? ") new_category = input("? ")
if transaction in travel_matches and transaction.category not in [ if transaction in travel_matches and transaction.category not in [
*income_categories, *cls.get_income_categories(),
]: ]:
transaction.category = Travel().name transaction.category = Travel().name
if transaction in null_matches: if transaction in null_matches:
@ -79,7 +75,41 @@ class Categories:
@classmethod @classmethod
def get_categories(cls): def get_categories(cls):
return [category() for category in cls.__subclasses__()] return cls.__subclasses__()
@classmethod
def get_categories_names(cls):
return [cat.name for cat in cls.get_categories()]
@classmethod
def get_income_categories(cls):
return [cat.name for cat in cls.get_categories() if "Income" in cat.name]
@classmethod
def get_fixed_expenses(cls):
return [
Utilities.name,
Commute.name,
]
@classmethod
def get_variable_expenses(cls):
return [Groceries.name]
@classmethod
def get_discretionary_expenses(cls):
return [
cat.name
for cat in cls.get_categories()
if cat.name
not in [
*cls.get_income_categories(),
*cls.get_fixed_expenses(),
*cls.get_variable_expenses(),
Investment.name,
Null.name,
]
]
class Income1(Categories): class Income1(Categories):