@@ -9,24 +9,28 @@ def __init__(self, db_path: str, start: str = None, end: str = None):
99 self .start = start
1010 self .end = end
1111
12- if start is None and end is None :
13- # Get all Items
14- self ._items = self ._items_db .get_all_items ()
15- pass
16- elif start is None and end is not None :
17- # Start from the Oldest Item(s) to the given end date string
18- oldest = min (item .date for item in self ._items_db .get_all_items ())
19- self ._items = self ._items_db .get_items_by_date_range (oldest .strftime ("%Y-%m-%d" ), end )
20- elif start is not None and end is None :
21- # Start from the given start date string to the latest date
22- latest = max (item .date for item in self ._items_db .get_all_items ())
23- self ._items = self ._items_db .get_items_by_date_range (start , latest .strftime ("%Y-%m-%d" ))
24- else :
25- # Get item from given date range
26- self ._items = self ._items_db .get_items_by_date_range (start , end )
12+ # if start is None and end is None:
13+ # # Get all Items
14+ # self._items = self._items_db.get_all_items()
15+ # pass
16+ # elif start is None and end is not None:
17+ # # Start from the Oldest Item(s) to the given end date string
18+ # oldest = min(item.date for item in self._items_db.get_all_items())
19+ # self._items = self._items_db.get_items_by_date_range(oldest.strftime("%Y-%m-%d"), end)
20+ # elif start is not None and end is None:
21+ # # Start from the given start date string to the latest date
22+ # latest = max(item.date for item in self._items_db.get_all_items())
23+ # self._items = self._items_db.get_items_by_date_range(start, latest.strftime("%Y-%m-%d"))
24+ # else:
25+ # # Get item from given date range
26+ # self._items = self._items_db.get_items_by_date_range(start, end)
27+
28+ @property
29+ def items (self ):
30+ return self ._items_db .get_all_items ()
2731
2832 @staticmethod
29- def _get_stats (items ) -> dict :
33+ def get_stats_expense_and_income (items ) -> dict :
3034 expense_items = [item .amount for item in items if item .amount < 0 ]
3135 if len (expense_items ) > 0 :
3236 expense_stats = {
@@ -49,20 +53,26 @@ def _get_stats(items) -> dict:
4953
5054 return expense_stats | income_stats
5155
52- def get_stats (self ):
53- return self ._get_stats (self ._items )
56+ @staticmethod
57+ def get_stats (items ) -> dict :
58+ if len (items ) < 1 :
59+ raise ValueError ('The list of items must contain at least one item' )
60+
61+ return {
62+ "average" : statistics .mean (items ),
63+ "max" : max (items ),
64+ "min" : min (items ),
65+ }
5466
55- def get_stats_by_category (self ) -> dict :
56- # The 'root' of category (i.e. it aggregates the subcategories). We do not care about the subcategories.
57- # Set of Root Categories
58- # item.get_category_str() for an item without category would return 'Uncategorized'
59- category_names = {item .category .name if item .category is not None else item .get_category_str () for item in
60- self ._items }
67+ def get_stats_all_items (self ):
68+ return self .get_stats_expense_and_income (self .items )
6169
70+ def get_stats_by_category (self ) -> dict :
71+ category_names = self ._items_db .get_category_names ()
6272 out_dict = {}
6373 for category_name in category_names :
64- items = [item for item in self ._items if item . category . name == category_name ]
65- out_dict [category_name ] = self ._get_stats (items )
74+ items = [item for item in self ._items_db . get_items_by_category ( category_name ) ]
75+ out_dict [category_name ] = self .get_stats_expense_and_income (items )
6676
6777 return out_dict
6878
@@ -71,12 +81,14 @@ def get_stats_by_category_with_subcategories(self) -> dict:
7181 stats_dict = {}
7282 for category_name in category_names :
7383 # Case: With Category and Without Subcategory
74- stats_dict [f'{ category_name } -NoSubcategory' ] = self ._get_stats (
84+ stats_dict [f'{ category_name } -NoSubcategory' ] = self .get_stats_expense_and_income (
7585 self ._items_db .get_items_without_subcategory (category_name ))
86+
7687 # Case: With Category and With Subcategory
77- for subcategory in self ._items_db .get_subcategory_name (category_name ):
88+ for subcategory in self ._items_db .get_subcategory_names (category_name ):
7889 stats_dict [f'{ category_name } -{ subcategory } ' ] = \
79- self ._get_stats (self ._items_db .get_items_by_category_and_subcategory (category_name , subcategory ))
90+ self .get_stats_expense_and_income (
91+ self ._items_db .get_items_by_category_and_subcategory (category_name , subcategory ))
8092
8193 return stats_dict
8294
0 commit comments