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); }