Beispiel #1
0
        public BudgetViewMonth GetLastBudgetViewMonth(DateTime month, out bool exactMatch)
        {
            if (_lastResult == null)
            {
                RecalculateCache();
            }

            BudgetViewMonth budgetViewMonth = null;

            if (_lastResult.Months.TryGetValue(month, out budgetViewMonth))
            {
                exactMatch = true;
                return(budgetViewMonth);
            }

            int index = _lastResult.MonthsByDate.BinarySearch(m => m.Month, month);

            index      = ~index;
            exactMatch = false;
            if (index == 0)
            {
                return(null);
            }
            return(_lastResult.MonthsByDate[index - 1]);
        }
        private void CalculateMonthBalances(List <BudgetViewMonth> monthsOrdered)
        {
            BudgetViewMonth previousMonth = null;

            foreach (var currentMonth in monthsOrdered)
            {
                if (previousMonth != null)
                {
                    bool isLastMonth = currentMonth.Month.AddMonths(-1).FirstDayOfMonth() == previousMonth.Month;
                    currentMonth.OverUnderBudgetedPreviousMonth = previousMonth.AvailableToBudget;
                    if (!isLastMonth)
                    {
                        currentMonth.OverUnderBudgetedPreviousMonth -= previousMonth.OverspentPreviousMonth;
                    }
                }

                currentMonth.AvailableToBudget = currentMonth.Income - currentMonth.Budgeted + currentMonth.OverspentPreviousMonth + currentMonth.OverUnderBudgetedPreviousMonth;

                previousMonth = currentMonth;
            }
        }
        private Dictionary <DateTime, BudgetViewMonth> InitializeMonths(Dictionary <DateTime, List <BudgetViewCategoryMonth> > categoriesByMonth, TransactionDictionary groupedTransactions)
        {
            Dictionary <DateTime, BudgetViewMonth> months = groupedTransactions.Where(kvp => kvp.Key.EntityType == nameof(IncomeCategory)).ToDictionary(kvp => kvp.Key.FirstDayOfMonth, kvp => new BudgetViewMonth(kvp.Key.FirstDayOfMonth)
            {
                Income = kvp.Value
            });

            foreach (var category in categoriesByMonth)
            {
                BudgetViewMonth month         = null;
                BudgetViewMonth nextMonth     = null;
                DateTime        nextMonthDate = category.Key.AddMonths(1).FirstDayOfMonth();
                months.TryGetValue(nextMonthDate, out nextMonth);

                if (!months.TryGetValue(category.Key, out month))
                {
                    month = new BudgetViewMonth(category.Key);
                    months[category.Key] = month;
                }

                foreach (var categoryMonth in category.Value)
                {
                    month.Budgeted += categoryMonth.AmountBudgeted;
                    if (categoryMonth.EndBalance < 0M && categoryMonth.NegativeBalanceHandling == NegativeBalanceHandlingTypes.AvailableToBudget)
                    {
                        if (nextMonth == null)
                        {
                            nextMonth             = new BudgetViewMonth(nextMonthDate);
                            months[nextMonthDate] = nextMonth;
                        }
                        nextMonth.OverspentPreviousMonth += categoryMonth.EndBalance;
                    }
                }
            }

            return(months);
        }