private BudgetWeek BindDataOf(IBudget budget) { var dataSource = new SortedDictionary <PEOrderKey, PEBudgetRow>(); var currentWeekMarker = CurrentWeekMarker(budget); BudgetWeek currentWeek = null; var lastWeekMonth = 0; foreach (var week in budget.Weeks) { if (week.Contains(currentWeekMarker)) { currentWeek = week; } if (week.Month != lastWeekMonth) { dataSource.Add( new PEOrderKey(week.FirstDay.MonthFirstDay(), WeekRowRank.MonthTitle), new PEBudgetRow { Date = week.FirstDay.ToString("MMMM") }); } dataSource.Add( new PEOrderKey(week.FirstDay, WeekRowRank.WeekTitle), new PEBudgetRow { Date = string.Format("Неделя {0:d} - {1:d}", week.FirstDay, week.LastDay), Amount = string.Format("Свободные {0}", budget.GetFreeMoney(week.FirstDay).ToString("D")), }); // todo : performance var monthlyCashStatements = budget.MonthlyCashMovements.Within(week).ToList(); AddExpenses(week, dataSource, DayRowRank.MonthlyIncome, monthlyCashStatements.Where(_ => _.Amount > 0), currentWeek, PEBudgetRow.CurrentWeekMonthlyIncome); AddExpenses(week, dataSource, DayRowRank.MonthlyExpense, monthlyCashStatements.Where(_ => _.Amount <= 0), currentWeek, PEBudgetRow.CurrentWeekMonthlyOutcome); AddTransfers(week, dataSource, DayRowRank.Income, budget.Investments.Within(week), deletionService.DeleteCashMovement, OnEditCashMovement, currentWeek, PEBudgetRow.CurrentWeekIncome); AddTransfers(week, dataSource, DayRowRank.Expense, budget.Expenses.Within(week), deletionService.DeleteCashMovement, OnEditCashMovement, currentWeek, PEBudgetRow.CurrentWeekOutcome); AddReminders(week, dataSource, DayRowRank.Remainer, budget.Remainders.Within(week), budget, deletionService.DeleteRemainder, OnEditRemainder, currentWeek, PEBudgetRow.Default); lastWeekMonth = week.Month; } view.CalculationResults.DataSource = new List <PEBudgetRow>(dataSource.Values); var monthToBalance = budget.Remainders.LastOrDefault()?.Date ?? DateTimeService.Now(); var balance = budget.MonthlyActualBalances.GetFor(monthToBalance); var nextMonth = monthToBalance.AddMonths(1); var nextMonthBalance = budget.MonthlyActualBalances.GetFor(nextMonth); view.MonthlyBalance = $"{monthToBalance:MMM}: {balance:+#;-#}, {nextMonth:MMM}: {nextMonthBalance:+#;-#}"; return(currentWeek); }
private Func <CashStatement, string> ExplainReminder(IBudget budget, BudgetWeek week) { return(statement => string.Format("Конверт {0}, Остатки {1}, Свободные {2}", week != null ? week.Remainder.ToString() : "?", statement.Amount, budget.GetFreeMoney(statement.Date))); }