Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
                }
            }
        }
Пример #3
0
        public int GetRemainder(DateTime date)
        {
            var remainder = Remainders.SingleOrDefault(r => r.Date == date);

            return(remainder != null ? remainder.Amount : calculatedRemainders[date]);
        }