diff --git a/financeplanner/calc.py b/financeplanner/calc.py index 9f0ab01..19b91de 100644 --- a/financeplanner/calc.py +++ b/financeplanner/calc.py @@ -68,9 +68,11 @@ class Statistics: def __init__(self, user): self.user = user self.today = current_date() - self.start = self.today - relativedelta(months=6) - self.end = self.today + relativedelta(months=6) - self.calc_start = self.start + self.calc_start = self.today - relativedelta(months=6) + self.calc_end = self.today + relativedelta(months=6) + self.real_calc_start = self.calc_start + self.display_start = self.today - relativedelta(months=1) + self.display_end = self.today + relativedelta(months=2) self.balances = [] self.transactions = [] self.actual_transactions = [] @@ -93,29 +95,29 @@ class Statistics: def _fetch_relevant_balances(self): self.balances = [] - balances_until_start = self.user.balances.filter(date__lte=self.start) + balances_until_start = self.user.balances.filter(date__lte=self.calc_start) if balances_until_start.exists(): self.balances.append(balances_until_start.latest("date")) - other_balances = self.user.balances.filter(date__gt=self.start, date__lte=self.end).order_by("date") + other_balances = self.user.balances.filter(date__gt=self.calc_start, date__lte=self.calc_end).order_by("date") self.balances += list(other_balances) if self.balances: - self.calc_start = self.balances[0].date + self.real_calc_start = self.balances[0].date def _fetch_relevant_transactions(self): one_time_in_range = Q( - booking_date__gte=self.calc_start, - booking_date__lte=self.end, + booking_date__gte=self.real_calc_start, + booking_date__lte=self.calc_end, recurring_months__isnull=True, ) endlessly_recurring = Q( - booking_date__lte=self.end, + booking_date__lte=self.calc_end, recurring_months__isnull=False, not_recurring_after__isnull=True, ) recurring_and_ending_in_range = Q( - booking_date__lte=self.end, + booking_date__lte=self.calc_end, recurring_months__isnull=False, - not_recurring_after__gte=self.calc_start, + not_recurring_after__gte=self.real_calc_start, ) transactions = self.user.transactions.filter( one_time_in_range | endlessly_recurring | recurring_and_ending_in_range @@ -128,9 +130,9 @@ class Statistics: if trans.recurring_months: iter_date = trans.booking_date iter_step = 1 - limit = min(trans.not_recurring_after, self.end) if trans.not_recurring_after else self.end + limit = min(trans.not_recurring_after, self.calc_end) if trans.not_recurring_after else self.calc_end while iter_date < limit: - if iter_date >= self.calc_start: + if iter_date >= self.real_calc_start: actual_transactions.append(ActualTransaction( date=iter_date, subject=f"{trans.subject} #{iter_step}", @@ -148,9 +150,9 @@ class Statistics: def _calculate_daily_stats(self): self.daily_stats = [] - iter_date = self.calc_start + iter_date = self.real_calc_start iter_amount = None - while iter_date < self.end: + while iter_date < self.calc_end: balance_amount, actual_transactions = None, [] relevant_balances = [bal for bal in self.balances if bal.date == iter_date] @@ -176,7 +178,9 @@ class Statistics: iter_date += relativedelta(days=1) def _calculate_daily_amount_scale(self): - amounts = [s.resulting_amount for s in self.daily_stats if s.resulting_amount is not None] + amounts = [s.resulting_amount for s in self.daily_stats + if s.resulting_amount is not None + and self.display_start <= s.date <= self.display_end] if amounts: max_amount = max(amounts) scale = _floor_to_first_two_places(max_amount * Decimal("1.25")) @@ -222,4 +226,4 @@ class Statistics: self.avg_monthly_irregular_expenses = self.avg_daily_irregular_expenses * days_per_month def get_daily_stats_in_range(self): - return [s for s in self.daily_stats if self.start <= s.date <= self.end] + return [s for s in self.daily_stats if self.display_start <= s.date <= self.display_end] diff --git a/financeplanner/views.py b/financeplanner/views.py index 8461fe3..59f884f 100644 --- a/financeplanner/views.py +++ b/financeplanner/views.py @@ -9,8 +9,8 @@ def index(request): user = request.user statistics = Statistics(user) context = { - "start": statistics.start, - "end": statistics.end, + "start": statistics.display_start, + "end": statistics.display_end, "balances": statistics.balances, "transactions": statistics.transactions, "actual_transactions": statistics.actual_transactions,