private void CalculateCoverages() { var to = budget.Weeks.Last().To; var remainder = 0; foreach (var investmentsSet in AllInvestments.GroupBy(i => i.Date).OrderByDescending(g => g.Key)) { var from = investmentsSet.Key; var coveredPeriod = new Period(from, to); var weeksToCover = budgetWeeks[coveredPeriod]; remainder += investmentsSet.Sum(i => i.Amount) - EnvelopeSize * weeksToCover.Count() + MonthlyExpenses[coveredPeriod].Sum(e => e.Amount) + Expenses[coveredPeriod].Sum(e => e.Amount);; if (remainder >= 0) { budget.AddFreeMoney(investmentsSet.Key, remainder); remainder = 0; } to = from; } var prevWeekRemainder = Remainders.Last(r => r.Date < budget.Weeks.First().From); if (prevWeekRemainder.Date <= to) { var from = prevWeekRemainder.Date; var coveredPeriod = new Period(from, to); var weeksToCover = budgetWeeks[coveredPeriod]; remainder += budget.GetRemainder(prevWeekRemainder.Date) - EnvelopeSize * weeksToCover.Count() + MonthlyExpenses[coveredPeriod].Sum(e => e.Amount) + Expenses[coveredPeriod].Sum(e => e.Amount);; budget.AddFreeMoney(prevWeekRemainder.Date, remainder); } }
private void CalculateWeekOutcomes() { foreach (var week in budget.Weeks) { var calculatedRemainder = PriorWeekRemainder(week) - EnvelopeSize + CashMovements[week].Sum(i => i.Amount) + MonthlyCashMovements[week].Sum(p => p.Amount); var remainder = Remainders.SingleOrDefault(r => r.Date == week.LastDay); if (remainder != null) { budget.AddFreeMoney(week.LastDay, remainder.Amount - calculatedRemainder); } } }
public int GetRemainder(DateTime date) { var remainder = Remainders.SingleOrDefault(r => r.Date == date); return(remainder != null ? remainder.Amount : calculatedRemainders[date]); }