public RetirementReport(IPensionAgeCalc pensionAgeCalc, IIncomeTaxCalculator incomeTaxCalculator, Family family, DateTime now, DateTime?givenRetirementDate, IAssumptions assumptions, ITaxSystem taxSystem) { _family = family; _assumptions = assumptions; TimeToRetirement = new DateAmount(DateTime.MinValue, DateTime.MinValue); TargetRetirementDate = givenRetirementDate; var spendingStepInputs = family.SpendingStepInputs.OrderBy(input => input.Date).ToList(); for (int i = 0; i < spendingStepInputs.Count; i++) { var endDate = i < spendingStepInputs.Count - 1 ? spendingStepInputs[i + 1].Date : family.PrimaryPerson.Dob.AddYears(100); SpendingSteps.Add(new SpendingStepReport(spendingStepInputs[i].Date, endDate.AddDays(-1), spendingStepInputs[i].NewAmount)); } var monthlySpending = MonthlySpendingAt(now) / family.Persons.Count; foreach (var person in family.Persons) { Persons.Add(new PersonReport(pensionAgeCalc, incomeTaxCalculator, person, now, givenRetirementDate, _assumptions, monthlySpending, taxSystem)); } }
public decimal MonthlySpendingAt(DateTime date) { var spendingStep = SpendingSteps.FirstOrDefault(step => date.Date >= step.StartDate.Date && date.Date <= step.EndDate.Date) ?? SpendingSteps.Last(); return(spendingStep.Spending / 12m); }