/// <summary>
        /// Calculates the savings plan for the given <paramref name="tag"/>.
        /// </summary>
        /// <param name="tag">The tag.</param>
        public ISavingsPlan CalculateSavingsPlan(string tag)
        {
            var savingsPlan = new SavingsPlan {
                Tag = tag, Date = DateTime.Now
            };

            var yearQuery = new TransactionYearsQuery()
                            .Register(new TransactionStartDateFilter(DateTime.MinValue))
                            .Register(new TransactionEndDateFilter(_dateCalculationService.GetEndOfToDay()))
                            .Register(new TransactionTagFilter(tag))
                            .Register(new TransactionDividendFilter(true));

            var years = _queryDispatcher.Execute(yearQuery).ToList();

            foreach (var year in years)
            {
                var period = new SavingsPlanPeriod()
                {
                    Year = year.ToString()
                };

                //Time period
                var start       = _dateCalculationService.GetStartAndEndDateOfYear(new DateTime(year, 1, 1), out DateTime end);
                var lastYearEnd = _dateCalculationService.GetEndDateOfYear(new DateTime(years[0] - 1, 1, 1));

                //Only this year
                var actualPeriodResult = CalculateCurrentPeriod(start, end, tag);

                period.PerformanceActualPeriodPercentage = actualPeriodResult.PerformanceActualPeriodPercentage;
                period.SumDividends = actualPeriodResult.SumDividends;

                //Accumulated till this end of year
                var periodResult = CalculateOverallPeriod(lastYearEnd, end, tag);

                period.SumOrderCostsPercentage = periodResult.SumOrderCostsPercentage;
                period.SumOrderCosts           = periodResult.SumOrderCosts;
                period.SumInpayment            = periodResult.SumInpayment;
                period.SumCapital = periodResult.SumCapital;
                period.PerformanceOverallPeriodPercentage = periodResult.PerformanceOverallPeriodPercentage;
                period.SumOverallDividends           = periodResult.SumOverallDividends;
                period.SumOverallDividendsPercentage = decimal.Round((periodResult.SumOverallDividends / periodResult.SumInpayment) * 100, 2);
                period.IsCurrentYear = DateTime.Now.Year == year;
                period.IsForecast    = false;

                savingsPlan.Periods.Add(period);
            }

            //Forecast
            if (savingsPlan.Periods.Any())
            {
                var startYear             = years.Max() + 1;
                var amountOfForecastYears = years.Min() + 35 - startYear;
                foreach (ISavingsPlanPeriod forecast in GetTagPeriodForecast(amountOfForecastYears, startYear, savingsPlan.Periods))
                {
                    savingsPlan.Periods.Add(forecast);
                }
            }

            return(savingsPlan);
        }
Esempio n. 2
0
        /// <summary>
        /// Creates the years.
        /// </summary>
        /// <param name="slice">The slice.</param>
        /// <param name="date">The minimum date. Any date earlier that this will not be incorporated if not affected.</param>
        private void CreateYears(AllTimeSlice slice, DateTime date)
        {
            foreach (var year in _dateCalculationService.GetInvolvedYears(slice.Start, slice.End))
            {
                //Skip earlier years
                if (year < date.Year)
                {
                    continue;
                }

                var startOfYear = _dateCalculationService.GetStartAndEndDateOfYear(year, out DateTime endOfYear);

                var yearSlice = new YearTimeSlice(startOfYear, endOfYear, year);
                CreateQuarters(yearSlice, date);
                slice.AddSlice(yearSlice);
            }
        }